오늘 알게된 것
Java Record + 정적 팩토리 메서드
@Builder
public record GetReviewDTO(
String userName,
Long gameId,
Long reviewId,
String reviewContent,
int reviewRank,
LocalDateTime createdDate,
LocalDateTime lastModifiedDate
) {
public static GetReviewDTO of(User user, Review review){
return GetReviewDTO.builder()
.gameId(review.getGameId())
.userName(user.getUserName())
.reviewId(review.getReviewId())
.reviewContent(review.getReviewContent())
.reviewRank(review.getReviewRank())
.createdDate(review.getCreatedTime())
.lastModifiedDate(review.getLastModifiedTime())
.build();
}
}
연관관계 설정 안한 이유는
쿼리 메서드를 활용해서 하면 좋지만 여러 데이터를 join해서 가져와야 해서 어쩔수없이 SQL문을 사용해야 해서 쿼리메서드를 사용하지 못한 것이였다.
SQL문을 연습하려고 한것이라고 하기보다는 ..
코드를 좀 더 좋게 만드는 방법!
다른 도메인 접근은 서비스 통해서만 접근할 수 있게
남의 레포지토리 접근하지 못하게
무슨 말이냐면,
Review review = reviewRepository.save(reviewRequest.toEntity(userId, gameId));
User user = userService.findById(review.getUserId());
return ReviewRegisterDTO.Response.of(user, review);
이런 경우에서 보통은 다른 Repository를 주입받아서 그 안에서 ID값을 이용해서 데이터를 찾는데,
이렇게 하지 말고 서비스를 주입받아서 해당 서비스의 findById를 사용해서 아이디를 가져오는게 낫다.
남의 레포지토리를 접근하는거는 좋지 않다!
update같은 경우에, 엔티티를 건드리지 말라는 건 필드를 건들지 말라는 거지
엔티티에서 메서드는 만들 수 있다.
-> review를 찾아온 후에 review.modify를 통해 수정 기능을 만들고
Transaction 으로 영속성 컨텍스트 적용
영속성 컨텍스트는 findById할 시에 "스냅샷"을 찍어놓고 그 이후에 값이 변경된 걸 Transaction을 통해 적용한다.
나중에 알고보니 BFS 문제였다고 한다. 나중에 기억해두자.
문제는 지도를 그린 후에 장애물 / 지도 초과 인 경우는 해당 이동을 무시하고 넘어가고,
이동을 모두 마친 뒤에 좌표를 반환하는 문제였다.