기술면접용 데이터베이스/JPA 정리

이성준·2022년 5월 28일
0

면접

목록 보기
6/6

데이터베이스

인덱스란 무엇인가요?

db 인덱스는 데이터베이스 테이블의 동작 속도를 높여주는 자료 구조를 의미합니다. 책의 목차처럼 해당 컬럼이 어디에 있는지 정하여, 해당부분만 검색할 수 있게 하여 검색속도를 향상 시킵니다.

  • 어떠한 경우에 사용하나
    테이블에 저장된 데이터의 양이 많고, select가 잦고 경우 성능 개선의 효과를 볼수 있습니다.

트랜잭션이란?

데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위 입니다.
한 트랜잭션 내에서 실행한 작업은 모두 성공하거나 실패해야되고 일관성있게 유지시키고 동시에 실행되는 트랜잭션은 서로 영향을 미칠수 없고 트랜잭션이 완료가 되면 결과는 영구적으로 반영됩니다.

정규화란?

데이터의 중복방지나, 무결성을 충족시키기 위해 데이터베이스를 설계하는것입니다.

무결성과 정합성

무결성 : 데이터의 값이 정확하고 일관성을 유지하는고 보증하는 것
정합성은 : 어떤 데이터의 값들이 서로 일치하는 상태 ex) 주문정보 테이블에서 고객정보를 1에서 2로 변경했는데, 고객정보 테이블에는 변경되지 않았을때

NOSQL vs RDBMS

rdbms는 효율적으로 보관하는것을 목적으로 하고 구조화가 굉장히 중요할때
비교적 자유로운 형태로 데이터의 관리와 접근을 지원하는 데이터베이스를 의미합니다, 데이터 스펙이 자주 변경되는 경우나, 수평확장이 필요할때 사용하면 좋습니다.

B+ Tree란?

DB의 인덱스를 위해 자식 노드가 2개 이상인 Binary Tree를 개선시킨 자료구조로서 아래와 같은 특성을 가진다.
Leaf 노드만 인덱스와 함께 데이터를 가지고 있고, 나머지 노드(인덱스 노드)들은 데이터를 위한 인덱스만을 갖습니다.

파티셔닝

테이블을 컬럼단위로 나누는 방법입니다. 업데이트나 인서트 같은 작업이 분산되어서 성능이 향상되고 단점은 index별로 파티셔닝을 할수가 없습니다.

샤딩

테이블을 row단위로 분산하여 저장하는 방법
장점은 서버의 수평적 확장이 가능하고 스캔범위를 줄여서 쿼리 반응 속도가 빨라집니다
단점 적절히 분리 하지못하면 샤딩의 의미가 없어질수 있다.

조인의 종류

Inner Join : 교집합
Full OUTER JOIN : 합집합 -> 양 테이블의 모든 데이터
Left Join : 왼쪽 테이블의 모든값 + 오른쪽 테이블의 조건과 일치하는 행의 결과 집합
Right Join : 오른쪽 테이블의 모든값 + 왼쪽 테이블의 조건과 일치하는 행의 결과 집합

JPA

쓰는이유?

SQL 위주의 반복적인 개발, 특정 dbms에 강결합되있따 페이징처리시 oracle rownum, mysql은 limit, db를 객체답게 모델링 할수있도록

영속성 컨텍스트란?

애플리케이션과 데이터베이스 사이에 객체를 보관하는 가상의 데이터베이스

엔티티의 생명주기

비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태
영속 : 영속성 컨텍스트에 관리되는 상태
준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
삭제 : 실제 db에서 삭제된 상태

영속성 컨텍스트의 좋은점

  1. 1차 캐시 : 만약 1차 캐시에 없을 경우, db에서 직접 조회하고 1차 캐시에 저장 후 반환
  2. 동일성 보장 : 반복해서 호출해도 1차 캐시에 있는 같은 인스턴스를 반환함
  3. 트랜잭션을 지원하는 쓰기 지연 : 커밋되는 순간 INSERT 쿼리를 보낸다.
  4. 변경 감지 : 트랜잭션되는 순간 flush()가 호출된다. 그러면 엔티티와 1차 캐시 내의 스냅샷을 비교, 변경이 있으면 update sql를 쓰기 지연 sql저장소에 저장하고 커밋이 되면 flush(0가 호출되서 db에 update 쿼리가 나간다.

지연로딩과 즉시로딩

지연로딩 : 엔티티를 조회할때, 연관된 엔티티도 함께 조회
즉시로딩 : 연관된 엔티티를 프록시로 조회하고, 프록시를 실제 사용할때 초기화하면서 조회

  • 프록시 : 실제 클래스를 상속 받아서 만들어진 겉모양이 같고 객체에 대한 참조를 보관함

N+1 문제

조회 시 1개의 쿼리를 생각하고 설계했는데 n개가 추가로 더 나가는 문제
즉시 로딩 : 조회 했을때, 연관관계인 엔티티들을 추가로 끌어오기때문에
지연 로딩 : 지연로딩에서 발생하는 이유는 지연로딩 전략을 사용한 하위 엔티티를 로드할 때, JPA에서 프록시 엔티티를 초기화 할 때 해당 엔티티를 조회하기 위한 추가적인 쿼리가 실행되어 발생합니다.
해결방법 : fetch 조인, @EntityGraph, BatchSize

0개의 댓글