반응형
mapper라는 개념부터 먼저 설명하고 시작하겠음
- Mapper"는 일반적인 용어로, 객체 간 데이터를 변환하는 역할을 하는 코드나 클래스를 의미합니다.
- 예를 들어, User 객체를 UserDto로 변환하거나 그 반대로 변환하는
- 로직을 작성하는 모든 코드는 "Mapper"라고 부를 수 있습니다.
mapper는 직접 수동으로작성할수도있고 라이브러리(mapperStruct)를 이용해 생성 가능함
MapStruct:
- MapStruct는 Mapper를 자동으로 생성해주는 자바 라이브러리입니다.
- 개발자가 매핑 로직을 수동으로 작성하지 않아도, 인터페이스에
- @Mapper 어노테이션과 메서드를 정의하면, MapStruct가 컴파일 시 자동으로 매핑 코드를 생성해줍니다
- 같은 어노테이션이지만 가져오는 라이브러리가다름.
org.apache.ibatis.annotations.Mapper //기본mapper(bean등록만해줌)
org.mapstruct.Mapper; //mapstruct
그냥 mapper를 사용할 경우(수동)
public class ManualMapper {
public UserDto toDto(User user) {
UserDto dto = new UserDto();
dto.setId(user.getId());
dto.setName(user.getName());
return dto;
}
}
내가 지금은 user->dto간의 변환 시 2개의필드만 사용했지만
훨씬 많은 필드가변경이될수도있음
내가 사용한 mapstuct라이브러리
(@주의 @ 서로 간 필드명이 같아야함)
package gradleProject.shop3.mapper;
import gradleProject.shop3.domain.User;
import gradleProject.shop3.dto.UserDto;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
//User와 UserDto 간의 변환 로직을 정의합니다.
//componentModel = "spring"은 생성된 매퍼 구현체를 Spring 프레임워크의 빈(Bean)으로 등록하도록 설정합니다.
//-> Spring에서 @Autowired로 이 매퍼를 주입받아 사용할 수 있습니다.
public interface UserMapper {
//dto->domain
User toEntity(UserDto userDto);
//domain-> dto
UserDto toDto(User user);
}
다음과같은 코드가 자동으로 생성된다고 보면됨(userMapperImpl)
Override
public User toEntity(UserDto userDto) {
if ( userDto == null ) {
return null;
}
User user = new User();
user.setUserid( userDto.getUserid() );
user.setChannel( userDto.getChannel() );
user.setPassword( userDto.getPassword() );
user.setUsername( userDto.getUsername() );
user.setPhoneno( userDto.getPhoneno() );
user.setPostcode( userDto.getPostcode() );
user.setAddress( userDto.getAddress() );
user.setEmail( userDto.getEmail() );
user.setBirthday( userDto.getBirthday() );
return user;
}
user와 userDto의 필드명이 다를경우 다음과같이 수동으로 매핑해야함
@Mapper(componentModel = "spring")
public interface UserMapper {
@Mapping(source = "userDto.emailAddress", target = "email")
User toEntity(UserDto userDto);
@Mapping(source = "user.email", target = "emailAddress")
UserDto toDto(User user);
}
mapstuct사용법
gradle 구조
dependencies {
implementation 'org.mapstruct:mapstruct:1.5.5.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
}
maven구조
<project>
<!-- 기타 설정 (예: project 태그, groupId, artifactId 등) -->
<dependencies>
<!-- MapStruct 라이브러리 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Maven Compiler Plugin: 어노테이션 프로세싱 활성화 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!-- Java 버전에 맞게 조정 (예: 11, 17 등) -->
<target>1.8</target> <!-- Java 버전에 맞게 조정 -->
<annotationProcessorPaths>
<!-- MapStruct 어노테이션 프로세서 -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
'Spring' 카테고리의 다른 글
SpringMVC 매개변수 순서의중요성(@Valid , BindingResult, Model) (0) | 2025.06.28 |
---|---|
부트캠프91일차 (new Project JPA,Thymeleaf사용,transaction,Log4j2) (0) | 2025.06.23 |
부트캠프91일차 (네이버검색api , Scheduling스케줄링) (2) | 2025.06.23 |
parameter값 or logic대신 Dto객체 사용 (0) | 2025.06.22 |
Exception과 AOP의 동작원리 (2) | 2025.06.21 |