코딩 자율학습단/학습 일지

[DAY 15] 댓글 REST API - 서비스, 컨트롤러, Read 구현

young604 2024. 8. 19. 16:55
728x90

어제 댓글 기능을 위해 엔티티와 리파지터리를 만들었으므로 이제 남은 건 DTO, REST 컨트롤러, 서비스다.

API 주소 설계

GET /articles/articleId/comments

POST /articles/aritcleId/comments

PATCH /comments/id

DELECT /comments/id

 

댓글 조회

1. 컨트롤러

2. 서비스

3. dto

순서대로 만들면 된다

이때 서비스에서 for문으로 댓글 엔티티를 하나씩 꺼내서 dto로 변환하는데 이를 스트림 문법으로 리팩토링하는 구문이 나온다.

    public List<CommentDto> comments(Long articleId) {
        // 1. 댓글 조회
        List<Comment> comments = commentRepository.findByArticleId(articleId);
        // 2. 엔티티 -> DTO 변환
        List<CommentDto> dtos = new ArrayList<CommentDto>();
        for (int i = 0; i < comments.size(); i++) {
            Comment c = comments.get(i);
            CommentDto dto = CommentDto.createCommentDto(c);
            dtos.add(dto);
        }
        // 3. 결과 반환
        return dtos;
 }

이를 스트림문법으로 변환하면 주석 1, 2 모두 필요없이 return문에 한번에 작성할 수 있게 된다.

    public List<CommentDto> comments(Long articleId) {
        return commentRepository.findByArticleId(articleId) // 댓글 엔티티 목록 조회
                .stream() // 댓글 엔티티 목록을 스트림으로 변환
                .map(comment -> CommentDto.createCommentDto(comment)) // 엔티티를 DTO로 매핑
                .collect(Collectors.toList()); // 스트림을 리스트로 변환
    }

스트림으로 변환한 엔티티를 DTO로 매핑할 때 쓰는 map() 메소드는 스트림의 각 요소(comment)를 꺼내 수행한 결과로 매핑해주는 역할을 한다.

그 이후, 매핑한 결과값은 steam<CommentDto> 타입이다. 하지만 해당 메서드의 반환형은 List여야 하므로 collect() 메서드를 이용하여 스트림을 리스트로 변환해준다.

api 요청을 쏴보면 결과값이 잘 나온당!

728x90