-
어디 가서 코틀린 매우 알은 체하기! - 제이슨세미나, 영상 요약정리 2022. 9. 27. 00:01728x90
https://www.youtube.com/watch?v=ewBri47JWII
우아한형제들의 박재성(Jason)님의 영상을 요약한 내용입니다.
대상
코틀린을 사용하지만 코틀린답게 사용하고 있는지 의심스러운 분
코틀린의 매력을 느끼고 백엔드 언어로 도입할 계획인데 다른 사람들은 어떻게 개발하는지 궁금한 분
나중을 위해 미리 듣는 분
코틀린의 성능이나 마이그레이션 방법을 원한다면 아래의 영상들을 추천합니다.
스프링 부트 2018 쿠팡 Kotlin Backend 적용기
카카오톡의 서버사이드 코틀린
PAYCO 매거진 서버 Kotlin 적용기
당근마켓 팀 - 자프링외길12년차 코프링2개월 생존기
위의 영상들은 모두 보았을 때 반복되는 부분들이 많지만 코틀린 언어에 대한 중요한 부분들을 설명해주고 활용하는 것을 볼 수 있기 때문에 복습 겸으로 보면 좋습니다.
코틀린이란?
- JVM, 안드로이드, 자바스크립트 및 네이티브를 대상으로 하는 정적 타입 지정 언어(자바와 동일)
- 젯브레인즈에서 개발한 오픈 소스(젯브레인은 intellij 개발사로 유명)
- 객체지향과 함수형 스타일을 모두 사용할 수 있습니다.
- 간결하고 실용적입니다. (강력한 코루틴이라는 라이브러리 제공)
TMI 코틀린은 섬입니다.
코틀린의 역사
이미 여러 언어들이 존재하는데 코틀린이 나온 이유는 무엇일까요?
코틀린이 나오기전 자바의 업데이트 속도가 정말 느렸으며 JDK7에 머물러 있던 시절이었습니다.
JVM상에서 돌아가는 언어로 스칼라가 존재했는데 기존의 자바 코드와 호환하기 불편함이 있었습니다.
따라서 젯브레인즈가 코틀린이라는 언어를 만들어서 공개하게 됩니다.
코틀린 얼마나 사용하고 있나요?
지난 12개월 동안 480만 명 이상의 사용자가 사용하였습니다.
대다수의 코틀린 개발자는 안드로이드 63% 및 서버 측 애플리케이션 개발 52%에 사용
한국에서 가장 인기가 많은 자바 -> 자연스럽게 코틀린에 대한 관심도 1위
멀티 플랫폼 언어
코틀린은 단순 JVM 위에서만 동작하는 것이 아니라 js, native로도 동작시킬 수 있습니다.
코틀린 표준 라이브러리를 익히고 사용하자
코틀린 1.3부터 kotlin.random.Random 클래스가 도입되었습니다.
자바로 랜덤 값을 도입하기 위해서는 Random클래스를 사용할지 ThreadLocalRandom을 사용할지 고민을 해야 합니다.
이때 thread-safe 하게 만들지 말지에 대해 고민하고 선택해야 합니다.
더 이상 자바 관련 import를 사용하지 않아도 되고 thread-safe 하게 사용할 수 있습니다.
코틀린은 읽기 전용 컬렉션과 변경 가능 컬렉션을 구별하여 제공합니다.
코틀린의 immutable collection에는 add라는 메서드도 존재하지 않기 때문에 호출할 가능성 자체를 없애버립니다.
코틀린 맛보기
class Person(val name: String, val age: Int = 1){ var nickname: String? = null }
val : 읽기 전용 값 (value)
var : 변경 가능한 값 (variable)
? : null이 될 수 있는 타입을 명시합니다. (기본적으로 null이 될 수 없습니다)
세미콜론을 생략할 수 있습니다.
기본 인자를 제공합니다.
자바에 비해 @NotNull, @Nullable, final과 같은 관용구들을 사용하지 않아도 됩니다.
자바로 역컴파일 하는 습관 들이기
코틀린 숙련도를 향상하는 가장 좋은 방법은 나에게 친숙한 자바로 어떻게 표현되는지 확인하는 방법입니다.
역컴파일을 통해 예기치 않은 코드 생성을 방지할 수 있습니다.
Intellij IDEA에서 Tools > Kotlin > Show Kotlin Bytecode => Decompile
코틀린 컴파일러
. kt(코틀린 파일)
. java(자바 파일)
첫 번째로 코틀린 파일이 코틀린 컴파일러에 의해. class로 컴파일됩니다.
두번째로 .java, .class 파일이 애너테이션 프로세싱 과정을 거쳐 .class 파일을 만들어내고 실제 실행 가능한 application으로 변하게 됩니다.
롬복 대신 데이터 클래스를 사용하라
자바에서는 롬복의 @Data를 사용하여 보일러 플레이트 코드를 생성합니다.
하지만 애너테이션 프로세서는 코틀린 컴파일 이후에 동작하기 때문에 롬복에서 생성된 자바 코드는 코틀린 코드에서 접근할 수 없습니다.
코틀린 코드보다 자바 코드를 먼저 컴파일하도록 빌드 순서를 조정하면 해결할 수 있지만 자바 코드에서 코틀린 코드를 호출할 수 없게 됩니다.
* 코틀린 1.5.20부터 롬복 컴파일러 플러그인이 실험적으로 추가되었습니다.
데이터 클래스를 사용하면 컴파일러가 equals, hashCode, toString, copy 등을 자동으로 생성해줍니다.
data class Person(val name: String, val age: Int) val javajigi = Perosn(name = "박재성", age = 49) val jason = javajigi.copy(age = 30)
이를 통해 긴 자바 코드들이 한 줄의 코틀린 코드로 바뀔 수 있습니다.
코틀린 1.5부터 자바 16의 레코드 클래스도 지원합니다.
Spring Boot와 코틀린
@Configuration class에는 final이 되면 안 됩니다.
스프링은 기본적으로 CGLIB를 사용하여 @Configuration 클래스에 대한 프록시를 생성합니다.
CGLIB는 대상 클래스를 상속하여 프록시를 만듭니다.
이때 final 클래스와 함수는 상속이거나 오버라이드 할 수 없어서 프록시를 만들 수 없습니다.
open을 붙여서 해결할 수 있지만 그러면 프록시를 사용하는 모든 클래스에 open을 붙여야 할까요?
All-open 컴파일러 플러그인을 통해 해결할 수 있습니다.
지정한 에너테이션이 있는 클래스와 모든 멤버에 open 변경자를 추가합니다.
스프링을 사용하는 경우에는 kotlin-spring 컴파일러 플러그인을 사용하면 all-open 컴파일러 플러그인을 포함하고 있습니다.
@Component, @Transactional, @Async 등이 기본적으로 지정됩니다.
필드 주입이 필요하면 지연 초기화를 사용하라
@Autowired private lateinit var objectMapper: ObjetMapper
생성자 주입이 가장 좋지만 가끔은 필드를 통해 주입해야 하는 경우가 있습니다.(순환 참조가 발생하는 경우)
null으로 초기화할 수 있지만 null을 사용하면 많은 불편을 초래합니다.
코틀린에서는 lateinit 변경자를 붙이면 프로퍼티를 나중에 초기화할 수 있습니다.
항상 var이어야 하는 단점이 있지만 nullable 하지 않은 장점도 있습니다.
잭슨 코틀린 모듈
var mapper1 = jacksonObjectMapper()
잭슨은 기본적으로 역직렬화 과정을 위해 매개변수가 없는 생성자가 필요합니다.
코틀린에서 매개변수가 없는 생성자를 만들려면 생성자의 모든 매개변수에 기본 인자를 넣어야 합니다.
잭슨 코틀린 모듈은 매개변수가 없는 생성자가 없더라도 직렬화와 역직렬화를 지원합니다.
변경 가능성을 제한하라
코틀린의 클래스와 멤버가 final인 것처럼 일단 val으로 선언하고 필요할 때 var로 변경하라
또한 backing property를 활용하여 변경 가능성을 제한할 수도 있습니다.
Persistence
No-arg 컴파일러 플러그인
JPA에서 엔티티 클래스를 생성하려면 기본 생성자가 필요합니다.
kotlin-jpa 컴파일러 플러그인을 사용하면 @Entity, @Embeddable, @MappedSuperclass에 기본적으로 기본 생성자가 추가됩니다.
엔티티에 데이터 클래스 사용을 피해라
롬복의 @Data와 같은 맥락으로 양방향 연관관계를 설정하는 경우 무한 순환 참조가 발생할 수 있습니다.
사용자 지정 getter를 사용하라
@Transient val fixed : Boolean = startData.util(endData).years < 1 //또한 뒷받침하는 필드가 존재하지 않기 때문에 @Transitne를 사용하지 않아도 됩니다. val fixed : Boolean get() = startData.util(endData).years < 1
Boolean이여서 null이 될 수 없음에도 불구하고 호출하면 null이 들어가게 됩니다.
jpa에 의해 인스턴스화 될 때 초기화 블록이 호출되지 않기 때문에 영속화하지 않는 필드는 사용자 지정 getter를 사용해야 합니다.
널이 될 수 있는 타입은 빠르게 제거하라
아이디를 0 또는 빈 문자열로 초기화하면 널이 될 수 있는 타입을 제거할 수 있습니다.
확장 함수를 사용해 반복되는 널 검사를 제거할 수 있습니다.
코틀린 DSL을 활용한 build.gradle 작성
DSL이란 특정 분야에 최적화된 프로그래밍 언어를 뜻합니다.
Groovy DSL에서 Kotlin DSL을 사용하게 되면 다음과 같은 장점이 생깁니다.
컴파일 타임에 에러를 미리 잡을 수 있음
자동 완성 지원
코틀린 DSL을 활용한 스프링 시큐리티, 코틀린 DSL을 활용한 WebMvcTest
스프링 시큐리티와 WebMvcTest에서도 코틀린 DSL을 활용할 수 있습니다.
코틀린이 확장 함수를 지원하기 때문에 Mocito 대신 코틀린 Mockk를 사용하면 편리하게 사용할 수 있습니다.
그 외 장점들 인자 밖에 쓸 수 있는 람다식, 확장 함수, 코루틴 등등
728x90'세미나, 영상 요약정리' 카테고리의 다른 글
테스트하기 쉬운 코드로 개발하기 - 정진욱 (0) 2022.10.02 [마틴 파울러] 소프트웨어 아키텍처의 중요성 (한글 자막) (0) 2022.10.01 카카오톡의 서버사이드 코틀린 - 유용하 (0) 2022.09.24 쿠팡 Kotlin Backend 적용기 - 배성혁 (0) 2022.09.15 [NHN]Spring Security 5 Oauth 총정리:클라부터 서버까지 (0) 2022.08.17