관리 메뉴

거니의 velog

(4) 모델2 방식으로 효율적으로 개발하기 4_답변형 게시판 구현 1 본문

Java/Java_JSP Model2

(4) 모델2 방식으로 효율적으로 개발하기 4_답변형 게시판 구현 1

Unlimited00 2023. 9. 23. 12:18

4. 모델2로 답변형 게시판 구현하기

* 게시판 기능은 모든 웹 페이지의 기본 기능을 포함하기 때문에 게시판을 만들 수 있다면 모든 웹 페이지를 쉽게 만들 수 있다.

* 이번에 우리가 실습을 통해 구현할 답변형 게시판의 글 목록은 다음과 같은 형태이다.

* 부모 글이 목록에 나열되면 각 부모 글에 대해 답변 글(자식 글)이 계층 구조로 나열되어 표시된다. 그리고 답변 글에 대한 답변 글은 또 다시 계층 구조로 표시된다. 즉, 답변 글에 또 답변 글을 올릴 수 있는 기능을 하는 게시판이다.

* 다음 표는 답변형 게시판 글을 저장하는 테이블 컬럼이다. 게시판의 글을 작성하려면 회원이 로그인 상태여야 한다. 즉, 각 글에는 작성자 ID가 저장된다. 따라서 게시판 테이블의 ID 컬럼은 회원 테이블의 ID 컬럼에 대해 외래키를 속성으로 가진다.

<답변형 게시판 테이블(t_board) 구조>

no 컬럼 이름 속성 자료형 크기 유일키
여부
NULL 여부 기본값
1 articleNO 글 번호 number 10 Y N 기본키  
2 parentNO 부모 글 번호 number 10 N N   0
3 title 글 제목 varchar2 100 N N    
4 content 글 내용 varchar2 4000 N N    
5 imageFileNmae 이미지 파일 이름 varchar2 100 N      
6 writeDate 작성일 date   N N   sysdate
7 id 작성자 ID varchar2 20 N N 외래키  

* 또한 다음은 테이블 컬럼의 주요 속성들이다. 여기서 부모 글 번호는 답변을 단 글 번호를 의미한다. 자신이 최초 글이면 부모 글 번호는 0이다. ID는 작성자의 ID를 의미하고, ID 컬럼은 항상 t_member 테이블의 ID 컬럼을 참조한다.

<테이블의 주요 속성>

속성 컬럼 설명
글 번호 articleNO 글이 추가될 때마다 1씩 증가되면서 고유 값을 부여한다.
부모 글 번호 parentNO 답변을 단 부모 글의 번호를 나타낸다. 부모 글 번호가 0이면 자신이 부모 글이다.
첨부 파일 이름 imageFileName 글 작성 시 첨부한 이미지 파일 이름이다.
작성자 ID id 글을 작성한 작성자의 ID이다.

* 다음 그림을 보면 게시판 테이블이 회원 테이블에 대한 참조 관계를 확인할 수 있다.

* 우리가 익히 알고 있는 일반적인 게시판처럼 부모 글에 대한 답변 글을 계층 구조로 나타내려면 어떻게 해야 할까?

* 가장 쉬운 방법은 각 글을 테이블에 추가할 때 해당 글의 부모 글 번호(parentNO)를 같이 등록한 후 글 조회 시 부모 글 번호에 대해 계층형 SQL문을 수행하여 계층 구조로 표시하는 것이다.

* 먼저 SQL Developer를 이용해 다음과 같이 테이블을 생성하고 테스트 글을 테이블에 추가한다.

--------------------------------------------
DROP TABLE t_board CASCADE CONSTRAINTS;

-- 게시판 테이블을 생성한다.
CREATE TABLE t_board(
    articleNO number(10) primary key,
    parentNO number(10) default 0,
    title varchar2(500) not null,
    content varchar2(4000),
    imageFileName varchar2(100),
    writedate date default sysdate not null,
    id varchar2(10),
    CONSTRAINT FK_ID FOREIGN KEY(id) REFERENCES t_member(id) -- ID 컬럼을 회원 테이블의 ID 컬럼에 대해 외래키로 지정한다.
);

-- 테이블에 테스트 글을 추가한다.
INSERT INTO t_board (articleno, parentno, title, content, imagefilename, writedate, id) 
VALUES (1, 0, '테스트글 입니다.', '테스트글 입니다.', null, sysdate, 'hong');

