Programming/Spring

·Programming/Spring
개발 방향성현재 t3.small 인스턴스를 사용하여 서버를 배포하고 있다. 현 서비스는 이벤트 서비스로 선착순 당첨 이벤트가 포함되어있다. 또한 사용하는 EC2 는 외부적인 요인으로 t3.small 을 사용 중이다.인스턴스 사양의 한계로, 가장 간단한 API 에 대해 최대 RPS 700 정도를 가진다.이를 높이기 위한 방법으로는 두 가지 방법을 고려할 수 있다.Scale OutScale UpScale Out 같은 경우, t3.small 인스턴스를 사용하고 있는 상황에서는 Scale Out 이 아닌 Scale Up 이 적용되어야할 상황이라 생각한다. 또한 트래픽이 몰리는 시간대가 정해져 있기에 Scale Out 할 시점이 정해져 있지만, 해당 시간이 너무나도 짧으며 Scale Out 에 사용되는 비용이 과..
·Programming/Spring
개요랭킹 서비스를 구현하기 위해 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 를 ..
·Programming/Spring
1. 개요기본적인 CRUD 만 구현하기에는 JPA 만한 것이 없다. 하지만 특정 날짜를 기준으로 이전 날짜 게시물만 조회하는 일이 필요할 때에는 JPA 만 사용하기에는 버겁다. 그렇다면 모든 데이터를 가져온 후 골라낼 것인가? 당연히 아니다.2. JPQL@Query("SELECT r FROM Reservation r" + "WHERE r.reservatedAt findPastReservation();원하는 조건의 데이터를 조회하기 위해서는 필연적으로 JPQL 을 필요로하게 된다. 하지만 복잡한 로직의 경우 쿼리 문자열이 매우 길어질 수 있고, 오타 등의 문법적인 오류가 발생하더라도 런타임 에러로 잡아낼 수 있다.하드코딩되어있는 부분을 제거하고, 동적 쿼리 및 재사용성을 높일 수 있는 것이 Que..
·Programming/Spring
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..
·Programming/Spring
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,..
·Programming/Spring
1. 개요 Spring 프로젝트를 진행하면서 결제 구현이 필요했다. 실제 PG 사와 카드사를 거쳐 구현하기에는 까다로운 요소들이 많았고, 이를 간단하게 구현할 수 있는 PortOne API 를 사용하기로 하였다.해당 게시물은 Spring Boot 만을 사용하였다.2. 코드(1) Front카드 결제카카오페이 결제결제는 클라이언트가 직접 portone 에 결제 요청하면서 시작된다. 타임리프로 구성된 페이지를 자세히 살펴보면 총 3가지 단계로 구성되어있다.포트원 라이브러리를 추가하고 객체를 초기화한다.서버에서 실제 결제 건을 조회한다.결제 금액이 일치한다면 Order 객체를 서버에 저장한다.클라이언트 측에서 라이브러리를 다운받기만 하더라도 다음과 같은 결제창을 얻을 수 있다.(2) Controller@Rest..
·Programming/Spring
1. 개요 에서는 WebSocket 으로 간단한 채팅 서버를 구현했다. 이것을 STOMP 를 사용해서 구현해보도록 하겠다. Spring 에서 Websockt 의존성을 받아오면 Spring Messaging 이라는 의존성도 함께 추가된다. 이를 이해하기 위해서는 STOMP 를 이해해야한다. 2. STOMPSimple Text Oriented Messaging ProtocolSTOPM 는 메세지 브로커를 활용해 쉽게 메세지를 주고받을 수 있는 프로토콜이다.pub-sub 이라는 발행-구독 형태를 사용해 메세지를 주고받을 수 있다.웹 소켓 위에 얹어 함께 사용할 수 있는 하위(서브) 프로토콜이다!(1) 데이터 형식WebSocket 을 사용할 때는 메세지를 주고받는 형식은 따로 정해져있지 않다. 반면 STOM..
·Programming/Spring
1. 개요 채팅 기능을 구현하기 위해 WebSocket 에 대한 공부를 시작했다. 웹소켓을 왜 사용하는 지, 동작부터 구현까지 정리해보도록 하겠다.(1) HTTP vs WebSocket가장 일반적으로 서버와의 통신은 HTTP 를 통해 이루어진다.하지만 이 경우 서버는 요청이 오지 않으면 응답을 줄 수 없는 치명적인 단점이 존재한다.다시말해 채팅 혹은 주식 가격 등 실시간성으로 변하는 데이터를 클라이언트가 확인하기 위해서는 계속해서 HTTP 요청을 보내고 받아야한다.당연하게도 클라이언트가 매번 똑같은 요청을 보내고 있는 것은 비효율적이다. 이를 위해 2 가지 해결책이 존재한다.Server-Sent EvnetWebSocketSSE(Server-Sent Event) 는 단방향 데이터 통신이다. HTTP 프로토..
행복한띠용이
'Programming/Spring' 카테고리의 글 목록 (2 Page)