본문 바로가기

서버27

Refactoring : if-else문을 사용하는 팩토리 클래스 제거하기 개발을 하다보면 VIP 유저, 일반 유저 등의 여러 상황과 정책에 대응하기 위해 하나의 인터페이스가 여러 구현체를 갖게되는 경우가 더러 있다. 위와 같은 경우 특정 상황에서 특정 구현체를 찾아주어야 하는 팩토리 클래스를 만들어야 하는데, 이 팩토리 클래스에 If-else문 혹은 switch, when 등을 사용하기 쉽상이다. 이때, 어떻게 대응해야할지 고민과 그 결과를 공유해보고자한다.if-else를 사용한 팩토리 클래스VVIP 유저, VIP 유저, GOLD, SILVER 유저마다 다르게 할인율을 계산해주는 정책이 있었다고 가정해보자. 보통의 상황에서 우리는 UserSalePolicy라는 인터페이스를 정의하고 각 유저에 맞는 정책들을 구현할 것이다.interface UserSalePolicy { fun .. 2023. 12. 26.
AbstractRoutingDataSource 를 통한 DB replication 환경 설정과 Spring Data JPA에서의 Transactional 이슈 해결을 위해 스프링 구현 코드를 까보는 (약간은 바보 같은) journey.. 문제 상황 Spring Data Jpa에서 메서드 명만 작성하면 알아서 jpql을 만들어내주는 신기한 기능을 많이들 써봤을 것이다. 나 또한 그랬고, 이번에도 어김없이 사용하고 있었다. 다만, 현재 하고 있는 프로젝트에서는 현재 트랜잭션이 read-only일 시에는 read-only DB, 데이터 변경 관련 트랜잭션일 경우에는 write 전용 DB를 바라보게 하고 있었다. (전형적인 DB replication 구조) 이때 클라이언트 단에서 post로 데이터를 작성하고, 직후 get을 통해 데이터를 조회할 시 read DB와 write DB의 동기화 시간 차이로 인한 문제로 not found exception이 발생했고 새로고침하면 동기화가 되어 다시 데이터가 정상적으로 조회되는 상황이었다. 해결? 사실 .. 2023. 10. 22.
Redis에서 사용하는 분산락 알고리즘인 RedLock에 대해 알아보자 개요 redis에서는 분산락을 제공하기 위해 redLock 알고리즘을 사용한다. 이에 대해 공부해보고 내용을 정리해본다. 참고: https://redis.io/docs/manual/patterns/distributed-locks/ Distributed Locks with Redis A distributed lock pattern with Redis redis.io 분산락을 적용하는 방법 레디스가 단일 인스턴스일 때의 방법은 간단하다. 레디스의 SetNX 를 사용하면 된다. // 락이 존재하지 않는다면 value를 set하고 3초 뒤에 ttl 한다. SET key_name random_value NX PX 3000 spring data redis를 활용한 스프링 코드로 보면 다음과 같을 것이다. 과정을 간.. 2023. 9. 16.
nGrinder 성능 테스트 측정 삽질 일기 (Docker를 통한 설치 + war 파일을 통한 설치 포함) 개요 서비스의 성능을 측정하기 위해서는 대게 Throughput과 Latency 성능지표가 필요하다. 보통 Throughput은 얼마나 많은 요청을 처리할 수 있는지에 대한 처리량을 의미하고, Latency는 요청을 처리하는 속도를 의미한다. 처음 nGrinder를 썼을 때 왜 안되지? 이것들은 뭐지? (가령, TPS는 뭔지, 스크립트는 어떻게 만드는지, Agent는 뭔지) 하며 많이 당황했었고 이 글을 보는 개발자 분들이 단순 구현보다는 성능과 모니터링에 관심을 가졌으면 해서 nGrinder를 활용한 성능 테스트 측정 방법을 정리해보고자 한다. nGrinder 알아보기 nGrinder는 네이버에서 The Grinder라는 성능 테스트 도구를 기반으로 제작한 오픈소스 성능 테스트 솔루션이다. (오픈소스 .. 2023. 9. 2.