tbl_board 테이블에 replyCnt 칼럼을 추가한다 (게시물 수가 많으면 시간이 오래 걸림)
기존에 댓글이 존재했다면 replyCnt에 반영해 두어야 하므로 아래의 쿼리를 실행한다.
1. 프로젝트 수정
데이터베이스가 수정되었으므로, BoardVO 클래스와 MyBatis의 SQL, BoardService 등을 수정해 줄 필요가 있다. 이전 파트에서 작성했던 'ex03' 프로젝트를 수정한느 형태로 적용한다!
1-1. BoardVO, BoardMapper 수정
- BoardVO
댓글의 숫자를 의미하는 인스턴스 변수를 하나 추가해야 한다.
- BoardMapper 인터페이스에는 새롭게 replyCnt 를 업데이트 하는 메서드를 추가해야 한다.
public void updateReplyCnt(@Param("bno") Long bno, @Param("amount") int amount);
새로 추가된 updateReplyCnt()는 해당 게시물의 번호인 bno와 증가나 감소를 의미하는 amount 변수에 파라미터를 받을 수 있도록 처리한다. 이것은 댓글이 등록되면 1이 증가하고, 댓글이 삭제되면 1이 감소하기 때문이다. MyBatis의 SQL을 처리하기 위해서는 기본적으로 하나의 파라미터 타입을 사용하기 때문에 위와 같이 2개 이상의 데이터를 전달하려면 @Param 이라는 어노테이션을 이용해서 처리할 수 있다.
댓글이 추가되면 반정규화된 tbl_board 테이블에 replycnt 칼럼이 업데이트되어야 하기 때문에 BoardMapper.xml에 updateReplyCnt 구문을 추가해야만 한다.
- BoardMapper.xml 수정
BoardMapper.xml의 게시물의 목록을 처리하는 부분에서는 새롭게 추가된 replycnt 칼럼을 가져오도록 인라인뷰 내에 추가하고, 바깥쪽 select에도 추가한다.
1-2. ReplyServiceImpl의 트랜잭션 처리
ReplyServiceImpl 클래스는 기존에는 ReplyMapper 만을 이용했지만, 반정규화 처리가 되면서 BoardMapper를 같이 이용해야 하는 상황이 되었다. ReplyServiceImpl에서 새로운 댓글이 추가되거나 삭제되는 상황이 되면 BoardMapper와 ReplyMapper를 같이 이용해서 처리하고, 이 작업은 트랜잭션으로 처리되어야 한다.
기존 프로젝트인 org.zerock.service 패키지의 ReplyServiceImpl 클래스를 수정한다.
- ReplyServiceImpl 클래스의 일부
기존과 달라지는 점은 기존에는 ReplyMapper만을 주입하기 때문에 스프링 4.3부터 지원하는 자동주입을 이용할 수 있었지만 추가적으로 BoardMapper를 이용하면서 자동 주입 대신 @Setter를 통한 주입이 이루어진다는 점이다.
ReplyServiceImpl의 댓글 등록과 삭제를 담당하는 메서드는 @Transactional의 처리가 필요하다.
- ReplyServiceImpl 클래스의 일부
댓글 등록의 경우에는 파라미터로 전달받은 ReplyVO 내에 게시물의 번호가 존재하므로 이를 이용해서 댓글을 추가한다. 댓글의 삭제는 전달되는 파라미터가 댓글의 번호인 rno만을 받기 때문에 해당 댓글의 게시물을 알아내는 과정이 필요하다. (파라미터로 게시물의 번호 bno 까지 받을 수 있다면 좋겠지만 그럴 경우에는 ReplyController 까지 같이 수정되야 한다.)
1-3. 화면 수정
BoardController나 ReplyController 자체는 크게 수정할 것이 없지만, 게시물의 목록 화면에서는 댓글의 숫자가 출력될 수 있도록 수정해 줄 필요가 있다.
views 폴더 내 board/list.jsp 파일의 일부에 댓글의 숫자를 반영한다.
- list.jsp 의 일부
'Spring' 카테고리의 다른 글
@GetMapping, @RequestMapping, @DeleteMapping 등이 import 안되는 에러 (0) | 2020.01.06 |
---|---|
[30] 파일 업로드 처리 - 파일 업로드 방식 (1) | 2020.01.06 |
ERROR: org.springframework.test.context.TestContextManager - Caught exception while allowing (3) | 2020.01.05 |
[28] AOP와 트랜잭션 - 스프링에서 트랜잭션 관리 (0) | 2020.01.05 |
[27] AOP와 트랜잭션 - AOP 이론과 예제 실습 (0) | 2020.01.05 |