본문 바로가기

전체 글266

JVM(with 컴파일 과정) 1. 자바자바는 OS에 독립적인 특성을 가지고 있습니다. 그게 가능한 이유는 JVM(Java Virtual Machine) 때문입니다. JVM의 어떤 기능 때문에 OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 통해 알아보겠습니다.2. 컴파일 과정자바 소스코드가(.java) 자바 컴파일러(javac)를 통해 자바 바이트 코드로 변환됩니다.(.class)컴파일된 바이트코드(.class)를 JVM의 클래스로더(Class Loader)에게 전달합니다.클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data Area의 Method Area), 즉 JVM의 메모리에 올립니다.메모리에 올리는 과정은 총 3가지 과정을 거칩니다.. 2025. 1. 16.
자바 가비지 컬렉션 CMS → G1 GC → ZGC 버전 별 발전과정 1. Java의 GC 발전 과정 개요Java에서 GC(Garbage Collector)는 메모리 관리를 자동화하여 개발자가 메모리 할당 및 해제를 직접 처리하지 않아도 되도록 합니다. 초기에는 Serial GC와 Parallel GC가 사용되었지만, 애플리케이션의 규모와 성능 요구사항이 증가함에 따라 CMS (Concurrent Mark Sweep), G1 GC (Garbage First), ZGC (Z Garbage Collector) 등이 도입되었습니다.각 GC는 Java의 메모리 관리와 Pause Time을 줄이고 성능을 향상시키기 위해 설계되었습니다.2. CMS (Concurrent Mark Sweep)2.1 동작방식Initial Mark: 살아있는 객체를 찾기 위한 초기 마킹 (STW 발생)Ol.. 2025. 1. 10.
자바 버전 별 선택 이유 LTS(Long Term Support) 버전을 선택하는 것이 안정적인 운영에 유리하기 때문에 LTS 버전만 기록하겠습니다.Java 8 : 2030년 12월까지Java 11 : 2026년 9월까지Java 17 : 2029년 9월까지Java 21 (2031년까지 지원)Java 8 (LTS)선택 이유:안정성이 매우 높고 레거시 시스템과 호환성 우수Lambda와 Stream API 도입으로 함수형 프로그래밍 지원서드파티 라이브러리 지원이 가장 풍부Java 11 (LTS)Spring Boot 2.x의 권장 버전 - Spring Framework 5 -가비지 컬렉터 성능 향상Java 11의 기본 가비지 수집기는 G1GC(가비지 우선 가비지 수집기)전체 힙을 일정 크기로 나누어 영역 별로 가장 많은 가비지가 쌓인 .. 2025. 1. 10.
[Real MySQL 9장] 옵티마이저와 힌트 1. 개요옵티마이저는 MYSQL에서 최적의 쿼리 실행계획을 수립하는 기능입니다.1.1 쿼리 실행 절차SQL파서: 사용자로부터 요청된 SQL 문장을 쪼개서 MYSQL 서버가 이해할 수있는 수준으로 분리(파스 트리)합니다.옵티마이저: 파싱 정보를 보면서 어떤 테이블부터 읽을지, 어떤 인덱스를 이용해 테이블을 이용해 읽을지 선택합니다.MYSQL 엔진, 스토리지 엔진: 두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져옵니다.1.2 옵티마이저의 종류옵티마이저는 테이터 베이스 서버에서 두뇌와 같은 역할을 담당합니다.규칙 기반 최적화(RBO, Rule-Based Optimizer)초기 버전에 많이 사용내장된 우선순위에 따라 실행 계획 수립통계 정보(테이블의 레코.. 2025. 1. 9.
[Real MYSQL 10장] 실행 계획 옵티마이저가 항상 좋은 실행 계획을 만들어낼 수 있는 것은 아닙니다.그렇기 때문에 DBMS 서버에서는 이를 보완할 수 있도록 EXPLAIN 명령으로 옵티마이저가 수립한 실행 계획을 확인할 수 있습니다.1. 통계 정보MySQL 5.7 까지는 테이블과 인덱스에 대한 정보를 가지고 실행 계획을 수립했습니다.MySQL 8.0 부터는 인덱스되지 않은 칼럼들에 대해서도 데이터 분포도를 수집해서 저장하는 히스토그램 정보가 도입됐습니다.1.1 테이블 및 인덱스 통계 정보MySQL 서버의 통계 정보 MySQL 5.5 버전 까지는 각 테이블의 통계 정보가 메모리에서만 관리되어서 서버 재시작시 모두 사라졌습니다.이후의 버전에서는 각 테이블의 통계 정보를 mysql 데이터베이스의 innodb_index_stats 테이블과 i.. 2025. 1. 3.
동시성 문제 해결 1. 문제리뷰삭제 요청에서 단일결과를 예상했지만, 9개의 결과를 리턴한다고 합니다. 예상대로라면 리뷰좋아요는 member당 하나씩 밖에 갖지 못합니다.1-1. 문제 원인리뷰를 저장할 때 동시성 이슈가 발생해서 그렇습니다.Transaction1과 Transaction2가 거의 동시에 시작되어 각각 BEGIN을 합니다.두 트랜잭션 모두 memberId=1, reviewId=1인 데이터를 찾기 위해 findByMemberIdAndReviewId를 호출합니다.빨간색 박스로 표시된 Race Condition 구간에서:Transaction1이 조회했을 때 "결과 없음"을 받습니다 (아직 좋아요가 없으므로)Transaction2도 조회했을 때 "결과 없음"을 받습니다 (Transaction1이 아직 커밋하지 않았으므.. 2024. 12. 22.
올바른 Optional 사용법 🤔 Optional 사용목적Optional은 메서드의 리턴 타입으로 Null일 수도 있음을 명확히 표현하는 용도Optional 사용하기 전 주의반환 값에서 Null을 반환할 수 있다고 알릴 때 Optional을 사용한다고 했습니다. 그러나 애초에 Null을 반환하는 행위 자체가 안티 패턴입니다. Optional을 사용하기 전에 Null을 반환하는 메소드를 수정하는 것이 좋습니다. ex) 빈 값 반환, -1 반환😲 Optional 올바른 사용법1. Optional 객체에 null를 할당하지마라반환 값을'null'로 반환할 경우 서비스 로직에서NullPointerException이 발생할 수 있기 때문에 Optional을 사용합니다. 즉, 서비스 로직에서 Optional을 반환받으면 Optional이 감.. 2024. 12. 21.
🙊 Fixture Monkey 도입 🙊 Fixture Monkey 도입 이유객체 생성객체가 가지고 있는 데이터 항목이 많아 객체 생성 비용이 크다.비즈니스 요구사항이 변경될 때 객체를 변경하고 테스트를 수정해야 할 수 있다.엣지 케이스 발견엣지 케이스를 직접 찾아야 하고 동일한 테스트를 여러번 작성해야한다🤔 Fixture Monkey가 뭔디https://naver.github.io/fixture-monkey/v1-0-0/Fixture Monkey는 테스트를 위한 객체 생성을 자동화해주는 Jqwik 기반 PBT 라이브러리입니다.🤔 Property-based Testing (PBT)는 뭘까?Property-based Testing은 테스트 케이스를 일일이 작성하는 대신, 프로그램이 랜덤 속성(property)을 만들어주고 테스트하는 방식.. 2024. 12. 19.
Gighub Action , Docker Compose, Nginx, code deploy 무중단 배포 무중단 배포1. rolling update 배포새로 배포되어야 하는 버전을 하나씩 순차적으로 적용시키면서 배포하는 방식입니다. 한 번에 모두 배포되는 게 아니기 때문에 배포가 되는 과정에서 옛날 버전과 새로운 버전이 공존합니다. 그렇기 때문에 잘못하면 배포하는 과정 중에 호환성 문제가 생길 수 있습니다2. Blue,Green 배포예시를 들자면 이전의 8080포트를 쓰고 있는 컨테이너가 있습니다. 새로운 컨테이너를 새로운 포트(8081)로 올립니다. 다 올려졌다면 nginx는 새로운 컨테이너 포트로 연결하고 이전 컨테이너는 내립니다.3. 카나리 배포적은 사용자에게 먼저 배포 후 A/B 테스트. 현재 단계에서는 고려하지 않겠습니다.rolling update는 인스턴스를 두 대 이상 사용하여 비용 문제가 발생.. 2024. 12. 18.