/** 
* 입력값이 NULL인지 체크 
*/ 
function isNull(input) { 
if (input.value == null || input.value == "") { 
return true; 
} 
return false; 
} 

/** 
* 입력값에 스페이스 이외의 의미있는 값이 있는지 체크 
* ex) if (isEmpty(form.keyword)) { 
* alert!("검색조건을 입력하세요."); 
* } 
*/ 
function isEmpty(input) { 
if (input.value == null || input.value.replace(/ /gi,"") == "") { 
return true; 
} 
return false; 
} 

/** 
* 입력값에 특정 문자(chars)가 있는지 체크 
* 특정 문자를 허용하지 않으려 할 때 사용 
* ex) if (containsChars(form.name,"!,*&^%$#@~;")) { 
* alert!("이름 필드에는 특수 문자를 사용할 수 없습니다."); 
* } 
*/ 
function containsChars(input,chars) { 
for (var inx = 0; inx < input.value.length; inx++) { 
if (chars.indexOf(input.value.charAt(inx)) != -1) 
return true; 
} 
return false; 
} 

/** 
* 입력값이 특정 문자(chars)만으로 되어있는지 체크 
* 특정 문자만 허용하려 할 때 사용 
* ex) if (!containsCharsOnly(form.blood,"ABO")) { 
* alert!("혈액형 필드에는 A,B,O 문자만 사용할 수 있습니다."); 
* } 
*/ 
function containsCharsOnly(input,chars) { 
for (var inx = 0; inx < input.value.length; inx++) { 
if (chars.indexOf(input.value.charAt(inx)) == -1) 
return false; 
} 
return true; 
} 

/** 
* 입력값이 알파벳인지 체크 
* 아래 isAlphabet() 부터 isNumComma()까지의 메소드가 
* 자주 쓰이는 경우에는 var chars 변수를 
* global 변수로 선언하고 사용하도록 한다. 
* ex) var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
* var lowercase = "abcdefghijklmnopqrstuvwxyz"; 
* var number = "0123456789"; 
* function isAlphaNum(input) { 
* var chars = uppercase + lowercase + number; 
* return containsCharsOnly(input,chars); 
* } 
*/ 
function isAlphabet(input) { 
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
return containsCharsOnly(input,chars); 
} 

/** 
* 입력값이 알파벳 대문자인지 체크 
*/ 
function isUpperCase(input) { 
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
return containsCharsOnly(input,chars); 
} 

/** 
* 입력값이 알파벳 소문자인지 체크 
*/ 
function isLowerCase(input) { 
var chars = "abcdefghijklmnopqrstuvwxyz"; 
return containsCharsOnly(input,chars); 
} 

/** 
* 입력값에 숫자만 있는지 체크 
*/ 
function isNumber(input) { 
var chars = "0123456789"; 
return containsCharsOnly(input,chars); 
} 

/** 
* 입력값이 알파벳,숫자로 되어있는지 체크 
*/ 
function isAlphaNum(input) { 
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 
return containsCharsOnly(input,chars); 
} 

/** 
* 입력값이 숫자,대시(-)로 되어있는지 체크 
*/ 
function isNumDash(input) { 
var chars = "-0123456789"; 
return containsCharsOnly(input,chars); 
} 

/** 
* 입력값이 숫자,콤마(,)로 되어있는지 체크 
*/ 
function isNumComma(input) { 
var chars = ",0123456789"; 
return containsCharsOnly(input,chars); 
} 

/** 
* 입력값이 사용자가 정의한 포맷 형식인지 체크 
* 자세한 format 형식은 자바스크립트의 'regular expression!'을 참조 
*/ 
function isValidFormat(input,format) { 
if (input.value.search(format) != -1) { 
return true; //올바른 포맷 형식 
} 
return false; 
} 

/** 
* 입력값이 이메일 형식인지 체크 
* ex) if (!isValidEmail(form.email)) { 
* alert!("올바른 이메일 주소가 아닙니다."); 
* } 
*/ 
function isValidEmail(input) { 
// var format = /^(\S+)@(\S+)\.([A-Za-z]+)$/; 
var format = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/; 
return isValidFormat(input,format); 
} 

/** 
* 입력값이 전화번호 형식(숫자-숫자-숫자)인지 체크 
*/ 
function isValidPhone(input) { 
var format = /^(\d+)-(\d+)-(\d+)$/; 
return isValidFormat(input,format); 
} 

