코딩 자율학습단/학습 일지
[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