본문 바로가기

Kotlin11

reified를 통해 generic type 정보 가져오기 generic을 사용하여 코드를 작성할 때, generic type의 정보를 사용하고 싶은 경우가 있을 것이다. 아래 코드는 generic을 사용하여 파라미터의 타입을 확인하는 함수이다. fun isInstanceOf(obj: Any): Boolean { println("check object(${obj::class}) is instance of ${T::class}") return obj is T } 하지만 generic은 compile 후 제거되기 때문에 위 코드와 같이 generic type을 직접적으로 사용하는 코드는 compile error를 낸다. 그래서 주로 아래와 같이 추가로 generic type과 같은 Class 타입의 파라미터를 받는 식으로 우회한다. fun isInstanceOf(o.. 2023. 1. 16.
[MockK] mock 객체가 호출되지 않았음을 검증하기 기능 개발을 하다보면 상태 값에 따라 특정 기능을 실행할지 말지 분기를 탈 필요가 있다. class SomeService( private val someFeature: SomeFeature, ) { fun executeIfFlagIsOn(flag: Boolean) { if (flag) { this.someFeature.execute() } } } class SomeFeature { fun execute() {} } 위와 같이 SomeService#executeIfFlagIsOn 메서드는 flag 파라미터를 통해 SomeFeature기능을 실행할지 말지를 결정하는 코드가 있을 때, MockK를 사용하여 SomeFeature의 기능이 실행되거나 안되었음을 테스트하기 위해서 wasNot(called: Call.. 2022. 10. 21.
JPA entity의 VO로 Kotlin value class 사용하기 DDD와 같이 도메인에 집중하는 설계 방식에 관련된 책이나 블로그 글들을 보면 VO(value object)에 대해 이야기하는 것을 자주 볼 수 있을 것이다. VO는 도메인에서 다루는 값을 나타내는 객체로 String이나 Int 등 범용적인 타입이 아닌 그 자체로 도메인의 값을 나타내며, 객체 안에 있는 값 또한 해당 도메인에서 사용하는 신뢰할 수 있는 값을 가지고 있다는 특징을 지닌다. (예를 들어 Email이라는 VO는 {username}@{domain} 형태의 String 값임을 나타낸다) 이번 포스팅에서는 Kotlin을 사용할 때 JPA entity와 VO 사용에 대해서 특히 value class를 사용한 VO에 대해 알아보도록 하겠다. (관련 코드는 여기에서 확인할 수 있다) Kotlin과 J.. 2022. 6. 1.
Double Dispatch를 통해 유연하게 확장하기 (해당 내용은 토비님의 유튜브영상을 정리한 것임을 알립니다) GoF Design Pattern 에 행동 관련(Behavioral) 패턴 중 Visitor Pattern이 있는데 이 패턴을 알기 위해서 Double Dispatch 기법을 알면 보다 쉽게 이해할 수 있다. (사실 상 Visitor Pattern의 기반이 Double Dispatch 기법이다) Double Dispatch 기법은 말 그대로 디스패치를 두 번 한다는 것인데, 다형성을 통한 유연성은 높이되 각 구현체에 대해 특화된 로직을 적용해야하는 경우에 사용할 수 있다. 코드로 Double Dispatch에 대해 알아보자. 예제 코드 예제는 SNS에 Post를 올리는 간단한 코드이다. interface SNS { fun getName(): .. 2022. 2. 10.
[Spring with Kotlin] sealed class로 다양하게 요청 받기 예제 코드는 여기에서 확인할 수 있다. 서버 API를 만들다보면 동일한 리소스에 대해 다른 요청 파라미터를 받아야할 때가 있다. 기본적인 파라미터는 동일하지만 리소스의 타입에 따라 다른 파라미터를 추가적으로 받아야할 때 sealed class를 활용하여 하나의 리소스에 대한 다양한 요청 DTO를 관리할 수 있다. 예를 들어 유저를 등록하는 API가 있다고 하자. 기본적으로 서비스에서 가입 시 유저로부터 이름, (로그인 ID로써)이메일, 비밀번호를 받아야한다면 요청 파라미터는 다음과 같은 data class로 나타낼 수 있을 것이다. data class UserSignUpRequest( @field:NotBlank val name: String, @field:Email val email: String, @.. 2022. 1. 28.
Arrow Core: Tutorials - Functional Error Handling (작성 중) Functional Error Handling 함수형 에러 핸들링 https://arrow-kt.io/docs/patterns/error_handling/ Λrrow Functional companion to Kotlin's Standard Library arrow-kt.io When dealing with errors in a purely functional way, we try as much as we can to avoid exceptions. 순수한 함수형 방식으로 에러를 처리할 때, 예외들을 피할 수 있게 최대한 노력한다. Exceptions break referential transparency and lead to bugs when callers are unaware that they may.. 2021. 12. 31.