의존성 추가
먼저 프로젝트에 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 보다 위에 적어주면 문제를 해결할 수 있다!
'Spring' 카테고리의 다른 글
Spring _ JAR(Java Archive) , WAR(Web application Archive) (0) | 2023.04.06 |
---|---|
Java Spring _ SSR(Server Side Rendering) ,CSR(Client Side Renderin (0) | 2023.03.23 |
Spring Security 권한 부여 (0) | 2023.03.17 |
Spring Security: 강력한 웹 보안 프레임워크 (0) | 2023.03.16 |
Spring Security [DelegatingFilterProxy, FilterChainProxy] (0) | 2023.03.16 |