전체 글

The sky is the limit
쿼리 성능 테스트로 대용량 데이터를 삽입해야 했다.평소에는 데이터 삽입 시 saveAll()을 사용했는데, batch insert를 사용하면 빠르게 삽입할 수 있다고 한다. 이번 글에서는 batch insert로 대용량 데이터를 삽입해 보고, saveAll()과 성능 차이를 비교해 보려고 한다. 그 전에 batch insert에 대해 간략히 알아보자.Batch insertbatch는 대량의 작업을 한 번에 처리한다는 뜻이다.batch insert는 여러 SQL 명령을 그룹화하여 단일 네트워크 호출로 DB 서버에 전송한다. batch insert는 JPA, JDBC 두 방식으로 구현할 수 있다. JPA로 batch insert 구현JPA 사용 시 아래처럼 batch size 설정을 추가해 배치를 구현할 수..
JPA Auditing 사용 시 주의사항이전 글에서 벌크 업데이트 시 JPA Auditing이 동작하지 않는다는 점을 배웠습니다. 그런데 아래 테스트 코드를 보면, 벌크 업데이트 후에 updatedAt 필드가 자동 갱신되는 것처럼 보입니다. 채팅 요청에 대해 벌크 연산을 진행했을 경우, updatedAt 필드도 함께 갱신되는지 확인하는 테스트 코드입니다.@DisplayName("벌크 함수 호출 시, updated_at 필드가 같이 변경된다.")@Testvoid changeUpdatedAtWhenChangeStatusOfChatInquiry() { // given ChatInquiry chatInquiry = chatInquiryRepository.save(ChatInquiryFixture.ch..
배경저는 진행 중인 프로젝트에서 채팅 기능을 담당하고 있습니다.기획에 따르면, 일주일이 지난 채팅 요청은 자동 거절되어야 합니다. 이를 구현하기 위해 스케줄러를 돌려 채팅 요청들의 상태를 bulk update 해주었습니다. 채팅요청 상태가 대기중이고, 현재 시간을 기준으로 생성된 지 일주일이 지났을 때채팅요청 상태를 거절됨으로 변경해 주는 코드입니다.public void updateChatInquiryStatusRejected() { queryFactory.update(chatInquiry) .set(chatInquiry.status, InquiryStatus.REJECTED) .where( chatInquiry.status.eq(InquiryStatus..
배경AWS는 각 Public IPv4 주소에 대해 시간당 0.005달러의 과금을 부과한다.따라서 과금을 줄이기 위해서는 Public IPv4 사용을 최소화해야 한다. 나는 아래의 목적으로 EC2, RDS에 대해 각각 public ip를 사용했었다.- EC2: 배포한 서버에 탄력적 IP 매핑- RDS: intellj와 DB 연결하여 편리하게 DB 수정 및 조회 다행인 점은 EC2는 IPv4 사용이 무료이다.그래서 RDS 인스턴스만 Public IPv4를 사용하지 않도록 바꾸면 된다. 내부 네트워크로 RDS에 접근하면 IPv4 없이도 RDS 인스턴스에 연결할 수 있다.아래 그림처럼 외부에서 EC2 public subnet으로 접근하고 이를 통해 다시 RDS private subnet으로 접근한다. RDS 생..
배경기존에는 애플리케이션만 Docker 이미지로 EC2 서버에서 실행하고, Redis는 EC2 서버에 인메모리로 설치하였다.하지만 Redis도 컨테이너로 관리하는게 환경 구성에 편리할 것 같다고 생각했다.이에 Docker-Compose를 사용하여 두 컨테이너들이 통합 관리되도록 변경하였다.추후에도 배포 자동화시 이 방법을 계속 사용할 거라 잊어버리기 전에 기록해두려고 한다.cd.yml 파일 수정더보기name: CD Backendon: push: branches: [ "main", "dev" ]permissions: contents: readjobs: build-and-push-image: runs-on: ubuntu-latest steps: - name: Checkout c..
기존에는 CI만 구현되어 있는 상태였고, PR merge 후 EC2 서버에 수동 배포했다.매번 배포할 때마다 우분투 서버에서 아래 과정들을 반복했는데, 시간이 오래 걸리고 번거로웠다.깃허브 프로젝트 클론 받기gitignore 파일 직접 추가프로젝트 빌드해 jar 파일 생성기존에 실행 중인 프로세스 종료jar 파일 백그라운드에서 실행이에 Github Actions와 Docker를 활용해 배포를 자동화하였다.이번 글에서는 어떻게 배포를 자동화했는지 정리해보려고 한다. cd.yml을 작성하기 전 Dockerfile 추가, EC2 패스워드 연결 활성화, Github Secrets 환경 변수 추가가 선행되어야 한다.Dockerfile 추가DockerFile은 자바 Docker 이미지를 생성하기 위한 스크립트이다...
들어가기최종 프로젝트에서 판매자와 구매자 간 일대일 채팅을 구현하기로 하였다.처음에는 클라이언트가 서버에게 지속적으로 요청을 해 메시지를 받으면 되지 않을까 생각했다.하지만, 이런 polling 방식은 매번 HTTP 연결을 생성하고 끊기 때문에 서버에 부담을 준다. 때문에 실제로 채팅, 주식 거래 등 실시간성 데이터를 송수신할 때는 웹 소켓 방식을 활용한다고 한다.이번 글에서는 웹 소켓과 웹 소켓 위에서 쓰이는 STOMP를 알아보고, 코드에 적용해 볼 것이다. 웹 소켓이란?웹 소켓은 서버와 클라이언트 간 양방향 통신이 가능한 프로토콜이다.웹 소켓 과정은 Open Handshake, Data Transfer, Close Handshake로 나눌 수 있다. [Open Handshake]클라이언트는 HTTP에..
엔티티의 필드 값을 수정하고 반영하는데 변경 감지 혹은 벌크 수정 쿼리를 사용할 수 있다.예시로 Waiting 엔티티의 필드를 수정해 보며 둘의 차이점을 알아보자.1.  영속성 컨텍스트와 DB 간 불일치 가능성변경 감지에서는 영속성 컨텍스트와 DB가 항상 일치한다.반면 벌크 수정 쿼리는 상황에 따라 영속성 컨텍스트와 DB가 불일치 할 수 있다. 변경 감지엔티티를 repository에 저장하면 해당 엔티티가 영속화되어 영속성 컨텍스트에서 관리된다. 따라서 setStatus()로 status 필드를 PROGRESS에서 CANCELED로 수정했을 때영속성 컨텍스트는 변경 감지를 하여 엔티티의 수정 사항을 반영한다.참고로 update 쿼리와 h2 필드를 확인하기 위해 @Rollback(false)를 추가하였다...
도입 배경웨이팅 로직을 구현하며 웨이팅 취소, 지연, 입장에 따라 웨이팅 순서를 갱신해줘야 했다.초기에는 웨이팅 순서를 DB에 저장하고, 아래의 상황들에서 벌크 연산으로 웨이팅 순서를 업데이트하고자 했다. 웨이팅 순서를 rank라고 했을 때특정 고객이 웨이팅을 취소하거나 대기를 맨 뒤로 미룸 -> 해당 고객 뒤 고객들의 rank 1 감소시키기고객 입장 -> 다른 고객들의 rank 1 감소시키기 rank는 실시간으로 변화하는 데이터라 매번 벌크 연산을 진행하고 DB에 반영하면 테이블 부하가 심해지는 문제가 있었다. 이에 Redis의 list 자료 구조를 활용해 대기열 큐를 구현하기로 하였다.Redis는 인메모리 데이터베이스로 빠른 읽기, 쓰기 작업이 가능하다는 장점이 있다. 설정Build.gradleSpr..
2차 프로젝트를 진행하며 Redis가 동시성 처리 등 다방면에 활용될 수 있다는 것을 알게 되었다.나는 Redis를 활용해 대기 생성, 지연, 입장을 처리하고 싶었으나 Redis의 이해가 선행되어야 했다. 그래서 Redis의 기본 개념인 데이터 타입과 해당 데이터 타입이 어디에 활용되는지부터 살펴보고자 하였다. 위 두 가지를 살펴보기에 앞서, Redis가 무엇인지 간략하게 살펴보자.Redis(Remote Dictionary Server)Redis는 다수의 서버가 공유하는 해시 테이블이다.해시맵처럼 key-value 형태로 되어 있다.특징인메모리에 모든 데이터를 저장한다.기본적으로 휘발성 데이터지만 영속성 옵션(RDB, AOF)을 통해 데이터를 영속적으로 관리할 수 있다.단일 스레드에서 모든 작업을 수행하..
hyun_12
hyunDev