1. 댓글 서비스 계층의 구현
댓글의 엔티티 처리가 끝났다면 서비스 계층을 구현
Service 패키지에 ReplyService 인터페이스와 ReplyServiceImpl 클래스를 추가
1) 댓글 등록 처리
👩🏻💻 댓글 등록은 게시물과 비슷하게 구현. ReplyService 인터페이스에 메서드를 정의
public interface ReplyService {
Long register(ReplyDTO replyDTO);
}
👩🏻💻 ReplyServiceImpl은 ReplyRepositoy와 ModelMapper를 주입받아서 구현
@Service
@RequiredArgsConstructor
@Log4j2
public class ReplyServiceImpl implements ReplyService {
private final ReplyRepository replyRepository;
private final ModelMapper modelMapper;
@Override
public Long register(ReplyDTO replyDTO) {
Reply reply = modelMapper.map(replyDTO, Reply.class);
Long rno = replyRepository.save(reply).getRno();
return rno;
}
}
댓글 등록 테스트
📍 test 폴더의 service 패키지에 ReplyServiceTests 클래스를 추가해서 ReplyService 기능들의 동작에 문제가 없는지 확인
@SpringBootTest
@Log4j2
class ReplyServiceImplTest {
@Autowired
private ReplyService replyService;
@Test
public void registerReply() {
log.info(replyService.getClass().getName());
ReplyDTO replyDTO = ReplyDTO.builder()
.bno(90L)
.replyText("test...")
.replyWriter("test...")
.build();
replyService.register(replyDTO);
}
}
✓ 실행 결과에 정상적으로 SQL이 동작하고 새로운 댓글이 insert되는지 확인. 실행 로그에는 새로운 댓글의 rno 값이 출력
2) 댓글 조회 / 수정 / 삭제 / 목록
👩🏻💻 댓글을 수정하는 경우에는 Reply 객체에서 replyText만을 수정할 수 있으므로 Reply를 수정
public class Reply extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long rno;
@ManyToOne(fetch = FetchType.LAZY)
private Board board;
private String replyText;
private String replyWriter;
public void changeText(String text) {
this.replyText = text;
}
}
👩🏻💻 ReplyService 인터페이스에 CRUD 기능들을 선언
public interface ReplyService {
Long register(ReplyDTO replyDTO);
ReplyDTO read(Long rno);
void modify(ReplyDTO replyDTO);
void remove(Long rno);
}
👩🏻💻 ReplyServiceImpl에서 register()를 제외한 기능들은 다음과 같이 구현
@Override
public ReplyDTO read(Long rno) {
Optional<Reply> replyOptional = replyRepository.findById(rno);
Reply reply = replyOptional.orElseThrow();
return modelMapper.map(reply, ReplyDTO.class);
}
@Override
public void modify(ReplyDTO replyDTO) {
Optional<Reply> replyOptional = replyRepository.findById(replyDTO.getRno());
Reply reply = replyOptional.orElseThrow();
reply.changeText(replyDTO.getReplyText()); // 댓글의 내용만 수정 가능
replyRepository.save(reply);
}
@Override
public void remove(Long rno) {
replyRepository.deleteById(rno);
}
3) 특정 게시물의 댓글 목록 처리
👩🏻💻 댓글 서비스의 가장 중요한 기능은 특정한 게시물의 댓글 목록을 페이징 처리한 것
ReplyService에 getListOfBoard()를 추가
PageResponseDTO<ReplyDTO> getListOfBoard(Long bno, PageRequestDTO pageRequestDTO);
👩🏻💻 ReplyServiceImpl에서는 PageRequestDTO를 이용해서 페이지 관련 정보를 처리하고 ReplyRepository를 통해서 특정 게시물에 속하는 Page<Reply>를 구함. 실제 반환되어야 하는 타입은 Reply가 아니라 ReplyDTO 타입이므로 ReplyServiceImpl에서는 이를 변환하는 작업이 필요
@Override
public PageResponseDTO<ReplyDTO> getListOfBoard(Long bno, PageRequestDTO pageRequestDTO) {
Pageable pageable = PageRequest.of(pageRequestDTO.getPage() <= 0 ? 0 : pageRequestDTO.getPage() - 1,
pageRequestDTO.getSize(), Sort.by("rno").ascending());
Page<Reply> replies = replyRepository.listOfBoard(bno, pageable);
List<ReplyDTO> replyDTOList = replies.getContent().stream().map(reply ->
modelMapper.map(reply, ReplyDTO.class)).collect(Collectors.toList());
return PageResponseDTO.<ReplyDTO>withAll()
.pageRequestDTO(pageRequestDTO)
.dtoList(replyDTOList)
.total((int)replies.getTotalElements())
.build();
}
[ 내용 참고 : IT 학원 강의 ]
'Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] 비동기처리와 Axios, 댓글 목록 처리 (1) | 2024.06.03 |
---|---|
[Spring Boot] 댓글 컨트롤러 계층 구현 (0) | 2024.06.01 |
[Spring Boot] 다대일ManyToOne 연관관계, 댓글 수 반영 화면 구현 (0) | 2024.05.31 |
[Spring Boot] REST 방식의 댓글 처리 준비 (0) | 2024.05.30 |
[Spring Boot] AJax와 JASON · 댓글 기능 구현 준비 (0) | 2024.05.30 |