728x90
PostgreSQL, MySQL 인덱스 구조 비교 PostgreSQL의 인덱스 구조- `Heap Table`(실제 저장소) + 별도 인덱스 구조 : 클러스터 인덱스가 없음 : PK 인덱스, 보조 인덱스 모두 Heap으로 향하는 포인터 `TID` 를 가짐- 인덱스 리프 노드에는 `TID (Heap Tuple Pointer)` 만 저장 : `TID` 크기는 6 바이트로 작고 고정되어 공간 효율이 좋음- 실제 데이터를 읽으려면 반드시 `Heap Table 페이지`로 이동해야 함 B-Tree Index ├── Key = (writer_id, created_at) └── Value = TID (Heap row pointer)인덱스만 보고 실제 데이터를 읽을 수 없고,`TID` 가 가리키는 `Heap 위치`..
애플리케이션 스레드- 자바 애플리케이션 실행 시 JVM이 여러 `OS 커널 스레드`와 1:1 매핑을 띄움- 그중, 우리가 직접 제어하고 코드를 실행시키는 스레드가 애플리케이션 스레드- 메인 스레드, 스케줄러 스레드, 실행 스레드가 있다. 메인 스레드 : 프로그램의 진입점 `Public static void main()`에서 시작 : Spring Boot 애플리케이션 시작스케줄러 스레드 : 주기적 작업 예약 및 실행 `ThreadPoolTaskScheduler` : `@Scheduled`실행 스레드 : 비동기 및 병렬 작업 수행 `ThreadPoolTaskExecutor`, `CompletableFuture` : `@Async`, `runAsync( )` = 모두 OS 커널 스레드와 1:1 매..
IOCP- Windows 커널이 제공하는 비동기 I/O 완료 통지 시스템- 비동기로 요청된 I/O 가 끝났을 때 커널이 결과를 큐에 넣고, 스레드가 그 큐를 꺼내 처리하는 구조- 수천 개의 연결도 블로킹 없이, 스레드 낭비 없이 처리 가능=> I/O 완료 알림을 효율적으로 전달하는 커널 객체=> 비동기 I/O + 스레드 폴링을 결합한 모델 - 핵심 구성요소`Completion Port (완료 포트)` : 커널 내부의 I/O 완료 큐`I/O Handle (파일, 소켓 등)` : 비동기 작업 대상`Overlapped 구조체` : 각 I/O 요청의 상태 정보`Worker Thread Pool` : 완료된 I/O를 처리할 사용자 스레드`I/O Manager (커널)` : 모든 I/O 요청과 완료를 관리하는 핵심..
부하 테스트를 하게 된 배경초기에 설계할 때, `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` 를 설치해야 ..