Spring

spring에서의 mapstruct 라이브러리에 관한 설명

동곤일상 2025. 6. 29. 20:18
반응형

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>