극락코딩
-
springboot v3.x에서 swagger v3 설정법극락코딩 2023. 11. 27. 18:17
SpringBoot v3.x로 올리면서, swagger3 적용 방식이 조금 달라졌다. 1주간 삽질한 것을 기록하자. springboot v3.x로 올려야 되는 상황이 발생했다. 지금까지 2.7.x만 사용하다가...3.x로 올리려니 겁이 났다. 어디서 에러가 터질까.. 어디서 장애가 날까.. 그중에서 가장 나를 아프게 한 건 Swagger Setup이다. 일단, springboot v2.x에서 사용했던 셋업은 다음과 같이 진행했다. object DependecyVersion { const val SPRINGDOC_VERSION = "1.7.0" const val JAVADOC_SCRIBE_VERSION = "0.15.0" } dependecy { implementation("org.springdoc:spr..
-
spring version up을 진행할때 참고하기극락코딩 2023. 11. 6. 21:59
SpringBoot Project의 버전업을 진행하는데 있어, 참고하면 좋은 방법에 대해 소개 문제발생 다른 repo를 보며, 버전업을 진행했는데.. 잘 알지 못하고 진행하다보니.. 이상한 버전들이 낑겨있는 문제가 발생했다. 그러면, 어떤 것을 보고 버전업을 진행해야 할까? Default가 짱.! spring starter를 가면, 내가 원하는 사양에 맞추어 셋업을 하고, 스프링에 default로 어떤 버전을 가져갔는지 확인 가능하다. 여기서 내가 원하는 셋업을 선택하고 하단의 Explore을 클릭하면, spring이 default로 가져가는 build.gradle의 version setup을 확인할 수 있다. 플러그인, task 등 spring에서 default로 어떤 셋업을 진행하는지 확인할 수 있다..
-
API Latency를 줄이는 방법 (Part. 1)극락코딩 2023. 8. 29. 23:43
API의 응답속도 및 지연에 민감한 서비스인 경우, 어떤 방식으로 latency를 줄일 수 있을까? 이전 게시글에서는 기본적인 Project Setup을 진행했다. 이번에는 아래의 상황이 적용된 API를 만들어 본다. 해당 API는 TPS 500이 넘는다고 가정한다. (그 만큼 Call이 많은 서비스) 해당 서비스는 다수의 쿼리를 조회하고, Redis 및 Client 호출이 많다. (Wrapping API라고 생각하자) 해당 서비스는 에러가 발생하더라도, 이를 방어할 수 있는 로직이 필요하다. (에러 발생보다는, 로그를 남기고 넘어가는 방향으로 진행) 위의 조건을 맞추기 위해, 지금 만드는 API에서는 다음과 같은 IO 발생 로직들을 추가할 것이다. 1. Database 조회 4번 2. Redis 조회 ..
-
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..