Kotlin +JPA

Shaun·2022년 12월 29일
0

Kotlin

목록 보기
7/10
post-thumbnail

Kotlin 을 배우기만 하고 활용을 잘 못해본것 같아서 이번 기회에 코틀린 연습겸 자바 ->kotlin 변환 연습을 해봤다.

도메인 Java ->Kotlin

  • 코틀린은 클래스 정의시 var,val 을 매개변수로 넣어서 선언 해주면 게터,세터, 매개변수 생성자, 맴버 변수를 만들 어줌.

  • 하지만 JPA에서 @Entity를 사용해 DB 등록을 하기 위해서는 기본 생성자가 필요함
    -> id 'org.jetbrains.kotlin.plugin.jpa'version'1.6.21'추가

  • 멤버 변수 id 는 불변, 하지만 null 일수 있으므로 위와 같이 선언 했고 name 같은 경우에는 null불가(?불가), 불변(val)으로 선언 해줬다.

  • name같은 경우 초기화시 간단한 널체크가 있으며 이는 코틀린의 init()으로 객체가 생성될때 검사가 되도록 했다.


  • 위 방법과 비슷하지만 주이해야할 점은 양방향 맵핑시 casacde 작성방법이 약간 다르다


  • first() 라는 메서드를 통해 stream.filter.findfirtst 를 줄여서도 사용 가능!
  • setter를 대신한 update메서드 같은 경우는 차이점이 거의 없어서 그냥 써주면 됀다.

Repository

  • 레포지토리 같은 경우에도 크게 다른 점은 없다. 눈여겨 봐야할 점은 Optional 이 코틀린에서는 ? 로 변경 가능 하다는 점!

Service

의존성주입

  • 생성자를 통한 의존성 주입 = 코틀린은 var,val 로 매개변수 선언시 매개변수 생성자 자동 생성.

로직

  • 서비스단 로직은 어렵지 않고 저렇게 코틀린으로 변경 할수 있다. 눈여겨 봐야할 점은 메서드 참조 사용방법이 조금 다르다는 점! 그리고 new 를 사용안한다는 점!

  • throw:Exception 부분이 중복이라 utils 로 뺴줬다. 이러면 fail()하나만 변경해줘도 다른곳도 함께 변경할수 있다는 장점도 있다.

  • @Transactional 을 사용하기 위해서는 밑으로 override가 가능한 상태 즉 Open 상태여야함. 하지만 코틀린은 기본 final
    ->id 'org.jetbrains.kotlin.plugin.spring'version'1.6.21' 추가

  • map(람다식)

  • Optional을 반환타입으로 가지는 우리가 만든 메서드는 ? 로 변경가능하지만 findById 같은 경우에는 fix 된경우라 ? 로 변경 할수가 없다. 이런 경우에는 코틀린의 확장함수를 사용하자!

  • 스프링 프레임워크에서는 Kotlin 과 crudRepository를 함께 사용할 경우를 대비해 crudRepostioryExtension.kt 라는 확장함수가 담긴 파일을 만들어 놨다
  • 이전에 만들어 놨던 utils에 구현을 해서 다른곳에서도 가져다 쓸수있게 만들어 준다.

Servie Testcode


  • testcode는 딱히 어려운점 없었다.

DTO

  • DTO도 특별한 변경점은 없다. 다만 DTO클래스를 만들때는 주로 Data클래스를 활용한다. 왜냐하면 주로 DTO클래스에서 값비교가 많기 떄문

  • 여기서 방법1(부생성자) 생성이유는 부생성자를 만들지 않을시에 그냥 각각 값(맴버변수)를 받아 생성되지만 부생성자에서는 User라는 클래스로 값을 받아 만들기 떄문

  • 하지만 만들떄 companion object(정적 팩토리 메서드) 를 사용해서 만드는 방식이 더 선호됀다.

Controller

  • controlelr도 크게 특별한건 없지만 눈여겨 볼점은 코틀린에서는 {} 를 생략해 조금 더 간단하게 리턴 코드를 작성 할수 있다는 점

  • @RequestParam 은 디폴트가 true 라 필수이지만 코틀린의 ?를 사용하면 (null허용) false로 바꿔준다.

Main

  • crudRepositoryExtension 에서 kotlin을 위해 구현해 놓은것처럼 SpringBootApplication 역시 runApplication() 라는 인라인 함수를 구현해놓음
  • 함수를 top line 에 사용하면 Java의 static를 쓴것과 동일하게 처리됌

Fixture

  • 이러한 패턴을 object mother 이라 부르고 이렇게 생겨난 것을 object fixture 라고 한다.

  • 왜 사용하냐면 코드들도 유지보수 대상이지만 테스트 코드들도 유지 보수 대상이다. 즉 메인 코드들이 변경되면 테스트 코드들도 변경이 되야하는데 예를들어 로직이 변경된게 아닌 그냥 데이터값 하나만 추가 된경우는(그렇게 중요한 데이터가 아닌경우) 테스트 코드에 굳이 반영하지 않아도 별 영향이 없다.
    -> 그래서 아예 고정 데이터를 박아 놓는다고 생각하면 쉽다!

profile
호주쉐프에서 개발자까지..

0개의 댓글