Database와 Spring data JPA

MONA·2024년 3월 5일

나혼공

목록 보기
12/92

Database

DBMS Database management system

데이터베이스 관리 소프트웨어.

관리 특징에 따라 관계형, 객체-관계형, 도큐먼트형, 비관계형 등으로 나뉨.

RDBMS

Relational DBMS. 관계형 모델을 기반으로 한 데이터베이스 관리 소프트웨어.

H2나 MySql 등
H2: spring boot가 지원하는 인메모리 관계형 데이터베이스. 앱 내부에 데이터를 저장해 앱을 다시 실행하면 데이터는 초기화된다. 테스트용으로 많이 사용한다.

ORM

Object-relational mapping. 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법.
객체와 데이터베이스를 연결해 자바 언어로만 데이터베이스를 다룰 수 있게 하는 도구.

  • 장점: - SQL을 직접 작성하지 않고 사용하는 언어로 DB에 접근 가능 - 객체지향적으로 코드를 작성할 수 있기 때문에 비즈니스 로직에만 집중 가능. - 데이터베이스 시스템이 추상화되어있기 때문에 다른 SQL로 전환시에도 추가로 작업할 것이 거의 없음(데이터베이스 시스템에 대한 종속성이 줄어듦) - 매핑하는 정보가 명확해 ERD에 대한 의존도를 낮출 수 있고 유지보수에 유리함
  • 단점: - 프로젝트의 복잡성이 커질수록 사용 난이도 상승 - 복잡하고 무거운 쿼리는 ORM으로 해결 불가

JPA와 하이버네이트

여러 종류의 ORM 중 자바에서는 JPA(Java persistence API)를 표준으로 사용함.

JPA

자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스.
자바 객체와 데이터베이스를 연결해 데이터를 관리. 객체 지향 도메인 모델과 데이터베이스의 다리 역할을 함.

하이버네이트

JPA의 실질적인 사용을 위해 필요한 ORM 프레임워크.
JPA 인터페이스를 구현한 구현체이자 자바용 ORM 프레임워크. 내부적으로는 JDBC API를 사용한다.

엔티티 매니저

엔티티

데이터베이스의 테이블과 매핑되는 객체.

자바 객체이지만 데이터베이스의 테이블과 직접 연결된다는 부분에서 일반 객체와 구분됨. 자바 객체이지만 DB에 영향을 미치는 쿼리를 실행하는 객체이다.

엔티티 매니저

  • 엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 역할을 함. 앤티티 매니저 팩토리에서 엔티티 매니저가 만들어진다.
  • 스프링 부트에서는 내부에서 엔티티 매니저 팩토리를 하나만 생성해서 관리하고 @PersistenceContext 또는 @Autowired 어노테이션을 이용해 엔티티 매니저를 사용한다.
  • 스프링부트는 빈을 하나만 생성해서 공유하므로 동시성 문제가 발생할 수 있다. 이 경우 프록시(가짜) 엔티티매니저를 사용해 필요할 때 데이터베이스 트랜젝션과 관련된 실제 엔티티 매니저를 호출한다.

영속성 컨텍스트

엔티티를 관리하는 가상공간.

  • 영속성 컨텍스트의 특징
    • 1차 캐시
      내부에 1차 캐시를 가지고 엔티티 조회 시 1차 캐시에서 데이터를 조회하고 값이 있으면 반환함. 캐시의 키는 엔티티의 @Id 어노테이션이 달린 기본키 역할을 하는 식별자, 값은 엔티티이다.
      조회했는데 값이 없다면 DB에서 조회해 1차 캐시에 저장하고 반환한다.
      -> 캐시된 데이터 조회시 DB까지 갈 필요가 없어 빠르다.
    • 쓰기 지연
      트랜젝션 커밋 전까지 쿼리문을 모았다가 커밋 시점에 모았던 쿼리를 한번에 실행한다. 묶음으로 쿼리를 요청하기 때문에 DB 시스템의 부담을 줄일 수 있다.
    • 변경 감지
      트랜젝션 커밋 시 1차 캐시에 저장되어있는 엔티티 값과 현재 엔티티 값을 비교해서 변경사항이 있다면 변경값을 DB에 자동으로 반영한다. 묶음 쿼리 요청으로 DB의 시스템의 부담을 줄일 수 있다.
    • 지연 로딩
      쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 게 아니라 필요할 때 쿼리를 날려 데이터를 조회한다.(<->즉시 로딩)

엔티티의 4가지 상태

  1. 분리 상태
  2. 영속성 컨텍스트가 관리하는 관리상태
  3. 영속성 컨텍스트와 전혀 관계가 없는 비영속 상태
  4. 삭제된 상태

스프링 데이터와 스프링 데이터 JPA

스프링 데이터

DB에 대한 특성은 유지하되 데이터 엑세스를 쉽게 하는 스프링 기반 프로그래밍 모델.

DB사용 기능을 클래스 레벨에서 추상화해 비즈니스 로직에 더 집중할 수 있도록 돕는다. - CRUD 포함한 여러 메서드와 자동 생성 쿼리 등을 사용할 수 있는 인터페이스를 이용할 수 있다.

스프링 데이터 JPA

스프링 프레임워크에서 JPA를 쉽게 사용하도록 만들어 둔 모듈

스프링 데이터 + JPA
repository 역할을 하는 인터페이스를 만들어 데이터베이스의 테이블 CRUD 같은 기본 작업을 쉽게 할 수 있다.
JpaRepository 인터페이스를 상속받고 제네릭에는 관리할 <엔티티명, 엔티티 기본키 타입>을 지정하면 기본 메서드 사용 가능.

예제

public interface UserRepository exgtends JpaRepository<User, Long>{ // 이렇게 상속받아 사용 가능하다
}
profile
고민고민고민

0개의 댓글