기술면접 준비(2)

2024. 9. 30. 00:06·이론공부
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();

       

       

    • 장점:
      • 타입 안정성: 컴파일 타임에 오류를 방지할 수 있음.
      • 동적 쿼리 작성이 편리함.
    • 단점:
      • 설정이 복잡할 수 있음.
      • 초기 학습 비용이 높음.

 

5. CS 문제: 트랜잭션

  • 트랜잭션(Transaction): 데이터베이스에서 하나의 논리적인 작업단위
    • ACID:
      • Atomicity (원자성): 트랜잭션 내의 모든 작업은 완전히 성공하거나 아예 수행되지않아야함
      • Consistency (일관성): 트랜잭션이 완료된 후에도 데이터베이스의 일관성이 유지되어야 함.
      • Isolation (고립성): 트랜잭션 간의 격리성을 보장하여, 다른 트랜잭션이 수행 중일 때 해당 트랜잭션에 영향을 주지 않아야 함.
      • Durability (지속성): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장되어야 함.
  • 트랜잭션의 격리 수준:
    1. READ UNCOMMITTED (읽기 비확정)
    • 설명: 한 트랜잭션이 다른 트랜잭션의 변경 사항을 커밋하기 전에 읽을 수 있다. 이로 인해 "더러운 읽기"가 발생할 수 있다.
    • 장점: 가장 높은 동시성을 제공하지만, 데이터의 신뢰성이 떨어질 수 있다.
    • 단점: 비즈니스 로직에서 일관성을 유지하기 어려워질 수 있다.
    2. READ COMMITTED (읽기 확정)
    • 설명: 트랜잭션은 커밋된 변경 사항만 읽을 수 있습니다. 따라서 더러운 읽기는 방지.
    • 장점: 데이터의 신뢰성이 향상되며, 일반적인 비즈니스 로직에서 많이 사용.
    • 단점: "비 반복 읽기"가 발생할 수 있습니다. 즉, 동일한 쿼리를 두 번 실행했을 때 결과가 달라질 수 있다.
    3. REPEATABLE READ (반복 가능 읽기)
    • 설명: 한 트랜잭션이 실행하는 동안 동일한 쿼리의 결과가 항상 동일하게 유지됩니다. 따라서 비 반복 읽기는 방지되지만, "팬텀 읽기"가 발생할 수 있다.
    • 장점: 데이터의 일관성을 더 잘 유지할 수 있다.
    • 단점: 트랜잭션이 완료될 때까지 다른 트랜잭션이 영향을 미칠 수 없기 때문에 동시성이 낮아질 수 있다.
    4. SERIALIZABLE (직렬화 가능)
    • 설명: 가장 높은 격리 수준으로, 모든 트랜잭션이 직렬적으로 실행되는 것처럼 동작합니다. 트랜잭션 간의 모든 상호작용이 차단되므로 더러운 읽기, 비 반복 읽기, 팬텀 읽기가 모두 방지.
    • 장점: 데이터의 일관성이 가장 잘 유지됩니다.
    • 단점: 성능이 저하될 수 있으며, 트랜잭션 대기 시간이 길어질 수 있습니다. 동시에 실행되는 트랜잭션의 수가 줄어듬.
  • 장점:
    • 데이터 무결성과 일관성을 보장.
    • 복수의 사용자 환경에서도 안정적인 작업 수행 가능.
  • 단점:
    • 트랜잭션 관리는 복잡할 수 있음.
    • 높은 격리 수준에서는 성능 저하가 발생할 수 있음.

'이론공부' 카테고리의 다른 글

자료구조 - 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
'이론공부' 카테고리의 다른 글
  • 자료구조 - R트리(R-Tree)
  • DB 인덱싱(Database Indexing)
  • 프록시(Proxy)란?
  • 기술면접 준비(1)
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • DB
      • AWS
      • CI-CD
      • 웹
      • git & github
      • 구인공고분석
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java enhance switch
    Java this
    java 에라토스테네스의 체
    java arrays.copyofrnage()
    java 세수의합
    java기초
    프로그래머스 java 기초트레이닝
    java 유클리드 호제법
    java 제어자
    자료구조
    java 멤버
    java two-pointer
    Java 생성자
    java 메서드
    데이터 크기
    java
    데이터 타입
    개발로드맵
    java super
    프로그래머스 java 기초 트레이닝
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
기술면접 준비(2)
상단으로

티스토리툴바