728x90
부하 테스트를 하게 된 배경초기에 설계할 때, `Comment` 엔티티 안에 `likeCount` 를 직접 +1, -1 하도록 했었다. 엔티티 값을 직접 변경했기 때문에 동시 요청 시 정합성이 깨질 것으로 예상되어서 DB 트랜잭션 기반으로 정합성을 유지하도록 수정하였다. `@Query` + `@Modifying(clearAutomatically = true)` 를 사용하고, 엔티티를 재조회 하여 `LaszInitializationException` 문제도 해결하였었다.(LazyInitializationException 관련 트러블 슈팅 블로그 글 보러가기) 이렇게 처리했어도 좋아요 기능은 동시에 여러 사용자가 같은 데이터에 접근하는 것이기 때문에 부하 테스트를 통해 잘 설계됐는지 확인해 보고 싶었다. 따..
지연 로딩(Lazy Loading) 문제와 해결 경험 정리문제 상황댓글 좋아요 토글 기능 `toggleLike` 를 구현하면서 다음과 같은 문제가 발생 - 좋아요 토글 이후 `comment.getWriter().getNickname()` 과 같이 지연 로딩된 필드에 접근할 때 `LazyInitializtionException` 발생- 좋아요 로직 내부에서 `@Modifying(clearAutomatically = true)` 옵션을 사용한 것이 원인 (좋아요 같은 기능은 동시성 문제 때문에 엔티티 값을 변경해 주는 것이 아니라, 직접 DB 에 update 하였다.) 원인 분석 - `@Modifying(clearAutomatically = true)` 는 DB 수정 쿼리 이후 영속성 컨텍스트를 자동으로 ..
1. EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 2. RDS PostgreSQL 생성, EC2 에 Redis 설치3. GitHub Actions 로 자동 배포4. 도메인 연결하기5. Nignx 무중단 배포 자동 배포 구조EC2 서버 파일 구조우선 `EC2` 서버 파일 구조이다~/memo-notepad/├── deploy.sh├── app.log├── releases/│ ├── notepad-20250718122228.jar │ └── notepad-20250718122439.jar└── config/ └── application-prod.yml`deploy.sh` : 실제 배포 스크립트`releases` : `jar` 파일 보관소`config` : `application-prod...
1. EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 2. RDS PostgreSQL 생성, EC2 에 Redis 설치3. GitHub Actions 로 자동 배포4. 도메인 연결하기5. Nignx 무중단 배포 도메인 연결하기Namecheap 도메인 구매https://www.namecheap.com/domains/registration/`Namecheap` 에 들어가서 원하는 이름을 검색하여 도메인을 구매해 준다.(나는 `notepad.today` 를 샀다! 4000원 주고 잘 구매했다.) 이때, 자동 연장만 다 체크 풀어주면 된다. AWS Elastic IP도메인을 구매했으면, `AWS` 로 들어가서 `Elastic IP` 를 생성해야 한다.`Elastic IP` 는 인스턴스가 중지/시작을 하게 ..
1. EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 2. RDS PostgreSQL 생성, EC2 에 Redis 설치3. GitHub Actions 로 자동 배포4. 도메인 연결하기5. Nignx 무중단 배포 자동 배포 구조배포 방식GitHub 의 애플리케이션 리포지토리에서`main` 브렌치에 `push` 가 발생하면 자동으로 배포하도록 설정하였다. 그리고 배포를 할 때,애플리케이션 리포지토리 자체를 `EC2` 서버로 전송하는 것이 아닌, `jar` 파일만 전송하여 단순히 `EC2` 서버에서는 build 하지 않고, `jar` 파일을 실행하여 가볍게 돌아가도록 하였다. GitHub Actions 로 자동 배포하기EC2 java 설치우선 `EC2` 서버에 `java` 와 `javac` 를 설치해야 ..
1. EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 2. RDS PostgreSQL 생성, EC2 에 Redis 설치3. GitHub Actions 로 자동 배포4. 도메인 연결하기5. Nignx 무중단 배포 RDS 인스턴스 생성하기RDS`AWS Console` > `Aurora and RDS` > `데이터베이스 생성` (아래는 내가 설정한 방식이다. 참고만 바람!)- 생성 방식: 표준 생성- 엔진 옵션 : `PostgreSQL` (`Aurora` 를 선택하면 비용이 발생한다 ... !! `PostgreSQL` 을 선택해야 프리티어에서 무료로 사용할 수 있다.)- DB 인스턴스 Id : `notepad-db`- DB 이름 : `notepad_db`- 마스터 사용자 이름 : 기본값 `postgre..
1. EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 2. RDS PostgreSQL 생성, EC2 에 Redis 설치3. GitHub Actions 로 자동 배포4. 도메인 연결하기5. Nignx 무중단 배포 AWS 배포하게 된 이유우선 기존 프로젝트를 간단하게 `render` 에서 배포하였지만, 무료 사용 기간(한 달)이 지나 `AWS` 로 재배포하기로 마음먹었다!! 메모장 프로젝트는- `PostgreSQL`- `Redis`를 사용하고 있다. `PostgreSQL`과 `Redis` 를 `AWS RDS` 로 사용하여 `AWS` 가 관리하도록 할지, `EC2` 서버 내부에 직접 설치할지 고민이었다. 1. `RDS` 사용하는 경우 : `AWS` 가 자동으로 백업, 장애복구, 보안패치, 스케일링 관리..
로그 파이프라인 구축 도구 정하기로그 수집 도구`Log Stash` : 많은 레퍼런스와 안정성 보장, JVM 기반으로 리소스 사용량 높음`Fluentd` : 리소스 사용량 높은 편`Vector` : `Log` 뿐 아니라 `Metrics`, `Tracing` 지원`Promtail` : `Loki` 와 통합이 잘 되지만, `Log` 만 지원하고 단순 처리만 가능따라서 `Vector` 로그 저장 도구`ES` : 리소스 사용량을 감당할 수 없음`Loki` : 기존 `Grafana` 와 통합 쉬움따라서 `Loki` 이렇게 프로젝트 팀원 분이 결정해 주셨다. 👍👍(나도 앞으로 기술을 선택할 때, 현재 상황에 맞춰서 장단점을 보고 골라야겠다고 다짐했다.) 그럼 이제 `Loki` 로 로그를 저장하고, `Vector..