기존 2차 프로젝트에서 기준에서 3차 프로젝트를 하면서 2차 프로젝트의 자바 코드를 코틀린 코드로 변환을 완료하였다.
프로젝트 환경
- Spring Boot 3.3.2
- Java 17
코틀린 사용하면서 느낀 장단점
Lombok 제거
전환과정에서 자바와 가장 컸던 점은 코틀린에서는 Lombok을 안쓴다는 점이다.
Lombok을 안쓰는 이유
- 코틀린에서는 타입추론 기능이 있어서 변수앞에 타입을 안붙인다. 변수 값에 의해서 타입이 정해진다. 그래서 변수 앞에는 val이나 var을 붙이는데 val은 Getter 기능이 포함되어 있고 var은 Getter, Setter가 포함되어 있다.
- @Data 대신에 Data Class를 사용하면 equals(), hashcode(), toString()를 컴파일러 시점에 자동으로 생성한다.
- 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을 발생시키는 코드이다.
![](https://blog.kakaocdn.net/dn/btwI0S/btsJBLTf1n9/FOuP6vHugynauyJkyU7kFK/img.png)
마무리
2차 프로젝트에서 3차 프로젝트로 넘어가면서 코틀린 전환을 하였는데 첨에는 속도가 많이 더디고 느렸지만 점차 하면서 코드가 간결해지는것을 느꼈다. 새로운 언어를 배운다는것은 쉽지 않았지만 왜 다양한 기업에서 코틀린으로 전환하려고 하는지 느낄수 있었다.
'Project > B2C-Side-Project(third)' 카테고리의 다른 글
[SpringBoot] 포트원 API 이용한 결제 기능 추가 (0) | 2024.09.23 |
---|---|
[SpringBoot] Kotlin 프로젝트에서 Vault 운영 서버 구축 (0) | 2024.09.17 |
[SpringBoot] 회원가입 구조 퍼사드 패턴 적용과 SRP 원칙 적용 (0) | 2024.09.17 |