kotlin 에서 java 프레임워크(대표적으로 spring, hibernate)를 이용할때 가장 문제가 되는건 상속이다. java 프레임워크들은 상속을 적극적으로 이용해서 개발자들의 코드를 확장하는데 kotlin 은 기본적으로 final class 이기때문에 상속이 되지않기때문이다. open 키워드를 붙이면 상속이 되게되는데 이를 수작업으로 할 경우 빼먹기도 쉽고 일일이 타이핑을 해줘야한다는 불편함이 존재한다. 이를 해소하기위해 jetbrains 에서 kotlin-allopen 이라는 플러그인을 지원하고있다. IDE 에서 언어를 kotlin 으로 지정해 spring 프로젝트를 생성하면 기본적으로 들어가는 플러그인이기때문에 저 플러그인을 제대로 인지하지 못하고 있어도 자연스럽게 개발하는데 문제가 없게되기..
얼마전 코틀린 1.4 버전이 릴리즈됐다. 추가된 기능들에 대해 간략히 살펴보자. # SAM conversions for Kotlin interfaces 지금까지 코틀린은 SAM(Single Abstract Method, 추상메서드가 하나뿐인 인터페이스) 에 대해 람다 표현식을 지원하지않았다. 함수 자체를 타입으로 나타낼 수 있었기때문에 함수 타입에만 람다를 지원하고, 자바의 함수형 인터페이스(마찬가지로 추상메서드가 1개인 인터페이스)만 람다로 표현할 수 있었다. fun main() { val calculator = object: Calculator { override fun add(n1: Int, n2: Int): Int = n1 + n2 } } interface Calculator { fun add(n..
처음 자바를 배울때만해도 getter, setter 는 객체지향 언어인 java 의 캡슐화의 산물이었다. 하지만 개발자로써 경험을 하고, 공부해오면서 getter, setter 로는 충분한 캡슐화를 제공하기 어렵고, 특히 setter 는 캡슐화를 넘어 객체 상태를 변경하기때문에 더 주의깊게 사용하고자 하고있다. 객체를 조작하고, 코드를 작성하다보면 객체의 상태를 변경해야하는 경우도 발생하는데 이럴때도 단순히 setter 를 호출하기보다는 좀 더 의미있는 이름의 메서드를 제공하고자했고, 특히 2개 이상의 상태를 변경해야한다면 클라이언트 코드에서 연속적인 setter 를 호출하는것 보다는 필요한 상태를 모두 원자적으로 변경하는 메서드를 제공하는 형태의 코드를 작성하고있다. - setter 를 이용한 상태 변..
이번 포스팅 내용은 kotlin 과 jackson 조합시에만 발생하므로 java 이용시엔 해당하지않는다. 정확히말하면 jackson 에서 kotlin 지원을 위한 모듈인 jackson-module-kotlin 의 문제다. jackson-module-kotlin 2.10.0 까지는 data class 를 json 으로 serialize 시 is 로 시작하는 프로퍼티에 대해 is 를 제거한 key 로 serialize 했다. 쉽게 코드를 보고 얘기하자면 data class Person( val isDeveloper: Boolean ) 이 클래스를 serialize 시 json 형태는 이런 형태였다. {"developer":true} jackson-kotlin-module 2.10.1 부터는 이 스펙이 변경되..
기본적으로 kotlin의 generics 는 자바와 많은 부분에서 비슷하다. 하지만 몇가지 달라진점, 추가된점들이 있는데 그 것들을 정리한다. 기본적으로 자바의 generics 을 어느정도 이해하고있다는 가정하에 얘기가 진행되므로 generics 전체를 자세히 설명하지는 않는다. 1. Star Projection * 를 이용해서 표현한다. 특정 타입을 지정하지않을때 사용하며, 자바의 와일드카드라고 생각하면 된다. 와일드카드와 동일하게 타입을 캡쳐하지않기때문에 타입안정성을 보장받지못한다. 다만 자바의 와일드카드처럼 한정적 와일드카드(bounded wildcard) 문법은 지원하지않는다. // 와일드카드처럼 사용 가능. val list: List = listOf(1, 2, 3) // 타입을 캡쳐하지않기때문에..
1. collection val evens: List = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) .filter { it % 2 == 0 } 코를린에서 처음 이런 코드를 봤을때 아무 생각없이 난 이렇게 생각했었다. '오 코틀린은 stream 호출안해도 알아서 stream 으로 바꿔주나보다' 이렇게 생각한 근거는 딱히 없다. 그냥 stream 과 동일한 API 를 제공하고있어서 그렇게 생각했던것 같다. (많이 알겠지만 filter, map 과 같은 api들은 매우 범용적인 네이밍이라 프로그래밍 언어 차원을 넘어서서 여기저기서 많이 제공하고있는 명칭이다.) 하지만 그게 아니란걸 알게되어 이 포스팅을 작성하게됐다. 사실 신중히 고민해봤다면 이상한걸 느꼈어야한다. stream 으로 변..
1. 자바의 지역변수 스레드 세이프 자바에서 지역변수는 람다나 익명클래스 내에서 값을 변경할 수 없다. 람다나 익명클래스에서만 값을 변경할 수 없을뿐아니라 람다나 익명클래스에서 읽고(read) 있다면 외부 메서드 내에서도 값을 변경할 수 없다. 이 규약을 지키기위해 람다가 없던 자바7까지는 익명클래스에서 외부 메서드의 지역변수를 읽기위해선 지역변수를 final 로 선언했어야했고, 람다가 추가된 자바8 이상에서는 effectively final(사실상 final) 이라는 규약으로 final 변수가 아니더라도 람다나 익명클래스에서 읽고있다면 사실상 final 이 되어 어디서도 값을 변경할 수 없다. public void test() { int number = 100; new Runnable() { @Over..

요근래 kotlin+spring boot2 로 개발을 하고있다. 이중에 코드를 리팩토링하고싶은 부분이 있었고, 이를 리팩토링하는 과정에서 꽤나 삽질을 하게만든 경험을 포스팅하려한다. 뭔가 특정한 내용에 대해 포스팅한다기보다 실제 상황에서 이슈를 만나고, 그 이슈를 해결해가는 과정을 남겨보려한다. 실제 이슈는 회사에서 프로덕션 코드를 리팩토링하는 과정에서 발생한부분이고, 포스팅에서 나오는 코드는 해당 코드를 예제화한 코드이다. 참고로 아래 예제코드를 위한 개발환경은 다음과같다. - kotlin - spring boot 2.1.5 - spring boot stater web - spring boot starter jdbc (필수) 1. 코드작성 abstract class BaseApiRepository(pr..
기존 운영중인 자바 프로젝트에서 테스트코드를 코틀린으로 작성하고자했다.어떤 것들을 해줘야하는지 찾아봤는데 정말 별거 없다. plugins { id 'org.jetbrains.kotlin.jvm' version '1.3.20' } 이것만 추가해주면 바로 코틀린 클래스를 만들어서 테스트 코드를 작성할 수 있다. class KotlinTest { @Test fun `안녕 코틀린`() { assertThat("hello").isEqualTo("hello") } }
kotlin 에서 jackson 사용시 kotlin/reflect/KotlinReflectionInternalErrorjava.lang.NoClassDefFoundError: kotlin/reflect/KotlinReflectionInternalError 이런 에러를 내뿜는 경우가 있다. 나같은경우 코틀린은 1.2.10 을 사용하고있고, 스프링부트를 이용해서 작업하고있었는데 스프링부트에서 포함하고있는 jackson 이 2.8.10 이라서 코틀린 jackson 모듈도 동일 버전으로 추가했었다. compile("com.fasterxml.jackson.module:jackson-module-kotlin:2.8.10") 그리고 저 에러를 만난건데 코틀린 jackson 버전을 2.9 이상으로 올려주면 해결된다.j..
- Total
- Today
- Yesterday
- OOP
- Design Pattern
- Kotlin
- java
- EffectiveJava
- JavaScript Core
- db
- DesignPattern
- backend개발환경
- TEST
- go-core
- servlet
- Spring
- java8
- MySQL
- Git
- frontend개발환경
- clean code
- code
- http
- generics
- 정규표현식
- JPA
- javascript
- Jackson
- spring cloud
- toby
- programming
- mariadb
- frontcode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |