코프링 - 우아한 테크 세미나

문지은·2021년 9월 30일
1

Kotlin

멀티 플랫폼 언어 - JVM, JS, Native 환경에서 모두 사용 가능
하나의 파일이 어떤 환경에서 컴파일되느냐에 따라 빌드된 파일이 달라진다! (개쩐당,,)

코틀린 표준 라이브러리

kotlin.random.Random
-> 자바에서처럼 Random/ThreadLocalRandom 사이에서 고민할 필요가 없다.
JDK 환경에 따라 알아서 함수를 골라주기 때문에

@NotNull, @Nullable, final을 사용할 필요 없다!
의식적으로 노력하지 않아도 안전한 코딩이 가능하다.

자바로 역컴파일하는 습관을 들여라

IntelliJ에서
Tools - Kotlin - Show Kotlin Bytecode -> decompile로 자바로 decompile해보기

lombok 대신에 데이터 클래스를 사용해라

annotation processor가 코틀린 컴파일 이후에 동작하기 때문에 lombok에서 생성된 자바 코드는 코틀린 코드에서 접근할 수 없다.
-> 최근 버전엔 플러그인 추가해서 해결 가능. 하지만 자바 코드에서 코틀린 코드를 호출할 수 없다.

equals(), hashCode(), toString(), copy() 등 사용하기

Spring Boot에서의 final

코틀린 코드를 왜 자바 코드로 봐야하는지에 대한 가장 큰 이유!

코틀린은 기본적으로 final을 붙임
자바에서 @SpringBootApplication@Configuration을 포함하고 이에 대한 프록시를 사용하는데 final을 붙이면 상속하거나 override 할 수 없으므로 에러 발생
모든 클래스를 open하게 되면 코틀린을 쓰는 의미가 없어짐

->All-open 컴파일러 플러그인 이용해서 해결

지정한 annotation이 있는 클래스와 모든 멤버에 open 변경자를 추가

IntelliJ에서
File - Project Structure - Project Settings - Modules - Kotlin - Compiler Plugins에서 확인 및 수정 가능

필드 주입이 필요하면 지연 초기화 사용

인스턴스화될 때 초기화되도록 설정

@Autowired
private lateinit var objectMapper: ObjectMapper

잭슨 코틀린 모듈
매개 변수가 없어도 직렬화, 역직렬화 지원

val mapper1 = jacksonObjectMapper()
val mapper2 = ObjectMapper().registerKotlinModule()

변경 가능성을 제한하라

일단 val로 선언하고 필요할 때 var로 변경

@EnableConfigurationProperties, @ConfigurationPropertiesScan을 사용해서 읽기 전용으로 생성자 바인딩

클래스에 개념적으로 동일하지만 하나는 공개된 API의 일부, 하나는 구현 세부 사항일 경우 private property에 _를 접두사로 사용

Persistence

No-arg 컴파일러 플러그인
JPA에서 엔티티 클래스를 생성하려면 매개변수가 없는 생성자 필요
매개변수가 없는 생성자를 추가
리플렉션 이용해서 자바/코틀린에서 사용 가능

이때도 allOpen 이용해서 open을 붙이지 않으면 지연 로딩 불가능 (프록시로 인해서)

엔티티에 데이터 클래스 사용을 피하라

양방향 연관의 경우 toString(), hashCode() 호출할 때 무한 순환 참조 발생

사용자 지정 getter를 사용하라

JPA에 의해 인스턴스화될 때 초기화 블록이 호출되지 않기때문에 getter 사용시 필드가 null인 경우 존재

null이 될 수 있는 타입은 빠르게 제거하라

null검사나 !! 연산자를 써야 한다. -> 굳이 자바 대신에 코틀린을 쓸 이유가 없다.
0 또는 빈 문자열로 초기화하는 편이 낫다.
optional 보다는 nullable 사용

every{
~~~~} returns ~~~

코틀린의 확장 함수를 적극 이용하자.

fun TermRepository.getById(id: Long): Term{
	if (id == 0L) {
    	return Term.SINGLE
    }
    return findByIdOrNull(id) ?: throw NoSuchElementException()
}

interface TermRepository : JpaRepository<Term, Long>
profile
백엔드 개발자입니다.

0개의 댓글