일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 트랜잭샨
- piplining
- 카카오
- JPA
- 결제서비스
- 검색어 추천
- jwt 표준
- gRPC
- 숫자 블록
- docker
- BFS
- prg 패턴
- 쿠키
- 백준
- AWS
- 디버깅
- 완전탐색
- 프로그래머스
- branch 전략
- 구현
- 누적합
- 셀러리
- 좋은 코드 나쁜 코드
- 알람 시스템
- 깊게 생각해보기
- 이분탐색
- 레디스 동시성
- 객체지향패러다임
- 주식
- spring event
- Today
- Total
목록분류 전체보기 (168)
코딩관계론
서론만들고 있는 서비스가 MSA(마이크로서비스 아키텍처)를 사용하다 보니 API Gateway의 구현이 필수적으로 요구되었습니다. API GateWay를 구현하는 방법에는 크게 두 가지 접근 방식이 있습니다. 첫 번째는 직접 구현하는 방식이고, 두 번째는 프레임워크를 사용하는 방식입니다. 저는 직접 API Gateway를 구현하는 방법을 택했는데, 이 글에서 그 이유와 구현 방식에 대해서 설명해보겠습니다.API Gateway란? API Gateway는 클라이언트와 백엔드 서비스 간의 요청을 중계하는 서버입니다. 이 서버는 인증과 인가를 담당하여, 사용자의 권한에 맞는 서비스만 호출할 수 있도록 관리해줍니다. 보통 API Gateway는 아래의 그림처럼 단순히 인증 및 인가를 처리하고, 클라이언트의 요청을..
서론앞서 JWT가 어떤 방식을 통해서 동작하는지 알아봤습니다. 이제는 어떤 방식으로 개발했는지에 대해서 설명하겠습니다.1. 왜 Interceptor를 선택했나?먼저 spring에는 filter를 통해 Interceptor와 똑같은 기능을 구현할 수 있습니다. 이때의 차이점이라고 한다면 Filter는 스프링 앞단에서 동작하고, Intercepto는 스프링 영역에서 동작하게 됩니다. 만약 Filter를 통해 구현하게 되면, 에러 처리가 추가적인 시간을 소모하게 됩니다. 그 이유는 Filter에서 발생한 에러가 WAS까지 전달된 후, WAS에서 다시 패킷을 생성해 /error 리다이렉트 시키는 방식이기 때문입니다. 반면, Interceptor를 사용할 경우, 서블릿 내에서 직접 Exception Handle..
보호되어 있는 글입니다.
서론자바에서 레디스를 통해 분산락을 구현해야 하는 상황이 생겼습니다. 자바에서는 Redisson이라는 라이브러리가 대표적으로 사용되는데, 이 라이브러리가 어떤 방법을 통해 분산락을 구현하는지 궁금해졌습니다. 이에 따라, 레디스 공식 문서를 참조하여 구현 방법을 분석해보았습니다.분산락을 위한 최소 조건레디스는 락의 안전 및 생존 보장을 위해 최소 3가지 조건이 보장되어야 한다고 합니다. 세 가지 조건이란 상호 배제, 생명 주기 A, 생명 주기 B입니다.상호배제: 락은 한 명의 사용자만 점유해야 한다.생명 주기 A: 락은 반드시 release가 되어야 한다.생명 주기 B: 다수의 레디스 노드가 동작 중이면, 락을 획득하고 해제할 수 있어야 한다.단일인스턴스에서 LOCK 획득 과정사용자는 락을 획득하기 위해서..
모름지기 잘 된 서비스들은 할인 이벤트를 만들어 사용자들의 접속을 유도한다. 여담으로 배민에서는 빼배로데이와 치킨데이가 있는데 이 때 참가하는 접속자가 많아서 치킨 디도스라고 불린다. 나의 서비스에도 이런 기능이 있으면 사용자들의 접속을 유도할 수 있겠다 싶어서 만들어야 겠다는 생각이 들었고, 아래의 글을 읽어봤는데 꽤나 재밌게 보였다.https://techblog.woowahan.com/2514/ 누군가에게는 빼빼로데이. 누군가에게는? | 우아한형제들 기술블로그호기심 가득 11월 11일 빼빼로데이. 많은 인터넷 서비스 회사들이 빼빼로데이를 맞이하여 여러 이벤트를 준비한 것처럼, 배민 또한 이벤트를 준비했습니다. 아침 11시부터 선착순 1,111명에게 11,000techblog.woowahan.com 먼..
PK전략 정의PK(Primary Key) 전략은 데이터베이스 성능에 큰 영향을 미치는 중요한 요소입니다. PK 값으로 클러스터링 인덱스가 생성되며, 이는 데이터가 물리적으로 정렬되어 저장되는 것을 의미합니다. 잘못된 PK를 설정하면 성능 저하가 발생할 수 있습니다2024.07.03 - [개발/Java] - 클러스터링과 논클러스트링이란?.왜 PK 전략이 중요한가?클러스터링 인덱스 효과: PK 값에 의해 데이터가 물리적으로 정렬됩니다.성능 최적화: 필드를 업데이트하거나 저장할 때 효율적으로 접근할 수 있습니다.잘못된 PK 설정의 위험: 비효율적인 PK는 데이터베이스 성능에 부정적인 영향을 미칠 수 있습니다.또한 자연키보단 대체키를 이용해 PK를 설정하도록 합니다. PK의 특징을 보면 절대 수정이 되면 안되는..
서론기존의 타임딜 서비스를 구현하고 나서, nGrinder를 이용해 부하테스트를 진행했습니다. 900명의 유저가 동시에 접근해서 쿠폰 지급을 요청할 때, TPS가 190, 평균 응답시간은 2.3초가 나왔습니다. 따라서 부하가 많이 나오는 지점을 파악하여 성능을 개선 할 필요가 생겼습니다. 병목지점은 DB의 비관적 락부분과 실제 HDD까지 쓰기 작업이 완료되고 나서야 사용자에게 응답을 보내는 구조가 문제라고 생각했습니다. 따라서 이러한 문제점을 해결하기 위해 위해 In memory database를 도입하게 됐고, 궁극적으로 성능이 어떻게 개선됐는지 말씀드리겠습니다. In-memory-db를 도입했는가?속도적 측면아래 그림을 보면 속도적 측면이 있다. Redis에 접근해서 데이터를 읽을 때는 100ns +..
타임딜 쿠폰 발급 서비스를 구현하는 도중에 발급 가능한 쿠폰의 개수보다 사용자에게 전달한 쿠폰의 개수가 더 많은 일이 발생했다. 아래가 원인이 된 코드인데 자세히 알아보자. 발급 가능한 쿠폰의 개수와 사용자에게 전달된 쿠폰의 개수를 비교한다. 발급이 가능하다면, 새로운 쿠폰 엔티티를 생성하고, 사용자에게 쿠폰을 발급했다고 업데이트를 하게 된다. @Transactional public Coupon generateCouponToUser(TimeDealEvent timeDealEvent, Double discountRate){ if(timeDealEvent.getPublishedCouponNum() 만약 아래의 그림과 같이 사용자 두 명이 동시에 티켓 발급 요청이 들어오면 어떻게 될..
영속성 컨텍스트란 영속성 컨텍스트는 논리적인 개념으로, 영속성 엔티티들의 집합을 의미합니다. JPA에서는 EntityManager를 통해 영속성 엔티티들이 데이터베이스에 반영됩니다. 영속성 컨텍스트를 사용하는 이유는 1차 캐시 ,동일성 보장, 트랜잭션, 변경 감지 , 지연 로딩 장점을 가질 수 있기 때문입니다. 이런 장점들에 의해서 객체 관리가 쉬워지고, DB 로직이 트렌젝션 단위로 실행되게 됩니다.Entity와 EntityManager란Entity: 테이블에 매핑되는 자바 클래스를 의미합니다.EntityManager: JPA에서 영속성 컨텍스트를 관리하며, 영속성 컨텍스트에 있는 엔티티들을 데이터베이스에 저장해주는 역할을 합니다. EntityManager는 엔티티의 생명주기를 관리하고, 트랜잭션을 통..
1. Git FlowGit Flow는 가장 널리 알려진 Git 브랜치 전략 중 하나로, Vincent Driessen에 의해 제안되었습니다. 이 전략은 명확한 브랜칭 모델을 제공하여, 대규모 프로젝트 관리에 유리합니다. 메인 브랜치master: 최종 제품의 코드를 포함하며, 항상 배포 가능한 상태여야 합니다.develop: 다음 출시 버전을 준비하는 브랜치로, 여기서 새로운 기능이 통합됩니다.보조 브랜치feature: 새로운 기능을 개발하는 브랜치로, develop 브랜치에서 파생되어 완료되면 다시 develop 브랜치에 병합됩니다.release: 출시 준비를 위한 브랜치로, develop 브랜치에서 파생되며 최종 테스트 및 버그 수정을 거친 후 main 브랜치와 develop 브랜치에 병합됩니다.hot..
AOP의 필요성AOP(Aspect-Oriented Programming)는 주요 기능과 부가 기능을 효과적으로 분리하고 관리할 수 있는 개념으로, 여러 클래스에 걸쳐 공통적으로 나타나는 부가 기능을 모듈화하여 코드의 중복을 줄이고 유지보수를 용이하게 합니다. AOP가 필요한 이유와 등장 배경을 좀 더 구체적으로 설명하면 다음과 같습니다.1. AOP의 필요성서비스를 구현할 때, 우리는 다음과 같이 두 가지로 나눌 수 있습니다:핵심 기능: 애플리케이션의 주요 로직을 담당하는 부분입니다. 예를 들어, 주문 시스템에서는 주문 생성, 결제 처리 등이 핵심 기능에 해당합니다.부가 기능: 핵심 기능을 지원하는 공통 기능들입니다. 예를 들어, 로깅, 보안, 트랜잭션 관리 등이 부가 기능에 해당합니다.핵심 기능과 부가 ..
1. 생성자 주입의존관계 주입에는 여럭가지 방법이 있지만 생성자 주입을 선택하는 것이 베스트라고 한다. 그 이유는 아래와 같이 요약할 수 있습니다. 1. 단 한번만 호출되는 보장생성자는 객체가 생성될 때 단 한번만 호출되며, 누군가가 생성자 변수를 강제로 변경할 수 없게 된다. 이러한 특성은 객체의 일관성과 안정성을 보장한다. 특히, 생성자 변수에 final 키워드를 설정하면, 초기화가 누락될 경우 컴파일 오류가 발생하므로 초기화의 정확성을 높일 수 있다. 2. 객체지향적 설계객체지향적 관점에서는 객체가 생성될 때 의존관계를 주입하는 것이 바람직하다. 이는 객체가 생성될 때 그 동작을 결정짓는 요소들을 함께 설정하는 것이기 때문이다. 예를 들어, 자동차를 조립할 때 엔진과 바퀴를 처음부터 조립하는 것과 ..