본문 바로가기

분류 전체보기154

할 수 있는 것과 해야하는 것 지금 팀에서 일주일 단위의 짧은 스프린트 기간을 갖으면서 프로젝트를 진행하고 있다. 말이 일주일이지 주말을 제외하고 스프린트 플래닝이랑 회고, 도메인 용어 정리, 서버-클라이언트 인터페이스 협의 등의 회의를 하고나면 실제로 일할 수 있는 시간은 그리 많지 않다. (또 가끔씩 플래닝 때는 생각치도 못한게 튀어나올 때가 있기도하다...) 이런 짧은 시간을 주기로 일을 하다보니, 일을 할 때 할 수 있는 것과 정말 해야할 것을 구분하는 것이 중요함을 많이 느끼게 된다. 예를 들어 사용자가 어떤 데이터를 생성할 수 있는 기능을 추가한다고 하자. 그러면 생성한 데이터를 수정하는 기능도 생각할 수 있을 것이다. 데이터를 수정하는 것은 기술적으로는 크게 어렵진 않지만 - 해당 데이터를 생성 후 언제까지 수정할 수 .. 2022. 7. 17.
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.
Sorted Set vs Top-K for Real-time Ranking System 실시간 랭킹 시스템을 구축할 때 Redis의 Sorted Set(ZSET)을 활용하는 방식은 많이 알려진 방식이다. Redis: Real-Time Leaderboard & Ranking Solutions AWS: Build a real-time gaming leaderboard with Amazon ElastiCache for Redis Sorted Set은 자료 구조 자체가 단순하고 지원되는 기능이 많으며 무엇보다 사용이 어렵지 않기 때문에 쉽게 랭킹 시스템을 구축할 수 있다. 또한 Redis는 시간이 지나면서 여러 기능과 모듈들이 생겼고 그러한 모듈 중 하나인 RedisBloom 모듈을 통해 몇 가지 확률적 자료구조를 지원하는데, RedisBloom 모듈은 Sorted Set과 마찬가지로 실시간 랭킹.. 2022. 5. 23.
직접적인 테스트와 간접적인 테스트 협업 중에 생긴 일화를 바탕으로 직접적인 테스트와 간접적인 테스트에 대한 개인적인 소견에 대해 적어본다. 테스트 코드를 작성하다보면 코드에 대한 테스트가 중복적으로 발생할 여지가 생길 때가 있다. 이 때 테스트를 어디에 짜는 것이 좋을까? 말로만 하면 애매하니 간단한 예제를 들어보자. 우리가 쓰는 신용카드, 체크카드는 유효기간(년, 월)을 갖고 있다. 그리고 해당 유효기간과 동일한 년, 월 까지는 카드가 유효하다. (e.g. 유효기간이 2022년 1월 이라면, 2022년 1월 31일 까지는 해당 카드는 유효하며, 2월 1일 부터는 만료된 것이다) 이 정보를 간단한 엔티티와 엔티티에 대한 정보를 담는 DTO 코드로 옮겨보자. import java.time.LocalDateTime import java.ti.. 2022. 5. 8.
Simple is the Best 세상엔 어떤 문제를 풀기위한 수십가지 방법들이 있다. 그렇기에 개발자로서 우리는 무언가를 만들면서 "좋은" 결정을 내려야한다. 그러면 "좋은" 결정이란 무엇일까? 나같은 경우, 개발에서 "좋은" 결정은 요구사항을 충족시키면서 동시에 간단하고 이해하기 쉬운 것이라고 생각한다. 매 챌린지 마다 항상 우아하게, 복잡하게 갈 필요는 없다고 생각한다. 만약 '분산 시스템에서 Unique ID 생성하기'와 같은 주제를 찾아보았다면 아마도 Flickr의 Ticket Server 방식을 본 적이 있을 것이다. https://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/ 이 방식은 동일한 년도에 발표한 Twit.. 2022. 5. 2.
[MockK] 메서드 호출 순서 검증하기 객체의 메서드를 여러 번 호출하는 로직이 있을 때, 사용되는 메서드를 순서대로 확인하고 싶을 때가 있을 수 있다. (하지만 구현 사항을 너무 깊게 확인하는 것일 수 있으니 정말 필요한 검증인지 충분히 고민해봐야한다) MockK를 사용할 때는 verifySequence를 사용하면 mock object의 호출 순서를 확인할 수 있다. import io.kotest.core.spec.style.DescribeSpec import io.mockk.mockk import io.mockk.verifySequence class MyObject { fun fun1(value: Any) { println(value) } fun fun2(value: Any) { println(value) } fun fun3(value: .. 2022. 4. 15.