오늘 깊게한 고민이다.
개요
팀 프로젝트 진행 중, Entity에 대한 생성을 어떻게 할 것인지 고민을 많이 했다.
우선 생성 방식은 정적 팩토리 메서드를 사용하기로 했다.
이유는 다음과 같다.
- 생성자를 쓰는 것보다 이름을 갖게 할 수 있어서 의미가 더욱 명확해진다.
말고도 더 많은 장점이 있지만 가장 큰 이유가 저거라고 판단했다.
근데 여기서 고민이 됐던게
// 1.
public static User from(UserCreateRequestDto requestDto) {
return User.builder()
.username(requestDto.username())
.password(requestDto.password())
.build();
}
// 2.
public static User from(String username, String encodedPassword) {
return User.builder()
.username(username())
.password(encodedPassword())
.build();
}
이 둘중 어떤 걸로 할지 고민이 많이 됐다...
무슨 차이가 있을까?
첫번째 방법
장점
- 편의성
- 필요한 모든 데이터가 Dto내에 있기 때문에 저거 하나만 넘겨주면 된다.
단점
- 종속성
- User 엔티티 내에서 Dto에 대한 종속성을 가지게 된다.
User 클래스에서 Dto를 알게 해야하나? 싶었던 고민이 많았다
두번째 방법
장점
- 종속성을 안가진다.
- 엔티티가 Dto에 대한 종속성을 갖기 않게 된다
- 굳이 엔티티가 Dto를 몰라도 된다.
- 엔티티가 Dto에 대한 종속성을 갖기 않게 된다
단점
- 코드 중복
- 서비스 단에서 계속 dto내의 값을 빼줘야 된다.
- 이게 과거로 역행한다는 느낌을 많이 들었음
- 위의 단점으로 인해 Dto 필드를 추가하거나 수정하면 여러 메서드에서 바꿔줘야 된다.
- 서비스 단에서 계속 dto내의 값을 빼줘야 된다.
종속성도 싫고, 코드 중복도 싫은데.. 어떻게 할까?
User에서 Dto에 대한 종속성을 갖게 하는 것도 싫고, 따로 계속 빼주는 코드 중복을 일으키기도 싫다 그러면 어떻게 할까?
Dto내에서 인스턴스 메소드를 쓰면 된다.
Dto 내에서 인스턴스 메소드
public record UserCreateRequestDto(String username,String password) {
public User createUser() {
return User.builder().username(username).password(password).build();
}
}
이렇게 하면 된다!!
근데, 레코드 클래스의 목적과 단일 책임 원칙을 위반하게 된다.
레코드 클래스의 목적
레코드 클래스는 불변성을 갖으므로 Dto와 같은 데이터 운반에 특화된 클래스이다. 근데 안에서 무언갈 만드는 메소드가 들어있다면 레코드 클래스의 의미가 약간은 바뀔 수 있다.
단일 책임 원칙
Dto내에서 User에 대한 생성 책임을 지게 되니, 단일 책임 원칙을 위반 할 수 있다.
그치만... ㅠㅠ 두 방법 다 싫은 걸... 매핑 메소드로 간주하면 되지 않을까 라는 생각을 하고 있다.
어..? 매핑 메소드?
매퍼 클래스를 만들면 되지 않을까?
매퍼 클래스
Dto와 Entity의 매핑을 해주는 클래스다
애초에 매퍼 클래스는 각 클래스간의 맵핑을 위해 존재해서 다른 클래스를 알아도 상관 없다
public class UserMapper {
public static createUser(UserCreateRequestDto requestDto) {
return User.builder()
.username(requestDto.username())
.password(requestDto.password())
.build()
}
}
이런 식으로!!!!!! 이러면 모든 문제가 해결된다!!
책임 분리도 되고, 레코드 클래스의 목적도 안 헤치고 엔티티내에서 Dto를 몰라도 된다.
'TIL' 카테고리의 다른 글
TIL 2024-01-09 쿼리최적화란 (0) | 2024.01.10 |
---|---|
TIL 2024-01-08 스프링 이미지 다중 업로드 구현 (0) | 2024.01.09 |
TIL 2024-01-05 cicd는 왜 생겼을까 (0) | 2024.01.06 |
TIL 2024-01-04 SQL에 배열을 어떻게 저장할까? (0) | 2024.01.05 |
TIL 2024-01-03 깃 액션으로 CD 구현하기 (0) | 2024.01.03 |