[Spring] ModelMapper
ModelMapper는 엔티티와 DTO 간에 변환 시 자동으로 Object를 매핑시켜주는 라이브러리다.
기본적으로 제공해주는 map() 메서드로 소스로 제공 할 object와 매핑할려는 object를 매개 변수로 받는다.
아래와 같은 UserSaveRequestDto 라는 DTO 가 있다.
@Data
@NoArgsConstructor
public class UserSaveRequestDto {
....// 코드 생략
}
이를 User 엔티티로 매핑을 시켜주고 싶을 때 modelMapper 를 사용한다.
@Getter
@Entity
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(exclude = "password")
public class User{
}
위의 내용으로 적용 해 보고 디버깅하여 확인 해보았다.
DTO 클래스에서 User엔티티 클래스로 매핑을 시켜주려고 하는데 매핑이 안되어 null이 나왔다. 자료를 찾아본 결과 modelMapper가 getter() 와 setter() 메서드로 동작이 된다는 것이다.
매핑해 줄 클래에스에는(User) setter() 메서드가 있어야 하고 매핑이 되는 클래스에는(DTO) getter() 메서드가 있어야 한다.
기존에 엔티티에는 무결성 조건을 만족하기 위해 setter() 메서드를 사용하지 않았다. 그러니 이러한 결과가 나타난다.
modelMapper가 주는 편함이 이리 골치 아플지 몰랐다. 매핑해 줄 클래스가 엔티티인 경우엔 dto 클래스에 빌더 패턴으로 엔티티를 반환 해 주자.
@Data
@NoArgsConstructor
public class UserSaveRequestDto {
....// 코드 생략
public User toEntity() {
return User.builder()
.name(this.name)
.email(this.email)
.nickname(this.nickname)
.password(this.password)
.city(this.city)
.address1(this.address1)
.address2(this.address2)
.build();
}
}
.
'Spring Boot' 카테고리의 다른 글
@Builder 사용시 초기화 필드는 어떻게 될까? (0) | 2022.09.05 |
---|---|
[Spring boot] 순환 참조 이슈 (0) | 2022.08.12 |
[Spring Boot] Spring 에서 비동기 처리 방식은 어떻게 하고 왜 사용해야 할까? (0) | 2022.07.31 |
[Spring Boot] Interceptor 는 어떻게 사용하고 왜 사용해야 할까? (0) | 2022.07.30 |
[Spring Boot] Filter를 왜 사용해야하고 어떻게 사용하는 걸까? (0) | 2022.07.30 |
[Spring Boot] Validation을 왜 해야하고 어떻게 할까? (0) | 2022.07.29 |
[Spring Boot] 예외처리를 왜 해야하고 어떻게 처리할까? (0) | 2022.07.29 |
[Spring Boot] Spring Dependency Injection 동작 원리와 Ioc Container를 알아보자 (0) | 2022.03.02 |