인프런 커뮤니티 질문&답변

wnsqud70님의 프로필 이미지
wnsqud70

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

강의 마무리

안녕하세요

작성

·

383

1

강사님 강의기초 + 도서관 강의 까지보고 개인 프로젝트 중에 막혀서 질문 드립니다.. ㅜㅜ 일단 개인 프로젝트 질문 드려서 죄송합니다.. 아무리 구글링해도 답이 안나오고 코틀린 같은 경우에는 계속 안드로이드 쪽만 레퍼런스가 있어서 답을 못 찾았습니다.

 

단순이 Entity ->Dto 변환 문제인데 @Enumrated 를 사용하지 않고 Converter를 사용해서 변환하려 하는데 아직 코틀린이 눈에 익숙하지 않아서 그런지 봐도 잘 모르겠습니다 ㅜㅜ

이전 개인프로젝트에서 하던 방식과 똑같이 햇는데 안되는 이유도 궁금하고 , 혹시나 더 좋은 방법이 있다면 추천 부탁 드리겠습니다!!

 

답변 1

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요, wnsqud70님!! 아이고 아닙니다 ㅎㅎㅎ 제가 답변 드려볼 수 있는 부분은 드려볼게요~!

 

음 우선 에러가 나고 있는 부분은 (Member, TypeVariable<V>) -> Unit 타입의 "함수"가 들어가야 하는데 단순한 프로퍼티가 들어가고 있어서 에러가 나는 것 같아요!

그래서 저 부분을 고치고 싶으시다면, 저는 처음 보지만 mapper.using().map() 사용방법을 찾아보셔야 할 것 같습니다!

 

또한, 제가 ModelMapper와 ModelMapper의 Converter는 처음 보긴하는데 우선 상황을 보니

MemberCreateDto라는 DTO를 Member 라는 Entity로 변환하시는 것 같습니다! (함수 of 에서 MemberCreateDto를 받아 Member 를 만들고 있어서요!)

 

저라면 이런식으로 로직을 작성했을 것 같습니다 ㅎㅎ 간단히 적어볼게요!

class Member(
  val name: String,
  val age: Int,
  val level: MemberLevel, // Entity에는 Enum이 있다.
)

enum class MemberLevel(val number) {

  A(1),
  B(2),
  C(3),
  ;

}

class MemberCreateDto(
  val name: String,
  val age: Int,
  val level: Int, // DTO는 정수를 사용한다. MemberLevel의 number가 level에 대응된다.
)

저는 converting 로직에서 별도의 라이브러리나 프레임워크를 사용하지 않는 편입니다! 따라서...

enum class MemberLevel(val number) {

  A(1),
  B(2),
  C(3),
  ;

  /**
   * MemberLevel 자체의 level을 받아 변환되도록 합니다.
   * 원래는 예외 처리를 하면 조금 더 좋겠지만, 저도 그냥 first 를 바로 쓸게요!!
   */
  companion object {
    fun of(level: Int): MemberLevel {
      return values().first { it.number == level }
    }
  }

}

이렇게 필드 <-> Enum에 대한 변환 함수를 만들어 두고...!!

class Member(
  val name: String,
  val age: Int,
  val level: MemberLevel,
) {
  // 멀티모듈 프로젝트에서는 Entity가 DTO를 모르지만, 우선 비슷하게 작성하겠습니다 ㅎㅎ
  companion object {
    fun of(memberCreateDto: MemberCreateDto): Member {
      return Member(
        name = memberCreateDto.name,
        age = memberCreateDto.age,
        level = MemberLevel.of(memberCreateDto.level), // 위에서 만든 of를 활용
      )
    }
  }
}

이런식으로 converting 로직을 쓸 것 같아요!

scope function(자바 개발자를 위한 코틀린 입문 - 20강. 코틀린의 scope function)을 활용한다면 코드를 조금 더 간단히 다듬을 수 있죠!

companion object {
  fun of(memberCreateDto: MemberCreateDto): Member = with(memberCreateDto) {
    Member(
      name = name,
      age = age,
      level = MemberLevel.of(level),
    )
  }
}

필드가 많아지더라도 IDE의 단축키를 적절히 활용하면 적은 코드로 converting이 가능해서 저는 이런식으로 코딩하는 것을 선호하게 되더라고요 ㅎㅎㅎ

 

답변이 도움이 되었으면 좋겠습니다!

감사합니다!! 🙏

wnsqud70님의 프로필 이미지
wnsqud70
질문자

일단 친절한 답변 너무 감사드립니다!

답변 너무 잘 읽었고 이해 충분히 했습니다 감사합니다.

제가 질문이 몇가지가 더 있는데

  1. 저는 자바에서 modelMapper을 사용한 이유가 저렇게 일일이 써주기도 귀찮고 코드도 너무 길어지는것 같아서 사용했는데.. 혹시 강사님도 자바를 사용하실때도 저런식으로 하나하나 필드값을 넣어 주셨을까요??

  2. 코틀린에서는 매핑관련 라이브러리를 잘 안쓴다는 경향이 있다고 들어서 혹시 그 이유때문에 이렇게 작성 하셨을까요??

     

wnsqud70님의 프로필 이미지
wnsqud70

작성한 질문수

질문하기