이제 코프링 (Kotlin + Spring)

Aiden Shin·2022년 8월 6일
0

코틀린 + 스프링 조합을 사용하면서 느낀점

안드로이드는 코틀린이 이미 대세로 자리잡은지 꽤 되었지만.. 백엔드는 아직 자바+스프링 조합이 훨씬 많이 사용되는 것 같다.
최근 유니콘 기업들이 신규 프로젝트를 코틀린+스프링 조합으로 진행하는 것을 보고 따라써봤다.

사실 예전에는 코틀린을 사용하면 JPA를 사용함에 있어 불편한점과 오류 해결방법을 몰라서 사용을 꺼렸었는데.. 이제 참고할만한 레퍼런스들을 발견하기 쉬워져서 사용하게 되었다.
설정방법은 나중에 기회가 되면 작성하려고 하고 이번에는 코틀린을 사용하면서 느낀점을 간단하게 적어보려고 한다.


코틀린을 사용하면서 제일 편했던 점은 null 처리였다..
애초에 변수 선언 시 null을 허용하려면 ?를 붙여줘야한다.

 val a: String // null 불가능
 val b: String? // null 가능
 

또한 null 체크도 너무 편하다

// if(username != null) { } 이런거 안해도됨
checkNotNull(username) // username의 널 체크, 체크 통과 시 username은 null이 아님이 보장됨
val user = userRepository.findByEmailThrow(username)

엘비스 연산자 ?:를 통한 null일 경우 처리도 편하다

// 결과가 없으면 exception 
val email = getEmail(id) ?: throw NotFoundException("not found user")

코틀린은 확장함수를 지원하는데 이것도 유용하게 사용 가능하다.

//UserCreateRequest의 확장함수 (객체 내부가 아닌 다른곳에서 정의)
fun UserCreateRequest.create() = User(
    email = this.email,
    name = this.name,
    password = bCryptPasswordEncoder.encode(this.rawPassword),
    role = UserRoles.ROLE_USER,
)

fun saveUser(userCreateRequest: UserCreateRequest) {
   ...
    userRepository.save(userCreateRequest.create()) // 위에서 만든 확장함수 사용
}

스코프함수를 이용해 객체의 값을 변경 가능하다.

    
    // 아래처럼 setter를 사용하지 않아도된다..
    //people.setName("신일현");
    //people.setAge(35)
    
	people.apply{
    	name = "신일현",
        age = 35,
    }

예외처리가 편하다.. 코틀린에서는 checked exceptiontry/catch 처리가 생략 가능하다..
또한 runCatching을 사용해서 깔끔하게 예외를 처리할 수 있다.

runCatching { pay(orderId) } // recover, onFailure, onSuccess 를 제공
    .recover { rePay(orderId) }
    .onSuccess { paySuccess(orderId) } 

이외에도 코틀린을 쓰다보면 다시 자바로 못돌아갈만큼 언어차원에서 처리해주는 것들이 많다..
하지만 JPA와 함께 쓰다보면 all-open 설정을 해줘야하는 등 불편한 점들이 있다.. 아무래도 JPAJJava라는 것을 느끼게된다..

그럼에도 앞으로 프로젝트는 웬만하면 코틀린으로 진행할 것 같다.

profile
개발하는 서아아빠

0개의 댓글