Hello, Freakin world!

코틀린으로 ModelMapper 만들기 - 1 본문

프로그래밍 언어/코틀린

코틀린으로 ModelMapper 만들기 - 1

johnna_endure 2022. 3. 17. 22:54

우선 ModelMapper를 간단히 소개하자면,

 

http://modelmapper.org/

 

ModelMapper - Simple, Intelligent, Object Mapping.

Why ModelMapper? The goal of ModelMapper is to make object mapping easy, by automatically determining how one object model maps to another, based on conventions, in the same way that a human would - while providing a simple, refactoring-safe API for handli

modelmapper.org

 

위 사이트에서 제공하는 자바 기반의 객체 매핑 라이브러리입니다.

필자는 Spring Data Jpa를 사용할 때, 엔티티 데이터를 DTO로 변환할 때 주로 사용했습니다.

(MapStruct 등 다른 라이브러리도 많겠지만, ModelMapper가 사용하기 제일 편하더라구요) 

 

하지만 코틀린에서 ModelMapper를 사용할 때 생기는 몇 가지 불편함이 있습니다.

 

우선 아래 코드를 살펴볼까요?

PersonDTO dto = modelMapper.map(person, PersonDTO.class);

 

person 은 엔티티 정보를 담고 있는 변수입니다.

person에 담긴 정보를 PersonDTO의 필드에 매핑하고 PersonDTO 인스턴스를 반환하고 있습니다.

 

PersonDTO는 라이브러리 내부에서 자바 리플렉션을 이용해 객체를 생성하고 setter, getter를 이용해 값을 바인딩합니다.

리플렉션을 이용해 객체를 생성할 때, 인수가 없는 생성자를 이용하기 때문에 DTO 클래스에서 인수없는 생성자의 생성이 강제됩니다.

바로 이 점이 조금 코틀린에서 사용하기 좀 껄끄러운 점입니다.

 

코틀린에서 ModelMapper를 사용하려면 data class를 다음과 같이 만들어야 합니다.

    data class PersonModel(var name: String = "", var age: Int = 0, var gender: String = "") {
    }

    data class PersonModel(var name: String, var age: Int, var gender: String) {
        constructor(): this(name = "", age = 0, gender = "")
    }

 위 코드는 data 클래스에서 인수없는 생성자를 만드는 두 가지 예입니다.

첫 번째는 의미없는 값을 주 생성자에서 기본값으로 줘야한다는 점에서 껄끄럽습니다.

두번째 역시 리플렉션만을 위한 의미없는 생성자를 만드는데 파라미터를 넘겨줘야 한다는 점이 귀찮습니다.

그리고 두 가지 모두 var 변수가 강제된다는 점이 가장 구립니다.  냄새가 진동을 합니다.

 

 

코틀린다운게 뭔지 저도 잘 모르지만, 이건 뭔가 냄새가 구립니다. 코틀린을 자바에 끼워맞춘듯한 느낌이랄까...?

 

 

그냥 간단하게 아래처럼 인수없는 생성자없이 주 생성자만으로 해결할 순 없을까요? 

    data class PersonModel(val name: String, val age: Int, val gender: String)

 

결론부터 말씀드리자면 가능합니다!

다음 글에선 코틀린 리플렉션을 이용해 이 문제를 해결하겠습니다.

조금 힌트를 드리자면 코틀린에서 Reified Type Parameters(구체화된 타입 파라미터)를 이용할 예정입니다.

 

다음 글에서 만나요! 아디오스~

 

 

 

 

'프로그래밍 언어 > 코틀린' 카테고리의 다른 글

코틀린으로 ModelMapper 만들기 - 2  (1) 2022.03.30
Comments