Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6주차 모의 면접 질문 정리 (Spring 9~15) #25

Open
kyeong-hyeok opened this issue Feb 15, 2024 · 0 comments
Open

6주차 모의 면접 질문 정리 (Spring 9~15) #25

kyeong-hyeok opened this issue Feb 15, 2024 · 0 comments
Assignees
Labels

Comments

@kyeong-hyeok
Copy link
Contributor

kyeong-hyeok commented Feb 15, 2024

JPA를 쓴다면 그 이유에 대해서 설명해주세요.

  • 객체지향 프레임워크이기 때문입니다. JPA를 사용하면 비즈니스 로직이 RDBMS에 의존하는 것이 아니라, 자바 코드로 표현될 수 있어 생산성이 높아집니다.
  • JPA는 데이터베이스와 상관없이 동일한 코드로 쿼리를 작성하여, 같은 동작을 기대할 수 있다는 장점도 가지고 있습니다. 이는 database dialect를 지원하기 때문에 가지는 장점입니다.

JWT와 Spring Security 에 대해 설명해주세요.

  • JWT(Json Web Token)는 웹 표준으로, 정보를 안전하게 전달하기 위해 JSON 객체를 사용하는 토큰입니다. JWT는 정보를 전자 서명하여 검증할 수 있도록 설계되어 있습니다. JWT는 클라이언트와 서버 간의 인증 및 정보 교환을 위해 사용됩니다.
  • Spring Security는 스프링 기반의 보안 프레임워크로, 웹 애플리케이션의 보안을 구현하는 데 사용됩니다. Spring Security는 사용자 인증, 권한 부여, 보안 설정 관리 등을 제공하여 애플리케이션의 보안을 강화합니다.

jwt는 개발자도구 열면 보이는데 어떻게 생각하시나요

  • 클라이언트 측에서 JWT를 안전하게 저장하고 처리해야 합니다. 브라우저의 쿠키 또는 웹 스토리지를 사용하여 JWT를 저장할 수 있습니다. 또한, 쿠키의 HttpOnlySecure 속성을 사용하여 보안을 강화할 수 있습니다.
  • 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 관계 문제의 해결 방법은 무엇인가요?

  • 연결 테이블용 엔티티를 추가

Transactional(readOnly=True) 를 사용하는 이유

  1. 성능 향상: 읽기 전용 트랜잭션은 데이터베이스에 대한 읽기 작업만 수행하고, 쓰기 작업은 수행하지 않습니다. 이는 데이터베이스에 락을 걸지 않고 읽기 작업을 병렬로 처리할 수 있기 때문에 전반적인 응답 시간을 향상시킬 수 있습니다.
  2. 데이터 무결성 보장: 읽기 전용 트랜잭션에서는 데이터 변경이 발생하지 않으므로 데이터베이스의 일관성과 무결성이 보장됩니다.
  3. 트랜잭션 최적화: Spring Framework에서는 읽기 전용 트랜잭션을 사용할 경우, 트랜잭션 관리 및 데이터베이스 커넥션을 최적화하여 성능을 높일 수 있습니다.
  4. 예상치 못한 변경 방지: 읽기 전용 트랜잭션을 명시적으로 선언함으로써 개발자가 코드의 의도를 명확히 전달할 수 있습니다. 즉, 읽기 작업만 수행하도록 의도하지 않은 데이터 변경을 방지할 수 있습니다.

Flush와 Commit의 차이는 무엇인가요?

  • flush는 쿼리를 전송하는 역할이고 commit은 내부적으로 flush를 수행한 뒤 트랜잭션을 끝내는 역할입니다.
  • 즉 flush로 전송된 쿼리는 rollback할 수 있지만 commit은 트랜잭션을 끝내므로 rollback 할 수 없습니다.

Eager Loading(즉시 로딩)과 Lazy Loading(지연 로딩)에 대해 설명해 주세요.

  • Eager는 데이터를 가져올 때 하나의 객체만 가져오는 것이 아닌 참조 객체들의 데이터까지 전부 읽어오는 방식
  • Lazy는 지연 로딩으로 참조 객체들의 데이터들은 무시하고 해당 엔티티의 데이터만 가져오는 방식
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants