inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Trong thực tế! Phát triển ứng dụng quản lý thư viện với Kotlin và Spring Boot (tái cấu trúc dự án Java)

Kết thúc bài giảng

안녕하세요

436

wnsqud70

58 câu hỏi đã được viết

1

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

 

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

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

 

refactoring kotlin spring-boot spring 리팩토링 java

Câu trả lời 1

0

lannstark

안녕하세요, 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이 가능해서 저는 이런식으로 코딩하는 것을 선호하게 되더라고요 ㅎㅎㅎ

 

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

감사합니다!! 🙏

1

wnsqud70

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

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

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

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

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

     

안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?

0

68

2

실행이 안되네요

0

66

2

프론트 영역 보는법

0

51

2

companion object

0

78

2

Custom 레프직토리 형식

0

57

2

Querydsl 도입

0

67

2

fetch join DISTINCT 중복제거

1

83

2

표준 예외와 커스텀 예외 사용 전략 질문

0

86

3

이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.

1

177

2

테스트를 위한 코드

1

105

2

프로젝트 실행 에러

0

151

2

PDF 문서에 오타가 있어서 알려드립니다.

1

102

1

enum질문

1

86

1

테스트 후 AfterEach 함수에서 나오는 쿼리

0

136

2

테스트 fixture

1

210

2

./gradlew test 실행시 인식할수 없다고 뜹니다.

0

140

1

test 코드 실행시 경고가 발생합니다.

0

140

1

13강 User Kotlin 변환중

2

169

3

'추가 - 코프링과 플러그인' 강의 7:46 allopen 관련 질문

2

174

1

-

0

141

2

4:28 build.gradle 수정 시 kotlin-reflect관련 implementation 추가 해야할까요?

0

312

3

junit import 불가

0

271

3

테스트 코드와 관련하여 질문이 있습니다.

1

218

1

hibernate가 select를 두번 하는 이유

0

240

1