실제 졸업 프로젝트에서도 MSA 관련 프로젝트를 진행했었고, 다수의 컨퍼런스, 테크톡에서 흔히 찾아볼 수 있는 주제가 MSA 이다. 새로운 개인 프로젝트를 MSA 구조를 사용해보려 하다가 좋은 영상이 있어 정리하고자 한다.API Gateway Framework 나를 포함해 대부분이 API Gateway 라고 여길만한 구조이다. 하나의 엔드포인트를 가지며 게이트웨이에서 다양한 마이크로서비스에 접근하는 것처럼 보인다. 하지만 안타깝게도 해당 구조는 API Gateway Pattern 이라 말할 수 없다. API Gateway Pattern 정의마이크로서비스 패턴 책에 나오는 예시는 위와 같다.앞선 그림과 차이점이 무엇일까??가장 쉽게 찾아볼 수 있는 것은 호출 메서드의 차이이다. 위에서는 클라이언트가 마이..
Programming
개발 방향성현재 t3.small 인스턴스를 사용하여 서버를 배포하고 있다. 현 서비스는 이벤트 서비스로 선착순 당첨 이벤트가 포함되어있다. 또한 사용하는 EC2 는 외부적인 요인으로 t3.small 을 사용 중이다.인스턴스 사양의 한계로, 가장 간단한 API 에 대해 최대 RPS 700 정도를 가진다.이를 높이기 위한 방법으로는 두 가지 방법을 고려할 수 있다.Scale OutScale UpScale Out 같은 경우, t3.small 인스턴스를 사용하고 있는 상황에서는 Scale Out 이 아닌 Scale Up 이 적용되어야할 상황이라 생각한다. 또한 트래픽이 몰리는 시간대가 정해져 있기에 Scale Out 할 시점이 정해져 있지만, 해당 시간이 너무나도 짧으며 Scale Out 에 사용되는 비용이 과..
개요랭킹 서비스를 구현하기 위해 DB 와 Redis 를 사용한 로직 중 선택하고자 한다. 이를 위해 두 로직의 성능을 테스트할 예정이며, 테스트할 API 는 아래와 같다.성능 테스트는 Locust 를 사용하였으며, EC2 는 모두 t3.small 인스턴스를 사용하였다.테스트 API 종류상위 20명 랭킹 조회특정 인원 게임 점수 갱신API 로직DB 사용 로직랭킹 조회EventUsers 테이블에 GameScore 필드로 Index 가 생성되어있다.SELECT (...) FROM EventUsers ORDER BY game_score DESC LIMIT 20해당 쿼리는 20 개의 row 만 검사하기에 매우 빠른 실행 속도를 가진다.게임 점수 갱신EventUser 테이블의 특정 row 의 GameScore 를 ..
CI/CD 과정은 총 7 단계로 이루어져 있다.(현재 레포지터리 기준) User 가 Master(Main) Branch 에 Pull Request 발생시킨다.Github 는 Pull Request 를 기준으로 Github Actions 를 실행시킨다.Github Actions 내부에서 CI 과정이 진행되며, Build 결과 파일 (Jar) 이 생성된다.Github Actions 는 S3 에 해당 파일을 업로드한다.Github Actions 가 CodeDeploy 에 Deployment 를 생성한다.CodeDeploy 는 S3 로 부터 빌드 파일을 가져온다.CodeDeploy 가 Ec2 에 해당 빌드 파일을 전달하며 스크립트를 실행시킨다.Github Actions, AWS 를 사용한 전형적인 CI/CD 과..
1. 개요기본적인 CRUD 만 구현하기에는 JPA 만한 것이 없다. 하지만 특정 날짜를 기준으로 이전 날짜 게시물만 조회하는 일이 필요할 때에는 JPA 만 사용하기에는 버겁다. 그렇다면 모든 데이터를 가져온 후 골라낼 것인가? 당연히 아니다.2. JPQL@Query("SELECT r FROM Reservation r" + "WHERE r.reservatedAt findPastReservation();원하는 조건의 데이터를 조회하기 위해서는 필연적으로 JPQL 을 필요로하게 된다. 하지만 복잡한 로직의 경우 쿼리 문자열이 매우 길어질 수 있고, 오타 등의 문법적인 오류가 발생하더라도 런타임 에러로 잡아낼 수 있다.하드코딩되어있는 부분을 제거하고, 동적 쿼리 및 재사용성을 높일 수 있는 것이 Que..
1. 개요 통합 테스트 코드에서는 실제 데이터베이스를 연결해서 작업하였다. 하지만 User Id 를 통한 List 조회 시에 테스트를 위해 사용한 데이터뿐만 아니라 실제 데이터베이스에 들어가있던 데이터들도 함께 조회되면서 테스트 검증에 어려움을 겪었다. 이를 해결하기 위해 테스트 데이터베이스를 분리하였지만 데이터베이스가 비어있어 연관관계 매핑에 문제가 발생하였다. 2. Test Code@Entity@Builder@AllArgsConstructor@NoArgsConstructor@Getterpublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String n..
1. 개요 개발 중 ENUM 값을 데이터베이스에 저장하니 ENUM 값의 순서, 인덱스가 저장되었다. 나는 상태코드를 기대하면서 저장했는데 숫자가 나와 당황했다. 그런고로 ENUM 의 데이터베이스 저장 및 처리에 대해서 알아보도록 하자.2. ENUM 값 저장@Entity@Builder@RequiredArgsConstructorpublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; private UserStatus status;}public enum UserStatus { ACTIVE,..
1. 개요 Spring 프로젝트를 진행하면서 결제 구현이 필요했다. 실제 PG 사와 카드사를 거쳐 구현하기에는 까다로운 요소들이 많았고, 이를 간단하게 구현할 수 있는 PortOne API 를 사용하기로 하였다.해당 게시물은 Spring Boot 만을 사용하였다.2. 코드(1) Front카드 결제카카오페이 결제결제는 클라이언트가 직접 portone 에 결제 요청하면서 시작된다. 타임리프로 구성된 페이지를 자세히 살펴보면 총 3가지 단계로 구성되어있다.포트원 라이브러리를 추가하고 객체를 초기화한다.서버에서 실제 결제 건을 조회한다.결제 금액이 일치한다면 Order 객체를 서버에 저장한다.클라이언트 측에서 라이브러리를 다운받기만 하더라도 다음과 같은 결제창을 얻을 수 있다.(2) Controller@Rest..