Open
Description
JPA를 쓴다면 그 이유에 대해서 설명해주세요.
- 객체지향 프레임워크이기 때문입니다. JPA를 사용하면 비즈니스 로직이 RDBMS에 의존하는 것이 아니라, 자바 코드로 표현될 수 있어 생산성이 높아집니다.
- JPA는 데이터베이스와 상관없이 동일한 코드로 쿼리를 작성하여, 같은 동작을 기대할 수 있다는 장점도 가지고 있습니다. 이는 database dialect를 지원하기 때문에 가지는 장점입니다.
JWT와 Spring Security 에 대해 설명해주세요.
- JWT(Json Web Token)는 웹 표준으로, 정보를 안전하게 전달하기 위해 JSON 객체를 사용하는 토큰입니다. JWT는 정보를 전자 서명하여 검증할 수 있도록 설계되어 있습니다. JWT는 클라이언트와 서버 간의 인증 및 정보 교환을 위해 사용됩니다.
- Spring Security는 스프링 기반의 보안 프레임워크로, 웹 애플리케이션의 보안을 구현하는 데 사용됩니다. Spring Security는 사용자 인증, 권한 부여, 보안 설정 관리 등을 제공하여 애플리케이션의 보안을 강화합니다.
jwt는 개발자도구 열면 보이는데 어떻게 생각하시나요
- 클라이언트 측에서 JWT를 안전하게 저장하고 처리해야 합니다. 브라우저의 쿠키 또는 웹 스토리지를 사용하여 JWT를 저장할 수 있습니다. 또한, 쿠키의
HttpOnly
및Secure
속성을 사용하여 보안을 강화할 수 있습니다. - Spring Security와 같은 토큰 기반 보안을 지원하는 프레임워크를 사용하여 JWT를 안전하게 처리할 수 있습니다. 이러한 프레임워크를 사용하면 JWT의 검증 및 처리를 안전하게 수행할 수 있습니다.
Hibernate에서 1차 캐시와 2차 캐시의 차이점은 무엇인가요?
- 1차 캐시는 영속성 컨텍스트 내부에 존재하는 엔티티를 보관하는 저장소
- 2차 캐시는 공유 캐시라고도 하며 애플리케이션에서 공유하는 캐시. 엔티티 매니저를 통해 데이터를 조회할 때 우선 2차 캐시에서 찾고 없으면 데이터베이스에서 찾음. 2차 캐시를 적절히 활용하면 데이터베이스 조회 횟수를 획기적으로 줄일 수 있음
영속성 컨텍스트는 무엇인가요? 어떤 역할을 하나요?
- 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 장소로, 가상의 데이터베이스 같은 역할을 합니다.
JPA 영속성 컨텍스트의 이점(5가지)을 설명해주세요.
- 영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 의미
- 영속성 컨텍스트를 쓰는 이유는 1차 캐시, 동일성 보장, 쓰기 지연, 변경감지(Dirty checking), 지연로딩이 있음
- 1차 캐시: 조회가 가능하며 1차 캐시에 없으면 DB에서 조회하여 1차 캐시에 올려 놓음
- 동일성 보장: 1차 캐시에서 엔티티를 조회하므로 동일한 객체를 반환
- 쓰기 지연: 트랜잭션을 지원하는 쓰기 지연이 가능하며 트랜잭션 커밋하기 전까지 쿼리를 바로 보내지 않고 모아서 보낼 수 있음
- 변경 감지(Dirty checking): 1차 캐시에 들어온 데이터를 스냅샷해 commit 되는 시점에 Entity와 스냅샷과 비교하여 update 쿼리를 생성
- 지연 로딩: 엔티티에서 해당 엔티티를 불러올 때 쿼리를 날려 해당 데이터를 가져옴
Querydsl 의 장점과 단점에 대해 설명해주세요
- 장점
- 타입 안전성(Type Safety): Querydsl은 자바 코드로 쿼리를 작성하기 때문에 컴파일 시점에 타입 안전성을 보장합니다. 이는 오타나 잘못된 속성 참조로 인한 오류를 줄여줍니다.
- 객체지향적인 쿼리 작성: Querydsl을 사용하면 객체지향적인 방식으로 쿼리를 작성할 수 있습니다. 이는 SQL의 문자열 기반 쿼리보다 가독성이 높고 유지보수가 쉽습니다.
- 코드 가독성 향상: Querydsl을 사용하면 SQL 쿼리를 자바 코드로 작성하기 때문에 가독성이 향상됩니다. 코드 내에 SQL 쿼리와 자바 코드가 섞이는 것을 방지하고, 추상화된 도메인 객체를 이용하여 쿼리를 작성할 수 있습니다.
- 단점
- 복잡성: 간단한 쿼리의 경우, JPA의 JPQL이나 기본 메소드가 더 간결하고 직관적일 수 있습니다. QueryDSL은 복잡한 동적 쿼리에는 뛰어나지만, 간단한 쿼리에서는 그만큼의 이점을 제공하지 않을 수 있습니다.
- 복잡한 쿼리의 경우 쿼리 분석이 어렵습니다. 전체 쿼리를 DBMS 툴로 조회하기 위해서는 실행되는 쿼리를 로깅하는 등의 방식으로 확인해야 합니다.
영속성 컨텍스트의 내용을 데이터 베이스에 반영하려면 어떻게 해야 하나요?
- 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
- 트랜잭션 커밋 시 플러시가 자동 호출
- JPQL 쿼리 실행 시 플러시가 자동 호출
JPQL 쿼리를 실행 할 때 왜 플러시 되나요?
- JPA는 쿼리를 실행하기 직전에 영속성 컨텍스트를 플러시해서 변경 내용을 데이터베이스에 반영하여 문제를 예방하기 위해 JPQL을 실행할 때도 플러시를 자동 호출
N+1 문제와 해결 방법에 대해 설명해주세요
- N + 1 쿼리 문제는 즉시 로딩과 지연 로딩 전략 각각의 상황에서 발생할 수 있습니다. 하위 엔티티들이 존재하는 경우 한 쿼리에서 모두 가져오는 것이 아닌, 필요한 곳에서 각각 쿼리가 발생하는 경우를 이릅니다.
- 즉시 로딩에서 발생하는 이유는 JPQL을 사용하는 경우 전체 조회를 했을 때, 영속성 컨텍스트가 아닌 데이터베이스에서 직접 데이터를 조회한 다음 즉시로딩 전략이 동작하기 때문입니다.
- 지연 로딩에서 발생하는 이유는 지연로딩 전략을 사용한 하위 엔티티를 로드할 때, JPA에서 프록시 엔티티를 unproxy 할 때 해당 엔티티를 조회하기 위한 추가적인 쿼리가 실행되어 발생합니다.
- 해결 방법으로는 Fetch Join이라고 불리는 JPQL의 join fetch를 사용하는 방법이 있으며, 또 다른 방법으로는
@EntityGraph
를 사용하는 방법,@Fetch(FetchMode.SUBSELECT)
를 사용하는 방법,@BatchSize
를 사용해 조절하거나 전역적인 batch-size를 설정하는 방법이 있습니다.
N:M 관계의 문제점은 무엇인가요?
- 연결 테이블이 단순히 연결만 하고 끝나지 않음
- 조인 테이블 자체에 주문시간, 수량 같은 추가 데이터가 많이 들어갈 수 있지만, 매핑 정보만 넣는 것이 가능하고, 추가 정보를 넣는 것 자체가 불가능
- 중간 테이블이 숨겨져 있기 때문에 예상하지 못하는 쿼리들이 나감
- 이런 이유들로 실무에서 사용하면 안 됨
N:M 관계 문제의 해결 방법은 무엇인가요?
- 연결 테이블용 엔티티를 추가
- @manytomany를 @manytoone, 다대일 관계 두개로 풀어냄
Transactional(readOnly=True) 를 사용하는 이유
- 성능 향상: 읽기 전용 트랜잭션은 데이터베이스에 대한 읽기 작업만 수행하고, 쓰기 작업은 수행하지 않습니다. 이는 데이터베이스에 락을 걸지 않고 읽기 작업을 병렬로 처리할 수 있기 때문에 전반적인 응답 시간을 향상시킬 수 있습니다.
- 데이터 무결성 보장: 읽기 전용 트랜잭션에서는 데이터 변경이 발생하지 않으므로 데이터베이스의 일관성과 무결성이 보장됩니다.
- 트랜잭션 최적화: Spring Framework에서는 읽기 전용 트랜잭션을 사용할 경우, 트랜잭션 관리 및 데이터베이스 커넥션을 최적화하여 성능을 높일 수 있습니다.
- 예상치 못한 변경 방지: 읽기 전용 트랜잭션을 명시적으로 선언함으로써 개발자가 코드의 의도를 명확히 전달할 수 있습니다. 즉, 읽기 작업만 수행하도록 의도하지 않은 데이터 변경을 방지할 수 있습니다.
Flush와 Commit의 차이는 무엇인가요?
- flush는 쿼리를 전송하는 역할이고 commit은 내부적으로 flush를 수행한 뒤 트랜잭션을 끝내는 역할입니다.
- 즉 flush로 전송된 쿼리는 rollback할 수 있지만 commit은 트랜잭션을 끝내므로 rollback 할 수 없습니다.
Eager Loading(즉시 로딩)과 Lazy Loading(지연 로딩)에 대해 설명해 주세요.
- Eager는 데이터를 가져올 때 하나의 객체만 가져오는 것이 아닌 참조 객체들의 데이터까지 전부 읽어오는 방식
- Lazy는 지연 로딩으로 참조 객체들의 데이터들은 무시하고 해당 엔티티의 데이터만 가져오는 방식