본문 바로가기

Kotlin13

여러 유저를 사용한 E2E test (RestAssured 사용) 플랫폼 서비스의 경우 서비스 내에서 다양한 역할이 존재하며, 도메인/서비스에 따라 구체적인 역할이 나뉘게 된다.간단한 커머스 서비스에 예로 들자면 다음과 같은 역할들이 있다.내부적으로 CS 처리나 운영에 있어 사용되는 Admin서비스를 통해 물건을 구매하는 Buyer서비스를 통해 물건을 판매하는 Seller 시스템에 따라 이러한 역할에 대한 계정 시스템이 분리될 수도 있지만,(특히 어드민은 사용자가 사용하는 서비스와 분리되기 때문에 어드민 계정 시스템은 서비스 계정 시스템과 분리되어 관리되는 경우가 있다)시스템에 따라 여러 역할이 모두 하나의 계정 시스템 내에서 관리되기도 한다. 그리고 '물품 구매와 구매 물품 리뷰'에 대해 다음과 같은 시나리오를 생각할 수 있다.Seller 역할을 가진 유저가 판매할 .. 2025. 5. 6.
Kotlin + Spring MVC 사용 시 요청 List 필드에 null이 들어가는 경우 Java와 비교했을 때 Kotlin은 컴파일 타임에서의 null-safety를 가질 수 있다는 장점이 있다.이를 통해 NullPointerException과 같은 런타임 오류 발생을 줄이고 더욱 안전한 코드를 작성할 수 있다. 하지만 generic에 있어서는 얘기가 조금 달라질 수 있는데generic은 컴파일 타임에 타입 체크가 이루어져 타입 안정성을 보장하지만, 런타임에는 타입 정보가 삭제되는 타입 소거(type erasure)가 발생하며 이로 인해 Kotlin의 null-safety가 깨질 수도 있다. 이번 포스팅에서는 Kotlin과 Spring MVC를 사용할 때, 요청 List 내 element의 null-safety가 깨지는 케이스에 대해 알아보고 이에 대한 대처에 대해 알아보도록 하겠다. (코.. 2025. 3. 3.
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.