개발일지

2024.03.29 TIL

과일바구니♡ 2024. 3. 29. 20:59

1. 스프링) 기술면접질문

1)N+1 문제의 발생 이유와 해결 방법에 대해 설명해주실 수 있을까요? 해결 방법은 3가지 이상 말씀해주시면 좋습니다

N+1 문제는 데이터베이스 쿼리 최적화와 관련된 문제 중 하나로, 특히 ORM(Object-Relational Mapping)을 사용할 때 자주 발생합니다. 이 문제를 이해하고 효과적으로 해결하는 것은 애플리케이션의 성능을 크게 향상시킬 수 있습니다.

 

N+1 문제 발생 이유

원인: N+1 문제는 1번의 쿼리로 N개의 연관된 객체를 가져오려 할 때, 각 객체를 가져오기 위해 추가적으로 N번의 쿼리가 발생하는 현상을 말합니다. 이는 주로 ORM에서 연관된 객체를 지연 로딩(LAZY Loading) 전략으로 가져올 때 발생합니다.

발생 상황: 예를 들어, 게시글(Post)과 댓글(Comment)이 1:N 관계일 때, 특정 게시글의 모든 댓글을 가져오기 위해 게시글에 대한 쿼리 1번과 각 댓글에 대한 N번의 쿼리가 발생하는 상황입니다.

 

N+1 문제 해결 방법

Fetch Join 사용: JPQL이나 QueryDSL 등에서 제공하는 Fetch Join 기능을 사용하여 연관된 엔티티를 한 번의 쿼리로 함께 가져옵니다. 1@EntityGraph 사용: Spring Data JPA에서 제공하는 @EntityGraph를 사용하여 연관된 엔티티를 한 번의 쿼리로 가져올 수 있습니다. 1Batch Size 설정: @BatchSize 어노테이션을 사용하여 한 번에 가져올 연관 엔티티의 수를 설정함으로써 쿼리 수를 줄일 수 있습니다. 6JOIN FETCH와 DISTINCT 사용: JPQL에서 JOIN FETCH와 DISTINCT를 함께 사용하여 중복을 제거하면서 연관된 엔티티를 한 번의 쿼리로 가져올 수 있습니다.

 

N+1 문제는 데이터베이스 성능에 큰 영향을 미칠 수 있으므로, 애플리케이션 개발 시 이를 인지하고 적절한 해결 방법을 적용하는 것이 중요합니다.

 

2)즉시로딩과 지연로딩은 각각 언제 사용하면 좋은지 설명해주실 수 있을까요?

ORM(Object-Relational Mapping)을 사용할 때, 즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)은 데이터를 어떻게 로딩할지 결정하는 중요한 전략입니다. 각각의 로딩 전략은 특정 상황에서 더 적합할 수 있으므로, 상황에 따라 적절히 선택하는 것이 중요합니다. 

 

즉시로딩(Eager Loading)

설명: 즉시로딩은 연관된 엔티티나 컬렉션을 최초 조회 시점에 함께 로딩하는 전략입니다. 즉, 엔티티를 조회할 때 연관된 모든 데이터를 한 번에 데이터베이스로부터 가져옵니다.

적합한 상황: 즉시로딩은 연관된 데이터를 항상 사용하는 경우에 적합합니다.

예를 들어, 사용자 정보와 그 사용자의 권한 정보가 항상 같이 필요한 경우, 즉시로딩을 사용하면 좋습니다. 

 

지연로딩(Lazy Loading)

설명: 지연로딩은 연관된 엔티티나 컬렉션을 실제로 사용하는 시점에 로딩하는 전략입니다. 즉, 필요할 때까지 데이터 로딩을 지연시키고, 실제로 접근하는 순간 데이터베이스에서 데이터를 가져옵니다.

적합한 상황: 지연로딩은 연관된 데이터를 항상 사용하지 않는 경우에 적합합니다. 예를 들어, 사용자 정보는 필요하지만, 사용자의 권한 정보는 특정 상황에서만 필요한 경우, 지연로딩을 사용하면 성능을 최적화할 수 있습니다. 

 

즉시로딩과 지연로딩은 각각의 장단점이 있으므로, 애플리케이션의 특성과 요구 사항을 고려하여 적절한 전략을 선택하는 것이 중요합니다. 데이터 접근 패턴을 분석하여, 필요한 데이터만 효율적으로 로딩할 수 있도록 설계가 필요합니다.

 

 

'개발일지' 카테고리의 다른 글

2024.04.02 TIL  (0) 2024.04.02
2024.04.01 TIL  (0) 2024.04.01
2024.03.28TIL  (0) 2024.03.28
2024.03.27 TIL  (0) 2024.03.27
2024.03.26 TIL  (1) 2024.03.26