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
'코딩 자율학습단 > 학습 일지' 카테고리의 다른 글
[DAY 17] 댓글 목록 View 페이지 구현 및 모델 등록하기 (0) | 2024.08.21 |
---|---|
[DAY 16] 댓글 REST API - Create, Update, Delete 구현 (0) | 2024.08.20 |
[DAY 14] 댓글 CRUD : InvalidDataAccessApiUsageException 에러 (0) | 2024.08.18 |
[DAY 13] JUnit5 테스트 코드 작성 (0) | 2024.08.18 |
[DAY 12] 컨트롤러 쪼개기 : 서비스 계층 구현과 트랜잭션 (0) | 2024.08.17 |