/** 
* 입력값의 바이트 길이를 리턴 
* ex) if (getByteLength(form.title) > 100) { 
* alert!("제목은 한글 50자(영문 100자) 이상 입력할 수 없습니다."); 
* } 
* Author : Wonyoung Lee 
*/ 
function getByteLength(input) { 
var byteLength = 0; 
for (var inx = 0; inx < input.value.length; inx++) { 
var oneChar = escape(input.value.charAt(inx)); 
if ( oneChar.length == 1 ) { 
byteLength ++; 
} else if (oneChar.indexOf("%u") != -1) { 
byteLength += 2; 
} else if (oneChar.indexOf("%") != -1) { 
byteLength += oneChar.length/3; 
} 
} 
return byteLength; 
} 

/** 
* 입력값에서 콤마를 없앤다. 
*/ 
function removeComma(input) { 
return input.value.replace(/,/gi,""); 
} 

/** 
* 선택된 라디오버튼이 있는지 체크 
*/ 
function hasCheckedRadio(input) { 
if (input.length > 1) { 
for (var inx = 0; inx < input.length; inx++) { 
if (input[inx].checked) return true; 
} 
} else { 
if (input.checked) return true; 
} 
return false; 
} 

/** 
* 선택된 체크박스가 있는지 체크 
*/ 
function hasCheckedBox(input) { 
return hasCheckedRadio(input); 
} 


 



사용자가 지정한 제약조건에 대한 정보는 user_constraints 뷰를 사용하여 확인할 수 있다.

릴레이션을 갖는 TABLE을 구성하는데 행(RECORD: ROW: TUPLE)을 구성하는 데이터 값들에 의해 식별되는데, 이처럼 각 행을 식별할 수 있는 속성(attribute)을 릴레이션(relation)의 KEY라 한다.

constraint 설명
PRIMARY KEY(PK) 해당 컬럼 값은 반드시 존재해야 하며, 유일해야 함
(NOT NULL과 UNIQUE 제약조건을 결합한 형태)
FOREIGN KEY(FK) 해당 컬럼 값은 참조되는 테이블의 컬럼 값 중의 하나와 일치하거나 NULL을 가짐
UNIQUE KEY(UK) 테이블내에서 해당 컬럼 값은 항상 유일해야 함
NOT NULL 컬럼은 NULL 값을 포함할 수 없다.
CHECK(CK) 해당 컬럼에 저장 가능한 데이터 값의 범위나 조건 지정

다음의 예를 보자.

학생
학번 이름 학년 학과
100 김씨 4 정보통신
200 이씨 3 전파공학
300 박씨 1 정보통신
400 조씨 4 전파공학
500 임씨 2 컴퓨터공학

위의 학생 테이블은 속성(A={학번,이름,학년,학과}) 집합으로 구성된 테이블이다.
이 테이블에서 어떤 속성 집합(K)가 속성집합(A)의 부분 집합이면서 유일성과 최소성을 만족하는 경우 속성집합(K)을 후보키(candidate key)라 한다.
즉, 학생 테이블에서 학번 속성은 테이블 내의 모든 행마다 서로 다르고 행을 유일하게 식별하는데 사용할 수 있으므로 이 학번은 학생 테이블의 후보키이다. 또한 이름 속성도 유일성을 가지므로 후보키이다.
이름 속성과 학과 속성을 조합해서 학생 테이블을 유일하게 식별하는 것이 가능하다면, 이 두 속성의 집합 {이름,학과} 역시 테이블의 후보키가 된다.

테이블에서 하나 이상의 후보키를 가질 수 있다. 그러나 관계형 모델에서는 테이블에서 하나의 키를 선정하여 이 키를 기본키(primary key)라 하고 기본키를 제외한 나머지 후보키대체키(alternate key)라 한다
예를 들어, 학생 테이블에서 학번 속성이나 이름 속성은 테이블 내의 을 유일하게 식별할 수 있으므로 기본키로 사용될 수 있다.
하나 이상의 테이블을 연결하여 사용하는 경우 필요한 키로, 외래키(foreign key)가 있다. 외래키는 한 테이블의 속성들의 집합으로 그 값이 다른 테이블의 기본키와 일치하거나 null 값인 키를 의미한다.


관계형 데이터베이스 내의 릴레이션은 이들을 연결할 수 있는 공통의 속성을 공유할 수 있다. 다음 두 릴레이션(테이블)을 살펴보자.

외래키가 릴레이션 간의 연결을 보장하기 위해서는 반드시 다음 조건을 충족시켜야 한다.
1) 외래키의 값이 반드시 다른 릴레이션의 기본키이어야 한다.
2) 외래키는 null값을 가질 수 없다.
릴레이션 사이에 이러한 두 조건을 충족하는 경우 이 릴레이션들은 참조 무결성(referential integrity)을 나타낸다고 말한다.

무결성에는 다음과 같은 종류가 있다.
1) 개체 무결성(entity integrity) :

