Lombok, MapStruct

정민교·2022년 11월 24일
0

trouble shooting

목록 보기
1/2

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;
    }
}

수정 후 정상적으로 구현 클래스가 생성된 것을 확인할 수 있다.

profile
백엔드 개발자

0개의 댓글