본문 바로가기
프로젝트/자바 빈과 JSP만을 사용한 게시판 만들기

8장 테이블과 시퀀스 생성

by IT여행자 2020. 5. 10.
728x90

데이터베이스를 접근할 때 사용하는 계정이나, 데이터베이스 클라이언트 툴에 대한 언급은 따로 하지 않습니다. 만약 필요하다면 댓글을 남겨 주시면 따로 포스팅하도록 하겠습니다. 이점 양지해 주시기 바랍니다.

 

프로젝트에서 사용하는 테이블과 시퀀스는 아래와 같습니다. 

 

  • 테이블 
    • board : 본문 글이 저장되는 테이블
    • boardAtt : 첨부 파일이 저장되는 테이블
  • 시퀀스
    • seq_board : board 테이블에서 사용하는 시퀀스
    • seq_boardAtt : boardAtt 테이블에서 사용하는 시퀀스

board 테이블 생성

CREATE TABLE BOARD
(
    SERIAL     NUMBER,
    MDATE      DATE,
    WORKER     VARCHAR2(20 BYTE),
    SUBJECT    VARCHAR2(200 BYTE),
    "CONTENT"  VARCHAR2(2000 BYTE),
    HIT        NUMBER,
    PWD        VARCHAR2(20 BYTE),
    PSERIAL    NUMBER
)

컬럼명에 대한 설명은 따로 필요 없을 듯싶습니다. 다만 PSERIAL의 용도는 댓글을 달았을 때 부모 글의 SERIAL이 누구인지를 저장하여 댓글을 계층형으로 가져오기 위해 필요한 컬럼입니다. 또한 무결성 제약 조건은 일절 사용하지 않았습니다.

 

boardAtt 테이블 생성

CREATE TABLE BOARDATT
(
    SERIAL      NUMBER,
    PSERIAL     NUMBER,
    ATTFILE     VARCHAR2(255 BYTE),
    ORIATTFILE  VARCHAR2(255 BYTE)
)

첨부된 파일명은 ORIATTFILE컬럼에 저장됩니다. 만약 첨부할 파일명이 서버 저장공간에 이미 존재할 가능성도 있기 때문에 파일이 업로드될 때 저장 파일명을 변경하여 저장할 것입니다. 이때 서버 저장공간에 저장되는 파일명은 ATTFILE 칼럼에 저장될 것입니다. 따라서 사용자에게 보이는 파일명은 ORIATTFILE 컬럼에 있는 정보이고 프로그램에서 저장, 삭제 등의 처리는 ATTFILE에 저장된 정보를 사용할 것입니다.

 

시퀀스 만들기

 

seq_board와 seq_boardAtt의 시퀀스는 모두 기본값으로 만들도록 하겠습니다.

CREATE SEQUENCE SEQ_BOARD
CREATE SEQUENCE SEQ_BOARDATT

 

board 테이블과 boardAtt 테이블의 관계도(ERD)

 

위의 두 개 테이블에 릴레이션을 설정하기 위해서는 제약조건이 필요하지만, 서두에서 밝힌바와 같이 제약 조건을 지정하지 않았기 때문에 정상적인 릴레이션을 걸 수는 없습니다. 따라서 그냥 개념도만 그려 보겠습니다.

 

 

관계도(ERD)

BOARD 테이블의 SERIAL 번호를 사용하여 BOARDATT 테이블의 PSERIAL 값을 조회하면 N건의 자료를 얻을 수 있고, BOARDATT테이블의 PSERIAL 값을 사용하여 BOARD 테이블의 SERIAL을 조회하면 1건의 자료를 얻을 수 있다는 의미의 그림입니다.

  • PK : 기본키라는 의미이며, 유일하면서 NULL 값이 아닌 컬럼을 의미합니다.
  • FK : 외래키라는 의미이며, 외부(BOARD.SERIAL)의 값을 참조하여 PSERIAL의 값이 만들어진다는 의미입니다. BOARD.SERIAL의 값이 없으면 BOARDATT.PSERIAL의 값은 만들어지지 않습니다(정상적인 릴레이션을 걸면).

샘플 데이터 입력

 

프로그램을 원활하게 진행하기 위해 BOARD 테이블에 몇 건의 데이터를 입력해 두겠습니다.

 

INSERT INTO BOARD(SERIAL, SUBJECT, WORKER, MDATE, CONTENT, PWD, HIT)
VALUES(SEQ_BOARD.NEXTVAL, '첫번째 제목입니다', 'HONG', SYSDATE, '첫번째 글입니다', '1', 0);

INSERT INTO BOARD(SERIAL, SUBJECT, WORKER, MDATE, CONTENT, PWD, HIT)
VALUES(SEQ_BOARD.NEXTVAL, '두번째 제목입니다', 'KIM', SYSDATE, '두번째 글입니다', '1', 0);

INSERT INTO BOARD(SERIAL, SUBJECT, WORKER, MDATE, CONTENT, PWD, HIT)
VALUES(SEQ_BOARD.NEXTVAL, '세번째 제목입니다', 'LEE', SYSDATE, '세번째 글입니다', '1', 0);

INSERT INTO BOARD(SERIAL, SUBJECT, WORKER, MDATE, CONTENT, PWD, HIT)
VALUES(SEQ_BOARD.NEXTVAL, '네번째 제목입니다', 'PARK', SYSDATE, '네번째 글입니다', '1', 0);

COMMIT;

 

이상으로 테이블 생성 및 시퀀스 생성과정을 마치도록 하겠습니다.