SQL - 테이블 분석 실습
왓챠로 예시를 들어본다.
영화 제목부터 컬럼들과 관계를 적어본다.
정규화
중복된 데이터 정리
TABLE 만들기
CLOB : 무제한
CHAR : 한개의 글자만 들어갈 때
ERD 만들기
위에 작성한 엑셀을 바탕으로 ERD를 만들어 본다.
ERD - 포워드 엔지니어링
이렇게 SQL 문을 완성시켜주는 편리한 기능이 있다.
Oracle 사용자 계정 생성 스크립트.sql
ALTER SESSION SET "_ORACLE_SCRIPT" = TRUE;
CREATE USER 사용자아이디 IDENTIFIED BY 비밀번호;
ALTER USER 사용자아이디 DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER 사용자아이디 TEMPORARY TABLESPACE temp;
GRANT CREATE SESSION, CREATE VIEW, ALTER SESSION, CREATE SEQUENCE TO 사용자아이디;
GRANT CREATE SYNONYM, CREATE DATABASE LINK, RESOURCE, UNLIMITED TABLESPACE TO 사용자아이디;
COMMIT;
한줄 한줄 실행시킨 후 ERD에서만들었던 새 편집기에 SQL문을 붙여넣어준다.
데이터 넣어주기
상단 수동으로 꼭! 바꾸고 데이터를 넣어준다.
확인 후 COMMIT;
이클립스 연결
dao (dataaccessobject) -> 데이터에 접근하는 객체, 데이터베이스에 접근
service -> DB의 transaction 담당
vo (Value Object) -> 데이터만 있는 클래스
테이블마다 시퀀스를 만들어 줘야함 동시성 문제 때문에 / 번호표개념
DBeaver에서
넣어줄 이름을 설정
PK의 이름설정에 따라서 값 넣어준다.
Cycle에 체크는 999999가 되면 다시 1로돌아가서 시작
이렇게 되면 PK값이 중복되기 때문에 PK이름 앞에 날짜를 붙여주는것.
시퀀스는 한번 증가하면 다시 돌아오지 않음.
ROLLBACK; 불가능
필요한 시퀀스들을 모두 생성해준다.
엑셀에서 정리했던 테이블 값들을 넣어준다.
INSERT INTO MOVIES
(MOVIE_ID
, TITLE
, MINIMUM_AGE
, OPEN_YEAR
, RUNNING_TIME
, GENRE
, ATMOSPHERE
, LOCATION
, SUMMARY
, POSTER
)
VALUES
--('MV-20240228-000003'/*MOVIE_ID*/
('MV' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '-' || LPAD (SEQ_MOVIES_PK.NEXTVAL, 6, '0') -- 위에서 적은 시퀀스로 기존 값 대신 적어준다.
,'런닝맨'/*TITLE*/
,15/*MINIMUM_AGE*/
,'2013'/* OPEN_YEAR*/
,120/*RUNNING_TIME*/
,'예능'/*GENRE*/
,'웃긴'/* ATMOSPHERE*/
,'한국'/* LOCATION*/
,'런닝맨'/* SUMMARY*/
,'런닝맨.png'/* POSTER*/)
;
하나하나 넣어줄 수도 있지만 간편한 방법은 엑셀에서
이렇게 한번에 정리해서 넣어줄 수 있는데,
=$B$1 & "'CT-' || TO_CHAR(SYSDATE, 'YYYYMMDD') || LPAD(SEQ_" & $A$1 & "_PK.NEXTVAL, 6, '0'), " & "''"&TEXTJOIN("', '", FALSE, B4:E4) & "');"
CT- 이부분들만 각 테이블 명으로 바꿔주면 한번에 완성 할 수 있다.
INSERT INTO RATINGS(RATING_ID,USER_ID,RATING,DESCRIPTION,MOVIE_ID) VALUES ('RT-' || TO_CHAR(SYSDATE, 'YYYYMMDD') || LPAD(SEQ_RATINGS_PK.NEXTVAL, 6, '0'), 'MEMBER_1', '3', '그녀도 말할 수 있다. 진실을', 'MV-20240228-0000001');
INSERT INTO RATINGS(RATING_ID,USER_ID,RATING,DESCRIPTION,MOVIE_ID) VALUES ('RT-' || TO_CHAR(SYSDATE, 'YYYYMMDD') || LPAD(SEQ_RATINGS_PK.NEXTVAL, 6, '0'), 'MEMBER_2', '3.5', '일부러라도 더 나와야하는 결의 영화.', 'MV-20240228-0000001');
INSERT INTO RATINGS(RATING_ID,USER_ID,RATING,DESCRIPTION,MOVIE_ID) VALUES ('RT-' || TO_CHAR(SYSDATE, 'YYYYMMDD') || LPAD(SEQ_RATINGS_PK.NEXTVAL, 6, '0'), 'MEMBER_3', '4', '팩트', 'MV-20240228-0000001');
INSERT INTO RATINGS(RATING_ID,USER_ID,RATING,DESCRIPTION,MOVIE_ID) VALUES ('RT-' || TO_CHAR(SYSDATE, 'YYYYMMDD') || LPAD(SEQ_RATINGS_PK.NEXTVAL, 6, '0'), 'MEMBER_4', '3', '비련의 여주인공과 미련한 남자의 공식을 이 둘이 만든 것처럼 보인다.', 'MV-20240228-0000002');
INSERT INTO RATINGS(RATING_ID,USER_ID,RATING,DESCRIPTION,MOVIE_ID) VALUES ('RT-' || TO_CHAR(SYSDATE, 'YYYYMMDD') || LPAD(SEQ_RATINGS_PK.NEXTVAL, 6, '0'), 'MEMBER_5', '3.5', '내게 남은 사랑을 드릴게요 - 장혜리', 'MV-20240228-0000002');
INSERT INTO RATINGS(RATING_ID,USER_ID,RATING,DESCRIPTION,MOVIE_ID) VALUES ('RT-' || TO_CHAR(SYSDATE, 'YYYYMMDD') || LPAD(SEQ_RATINGS_PK.NEXTVAL, 6, '0'), 'MEMBER_2', '3.5', '나문희 짱짱', 'MV-20240228-0000002');
;
vo 패키지
DirectorsVO.java
-- Database의 DIRECTORS 테이블과
매핑되는 클래스
dao(Data Access Object) 패키지
DirectorsDao.java
-- java에서 Database를 연동하기 위한 클래스
-- Dao 클래스만 Database와 연동된다.
service 패키지
DirectorsService.java
-- Dao가 처리하는 쿼리
-- 업무흐름과 관계
-- 코드를 업무의 흐름대로 작성한다.
Handler.java
-- 사용자가 특정 기능을 호출
-- 감독을 신규로 추가해달라
-- 감독이 제작한 영화의 목록을 조회해달라 -> DirectorsService.java를 통해서 호출
-- handler는 서비스를 호출 / Dao는 호출x transaction을 쓰지 못함
(Handler.java)
|
(DirectorsService.java-transaction관리 / ActorsService.java)
|
(DirectorsDao.java / ActorsDao)
|
(DB)