전체 글
-
API Latency를 줄이는 방법 (Part. 0)극락코딩 2023. 8. 28. 20:13
API의 응답속도 및 지연에 민감한 서비스인 경우, 어떤 방식으로 latency를 줄일 수 있을까? 최근에 API의 latency가 민감한 서비스를 개발하게 되었다. 사용자 경험상, 아무리 늦더라도 60~80ms안에는 API의 응답을 받아야 했다. 그렇다면, latency를 줄이기 위한 방법으로는 무엇이 있을까? 일단, 몇가지 상황을 제시한다. 해당 API는 TPS 500이 넘는다고 가정한다. (그 만큼 Call이 많은 서비스) 해당 서비스는 다수의 쿼리를 조회하고, Redis 및 Client 호출이 많다. (Wrapping API라고 생각하자) 해당 서비스는 에러가 발생하더라도, 이를 방어할 수 있는 로직이 필요하다. (에러 발생보다는, 로그를 남기고 넘어가는 방향으로 진행) 그럼, Project Se..
-
Slack Message 발송극락코딩 2023. 8. 27. 17:35
이번에는 Slack에 Message를 발송하는 방법에 대해 정리하려고 한다. 매우 쉽고, 30분안에 만들 수 있다. Spring + Kotlin 기반으로... 가장 먼저 프로젝트 셋업 build.gradle import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { val kotlinVersion = "1.6.21" id("org.springframework.boot") version "2.7.6" id("io.spring.dependency-management") version "1.0.14.RELEASE" kotlin("jvm") version kotlinVersion kotlin("plugin.spring") version kotlinVers..
-
@Transactional vs TransactionTemplate극락코딩 2023. 8. 22. 00:53
스프링에서 트랜잭션을 다루는 2가지 방법이 있다. @Transactional을 사용하는 선언적 트랜잭션과 TransactionTemplate을 사용하는 프로그래밍적 트랜잭션이다. 2가지 방법에 대해 간단하게 정리하면, 다음과 같다. @Transactional 어노테이션 기반으로 method에 트랜잭션을 거는 방법 proxy로 원래 객체를 감싸는데, 그 이유는 실제 메서드의 가장 앞단과 가장 뒤에 트랜잭션의 begin과 commit으로 감싸기 위함 TransactionInterceptor.class @Override @Nullable public Object invoke(MethodInvocation invocation) throws Throwable { // Work out the target class..
-
온디맨드가 뭔디?극락코딩 2023. 8. 20. 15:15
온디맨드 서비스, 온디맨드 구축 등 온디맨드 관련된 단어를 많이 들을 것이다. 그렇다면, 온디맨드는 무엇을 의미하는 것일까? 온디맨드란?(On-Demand) 온디맨드(On-Demand)는 사용자의 요구에 따라 필요한 서비스나 콘텐츠를 즉시 제공하는 방식을 의미한다. 온디맨드 서비스는 사용자가 언제든지 원하는 시간에 필요한 서비스를 이용할 수 있는 편리성을 제공한다. 예시 온디맨드 비디오 스트리밍 서비스인 Netflix는 사용자가 영화나 TV 프로그램을 원하는 시간에 스트리밍하여 시청할 수 있게 해준다. 사용자는 특정 프로그램을 예약하거나 방송 시간을 기다릴 필요 없이 언제든지 해당 콘텐츠를 선택해 재생할 수 있다. AWS의 온디맨드 서비스는 사용자의 요청에 따라, 서비스를 제공한다. 온디맨드 서비스는 또..
-
Redis Pub-Sub 사용하기극락코딩 2023. 8. 19. 11:41
Redis의 사용용도는 무궁무진하다. 캐싱, 큐, 분산락, 그리고 pub-sub 등 다양한 기능으로 사용될 수 있다. 이번에는 redis pub-sub에 대해 정리해볼려고 한다. Pub-Sub 구조란? 분산 시스템에서 사용되는 메시징 아키텍처 패턴 중 하나이다. 시스템 내의 다른 컴포넌트나 서비스 간에 데이터나 이벤트를 비동기적으로 교환하는데 사용한다. --> 컴포넌트들을 느슨한 결합으로 연결할 수 있다. 구조 Publisher (발행자) Publisher는 메시지나 이벤트를 생성하고 PubSub 시스템에 발행 데이터 생산자 역할 Publisher는 어떤 이벤트가 발생했을 때 해당 이벤트를 PubSub 시스템에 알리는 역할 Subscriber (구독자) Subscriber는 PubSub 시스템에서 발행된..
-
디프만 똑스 서버에서 캐싱 공통 모듈 만들기극락코딩 2023. 8. 17. 23:34
디프만 12기에서 진행한 똑스라는 프로젝트가 있다. 12기 활동 진행시에는 운영진으로 참여하여 대부분의 구현 작업에 참여하지는 않았는데.. 12기 종료후에 본격적으로 개발 작업에 참여하게 되었다. 개발 작업에 착수하며, 몇가지 문제점을 파악했는데, 그 중에서 캐싱 부분에 대해 확인해보겠다. 문제가 되는 부분 1. 자주 사용되는, 하지만 변경이 일어나지 않는 데이터에 대한 캐싱이 없다. 2. 그렇기에 데이터 조회시 레이턴시가 상당하다. 3. 조회 성능이 중요한 api의 레이턴시가 300ms를 넘게 초과한다. 해결방안 1. Network IO를 가능한 적게 타도록 구성 2. 변경이 적은 데이터에 대한 레디스 캐싱 작업 진행 api의 레이턴시를 낮추기 위해, 가장 좋은 방법은 network IO를 가능한 줄..
-
Http에서 국가 정보 얻기극락코딩 2023. 8. 17. 00:14
한국이 아닌, 다른 나라에서 접근하는 유저에 대해 다국어 지원, 혹은 별도의 필터링을 해야 되는 작업이 있을 수 있다. 이럴때, 어떻게 국가 정보를 얻을 것인지 혼란스러울 수 있다. 사실, 라우팅하는 쪽에서 심어주어도 될 것 같긴한데, 그것 말고 Http Header 기반으로 체크하는 방법도 있다. (이게 가장 간단하긴 함,, 하지만 정확성은 떨어진다.. 어쩔 수 없음) Http Header 중에서, accept-language 라는 항목이 있다. 해당 항목에 데이터 요청시 어떤 언어를 어떤 순위로 지정할 것인지 들어 있다. 자세한건.. 요기서 아래의 코드를 참고하면, 아주 쉽게 Country Check 기능 구현 가능~! 전체코드 import mu.KotlinLogging import org.sprin..
-
Kotlin에서 Builder Pattern을?극락코딩 2023. 8. 15. 17:39
java에서는 코드의 가독성과 편의를 위해 롬복을 사용한다. 그중에서 builder를 많이 사용할 것인데... Kotlin에서는 builer Pattern을 생각보다 많이 사용하지 않는다. (물론 사용은 가능...) 그래서 예시를 함 보자 kotlin에서 builder Pattern을 사용하지 않는 이유가 무엇일까요? 1. kotlin에서는 getter없이 property 접근이 가능하다.. 2. kotlin에서는 setter없이 property 값을 변경 가능하다.. 위의 두가지 처럼, property를 직접 접근 가능한 이유로 builder 쓸 이유가 없어진다. 그래도 만약에 쓰고 싶다면, 아래와 같이 해보면 어떨까 import java.time.LocalDateTime /** 단순 객체 데이터를 B..