Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

[스프링 부트3 백엔드 개발자 되기] - 3일차 본문

공부/백엔드

[스프링 부트3 백엔드 개발자 되기] - 3일차

Hannah0226 2024. 3. 3. 20:22

5장 - 데이터베이스 조작이 편해지는 ORM

5.1 데이터베이스란?

DBMS(database management system): 데이터베이스 관리를 위한 소프트웨어

  • 관계형 DBMS: 관계형 모델을 기반으로 함. 테이블 형태로 이루어진 데이터 저장소. ex) 회원 테이블이 있다고 가정하면 각 행은 고유의 키, 이메일, 나이와 같은 회원과 관련된 값들이 들어감 H2, MySQL
  • * H2: 자바로 작성되어 있는 관계형 DBMS로, 데이터를 다른 공간에 따로 보관하는 것이 아니라 애플리케이션 자체 내부에 저장한다는 특징이 있음. 간편하지만 애플리케이션을 다시 실행하면 데이터가 초기화되기에 테스트 용으로 많이 사용 됨.

5.2 ORM이란?

ORM(Object-relational mapping): 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법. 이를 사용해 데이터베이스의 값을 객체처럼 사용할 수 있음. → 객체와 데이터베이스를 연결해 자바 언어로만 데이터베이스를 다룰 수 있게 하는 도구

 

5.3 JPA와 하이버네이트?

  • JPA(java persistence API): ORM의 한 종류로써 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 하이퍼네이트: JPA 인터페이스를 구현한 구현체이자 자바용 ORM 프레임워크. 내부적으로는 JDBC API 사용. 하이퍼네이트의 목표는 자바 객체를 통해 데이터베이스 종류에 상관없이 데이터베이스를 자유자제로 사용할 수 있게 하는 것에 있음

 

엔티티 매니저

  • 엔티티: 데이터베이스의 테이블과 매핑되는 객체
  • 엔티티 매니저: 엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할을 함. ex) 회원 2명이 동시에 회원가입을 하려는 경우 엔티티 매니져 팩토리에서 각 회원을 맡는 엔티티 메니져를 생성하여 가입처리 진행

but 스프링부트는 내부에서 엔티티 매니져 팩토리 하나만 생성해서 관리하고, @Persistence Context또는 @Autowired 애너테이션을 사용해 엔티티 매니저 사용. 또한 스프링부트는 기본적으로 빈을 하나만 생성해서 공유하므로 동시성 문제가 발생할 수 있음. → 엔티티 매니저가 아닌 실제 앤티티 매니저와 연결하는 프록시 엔티티 매니저 사용

 

영속성 컨텍스트

  • 영속성 컨텍스트: 엔티티를 관리하는 가상의 공간. 엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장한다는 특징이 있음.
  • 1차 캐시: 영속성 컨텍스트는 내부에 1차 캐시를 가지고 있음. 캐시의 키는 식별자이며 값은 엔티티임. 엔티티를 조회하면 1차 캐시에서 데이터를 조회하고 값이 있으면 반환. 값이 없으면 데이터베이스에서 조회해 1차 캐시에 저장한 다음 반환 → 빠르게 데이터 조회 가능
  • 쓰기 지연: 트랜잭션을 커밋하기 전까지는 데이터베이스에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 한번에 실행 → 시스템 부담 줄임
  • 변경 감지: 트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 변경 사항을 감지해 변경된 값을 데이터베이스에 자동 저장 시스템 부담 줄임
  • 지연 로딩: 쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회하는 것

엔티티의 상태

  • 분리 상태: 영속성 컨텍스트가 관리하고 있지 않은 상태 (엔티티 생성시)
  • 관리 상태: 영속성 컨텍스트가 관리하는 상태 (persist() 메서드 사용)
  • 비영속 상태: 영속성 컨택스트와 관계가 없는 상태 (detach() 메서드 사용)
  • 삭제된 상태 (remove() 메서드 사용)

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

...