INSERT INTO t_board (articleno, parentno, title, content, imagefilename, writedate, id) 
VALUES (2, 0, '안녕하세요.', '상품 후기 입니다.', null, sysdate, 'hong');

INSERT INTO t_board (articleno, parentno, title, content, imagefilename, writedate, id) 
VALUES (3, 2, '답변입니다.', '상품 후기에 대한 답변입니다.', null, sysdate, 'hong');

INSERT INTO t_board (articleno, parentno, title, content, imagefilename, writedate, id) 
VALUES (5, 3, '답변입니다.', '상품 좋습니다.', null, sysdate, 'lee');

INSERT INTO t_board (articleno, parentno, title, content, imagefilename, writedate, id) 
VALUES (4, 0, '김유신입니다.', '김유신 테스트글 입니다.', null, sysdate, 'kim');

INSERT INTO t_board (articleno, parentno, title, content, imagefilename, writedate, id) 
VALUES (6, 2, '상품 후기입니다...', '이순신씨의 상품 사용 후기를 올립니다!!!', null, sysdate, 'lee');

COMMIT; -- 추가 후 반드시 커밋을 해준다.
SELECT * FROM t_board;

* 본격적으로 코드를 작성하기에 앞서 답변형 게시판의 기능을 담당하는 클래스와 JSP의 MVC 구조를 살펴보자.

* 뷰와 컨트롤러는 그대로 JSP와 서블릿이 기능을 수행하지만 모델은 기존의 DAO 클래스 외에 BoardService 클래스가 추가된 것을 볼 수 있다.

* 지금까지 MVC로 기능을 구현할 때 모델 기능은 DAO 클래스가 수행했다. 하지만 실제로 개발을 할 때는 Service 클래스를 거쳐서 DAO 클래스의 기능을 수행하도록 구현한다. 그렇다면 모델에서 Service 클래스를 두는 이유가 무엇일까?

* DAO는 데이터베이스에 접근하는 기능을 수행하고 Service는 실제 프로그램을 업무에 적용하는 사용자 입장에서 업무 단위, 즉 트랜잭션(Transaction)으로 작업을 수행한다. 여기서 업무 단위란 '단위 기능'이라고도 하며, 사용자 입장에서 하나의 논리적인 기능을 의미한다.

* 웹 애플리케이션에서 일반적으로 묶어서 처리하는 단위 기능에는 다음과 같은 것들이 있다.

- 게시판 글 조회 시 해당 글을 조회하는 기능과 조회 수를 갱신하는 기능

- 쇼핑몰에서 상품 주문 시 주문 상품을 테이블에 등록한 후 주문자의 포인트를 갱신하는 기능

- 은행에서 송금 시 송금자의 잔고를 갱신하는 기능과 수신자의 잔고를 갱신하는 기능

* 다음 그림처럼 단위 기능 1은 자신의 기능을 수행할 때 DAO와 연동해 한 개의 SQL문으로 기능을 수행하지만 단위 기능2나 단위 기능3은 여러 SQL문을 묶어서 하나의 단위 기능을 수행한다.

* 실제 개발을 할 때에도 Service 클래스의 메서드를 이용해 큰 기능을 단위 기능으로 나눈 후 Service 클래스의 각 메서드는 자신의 기능을 더 세부적인 기능으로 하는 DAO의 SQL문들을 조합해서 구현한다. 이렇게 하는 이유는 유지보수나 시스템의 확장성 면에서 훨씬 유리하기 때문이다.

* 예를 들어 가장 흔한 게시판 기능은 크게 다음과 같이 나눌 수 있다.

- 새 글 쓰기

- 글 보기

- 글 수정하기

- 글 삭제하기

즉, 각 글과 관련해 세부 기능을 수행하는 SQL문들을 DAO에서 구현하고, Service 클래스의 단위 기능 메서드에서 DAO에 만들어 놓은 SQL문들을 조합해서 단위 기능을 구현하는 것이다.

* 다음 그림은 실제 답변형 게시판의 모델 구조를 나타낸 것이다.

보통 게시판의 Service 클래스 기능은 BoardDAO의 각 메서드의 SQL문 조합으로 기능을 구현한다. 그럼 지금부터 글 목록 보기, 새 글 쓰기, 글 수정하기, 글 삭제하기를 하나씩 차례대로 실습해 보자. 먼저 글 목록을 보는 기능부터 시작한다.