웹개발/Spring Boot

[Spring Boot] Model Mapper

BEOTIZA♥ 2024. 1. 29. 19:39

Model Mapper

서로 다른 두 오브젝트의 필드값들을 자동으로 Mapping 시켜주는 라이브러리이다.

( DTO -> Entity, Entity -> DTO 변환에 사용 되며 map() 메소드를 통해 간단히 매핑을 할수 있다.)

 

  • build.gradle의 dependencies에 'ModelMapper' 라이브러리 추가 
dependencies {
implementation 'org.modelmapper:modelmapper:3.1.0'
}

 

  • Config 디렉토리를 구성하고 RootConfig 클래스를 생성

@Configuration 어노테이션을 이용해서 Bean을 관리 가능

public class RootConfig {

 //ModelMapper 객체를 스프링 컨테이너에 Bean 등록
    @Bean
    public ModelMapper getMapper() {
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration()
                .setFieldMatchingEnabled(true)
                .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE)
                .setMatchingStrategy(MatchingStrategies.LOOSE);
                //LOOSE 매핑시 필드명을 느슨하게 관리

        return modelMapper;
    }
}

 

  • 필드값들을 매핑시켜줄 BoardDTO 클래스다.
public class BoardDTO {

    private Long bno;
    private String title;
    private String content;
    private String writer;
    private LocalDateTime regDate;
    private LocalDateTime modDate;
}

 

  • BoradService인터페이스에 register() 선언

BoardService 인터페이스와 BoardServiceImpl클래스 추가
BoardServiceImpl은 ModelMapper와 BoardRepository를 주입받도록 구현

public interface BoardService {
    Long register(BoardDTO boardDTO);
}
  • BoradServiceImple은 ModelMapper와 BoardRepository를 주입받도록 구현
@Service
@Log4j2
@RequiredArgsConstructor
@Transactional
public class BoardServiceImpl implements BoardService{

    private final ModelMapper modelMapper; //ModelMapper 주입
    private final BoardRepository boardRepository; //BoardRepository 주입

    @Override
    public Long register(BoardDTO boardDTO) {

        Board board = modelMapper.map(boardDTO, Board.class);

        Long bno = boardRepository.save(board).getBno();

        return bno;
    }
}

 

  • BoardServiceTests에 testRegister() 등록 기능 테스트  : CRUD 작업 처리
@SpringBootTest
@Log4j2
public class BoardServiceTests {

   @Autowired
   private BoardService boardService;

    @Test
    public void testRegister() { //insert문 동작 테스트
        log.info(boardService.getClass().getName());

        BoardDTO boardDTO = BoardDTO.builder()
                .title("Sample Title...")
                .content("Sample Content...")
                .writer("user00")
                .build();

        Long bno = boardService.register(boardDTO);

        log.info("bno: " + bno);
    }
}

 

결과물

 

 

Model Mapper  매칭 전략

modelMapper.setMatchingStrategy(MatchingStrategies.STANDARD) // STANDARD 전략
modelMapper.setMatchingStrategy(MatchingStrategies.LOOSE) // LOOSE 전략
modelMapper.setMatchingStrategy(MatchingStrategies.STRICT) // STRICT 전략

 

  • MatchingStrategies.STRICT
    가장 엄격한 전략
    타입과 필드명이 같을 때만 변환
  • MatchingStrategies.LOOSE
    가장 느슨한 전략
    마지막 source 필드명에는 일치하는 토큰이 하나 이상 있어야 한다.
  • MatchingStrategies.STANDARD(default)
    하나 이상의 토큰이 매칭되어야 한다.
    토큰은 어떤 순서로든 일치될 수 있다.