일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- EnhancedFor
- 다형성
- 정수형타입
- oracle
- 한국건설관리시스템
- 제네릭
- 집합_SET
- 인터페이스
- 메소드오버로딩
- 대덕인재개발원
- cursor문
- 컬렉션프레임워크
- 객체 비교
- 사용자예외클래스생성
- exception
- 생성자오버로드
- abstract
- 예외미루기
- 참조형변수
- 어윈 사용법
- 추상메서드
- GRANT VIEW
- 자동차수리시스템
- 오라클
- Java
- 예외처리
- 자바
- 환경설정
- NestedFor
- 컬렉션 타입
- Today
- Total
거니의 velog
(4) 모델2 방식으로 효율적으로 개발하기 4_답변형 게시판 구현 1 본문
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문 조합으로 기능을 구현한다. 그럼 지금부터 글 목록 보기, 새 글 쓰기, 글 수정하기, 글 삭제하기를 하나씩 차례대로 실습해 보자. 먼저 글 목록을 보는 기능부터 시작한다.
'Java > Java_JSP Model2' 카테고리의 다른 글
(6) 모델2 방식으로 효율적으로 개발하기 4_답변형 게시판 구현 3 (0) | 2023.09.23 |
---|---|
(5) 모델2 방식으로 효율적으로 개발하기 4_답변형 게시판 구현 2 (0) | 2023.09.23 |
(3) 모델2 방식으로 효율적으로 개발하기 3 (0) | 2023.09.23 |
(2) 모델2 방식으로 효율적으로 개발하기 2 (0) | 2023.09.22 |
(1) 모델2 방식으로 효율적으로 개발하기 1 (0) | 2023.09.22 |