일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- spring 프로젝트
- 스프링 게시판
- 회원가입 기능
- 스프링 게시판 구현
- 쇼핑몰 프로젝트
- Bcrypt
- 스프링 HikariCP
- 로그아웃 기능 구현
- 스프링 쇼핑몰 프로젝트
- 정규표현식
- ResponseEntity
- oracle 설치방법
- spring 쇼핑몰
- BCrypt 적용
- 파일 업로드
- 스프링 메일 전송
- arraylist
- 스프링 이미지
- 쇼핑몰 포트폴리오
- 스프링 업로드
- 인증번호 전송
- 로그인 기능
- 스프링 쇼핑몰
- 삭제 구현
- 스프링 파일 삭제
- 스프링 프로젝트 설정
- 스프링 프로젝트
- 스프링 포트폴리오
- 스프링 프로젝트 기본 설정
- 이미지 출력
- Today
- Total
Kim VamPa
[Spring][쇼핑몰 프로젝트][47] 댓글 페이징 - 1 본문
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188
목표
댓글 페이징 기능 구현
'상품 상세 페이지에' 페이징 된 등록 댓글 리스트 구현을 목표로 합니다.
순서
1. 개요
2. DTO
3. Mapper
4. Service
5. Controller
6. 정리
1. 개요
"상품 상세 페이지"에 등록되어 잇는 댓글 리스트를 볼 수 있도록 구현할 것입니다. 그리고 10개 이상의 댓글이 존재하는 경우 페이징을 적용해서 댓글 페이지 버튼을 통해 10개 단위의 댓글들을 볼 수 있도록 구현할 것입니다.
큰 흐름에서는 기존해 하던 페이징 구현과 동일합니다. 하지만 기존 구현과는 크게 다른 점이 있는데, 기존 구현의 경우 서버에서 페이징 된 뷰를 반환했는데, 댓글 페이징의 경우는 단순히 서버로부터 댓글과 페이징 정보를 전달받아서 뷰에서 동적으로 댓글 태그들을 만들어 내야 된다는 점입니다.
이번 포스팅에서는 서버측 구현을 다음 포스팅에서는 뷰 측 구현을 하겠습니다.
2. DTO
기존 페이징에서 사용했던 Criteria와 PageDTO 클래스를 그대로 사용할 것입니다. 단 critera 클래스에는 변수를 하나 추가해줄 것입니다.
Criteria
페이징의 조건 데이터를 담을 DTO객체는 기존에 작성 해둔 Criterial 클래스를 그대로 사용할 것입니다. 단 댓글 페이징에서는 bookId 조건이 필요로 하기 때문에 기존 Criteria 클래스에 bookID변수를 추가해줍니다.
/* 상품 번호(댓글 기능에서 사용) */
private int bookId;
추가 해준 변수의 getter/setter 메서드를 추가해주고 toString 메서드를 새로 추가한 변수도 포함하도록 수정해주었습니다.
ReplyPageDTO
서버에서는 두 개의 정보를 만들어서 뷰로 전달해주어야 합니다. 하나는 10개로 페이징 된 '댓글 정보 리스트'를 다른 하나는 회원이 보고자 하는 '페이지 정보'입니다. 원래라면 뷰에서는 두 개의 정보를 얻기 위해서 가각 두 번의 ajax 요청을 해야겠지만 우리는 한 번의 ajax 요청으로 두 개의 정보를 뷰로 반환할 수 있도록, 두 개의 정보를 담는 그릇이 될 새로운 타입이 될 DTO클래스를 생성해주고자 합니다.(Controller 부분에서 한번 더 설명은 할 것이지만 서버에서 뷰로 전송이 될 때 이 객체는 JSON으로 변환되어서 뷰로 전달됩니다.)
com.vam.model 패키지에 ReplyPageDTO 클래스를 생성합니다.
생성한 클래스에 페이징 된 댓글 리스트 정보와 페이지 정보를 저장할 변수를 선언합니다.
List<ReplyDTO> list;
PageDTO pageInfo;
추가 한 두 변수의 getter/setter 메서드와 toString 메서드를 추가합니다.
3. Mapper
ReplyMapper 인터페이스
com.vam.mapper 패키지의 ReplyMapper 클래스에 '페이징 댓글 정보'와 '댓글 총 개수(페이지 버튼 정보 생성에 필요)'를 만들어내는 2개의 Mapper 메서드 선언부를 작성합니다.
/* 댓글 페이징 */
public List<ReplyDTO> getReplyList(Criteria cri);
/* 댓글 총 갯수(페이징) */
public int getReplyTotal(int bookId);
ReplyMapper.xml
인터페이스에서 선언한 메서드가 실행할 쿼리를 작성합니다.
Oracle
<!-- 댓글 페이징 -->
<select id="getReplyList" resultType="com.vam.model.ReplyDTO">
<![CDATA[
select * from(
select rownum as rn, replyId, bookId, memberId, content, rating, regDate
from vam_reply
where rownum <= #{pageNum} * #{amount} and bookId = #{bookId}
order by regDate desc
)
where rn > (#{pageNum} -1) * #{amount}
]]>
</select>
<select id="getReplyTotal" resultType="int">
select count(*)
from vam_reply
where bookId = #{bookId}
</select>
MysQL
<!-- 댓글 페이징 -->
<select id="getReplyList" resultType="com.vam.model.ReplyDTO">
select replyId, bookId, memberId, content, rating, regDate
from vam_reply
where bookId = #{bookId}
order by regDate desc
limit #{skip}, #{amount}
</select>
<select id="getReplyTotal" resultType="int">
select count(*)
from vam_reply
where bookId = #{bookId}
</select>
4. Service
페이징 정보를 만들어내는 Service 메서드는 앞서 만들어준 2개의 메서드를 호출하여 ReplyPageDTO 객체에 담아 준 후, 그 객체를 반환해주는 로직을 가질 것입니다.
ReplyService 인터페이스
com.vam.service 패키지의 ReplyService 인터페이스에 댓글 페이징 정보(페이지 정보 포함)를 만들어 내는 메서드 선언 부를 작성합니다.
/* 댓글 페이징 */
public ReplyPageDTO replyList(Criteria cri);
ReplyServiceImpl
com.vam.service 패키지의 ReplyServiceImpl 클래스에 인터페이스에서 선언한 메서드를 오버라이딩 합니다. 구현부에는 '페이징 댓글 정보', '페이지 총 개수'를 반환해주는 Mapper 메서드를 호출하여 반환 받은 값을 ReplyPageDTO 객체에 담은 후, 객체를 반환 해주는 코드를 작성합니다.
- '페이징 댓글 정보'는 ReplyPgaeDTO 변수에 바로 대입
- '페이지 총 개수'의 경우 PageDTO객체를 생성되는 데 사용된 후, PageDTO객체가 ReplyPageDTO의 변수에 대입
@Override
public ReplyPageDTO replyList(Criteria cri) {
ReplyPageDTO dto = new ReplyPageDTO();
dto.setList(replyMapper.getReplyList(cri));
dto.setPageInfo(new PageDTO(cri, replyMapper.getReplyTotal(cri.getBookId())));
return dto;
}
5. Controller
com.vam.controller 패키지의 ReplyController에 댓글 페이징 정보(페이지 정보 포함)를 요청을 처리하는 URL 매핑 메서드를 작성합니다.
- 반환 타입으로 지정한 ReplyPageDTO가 JSON으로 변환되어 뷰에 전송되도록 @GetMapper 어노테이션의 produces 속성 값으로 JSON 지정 코드를 작성해주었습니다. (이전에 추가 해준 JACKSON 라이브러리가 객체를 JSON으로 변환시켜 줍니다.)
/* 댓글 페이징 */
@GetMapping(value="/list", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ReplyPageDTO replyListPOST(Criteria cri) {
return replyService.replyList(cri);
}
6. 정리
구현한 코드가 동작시 큰 흐름은 다음과 같습니다.
- 뷰에서 댓글 페이지 정보를 요청한다. bookId와 페이징 정보(요청 페이지(pageNum), 표시 량(amount))를 서버로 전송한다.
- "reply/list" URL 매핑 메서드가 동작한다.
- 댓글 페이징 정보를 만들어내는 Service 메서드를 호출한다.
- Service 메서드는 '댓글 페이징 정보'와 '댓글 총 개수'를 반환 해주는 Mapper 메서드 2 개를 호출 한다. '댓글 총 갯수'
값은 '페이지 정보'인 담기는 PageDTO 객체를 만드는 데 사용이 된다.
- Service 메서드에서 ReplyPageDTO 객체 생성하여 '댓글 페이징 정보'와 '페이지 정보'를 담은 후 해당 객체를 반환한다.
- Controller은 반환받은 ReplyPageDTO 뷰로 전송한다.
- ReplyPageDTO는 JSON 데이터로 변환되어 뷰로 전송한다.
REFERENCE
DATE
- 2020.01.11
'스프링 프레임워크 > 쇼핑몰 프로젝트' 카테고리의 다른 글
[Spring][쇼핑몰 프로젝트][47] 댓글 페이징 - 3 (0) | 2022.01.13 |
---|---|
[Spring][쇼핑몰 프로젝트][47] 댓글 페이징 - 2 (0) | 2022.01.12 |
[Spring][쇼핑몰 프로젝트][46] 댓글 체크 - 2 (0) | 2022.01.10 |
[Spring][쇼핑몰 프로젝트][46] 댓글 체크 - 1 (5) | 2022.01.07 |
[Spring][쇼핑몰 프로젝트][46] 댓글 등록 - 3 (0) | 2022.01.06 |