Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- DB replication
- 산업은행it
- CPU스케줄링
- fatch
- 백준
- 외래키제약조건위반
- 프로그래머스
- 운영체제
- springboot
- SpringBatch
- 프로젝트
- 코테
- 파이널프로젝트
- 트리맵
- 그래프탐색
- CS
- 2178
- 구현
- BFS
- 산업은행청년인턴
- 트리셋
- findById
- 폰켓몬
- Spring JPA
- JPA
- 컴퓨터구조
- flyway
- 스케일아웃
- 해시
- 임베디드타입
Archives
- Today
- Total
나 JAVA 봐라
컨트롤러와 서비스에서 Embedded PK를 어떻게 교환? 본문
https://yejin-code.tistory.com/10
Embeddable Type
review 엔티티에 이어, review에 대한 반응을 남기는 기능을 구현하기 위해 Embedded Type에 대해 알아보게 되었다. review 반응을 저장하기 위한 review_reaction DB를 새로 구상해보았더니 필드를 아래와 같
yejin-code.tistory.com
(Embedded Type에 대한 포스팅은 위의 링크를 참고하세요!)
Embedded PK 엔티티에 대한 Dto를 생성하지 않았다.
그래서 컨트롤러에서 Dto 대신 엔티티를 import 하게 되었다.
Embedded PK에 한해서만 컨트롤러에서 엔티티를 import 하는 것이 기존의 방식과 어떻게 다른지 정리했다.
- PK에 대한 Dto를 생성했을 때
- 장) 컨트롤러에서 엔티티를 import 하지 않아도 된다.
- 단)
- 컨트롤러: userId, reviewId를 받아서 PK Dto 생성
- 컨트롤러: PK Dto와 request로 받은 reactionType으로 reviewReactionDto 생성
- 서비스: reviewReactionDto를 받아서 엔티티로 변환 후 DB 저장
- PK에 대한 Dto를 생성하지 않았을 때
- 장) 코드가 간결해진다
- 컨트롤러: userId, reviewId로 PK 엔티티 생성
- 컨트롤러: PK 엔티티와 reactionType 받아서 reviewReaction 엔티티 생성
- 컨트롤러: reviewReaction 엔티티를 Dto로 변환한 후 서비스로 넘김 (→ 굳이 엔티티를 또 DTO로 변환해야하나? 싶은 생각)
- 서비스: Dto를 받아서 엔티티로 변환 후 DB 저장
- 단) 기존의 방식과 달라서 통일성이 없다.
- 장) 코드가 간결해진다
- 먼저 Embedded PK는 userId와 reviewId를 갖는다.
- 기존의 컨트롤러에서는 Dto만 import하도록 컨벤션을 정했기 때문에,
- Embedded PK에 대한 Dto는 생성하지 않았다.
해당 부분에 대해 논의해본 결과
- 기존의 Embedded PK를 사용하지 않는 컨트롤러에서 서비스와 Dto 값을 교환하고 있지만 Id 값 정도는 따로 담지 않고 교환하고 있다.
- 예시 코드들
// Controller 레이어
@Operation(summary = "리뷰 조회", description = "리뷰 수정을 위해 리뷰 id로 기존에 있는 값을 조회하여 정보를 가져온다.")
@GetMapping("/review/{reviewId}")
public ApiResponse<Object> getReview(@PathVariable Long reviewId) {
ReviewDto reviewDto = reviewService.getReviewDtoById(reviewId);
// 나머지 코드들
}
// Service 레이어
@Transactional(readOnly = true)
public ReviewDto getReviewDtoById(Long id) {
Review review = reviewRepository.findById(id)
.orElseThrow(() -> new BusinessException(ReviewErrorCode.NOT_FOUND));
// 나머지 코드들
}
2. Embedded PK의 경우에는 userId, reviewId만 가지고 있다. 즉 담고 있는 값이 Id 뿐이다.
3. Id 값 같은 경우에는 기존에 Dto에 담지않고 교환했으니, Embedded PK도 Dto를 따로 두지 않고 바로 엔티티로 담아서 값을 넘기는 것이 기존의 방식과 더 맞다. 그리고 Embedded PK도 Dto로 감싸면 너무 코드가 더러워진다 !
그래서 아래와 같이 컨트롤러를 작성했다.
@Operation(summary = "리뷰 반응 생성", description = "리뷰에 대한 반응을 생성한다.")
@PostMapping("review/reaction")
public ApiResponse<Object> createReviewReaction(@RequestBody ReviewReactionRequest request) {
ReviewReactionPK reactionPK = ReviewReactionPK.of(NumberConstants.USER_ID, request.reviewId());
ReviewReaction reviewReaction = ReviewReaction.of(reactionPK, request.reactionType());
ReviewReactionDto reviewReactionDto = ReviewReactionDto.from(reviewReaction);
reviewReactionService.createReviewReaction(reviewReactionDto);
// 나머지 코드들,,
}
⇒ 한 줄 요약: Embedded PK는 따로 Dto를 두지 말자. (가 우리 팀 결론임)
'Spring > Spring Boot' 카테고리의 다른 글
Spring Boot + AWS RDS 연동 및 Read/Write 분산 처리 (0) | 2024.01.24 |
---|---|
Embeddable Type (0) | 2024.01.09 |