[Spring Boot] DTO 활용 패턴 - toEntity(), from() + 정적 팩토리 메서드

·2025년 6월 1일

Spring Boot

목록 보기
2/6

💡 toEntity()와 from()의 사용이유와 차이점

toEntity()와 from() 둘다 Entity ↔ Dto 변환에서 자주 사용하는 메서드이다.
Dto로 변환하느냐, Entity로 변환하느냐에 따라 toEntity()를 사용할지, from()을 사용할지가 나뉜다.

  • toEntity() → DTO를 Entity로 변환
  • from() → Entity를 DTO로 변환

❓그런데 왜 toEntity()는 static이 아니고 from()은 static 일까?


✅왜 from()은 static일까?

메서드용도메서드 타입이유
toEntity()DTO → Entity인스턴스 메서드DTO의 자기 필드(this)를 사용하니까
from()Entity → DTO정적 팩토리 메서드(static)Entity를 외부에서 받아서 처리하니까 객체 의존이 없음

✅코드 예시

📌UserRequestDto : toEntity()

@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 ❌

📌UserResponseDto : from()

@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 ⭕
  • 즉, 정적 팩토리 메서드이다.

💡정적 팩토리 메서드가 뭔데?

  • 객체를 생성하는 방식 중 하나로, Java에서 생성자 대안으로 자주 쓰이는 설계 기법
  • 정적(static) 메서드를 통해 객체를 생성해서 반환하는 메서드

➡️즉, new 키워드 대신 클래스 내부의 static 메서드를 통해 인스턴스를 생성하는 방식이다!


생성자 vs 정적 팩토리 메서드

📌생성자로 객체 만들기

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");

💡toEntity()와 from()의 Service 사용 예시

📌 회원가입 처리

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() 비교 정리

항목toEntity()from()
방향DTO → EntityEntity → DTO
위치RequestDtoResponseDto
목적데이터 저장 전 변환데이터 응답 전 변환
선언 형태인스턴스메서드public static 메서드
주 사용처Controller → Service / 저장 로직Service → Controller / API 응답

📌기본 설계 패턴

  • 엔티티 → @Builder
  • RequestDto → @Builder + toEntity()
  • ResponseDto → @Builder + static from(Entity)
profile
배우고 기록하며 성장하는 백엔드 개발자입니다!

0개의 댓글