Outbox 패턴
·
개발 관련
Outbox 패턴대상 독자Outbox 패턴이 무엇인지 궁금한 사람데이터베이스 저장과 이벤트 발행 간 정합성 문제를 겪는 사람dual-write 문제를 해결하고 싶은 사람TL;DROutbox 패턴은 서로 다른 시스템에 쓰기 작업을 할 때 원자성을 보장할 수 없는 dual-write 문제를 해결하기 위한 방법으로, 서로 다른 시스템의 쓰기 작업을 데이터베이스 트랜잭션 내로 묶는 패턴입니다.등장 배경Outbox 패턴은 외부 시스템과 데이터베이스 저장 간의 원자성 보장이 어렵다는 문제로 인해 등장했습니다.이벤트 발행 시스템을 예시로 들면, 다음 두 가지 문제가 존재합니다.데이터베이스 저장은 성공했지만 이벤트 발행이 실패하는 경우데이터베이스 저장은 실패했지만 이벤트 발행은 성공하는 경우1번의 경우, 이벤트 발행이..
GitHub actions runner 변경으로 인해 testcontainers 호환 트러블 슈팅
·
상황갑작스럽게 PR의 CI가 실패하는 상황이 발생했다.기존에 정상적으로 성공하던 코드베이스가 실패하고 있었다.목표원인을 파악해서 CI를 정상적으로 만들자는 목표를 세웠다.실행먼저 CI가 왜 실패하는지 먼저 파악했다.데이터베이스를 띄우는 통합 테스트들이 실패하고 있었고, ContextLoad 테스트에서도 터지고 있었다.FestabookApplicationTests > contextLoads FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractB..
GitHub Actions와 AWS 간 작업을 위한 OIDC 활용 임시 자격 증명 발급의 이해 및 방법
·
개요본 문서는 GitHub actions에서 개발자가 AWS의 IAM Access Token을 발급받아 관리하지 않고 CI/CD 과정에서 짧은 시간 유효한 임시 토큰을 발급받아 사용하는 방식이 어떤 방식으로 이뤄지는지 설명한다.자격 증명 획득 흐름AWS에서는 자격 증명을 AWS 외부 애플리케이션에 장기간 보관하지 않는 것을 강력히 권장한다.아무래도 권한 액세스 키를 관리해야하기 때문이다. 보안적으로 노출될 위험도 존재하고, 퇴사자가 발생하거나 정보를 알고있는 사람이 외부로 노출되었을 경우와 같은 불필요한 위험을 감수해야한다.따라서 AWS에서는 OIDC 토큰을 발급받아 이를 AWS가 검증하여 단기 자격증명을 발급해주는 방식을 제공한다.간단한 흐름은 다음과 같다.Identity Provider에 대한 정보를..
OAuth 2.0 Authorization Code Grant 방식
·
개요본 문서는 OAuth 2.0의 Authorization Code Grant 방식의 흐름과 용어들을 설명한다.OAuth 2.0의 Authorization Code Grant 방식의 전체적인 흐름을 이해하고 싶은 독자들을 위해 작성했다.자세한 구현 세부사항들은 해당 기능을 제공하는 개발 문서를 읽기 바란다. 설명에 덧붙여 카카오 로그인 다이어그램에서도 같은 흐름을 제공함도 보여준다.용어 정리Resource Owner: 사용자 즉, 리소스의 주인이다.Client: 리소스의 주인으로부터 권한을 위임받으려는 서비스이다.Authorization Server: 클라이언트가 리소스의 소유자의 권한을 얻을 수 있도록 도와주는 서버이다.Resource Server: 리소스 서버는 보호되는 리소스를 호스팅하는 서버이다...
OAuth와 OIDC의 역사
·
OAuth란?Open Authorization의 약자로, 사용자의 비밀번호와 같은 민감 정보를 노출하지 않고 하나의 서비스가 다른 서비스에 있는 사용자의 데이터 혹은 기능에 접근할 수 있도록 권한을 위임하는 표준입니다.예를 들어 내가 만든 서비스가 사용자의 네이버 캘린더에 접근해서 일정을 등록하는 기능이 필요하다면, OAuth를 구현하여 사용자의 네이버 비밀번호를 입력받지 않고도 권한을 위임받아 처리할 수 있도록 합니다.비밀번호를 평문으로 제공받거나 사용하기에는 보안적인 위험 요소들이 많았기 때문에 이런 방법을 고안했습니다.OAuth 1.0a초기의 OAuth 1.0a는 다음의 이유로 사라졌습니다.클라이언트(권한을 위임받는 서비스)에게 높은 연산 작업을 요구했다. 키를 총 4번 생성하는데, 이 작업은 CP..
G1, Garbage First 가비지 컬렉터
·
JAVA
정의G1은 garbage first라는 이름의 가비지 컬렉터로, 처리 효율이 높으면서 설정된 정지 시간을 맞출 수 있는 곳 부터 쓰레기들을 청소하는 가비지 컬렉터다.G1의 목표G1의 설계자들은 정지 시간 예측 모델을 만들고자 했다. 즉, 목표 시간을 M 밀리초로 설정하면 가비지 컬렉터가 쓰는 시간이 M 밀리초가 넘지 않도록 통제하는 것이다.정리하면 주된 목표는 가비지 컬렉터의 정지 시간을 예측가능하도록 만들어서 블랙박스 상태를 피하려고 하는 것이다.왜 G1의 설계자들은 정지 시간 예측 모델을 만드려고 했을까?서버 시스템에서 타임아웃, 로드밸런싱, 장애 전파등의 기준이 시간을 기준으로 서버의 상태를 파악하거나 종료시킨다.G1 이전의 GC 들은 정지 시간을 예측할 수 없었고 갑자기 너무 긴 시간 GC를 해버..
왜 JVM GC는 디스크,램과 달리 파편화/단편화 문제를 압축(memory compression)으로 해결한걸까?
·
JAVA
궁금증GC 알고리즘 중, 마크-스윕 알고리즘은 회수 대상에 대해서 마킹을 진행하고, 마킹된 대상들을 쓸어담아서 회수한다. 따라서 메모리에 살아남은 객체들 사이사이에 파편화된 공간이 남게 된다.이런 방식의 문제점은 메모리의 파편화가 생긴다는 것이다. 살아남은 객체 사이사이 공간들은 일정한 크기가 아니라 들쭉날쭉한 크기로 남게 될 것이고, 큰 객체가 생겨났을 때 해당 공간을 활용하지 못할 것이다.GC 알고리즘에서는 마크-컴팩트 알고리즘 혹은 마크-카피 알고리즘을 통해 이 단편화 문제를 해결한다. 컴팩트 알고리즘은 살아남은 객체들을 메모리공간의 첫 번째 구역부터 차례로 차곡차곡 쌓고 남은 영역을 회수한다. 마크-카피 알고리즘은 살아남은 객체들을 사용하지 않는 공간에 차곡차곡 쌓고 남은 영역을 회수한다. 이 알..
festabook의 TPS 기준 서버 및 MySQL 튜닝
·
들어가며festabook의 서버 설정 튜닝을 위해 TPS를 측정하면서, 향상시킨 이야기이다.festabook의 가장 주요 서비스인 지도 정보 조회 api를 기준으로 TPS를 측정시키고, 여러가지 실험을 해보면서 TPS가 향상되는지 확인하면서 튜닝을 진행했다.서버 TPS 측정 환경 설정해당 게시글에서 이야기하는 TPS는 RPS와 혼용해서 사용했다. 하나의 API를 트랜잭션 단위로 잡고, 계산했다.실제로 k6 환경을 구성하는 이야기는 또 게시글을 작성하겠다. 해당 글에서는 어떤 판단기준으로 채택했는지만 작성했다.k6 - TPS 측정 도구TPS 측정 도구로는 다양하게 있었지만 그 중에서 우리는 k6를 채택했다.k6는 자바스크립트를 이용해서 스크립트를 작성하기 때문에 코드를 읽기 편했다.xk6-dashboard..