수업내용/Web

[2022.11.11.금] 게시판 구현

주니어주니 2022. 11. 13. 23:55

 

 

 

 

1. 라이브러리 파일을 src/main/webapp/WEB-INF/lib 폴더에 추가한다.
ojdbc11.jar
ibatis-2.3.4.726.jar

2. ibatis 환경설정
src/main/resources "소스폴더"를 추가한다.
src/main/resources "소스폴더"에 META-INF/ibatis/mappers "폴더"를 추가한다.

src/main/resources/META-INF/ibatis/mappers 폴더에 매퍼파일을 추가한다.
boards.xml, reviews.xml
src/main/resources/META-INF/ibatis 폴더에 ibatis-config.xml 파일을 추가한다.
ibatis-config.xml 파일에 boards.xml과 reviews.xml 파일을 등록한다.

3. 패키지 생성 및 유틸리티 클래스 추가
com.sample.util 패키지를 추가한다.
com.sample.util 패키지에 SqlMapper.java와 StringUtils.java를 추가한다.
com.sample.vo 패키지를 추가한다.
Board.java와 Review.java를 추가한다.
com.sample.dao 패키지를 추가한다.
BoardDao.java와 ReviewDao.java를 추가한다.

4. JSP 구현하기
src/main/webapp 폴더에 jsp 파일을 추가한다.
home.jsp
list.jsp
form.jsp
register.jsp 
detail.jsp, [리뷰 : addReview.jsp, deleteReview.jsp]
delete.jsp
modifyform.jsp 
update.jsp

 

 

 

게시글 테이블과 리뷰 테이블
CREATE TABLE SAMPLE_BOARDS (
    BOARD_NO NUMBER(5) CONSTRAINT BOARD_NO_PK PRIMARY KEY,
    BOARD_TITLE VARCHAR2(255) NOT NULL,
    BOARD_WRITER VARCHAR2(100) NOT NULL,
    BOARD_READ_COUNT NUMBER(5) DEFAULT 0,
    BOARD_REVIEW_COUNT NUMBER(5) DEFAULT 0,
    BOARD_CONTENT VARCHAR2(200) NOT NULL,
    BOARD_DELETED CHAR(1) DEFAULT 'N',
    BOARD_CREATED_DATE DATE DEFAULT SYSDATE,
    BOARD_UPDATED_DATE DATE DEFAULT SYSDATE
);

CREATE TABLE SAMPLE_BOARD_REVIEWS (
    REVIEW_NO NUMBER(5) CONSTRAINT BOARD_REVIEW_NO_PK PRIMARY KEY,
    REVIEW_WRITER VARCHAR2(100) NOT NULL,
    REVIEW_CONTENT VARCHAR2(1000) NOT NULL,
    REVIEW_CREATED_DATE DATE DEFAULT SYSDATE,
    BOARD_NO NUMBER(5) CONSTRAINT REVIEW_BOARD_NO_FK REFERENCES SAMPLE_BOARDS (BOARD_NO)
);

게시글번호 시퀀스와 리뷰번호 시퀀스
CREATE SEQUENCE SAMPLE_BOARDS_SEQ START WITH 10000 NOCACHE;
CREATE SEQUENCE SAMPLE_REVIEWS_SEQ START WITH 10000 NOCACHE;




1. 게시글 등록
* 게시글 입력화면(form.jsp 실행결과)에서 등록버튼을 클릭하면 [ register.jsp ] 요청을 서버로 보낸다.
* register.jsp에서는 요청객체에서 제목, 작성자, 내용을 를 가져와서 게시글 정보를 등록시킨다.
* register.jsp에서는 재요청 URL(list.jsp)을 응답으로 보낸다.

2. 게시글 목록 조회
* 홈 화면에서 메뉴의 게시판 링크를 클릭하면 [ list.jsp ] 요청을 서버로 보낸다.
* 게시글 목록화면에서 페이지번호를 클릭하면 [ list.jsp?page=페이지번호 ] 요청을 서버로 보낸다
* list.jsp에서는 요청객체에서 페이지번호를 조회하고, 페이지번호에 맞는 게시글 목록을 조회해서 화면에 출력한다.
* list.jsp에서는 전체 게시글 갯수를 조회하고, 페이지범위를 계산해서 페이지번호를 출력한다.

3. 게시글 상세 조회
* 리스트 화면에 게시글 제목을 클릭하면 [ detail.jsp?no=글번호 ] 요청을 서버로 보낸다.
* detail.jsp에서는 요청객체에서 글 번호를 가져오고, 글번호에 해당하는 게시글 정보를 조회한다.
   4. 게시글 조회수 증가
* detail.jsp에서는 게시글 정보의 조회수를 1증가시키고, 테이블에 변경된 내용을 반영시킨다.
* detail.jsp에서는 조회된 게시글 정보를 출력한다.
   8. 리뷰 조회하기
* detail.jsp에서는 게시글번호에 해당하는 리뷰목록을 조회해서 화면에 출력한다.

5. 게시글 삭제
* 상세화면에서 삭제버튼을 클릭하면 [ delete.jsp?no=글번호 ] 요청을 서버로 보낸다.
* delete.jsp에서는 요청객체에서 글 번호를 가져오고, 글번호에 해당하는 게시글 정보를 조회한다.
* delete.jsp에서는 조회된 게시글 정보의 deleted값을 "Y"로 변경하고 테이블에 변경된 내용을 반영시킨다.
* delete.jsp에서는 재요청 URL(list.jsp)을 응답으로 보낸다.

6. 게시글 수정하기
* 상세화면에 수정버튼을 클릭하면 [ modifyform.jsp?no=글번호] 요청을 서버로 보낸다.
* modifyform.jsp에서 요청책체서 글번호를 가져오고, 글번호에 해당하는 게시글 정보를 조회한다
* 수정폼의 입력요소에 게시글 정보를 출력한다.
* 수정폼의 수정버튼을 클릭하면 [ update.jsp ] 요청을 서버로 보낸다.
* update.jsp에서는 요청객체에서 글번호, 제목, 작성자, 내용을 가져온다.
* update.jsp에서는 글번호에 해당하는 게시글 정보를 조회한다.
* update.jsp에서는 조회된 게시글 정보의 제목, 작성자, 내용을 요청객체에 조회한 값으로 변경한다.
* update.jsp에서는 테이블에 변경된 내용을 반영시킨다.
* update.jsp에서는 재요청 URL(detail.jsp?no=글번호)을 응답으로 보낸다.

7. 리뷰 등록하기
* detail.jsp의 리뷰 입력폼에 게시글번호을 hidden 필드에 추가한다.
* detail.jsp의 모달창의 리뷰등록 버튼을 클릭하면 [ addReview.jsp ]로 요청을 보낸다.
* addReview.jsp에서는 요청객체에서 게시글번호, 작성자, 내용을 가져온다.
* addReview.jsp에서는 리뷰정보를 테이블에 등록시킨다.
* addReview.jsp에서는 게시글번호에 해당하는 게시글 정보를 조회해서 리뷰 갯수를 1증가시키고 변경된 정보를 테이블에 반영한다.
* addReview.jsp에서는 재요청 URL(detail.jsp?no=글번호)을 응답으로 보낸다.

9. 리뷰 삭제하기
* detail.jsp의 리뷰 목록에서 휴지통아이콘을 클릭하면 [ deleteReview.jsp?boardNo=게시글번호&reviewNo=리뷰번호 ] 요청을 서버로 보낸다. 
* deleteReview.jsp에서는 요청객체에서 게시글번호와 리뷰번호를 가져온다.
* deleteReview.jsp에서는 리뷰번호에 해당하는 리뷰정보를 삭제한다.
* deleteReview.jsp에서는 게시글번호에 해당하는 게시글 정보를 조회해서 리뷰 갯수를 1감소시키고 변경된 정보를 테이블에 반영한다.
* deleteReview.jsp에서는 재요청 URL(detail.jsp?no=글번호)을 응답으로 보낸다.

 

 

 

board_read_count
게시글 조회수
게시글 상세화면을 요청할 때마다 1씩 증가되는 컬럼이다.
detail.jsp에서 게시글 상세보기 요청이 올 때마다 board_read_count값을 1씩 증가시킨다.

detail.jsp의 코드
1. 요청객체에서 게시글 번호를 조회한다.
2. 게시글 번호에 해당하는 게시글 정보를 조회한다. Board board = boardDao.getBoardByNo(게시글번호)
+3. 게시글 정보에서 게시글 조회수를 1증가시킨다.  board.setReadCount(board.getReadCount() + 1)
+4. 변경된 게시글 정보를 테이블에 반영시킨다.   boardDao.updateBoard(board);
5. 게시글 정보를 출력한다.   
*6. 게시글 번호로 리뷰테이블에서 해당 게시글의 리뷰를 모드 조회한다. List<Review> reviewList = reviewDao.getReviewsByBoardNo(게시글번호)
*7. 리뷰리스트를 출력한다.

board_review_count
게시글의 댓글갯수
게시글에 대한 댓글이 추가되거나 삭제될 때마다 1씩 증감되는 컬럼이다.

addReview.jsp의 코드
1. 요청객체에서 게시글번호, 리뷰작성자, 리뷰내용을 조회
2. 리뷰 객체를 생성해서 게시글번호, 리뷰작성자, 리뷰내용을 저장한다.
3. 리뷰 객체를 ReviewDao의 insertReview(Review review)에 전달해서 저장시킨다.
4. 게시글번호로 게시글 정보를 조회한다.
5. 게시글 정보의 리뷰갯수를 1증가시킨다.
6. 변경된 게시글 정보를 테이블에 반영시킨다.
7. 재요청 URL을 응답을 보낸다. 
response.sendRedirect("detail.jsp?no=" + 게시글번호);

deleteReview.jsp의 코드
1. 요청객체에서 게시글번호, 리뷰번호를 조회
2. 리뷰번호에 해당하는 리뷰정보를 삭제한다. delete 구문 실행
3. 게시글번호로 게시글 정보를 조회한다.
4. 게시글 정보의 리뷰갯수를 1감소시킨다.
5. 변경된 게시글 정보를 테이블에 반영시킨다.
6. 재요청 URL을 응답을 보낸다. 
response.sendRedirect("detail.jsp?no=" + 게시글번호);

board_deleted
게시글 삭제여부 

delete.jsp의 코드
1. 요청객체에 게시글번호 조회
3. 게시글번호로 게시글 정보를 조회한다.
3. 게시글 정보의 삭제여부를 "Y"로 변경한다.
4. 변경된 게시글 정보를 테이블에 반영시킨다.
6. 재요청 URL을 응답을 보낸다. 
response.sendRedirect("list.jsp);

board_deleted의 활용
board_deleted의 값이 'N'인 게시글만 조회한다.
게시글 조회
select 
*
from (
select row_number() over (order by board_no desc) row_numbers,
board_no, .....
from sample_boards
where board_deleted = 'N')
where
row_numbers between #begin# and #end#

게시글 갯수 조회
select count(*)
from sample_boards
where board_deleted = 'N'