아마 개발할 때 DTO 클래스에 toEntity메서드와 from 메서드를 추가한 적이 있을 것이다.
그리고 from 메서드에는 static을 붙였을 것이다.
오늘은 DTO에 toEntity와 from을 붙이는 이유와 from은 왜 static인지를 알아볼것이다.
▶ 우선 이유 먼저 🔥
DTO에서 toEntity나 from 같은 메서드를 추가하는 이유는
데이터를 엔티티와 DTO간에 변환할 수 있게 하기 위해서이다.
클라이언트로부터 받은 데이터를 엔티티로 변환해서 데이터베이스에 저장하거나,
데이터베이스에서 조회한 엔티티를 클라이언트로 보내기 전에 DTO로 변환하는 작업이 필요하기 때문이다.
DTO는 데이터를 주고받기 위한 '상자' 라고 할 수 있다.
이 상자 안에 있는 데이터를 밖으로 꺼낼때는 toEntity 메서드를,
엔티티를 상자 안에 넣어서 클라이언트에게 보낼때는 from 메서드를 사용한다.
▷ 오케이! 근데 사용하면 무슨 이득이 있음??
- 유지보수성
- 변환 로직이 분리되어 있으면 코드가 더 깔끔해지고, 나중에 수정할 때 편리하다.
- DTO안에 이런 메서드가 있으면, 다른 곳에서 매번 변환 로직을 구현하지 않아도 된다.
- 코드의 일관성
- 프로젝트 전반에서 변환 방식이 일관되게 유지될 수 있다.
- 여러군데에서 변환 로직이 중복되면 오류가 생기기 쉬운데, 이런 메서드가 있으면 그런 위험을 줄일 수 있다.
▷ 그런데 DTO에 로직을 추가해도 괜찮은가??
Q. DTO는 그저 데이터를 운반하는 상자라고 말했다. 그런데 이 상자에 이런 변환 로직들이 들어가도 되는건가?
A. toEntity나 from 같은 변환 메서드는 DTO의 핵심 목적에 맞는 로직이기 때문에 일반적으로 허용된다.
하지만 비즈니스 로직이나 복잡한 계산 등을 DTO에 넣는것은 안된다!!
▶ 메서드들 예시✨
이제 toEntity와 from 메서드의 예시를 보자!
▷ toEntity 메서드 (인스턴스 메서드)
toEntity는 이미 파라미터로 주어진 DTO 인스턴스의 필드 값을 바탕으로 새로운 엔티티 객체를 생성한다(DTO를 Entity로 변환한다).
이 경우 DTO 인스턴스 안에 있는 값을 사용해야 하니까
즉, 그 인스턴스를 통해서 메서드를 호출해야 하므로 static을 붙이지 않고 인스턴스 메서드로 만들어주는게 자연스럽다.
CreateUserRequestDto
//User Dto -> User Entity로 변환하는 메서드
public User toEntity(PasswordEncoder passwordEncoder) {
//Password Encoder 통해 비밀번호 암호화
String encodedPassword = passwordEncoder.encode(password);
return User.builder()
.email(email)
.password(encodedPassword)
.nickname(nickname)
.build();
}
사용 예시
//파라미터로 받은 DTO를 Entity로 변환
User user = createUserRequestDto.toEntity(passwordEncoder);
▷ from 메서드(정적 메서드)
반면에 from 메서드는 엔티티 객체를 인자로 받아서 DTO 객체로 변환하는 메서드이다.
여기서 중요한 점은,
이 메서드를 사용하기 위해서 DTO객체를 만들 필요가 없다는것이다.
이 메서드는 DTO 인스턴스와는 상관없이 엔티티를 DTO로 변환할 수 있기 때문에
굳이 DTO 객체를 생성하지 않고도 사용이 가능하다.
따라서 static 메서드로 만드는게 자연스럽다.
from
// Entity -> DTO 변환
public static CreateUserResponseDto from(User user) {
return CreateUserResponseDto.builder()
.id(user.getId())
.email(user.getEmail())
.nickname(user.getNickname())
.createdAt(user.getCreatedAt())
.modifiedAt(user.getModifiedAt())
.build();
}
사용 예시
//변환한 Entity를 DB에 저장
userRepository.save(user);
//DB에 저장한 Entity를 DTO로 변환 후 반환
return CreateUserResponseDto.from(user);
▶ 메서드에 static을 붙이는 기준이 뭐지??
를 위에서 말했기 때문에 한마디로 요약해보겠다.
- toEntity 메서드
- 이미 존재하는 DTO 인스턴스를 사용해서 엔티티를 만듦.
- → DTO 인스턴스가 있어야 호출할 수 있음.
- 그래서 인스턴스 메서드로 만들어줌.
- from 메서드
- 엔티티를 DTO로 바꾸는데 DTO 인스턴스가 없어도 됨.
- → 그냥 클래스 이름으로 메서드를 호출해서 DTO를 만듦.
- 그래서 static 메서드로 만들어줌.
이렇게 정리할 수 있을 것 같다.