- SQL 구분 분석(Parsing)
- 문법의 유효성 검사(Syntax Check)
- 문법의 규칙을 준수하는지 검사한다.
- 예) select * form pms_board
- form
은 잘못된 SQL 문법이다.
- SQL 문의 의미 검사(Semantic Check)
- SQL 문에서 지정하는 컬럼이나 테이블, 뷰 등이 유효한지 검사한다.
- 예) select * from pms_okok
- pms_okok
테이블이 없다면, semantic 오류 이다.
- SQL 공유 풀 검사(Shared Pool Check)
- 공유 풀 은 SQL 문에 대해 생성된 *실행 계획(execution plan)* 등을 보관한다.
- 먼저 SQL 문에 대해 해시(hash) 연산을 수행하여 SQL ID를 생성한다.
- 공유 풀 에 저장된 값 중에서 SQL ID와 일치하는 값이 있는지 조사한다.
- 만약 있다면, 즉시 해당 값을 꺼내 *실행 계획* 에 따라 SQL 문을 실행한다.
- 없다면, *하드 파싱(hard parsing)* 이라는 과정을 수행한다.
- 하드 파싱
- SQL 최적화(Optimization)
- SQL 문을 가장 효율적으로 실행할 수 있게 재구성한다.
- 각 문장 별로 *실행 계획(execution plan)* 이라는 명령 코드를 생성한다.
- 여러 개의 실행 계획 을 검토한 후 실행 비용을 계산하여 최적의 실행 계획을 생성한다.
- SQL 컴파일(Row Source Generation)
- 최적화 단계에서 생성된 실행 계획 을 입력으로 받는다.
- 각 실행 단계 별로 결과 데이터(result set) 를 리턴할 바이너리 명령을 생성한다.
- 이 바이너리 명령을 *Row Source* 라고 부른다.
- Row Source 는 테이블이나 뷰, 조인 또는 그룹 연산을 가리킨다.
- *Row Source Generator* 는 실행 순서에 따라 Row Source Tree 를 생성한다.
- SQL 실행
- SQL 엔진은 Row Source Tree 에 따라가면서 Row Source 바이너리 명령을 실행한다.
- 각 Row Source 바이너리 명령은 테이블이나 뷰, 조인 또는 그룹 연산 결과를 생성한다.
- 최종 실행 결과는 애플리케이션에게 리턴할 *결과 데이터(Result Set)* 이다.
create table pms_project(
no int not null,
title varchar(255) not null,
content text not null,
sdt date not null,
edt date not null,
owner int not null, /* pms_member테이블의 no PK컬럼 값을 저장해야 한다.*/
members varchar(255) not null
);
alter table pms_project
add constraint pms_project_fk foreign key(owner) references pms_member(no);
다대 다 관계는 1대 다 관계로 변환해야 한다.
create table pms_member_project(
member_no int not null,
project_no int not null
);
/*다대다 관계를 저장할 컬럼에 대해 FK를 설정한다.*/
alter table pms_member_project
add constraint pms_member_project_fk1 foreign key(member_no) references pms_member(no),
add constraint pms_member_project_fk2 foreign key(project_no) references pms_project(no);
/*프로젝트 멤버 정보가 중복 저장되지 않도록 PK로 설정한다.*/
alter table pms_member_project
add constraint pms_member_project_pk primary key(member_no, project_no);
alter table pms_task
add constraint pms_task_fk foreign key(owner) references pms_member(no);
UML실전에선 이것만 쓴다.(책)
FK와 PK를 join해야하는데 일치하지 않는다면 설계를 잘못한거임.
members.append(memberRs.getString(“name”));
m.name하면 안됀다! 컬럼명으로 꺼내야한다!
mybatis : sql소스와 java소스코드가 막 섞여있어서 둘을 분리하는 것 -> 자바코드에서 sql문 분리
캐스케이딩 delete : 부모객체가 참조하는 자식객체를 한번에 다 삭제하지만 실무에서는 잘 쓰지 않는다!