Spring

MapStruct / Spring MVC에서 DTO오 Entity간의 매핑 처리하기

검은고양이개발자 2023. 3. 18. 11:59
반응형

의존성 추가

 

먼저 프로젝트에 MapStruct를 추가해야 합니다.

Gradle 또는 Maven 프로젝트에 다음 의존성을 추가합니다.

 

 

Gradle:

implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'

 

 

Maven:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.4.2.Final</version>
    <scope>provided</scope>
</dependency>

 

 

 

 

DTO와 Entity 클래스 생성

 

다음과 같이 DTO와 Entity 클래스를 생성합니다.

 

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    private long memberId;
    private String email;
    private String name;
    private String phone;
}

@Getter
@AllArgsConstructor
public class MemberResponseDto {
    private long memberId;
    private String email;
    private String name;
    private String phone;
}

 

 

 

Mapper 인터페이스 정의

 

MapStruct를 사용하여 DTO와 Entity 간의 매핑을 처리하는 Mapper 인터페이스를 정의합니다.

 

@Mapper(componentModel = "spring")
public interface MemberMapper {
    Member memberPostDtoToMember(MemberPostDto memberPostDto);
    Member memberPatchDtoToMember(MemberPatchDto memberPatchDto);
    MemberResponseDto memberToMemberResponseDto(Member member);
}

 

 

문제 상황

 

예상대로라면 MapStruct가 필드명이 같은 경우 자동으로 매핑해 줍니다.

그러나, 다음과 같은 오류 메시지가 나타날 수 있습니다.

 

error: No property named "memberId" exists in source parameter(s). Did you mean "null"?

 

 

 

해결 방법

 

위 문제가 발생할 경우, 다음과 같은 해결 방법을 시도해 볼 수 있습니다.

 

1. 필드명이 같은 경우, MapStruct가 자동으로 인식하여 매핑하므로 '@Mapping' 애너테이션을 사용하지 않아도 됩니다. 따라서 위의 'MemberMapper' 인터페이스를 다시 빌드하고 확인합니다.

 

2. 프로젝트의 다른 부분에서 발생한 오류 메시지가 실제로 'MemberMapperlmpl'과 관련되어 잇지 않을 수 있으므로, 프로젝트의 전체 코드를 검토하고 오류가 있는 부분을 수정합니다. 일부 설정이나 오타, 누락된 import 등이 문제가 될 수 있습니다.

 

3. 프로젝트를 완전히 깨끗한 상태로 빌드하여 문제가 해결되는지 확인합니다. Gradle의 경우 './gradlew clean build'명령을 실행하고, Maven의 경우 'mvn clean install' 명령을 실행합니다.

 

4. IDE의 캐시가 꼬여서 발생하는 문제일 수도 있습니다. IDE를 재시작하거나, 캐시를 삭제한 후 프로젝트를 다시 빌드해 봅니다.

 

위의 해결 방법들을 시도한 후에도 문제가 계속된다면, 코드와 설정을 세밀하게 검토하며 문제의 원인을 찾아야 합니다. 필요한 경우, MapStruct의 문서나 커뮤니티에서 도움을 받을 수 있습니다.

 

결론적으로, MapStruct를 사용하면 DTO와 Entity 간의 매핑 작업을 편리하게 처리할 수 있습니다. 문제가 발생할 경우, 위에서 제시한 해결 방법들을 차례대로 시도하여 문제를 해결하고 프로젝트를 정상적으로 진행할 수 있습니다.

 

 

또 하나의 추가 해결방법 

dependencies {
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	implementation 'org.mapstruct:mapstruct:1.4.2.Final'
	annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework:spring-web:5.3.13'
	implementation 'com.squareup.okhttp3:okhttp:4.10.0'
	implementation 'org.springframework.boot:spring-boot-starter-web'

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

이전에 dependecies에 입력을 할 때

lombok 을 mapstruct 밑에 입력을 했었는데

이 때문에 lombok이 적용이 안된 채로  mapstruct 가 실행됐기 때문에 문제가 발생했었다.

 

따라서 lombok 관련 dependecy를 mapstruct 보다 위에 적어주면 문제를 해결할 수 있다!

반응형