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

  • 최근 글

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

티스토리툴바