[SpringBoot] 3차 프로젝트 자바에서 코틀린 전환 회고

기존 2차 프로젝트에서 기준에서 3차 프로젝트를 하면서 2차 프로젝트의 자바 코드를 코틀린 코드로 변환을 완료하였다.

2차 프로젝트 깃허브 링크 

3차 프로젝트 깃허브 링크

 

프로젝트 환경

  • Spring Boot 3.3.2
  • Java 17

코틀린 사용하면서 느낀 장단점

Lombok 제거

전환과정에서 자바와 가장 컸던 점은 코틀린에서는 Lombok을 안쓴다는 점이다. 

Lombok을 안쓰는 이유
  1. 코틀린에서는 타입추론 기능이 있어서 변수앞에 타입을 안붙인다. 변수 값에 의해서 타입이 정해진다. 그래서 변수 앞에는 val이나 var을 붙이는데 val은 Getter 기능이 포함되어 있고 var은 Getter, Setter가 포함되어 있다.
  2. @Data 대신에 Data Class를 사용하면 equals(), hashcode(), toString()를 컴파일러 시점에 자동으로 생성한다.
  3. Named Arguments 문법적 특징으로 @Builder 를 안써도 된다.

 

다만 불편했던 점은 Lombok의 @Slf4j 어노테이션을 쓸수 없다보니 코틀린에서는 로그를 작성하려면 아래 코드를 이용해서 작성해야 한다. ${}는 변수값을 사용한다는 뜻이다.

//의존성 추가
implementation("io.github.oshai:kotlin-logging-jvm:5.1.4")

//클래스 내부에 추가
private val log = KotlinLogging.logger {}

//로그 사용 예시
log.info { "회원 상세 조회 memberId = ${memberId}" }

 

 

Optional 제거

그리고 ? 를 사용해서 이 값이 null이 될수 있는지 없는지를 항상 생각하고 붙여줘야 한다. 그래서 코틀린에서는 optional을 안쓴다.

사실 자바코드를 짜면서 null 허용 여부를 신경 안쓰고 무조건 Optional을 써서 작업하였는데 코틀린에서는 ? 여부를 항상 붙여줄수 있다보니 null 허용 여부를 항상 신경쓰면서 개발하였다. 그래서 코드가 더 깔끔해졌다

 

JPA를 사용할때 findById() 함수를 사용할때 Optional을 강요하여서 코틀린에서도 어쩔수 없이 사용될수 밖에 없다고 생각하였지만

 

코틀린에서 반환 타입에 ? 를 붙이면 nullable 타입이 되고 findByIdOrNull 확장함수를 사용할 수 있어서 Optional을 사용하지 않아도 된다.

 

그리고 아래처럼 ?:(엘비스 연산자) 를 통해서 값이 없을때의 처리를 지정해주면 된다.

 

 

확장함수 ?.let 사용

코틀린에서는 다양한 확장함수가 있는데 이중에서 let을 가장 많이 사용하였다.

let 확장함수는 아래처럼 T 객체 타입에서 R 객체타입으로 변환할 수 있는 함수인데 

fun <T, R> T.let(block: (T) -> R): R

 

nullable 타입에서 사용하게 된다면  T?.let{ } 에서 {} 안에는 non-null 값만 들어올수 있어서 ?: 와 같이 사용했을때 굉장히 유용하다.

아래 코드는 memberRepository 에서 Id값으로 객체를 불러왔을때 객체 값이 없으면 MemberResponse로 타입을 변환시키고 그게 아니면 NotFoundMemberExcetpion을 발생시키는 코드이다.

 

 

마무리

2차 프로젝트에서 3차 프로젝트로 넘어가면서 코틀린 전환을 하였는데 첨에는 속도가 많이 더디고 느렸지만 점차 하면서 코드가 간결해지는것을 느꼈다. 새로운 언어를 배운다는것은 쉽지 않았지만 왜 다양한 기업에서 코틀린으로 전환하려고 하는지 느낄수 있었다.

 

 

댓글

Designed by JB FACTORY