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 학원 강의 ] 

+ Recent posts