여기 JPA 환경에서의 업데이트 로직이 있습니다.
게시글 아이디로 게시글을 검색하고 파라미터로 넘어온 UserId가 해당 게시글의 작성자인지 확인합니다.
그리고 DTO로 넘어온 데이터를 사용하여 게시글을 업데이트 합니다.
@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateBy(Long boardId, BoardRequest.updateDTO updateDTO, Long userId) {
Board board = getBoardById(boardId);
if (!board.isCreatedBy(userId))
throw new BoardUpdateFailureException(ErrorMessage.INVALID_BOARD_CONSTRUCTOR);
board.updateBy(updateDTO.getContent(), updateDTO.getTitle());
}
Board 엔티티는 아래와 같습니다.
public class Board {
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
public boolean isCreatedBy(Long userId) {
return Objects.equals(user.getId(), userId);
}
public void updateBy(String contentToUpdate, String titleToUpdate) {
title = titleToUpdate;
content = contentToUpdate;
}
}
의문인 점은 엔티티에 업데이트 혹은 검증을 위한 메서드가 포함되어도 되는가 입니다.
isCreatedBy()
메서드는 자신의 상태값인 User의 id와 파라매터로 넘어온 userId가 동일한지 판단합니다.
updateBy()
메서드는 자신의 상태값을 파라매터로 넘어온 값으로 변경합니다.
DBMS와 하이버네이트 환경에서 Board(엔티티) 역할은 무엇일까요?
저는 DB의 데이터를 자바세계의 객체로 매핑하는 역할이라고 생각합니다.
그렇다면 데이터를 저장하고 꺼내쓰는 용도로 사용하기 위해 자바빈즈와 같은 상태를 유지하는 것이 옳은 것일까요?
ORM의 역할만 가진다고 했을 때 isCreatedBy와 같은 메서드가 추가되어 버린다면 SRP에 어긋나버립니다.
앞서 말한 데이터를 저장하고 꺼내쓰는 용도를 유지한다 라고 한다면 서비스 로직이 너무 절차지향적이게 되는 거 같아요.
예를 들면 위의 서비스 로직은 board
객체에게 질문하고 응답받는 형식이 아닌 아래와 같이 객체의 역할을 서비스 레이어의 메서드가 담당하게 될 것입니다.
@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateBy(Long boardId, BoardRequest.updateDTO updateDTO, Long userId) {
Board board = getBoardById(boardId);
if (!board.getUser().getId().equals(userId)) // 수정된 부분
throw new BoardUpdateFailureException(ErrorMessage.INVALID_BOARD_CONSTRUCTOR);
board.setTitle(updateDTO.getTitle());
board.setContent(updateDTO.getContent());
}
뭐가 옳은 방법인지는 조금 더 공부하며 알아봐야겠습니다.
배움이 많이 필요하다고 생각되는 순간이네요.
'의문과 실험' 카테고리의 다른 글
상속 시, 오버라이딩된 메서드의 접근제어자는 왜 확장만을 허용할까 (0) | 2023.12.19 |
---|---|
[Spring] 프로젝트에서 IO를 줄여 성능을 개선해보자 (0) | 2023.10.04 |
Model이 DTO의 존재를 모르게 하라? Model과 DTO (0) | 2023.07.11 |
[Java] 싱글톤과 Static은 뭐가 다를까? (0) | 2023.07.03 |
[JAVA] Vector는 Thread-Safe 한가? (0) | 2023.04.21 |