Dto 클래스와 Entity 클래스 간 변환을 위해서 MapStruct 라이브러리를 사용했다.
@Getter
public class MemberPostDto {
@NotBlank
@Email
private String email;
@NotBlank(message = "이름은 공백이 아니어야 합니다.")
private String name;
@Pattern(regexp = "^010-\\d{3,4}-\\d{4}$",
message = "휴대폰 번호는 010으로 시작하는 11자리 숫자와 '-로 구성되어야 합니다.")
private String phone;
public String getEmail() {
return email;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
}
@Getter
@Setter
public class MemberPatchDto {
private long memberId;
@NotSpace(message = "회원 이름은 공백이 아니어야 합니다.")
private String name;
@Pattern(regexp = "^010-\\d{3,4}-\\d{4}$",
message = "휴대폰 번호는 010으로 시작하는 11자리 숫자와 '-'로 구성되어야 합니다.")
private String phone;
}
@Getter
@AllArgsConstructor
public class MemberResponseDto {
private long memberId;
private String email;
private String name;
private String phone;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Member {
private long memberId;
private String email;
private String name;
private String phone;
}
```java
@Mapper(componentModel = "spring")
public interface MemberMapper {
public Member memberPostDtoToMember(MemberPostDto memberPostDto);
public Member memberPatchDtoToMember(MemberPatchDto memberPatchDto);
public MemberResponseDto memberToMemberResponseDto(Member member);
}
각 Dto 클래스와 Entity 클래스에 롬복을 적용하고 MapStruct기반의 mapper 인터페이스를 작성하였다.
빌드 후에 오류가 발생하여 구현된 mapper 클래스를 확인해보니
@Component
public class MemberMapperImpl implements MemberMapper {
@Override
public Member memberPostDtoToMember(MemberPostDto memberPostDto) {
if ( memberPostDto == null ) {
return null;
}
Member member = new Member();
return member;
}
@Override
public Member memberPatchDtoToMember(MemberPatchDto memberPatchDto) {
if ( memberPatchDto == null ) {
return null;
}
Member member = new Member();
return member;
}
@Override
public MemberResponseDto memberToMemberResponseDto(Member member) {
if ( member == null ) {
return null;
}
MemberResponseDto memberResponseDto = new MemberResponseDto();
return memberResponseDto;
}
}
제대로 롬복이 적용되지 않았다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.mapstruct:mapstruct:1.5.3.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
MapStruct 라이브러리가 lombok의 annotation processor에 의존하고 있어서 lombok 라이브러리 설정 다음에 Mapstruct 가 위치해야 한다.
혹은 lombok-mapstruct-binding를 dependencies에 추가해주면 된다.
@Component
public class MemberMapperImpl implements MemberMapper {
@Override
public Member memberPostDtoToMember(MemberPostDto memberPostDto) {
if ( memberPostDto == null ) {
return null;
}
Member member = new Member();
member.setEmail( memberPostDto.getEmail() );
member.setName( memberPostDto.getName() );
member.setPhone( memberPostDto.getPhone() );
return member;
}
@Override
public Member memberPatchDtoToMember(MemberPatchDto memberPatchDto) {
if ( memberPatchDto == null ) {
return null;
}
Member member = new Member();
member.setMemberId( memberPatchDto.getMemberId() );
member.setName( memberPatchDto.getName() );
member.setPhone( memberPatchDto.getPhone() );
return member;
}
@Override
public MemberResponseDto memberToMemberResponseDto(Member member) {
if ( member == null ) {
return null;
}
long memberId = 0L;
String email = null;
String name = null;
String phone = null;
memberId = member.getMemberId();
email = member.getEmail();
name = member.getName();
phone = member.getPhone();
MemberResponseDto memberResponseDto = new MemberResponseDto( memberId, email, name, phone );
return memberResponseDto;
}
}
수정 후 정상적으로 구현 클래스가 생성된 것을 확인할 수 있다.