Kotlin
Kotest를 활용해 Spring Boot에서 테스트코드 작성하기
Kotest를 활용해 Spring Boot에서 테스트코드 작성하기
2023.01.29Kotlin + Spring Boot 프로젝트에서 테스트코드를 Junit으로 작성하기는 쉽지 않습니다. Kotlin 컨벤션을 무시하고 Annotation 떡칠한 채 테스트코드를 작성한다면 분노의 찬 Jetbrains IntelliJ가 갑자기 컴파일을 하지 않을 수도 있습니다. 그래서 태생부터 Kotlin을 위해 개발된 테스트 프레임워크로 Kotlin 최신 문법을 발 빠르게 지원하고 있는 Kotest와 함께 테스트코드를 작성한다면 유지보수측면에서도 훨씬 더 효과적일 것입니다. 테스트 준비 Kotest와 Spring Boot Test를 사용하기 위해 의존성을 아래와 같이 추가합니다. (아래에 H2 DB를 이용해 테스트를 수행할 예정으로 h2 의존성도 추가합니다.) testImplementation("com...
Kotlin 'by' 키워드의 역할 (feat. Composition)
Kotlin 'by' 키워드의 역할 (feat. Composition)
2023.01.21코틀린의 by 키워드는 Delegate Pattern을 쉽게 구현할 수 있도록 도와주는 키워드입니다. Delegate Pattern Delegate Pattern이란 객체의 메소드를 다른 객체(Helper Object)에 위임하여 처리하는 패턴입니다. 즉 어떤 기능을 자신이 수행하지 않고 다른 객체가 수행하도록 하는 패턴입니다. 특히 이 Delegate Pattern과 항상 붙어다니는 "상속 vs 조합" 이라는 단어입니다. 자식클래스에서 부모클래스의 요소를 사용할 때 상속(Ingeritance) 또는 조합(Composition)을 이용할 수 있습니다. 상속은 모든 요소를 물려받기 때문에 변수나 메소드 등을 다시 구현할 필요가 없어 편리하지만, 객체의 유연성이 떨어진다는 치명적인 단점이 있습니다. 만약 부..
Spring Boot + Kotlin 깔끔한 validation 처리 (feat. Jackson)
Spring Boot + Kotlin 깔끔한 validation 처리 (feat. Jackson)
2022.10.18스프링 부트 의존성 라이브러리를 확인했을 때 별도의 라이브러리를 추가하지 않더라도 기본 starter 킷에 Jackson 라이브러리가 포함되어 있는 것을 확인할 수 있습니다. Spring Boot를 이용한 HTTP API 서버 구현시 요청의 body 값을 대부분 JSON으로 받게됩니다. 또한 응답을 Class Instance로 반환하면 JSON으로 변환하여 응답하게 됩니다. 때문에 직렬화와 역직렬화가 수행되는데, 스프링부트에서는 @RestController 어노테이션이 달린경우 Jackson 라이브러리가 직렬화와 역직렬화를 담당하게 됩니다. 대부분의 변환 과정에서 큰 문제는 없지만 스프링부트와 Kotlin을 함께 사용하게 된다면 이야기가 조금 달라집니다. @RestController class Examp..
Javascript Promise로 배우는 Kotlin Coroutine
Javascript Promise로 배우는 Kotlin Coroutine
2022.10.09Coroutine 이란? 처음 코루틴을 접했을 때 코틀린의 '코'를 따서 'Ko'routine 인줄 알았지만, 사실 코루틴의 Co는 Concurrency라는 의미를 가지고있습니다. 즉, 동시성 프로그래밍 개념을 코틀린에 도입한 것이 코루틴 이라고 합니다. 코루틴은 javascript Promise와 조금 다른 성질을 가지고 있습니다. 코루틴은 스레드 위에서 실행되는데 여러가지 코루틴 1,2,3이 존재한다고 할 때 코루틴1을 실행하던 중 코루틴2가 실행되어도 실행중인 스레드를 정지하면서 컨텍스트 스위칭 개념으로 다른 스레드로 전환하는 것이 아니라 기존 스레드를 유지하며 기존 스레드에서 코루틴2를 실행하게 됩니다. 이후 코루틴1을 다시 실행할 때 저장해둔 코루틴1 상태를 불러와 다시 스레드에서 코루틴1을 실..
SpringBoot ResponseBodyAdvice 특정 응답 값 암호화하기
SpringBoot ResponseBodyAdvice 특정 응답 값 암호화하기
2022.09.25본 포스팅은 ResponseBodyAdvice를 이용하여 암호화된 응답값을 생성하는 예제입니다. 사실 HandlerInterceptor의 postHandler 같은 곳에서 응답값을 가공할 수 있을 듯하지만, 사실 인터셉터 단에서 응답 가공은 불가능합니다. 하지만 특정 API만 암호화된 값으로 응답을 가공하고 싶을 때가 있는데, 그럴때 사용하는 것이 ResponseBodyAdvice입니다. ResponseBodyAdvice @RestControllerAdvice class EncryptedResponseWrapper : ResponseBodyAdvice { override fun supports(returnType: MethodParameter, converterType: Class): Boolean { ..
Kotlin 리플렉션(Reflection)
Kotlin 리플렉션(Reflection)
2022.09.06리플렉션(Reflection)이란? 리플렉션은 말 그대로 '반사', '반영'의 의미를 가지고있습니다. 구체적인 클래스 타입을 알지 못하더라도 바이트코드를 이용해 해당 클래스의 메소드, 타입, 변수들을 참조하여 값을 찾을 수 있는 JAVA API입니다. 즉 컴파일 시점이 아닌 런타임에 동적으로 특정 클래스의 정보를 추출할 수 있고 변수를 변경하거나 메소드를 호출할 수 있는 프로그래밍 기법입니다. 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용됩니다. intelliJ의 자동완성 기능, Lombok, Spring Container, Spring annotation 등에서 사용됩니다. 리플렉션은 아래와 같은 정보들을 가..
[Kotlin] companion object, Java static 차이점
[Kotlin] companion object, Java static 차이점
2022.05.15이 글은 코틀린의 companion object와 Java의 static 키워드의 차이점에 대해 학습한 것을 정리하였습니다. object class 코틀린은 자바에 없는 독특한 싱글톤(Singleton) 선언 방법이 있습니다. 아래처럼 class 키워드 대신 object 키워드를 사용하면 됩니다. object Singleton { val name = "singleton" fun print() = println("hello") } fun main() { println(Singleton.name) // "singleton" Singleton.print() // "hello" val singleton = Singleton() // 에러! } object 키워드로 선언한 속성과 메소드는 static 키워드로 선..
[Kotlin] coroutine, suspend 함수 정리 및 예제
[Kotlin] coroutine, suspend 함수 정리 및 예제
2022.04.19Coroutine 코루틴이란. 실행의 지연과 재개를 허용함으로서, 비선점 멀티테스킹을 위한 서브루틴을 일반화한 구성요소입니다. 자세히 이해하기 위해 서브루틴과 비선점 멀티테스킹 두가지 개념을 알아야 합니다. 루틴과 서브루틴 루틴은 컴퓨터 프로그램에서 하나의 정리된 일(job)입니다. 프로그램은 보통 크고 작은 여러가지 루틴을 조합시킴으로써 만들어집니다. 루틴은 다시 메인루틴과 서브루틴으로 나뉩니다. 메인루틴은 프로그램 전체의 개괄적인 동작 절차를 표시하도록 만들어 집니다. 서브루틴은 반복되는 특정 기능을 모아 별도로 묶어 이름을 붙여 놓은 것입니다. 그리고 별도의 메모리에 해당 기능을 모아놓고 서브루틴이 호출될 때마다 저장된 메모리로 이동했다가 return 을 통해 원래 호출자의 위치로 돌아오게 됩니다...
[Kotlin] 확장 함수와 프로퍼티
[Kotlin] 확장 함수와 프로퍼티
2022.03.20코틀린 확장 함수 코틀린은 기존 클래스에 메소드를 추가할 수 있습니다. 이를 확장 함수라고 합니다. 하지만 기존 클래스에 대해 메소드를 확장적으로 선언을 할 수 있을 뿐, 해당 클래스의 구현부를 바꿀 수는 없습니다. 기존 클래스는 그대로 두고 클래스 주변에 새로운 함수를 추가하여 클래스의 크기를 확장한다. 라고 생각하면 좋을 것 같습니다. String 클래스의 메소드인것 처럼 사용할 수 있는 lastChar 메소드를 확장해보겠습니다. 확장 함수의 선언 방법은 아래와 같습니다. fun String.lastChar():Char = this.get(this.length - 1) // this 생략 가능 fun String.lastChar():Char = get(length - 1) // 사용시 println(..