toEntity()와 from() 둘다 Entity ↔ Dto 변환에서 자주 사용하는 메서드이다.
Dto로 변환하느냐, Entity로 변환하느냐에 따라 toEntity()를 사용할지, from()을 사용할지가 나뉜다.
toEntity() → DTO를 Entity로 변환from() → Entity를 DTO로 변환❓그런데 왜
toEntity()는 static이 아니고from()은 static 일까?
| 메서드 | 용도 | 메서드 타입 | 이유 |
|---|---|---|---|
| toEntity() | DTO → Entity | 인스턴스 메서드 | DTO의 자기 필드(this)를 사용하니까 |
| from() | Entity → DTO | 정적 팩토리 메서드(static) | Entity를 외부에서 받아서 처리하니까 객체 의존이 없음 |
@Getter
public class UserReqestDto{
private String name;
private String email
@Builder
public UserRequestDto(String name, String email) {
this.name = name;
this.email = email;
}
//Entity -> DTO 변환
public User toEntity() {
return User.builder()
.name(this.name)
.email(this.email)
.build();
}
}
/*
* Controller 사용 예시
*/
UserRequestDto requestDto = UserRequestDto.builder()
.name("홍길동")
.email("aaa@aaa.com")
.build();
User user = requestDto.toEntity(); //DTO -> Entity로 변환
this.name, this.email처럼 자기 자신의 내부필드(this)를 쓰기때문에 객체가 있어야 작동됨 → static ❌@Getter
public class UserResponseDto{
private Long id;
private String name;
private String email;
@Bulider
public UserResponseDto(Long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
//Entity -> DTO 변환
public static UserResponseDto from(User user){
return UserResponseDto.builder()
.id(user.getId())
.name(user.getName())
.email(user.getEmail())
.build();
}
}
/*
* Controller 사용 예시
*/
User user = userRepository.findById(1L).orElseThrow();
UserResponseDto responseDto = UserResponseDto.from(user);
User user라는 외부 객체만 받아 쓰므로 내부상태(this)에 의존 없음 → static ⭕정적 팩토리 메서드이다.생성자 대안으로 자주 쓰이는 설계 기법➡️즉,
new키워드 대신 클래스 내부의static 메서드를 통해 인스턴스를 생성하는 방식이다!
User user = new User("홍길동","aaa@aa.com");
User user = new User.of("홍길동","aaa@aa.com");
생성자보다 더 유연하고 명확하게 객체 생성 의도를 표현할 수 있기 때문에
// 생성자 방식 (어떤 의미인지 애매)
User user = new User("홍길동", "ssj@example.com");
// 정적 팩토리 방식 (의도가 명확함)
User user = User.withNameAndEmail("홍길동", "ssj@example.com");
public UserResponseDto signup(UserRequestDto request) {
// 요청 DTO → Entity
User user = request.toEntity();
// 저장 후 Entity → 응답 DTO
return UserResponseDto.from(userRepository.save(user));
}
toEntity()는 Dto 인스턴스가 있으므로 바로 호출from()은 Entity를 받아서 Dto로 만드는 정적 호출| 항목 | toEntity() | from() |
|---|---|---|
| 방향 | DTO → Entity | Entity → DTO |
| 위치 | RequestDto | ResponseDto |
| 목적 | 데이터 저장 전 변환 | 데이터 응답 전 변환 |
| 선언 형태 | 인스턴스메서드 | public static 메서드 |
| 주 사용처 | Controller → Service / 저장 로직 | Service → Controller / API 응답 |
📌기본 설계 패턴
- 엔티티 → @Builder
- RequestDto → @Builder + toEntity()
- ResponseDto → @Builder + static from(Entity)