기본키로 사용하는 속성은 null 값을 가질 수 없다. 이는 관계 데이터 모델에서의 릴레이션이 현실의 개체를 나타내므로 이 개체들을 식별할 수 있는 식별자가 반드시 존재해야 하기 때문이다. 그러므로 이러한 속성을 개체 무결성이라 한다.

2) 참조 무결성(referential integrity) :
릴레이션은 참조할 수 없는 외래키의 값을 가져서는 안 되는데, 참조할 수 없는 외래키란 null이 아니면서 참조된 릴레이션의 어떤 기본키의 값과도 일치하지 않음을 의미한다.

3) 범위 무결성(domain integrity):
범위 무결성 규칙은 속성에서 허용 가능한 값의 범위를 지정하기 위한 제약조건이다 . 범위 무결성 규칙에서는 속성의 데이터 타입, 길이, 기본 키, 유일성, null 허용, 허용 값의 범위와 같은 다양한 제약조건을 지정할 수 있다.

SQL> select constraint_name,constraint_type,
  2  table_name,r_constraint_name
  3  from user_constraints;
 
CONSTRAINT_NAME      C TABLE_NAME R_CONSTRAINT_NAME
-------------------- - ---------- --------------------
FK_DEPTNO            R EMP        PK_DEPT
PK_DEPT              P DEPT
PK_EMP               P EMP
 
SQL> 


1. #는 쿼리가 수행될 때, 다음과 같이 된다 

SELECT * FROM USER 

WHERE 
col = ?  


parameter : [값]


?에 bind된 값이 들어가게 된다. 

이 쿼리의 컴파일 된 내용을 재사용 할 수 있고, 파라미터에 따라 대입해주므로 효율적이다.
내부적으로 preparedStatement 객체에서 ? 에 들어갈 파라미터의 값을 set 해줌으로써 사용이 된다.
 
preparedStatement는 한번 수행한 쿼리를 캐싱하는 객체


사용 용도 >>

#일 경우, 에 사용한다.

myBatis : 컬럼명 = #{값}   
iBatis : 컬럼명 = #값#

* 쿼리에 작은 따옴표가 붙게 된다.


2. $는 쿼리가 수행될 때, 다음과 같이 된다

SELECT * FROM USER
WHERE 
col = 



값이 넣어진 쿼리 자체로 수행이 된다.(상수)
즉, 문장 전체가 preparedStatement가 된다.

사용 용도 >>

$일 경우는 컬럼명이 동적으로 바뀌어야 할 때 사용한다. 또는 테이블명.

myBatis : ${컬럼명} = #{값}   
iBatis : $컬럼명$ = #{값}

* 쿼리에 작은따옴표가 붙지 않는다. 
값에 $를 사용하면 스트링의 경우 작은따옴표로 감싸지지 않기 때문에 에러 발생한다.


이렇게 사용하지 않으면 unknown column 이나 There is no readable property named  등등의 에러가 뜨게 된다


onkeydown 이벤트 발생시 event.keyCode 값과

onkeypress 이벤트 발생시 event.keyCode 값이 다르다는 것을 알았다.

 

onkeypress 이벤트 발생시 event.keyCode 값은 다음과 같다.

 

이는 ASCII 값과 같음을 알게 되었다.

 

 

이벤트(Event) Key code 정리

키코드

사용키(시스템)

키코드

사용키(숫자)

13

ENTER

48

0

27

ESC

49

1

32

SPACE BAR

50

2

 

 

51

3

 

 

52

4

 

 

53

5

 

 

54

6

 

 

55

7

 

 

56

8

 

 

57

9

키코드

사용키(영어 대문자)

키코드

사용키(영어 소문자)

65

A

97

a

66

B

98

b

67

C

99

c

68

D

100

d

69

E

101

e

70

F

102

f

71

G

103

g

72

H

104

h

73

I

105

i

74

J

106

j

75

K

107

k

76

L

108

l

77

M

109

m

78

N

110

n

79

O

111

o

80

P

112

p

81

Q

113

q

82

R

114

r

83

S

115

s

84

T

116

t

85

U

117

u

86

V

118

v

87

W

119

w

88

X

120

x

89

Y

121

y

90

Z

122

z

키코드

사용키(특수문자)

키코드

사용키(특수문자)

33

!

58

:

34

"

59

;

35

#

60

<

36

$

61

=

37

%

62

>

38

&

63

?

39

'

64

@

40

(

91

[

41

)

92

\

42

*

93

]

43

+

94

^

44

,

95

_

45

-

96

`

46

.

123

{

47

/

124

|

 

 

125

}

 

 

126

~



+ Recent posts