1. JPA에서 Lazy Loading과 Eager Loading의 차이점과 각각의 장단점
- Lazy Loading (지연 로딩): 연관된 엔티티나 컬렉션을 실제로 사용할 때 로드합니다. 즉, 객체를 처음 불러올 때는 연관된 엔티티를 로드하지 않고 필요할 때 데이터를 가져옵니다.
- 장점:
- 처음 데이터 로드 시 불필요한 데이터를 가져오지 않으므로 성능 최적화에 유리함.
- 메모리 사용량을 줄일 수 있음.
- 단점:
- 필요한 시점에 데이터베이스에 추가 쿼리를 실행하기 때문에 성능 문제가 발생할 수 있음 (특히 N+1 문제).
- 즉시 데이터를 사용해야 하는 경우 사용하기 어려움.
- 장점:
- Eager Loading (즉시 로딩): 엔티티를 조회할 때 연관된 모든 엔티티를 함께 조회합니다.
- 장점:
- 처음 로드 시 관련된 모든 데이터를 한 번에 가져오기 때문에 N+1 문제를 방지할 수 있음.
- 연관된 데이터를 즉시 사용할 수 있음.
- 단점:
- 불필요한 데이터를 미리 모두 로드하므로 메모리 낭비가 발생할 수 있음.
- 초기 로딩 시간이 오래 걸릴 수 있음.
- 장점:
2. JPA에서 N+1 문제를 해결하기 위한 방법
- N+1 문제: 하나의 엔티티를 조회할 때 관련된 N개의 연관된 엔티티를 각각 다시 조회하여, 총 1 + N개의 쿼리가 발생하는 문제입니다.
- 해결 방법:
- @EntityGraph 사용: 특정 쿼리에서 연관 엔티티를 명시하여 즉시 로딩하도록 지정하는방식
- fetch join: JPQL에서 join fetch를 사용하여 연관된 엔티티를 함께 조회함으로써 한 번의 쿼리로 데이터를 가져올 수 있습니다.
- @BatchSize 또는 hibernate.default_batch_fetch_size 설정: 연관된 엔티티를 일정한 크기만큼 배치로 가져오게 설정하여 여러 쿼리를 한 번에 해결합니다.
3. 단위 테스트와 통합 테스트의 차이점과 각각의 장단점
- 단위 테스트 (Unit Test): 개별 클래스나 메서드를 독립적으로 테스트하는 방식.
- 장점:
- 테스트 속도가 매우 빠름.
- 특정 로직에만 집중하여 테스트 가능.
- 의존성이나 외부 자원을 제거하고 순수하게 코드 자체만을 검증 가능.
- 단점:
- 전체 시스템의 동작을 확인하기 어려움.
- 의존 관계나 환경 설정에 따른 문제를 발견하기 어려움.
- 장점:
- 통합 테스트 (Integration Test): 여러 모듈이나 컴포넌트가 함께 동작하는 것을 테스트하는 방식. 보통 데이터베이스나 외부 API와의 연동을 포함합니다.
- 장점:
- 시스템 전반의 동작을 검증할 수 있음.
- 실제 환경과 유사한 조건에서 테스트 가능.
- 단점:
- 테스트 속도가 느림.
- 설정과 준비가 복잡할 수 있음.
- 특정 문제의 원인을 파악하기 어려울 수 있음.
- 장점:
4. QueryDSL을 사용하여 복잡한 동적 쿼리를 작성하는 방법
- QueryDSL은 JPQL을 대신하여 타입 세이프한 방식으로 동적 쿼리를 작성할 수 있게 해주는 라이브러리입니다.
- 설정: 프로젝트에 QueryDSL을 설정한 후, 엔티티 클래스에 대한 Q 클래스를 생성하여 사용합니다.
- 동적 쿼리 작성:
- BooleanBuilder 또는 Expressions 등을 사용하여 조건을 동적으로 추가할 수 있습니다.
- BooleanBuilder : 논리적 조건을 and(),or()메서드를 사용하여 조합할때 사용
- Expressions : 특정 SQL표현식을 정의할 때 사용
QUser user = QUser.user; BooleanBuilder builder = new BooleanBuilder(); if (name != null) { builder.and(user.name.eq(name)); } if (age != null) { builder.and(user.age.gt(age)); } List<User> result = queryFactory .selectFrom(user) .where(builder) .fetch();
- BooleanBuilder 또는 Expressions 등을 사용하여 조건을 동적으로 추가할 수 있습니다.
- 장점:
- 타입 안정성: 컴파일 타임에 오류를 방지할 수 있음.
- 동적 쿼리 작성이 편리함.
- 단점:
- 설정이 복잡할 수 있음.
- 초기 학습 비용이 높음.
5. CS 문제: 트랜잭션
- 트랜잭션(Transaction): 데이터베이스에서 하나의 논리적인 작업단위
- ACID:
- Atomicity (원자성): 트랜잭션 내의 모든 작업은 완전히 성공하거나 아예 수행되지않아야함
- Consistency (일관성): 트랜잭션이 완료된 후에도 데이터베이스의 일관성이 유지되어야 함.
- Isolation (고립성): 트랜잭션 간의 격리성을 보장하여, 다른 트랜잭션이 수행 중일 때 해당 트랜잭션에 영향을 주지 않아야 함.
- Durability (지속성): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장되어야 함.
- ACID:
- 트랜잭션의 격리 수준:
1. READ UNCOMMITTED (읽기 비확정)- 설명: 한 트랜잭션이 다른 트랜잭션의 변경 사항을 커밋하기 전에 읽을 수 있다. 이로 인해 "더러운 읽기"가 발생할 수 있다.
- 장점: 가장 높은 동시성을 제공하지만, 데이터의 신뢰성이 떨어질 수 있다.
- 단점: 비즈니스 로직에서 일관성을 유지하기 어려워질 수 있다.
- 설명: 트랜잭션은 커밋된 변경 사항만 읽을 수 있습니다. 따라서 더러운 읽기는 방지.
- 장점: 데이터의 신뢰성이 향상되며, 일반적인 비즈니스 로직에서 많이 사용.
- 단점: "비 반복 읽기"가 발생할 수 있습니다. 즉, 동일한 쿼리를 두 번 실행했을 때 결과가 달라질 수 있다.
- 설명: 한 트랜잭션이 실행하는 동안 동일한 쿼리의 결과가 항상 동일하게 유지됩니다. 따라서 비 반복 읽기는 방지되지만, "팬텀 읽기"가 발생할 수 있다.
- 장점: 데이터의 일관성을 더 잘 유지할 수 있다.
- 단점: 트랜잭션이 완료될 때까지 다른 트랜잭션이 영향을 미칠 수 없기 때문에 동시성이 낮아질 수 있다.
- 설명: 가장 높은 격리 수준으로, 모든 트랜잭션이 직렬적으로 실행되는 것처럼 동작합니다. 트랜잭션 간의 모든 상호작용이 차단되므로 더러운 읽기, 비 반복 읽기, 팬텀 읽기가 모두 방지.
- 장점: 데이터의 일관성이 가장 잘 유지됩니다.
- 단점: 성능이 저하될 수 있으며, 트랜잭션 대기 시간이 길어질 수 있습니다. 동시에 실행되는 트랜잭션의 수가 줄어듬.
- 장점:
- 데이터 무결성과 일관성을 보장.
- 복수의 사용자 환경에서도 안정적인 작업 수행 가능.
- 단점:
- 트랜잭션 관리는 복잡할 수 있음.
- 높은 격리 수준에서는 성능 저하가 발생할 수 있음.
'이론공부' 카테고리의 다른 글
자료구조 - R트리(R-Tree) (0) | 2024.11.16 |
---|---|
DB 인덱싱(Database Indexing) (0) | 2024.11.10 |
프록시(Proxy)란? (0) | 2024.09.05 |
기술면접 준비(1) (1) | 2024.09.05 |
혼자공부하는 컴퓨터 구조와 운영체제 Ch1~5 (0) | 2024.06.14 |