Skip to content

Latest commit

 

History

History
114 lines (86 loc) · 7.01 KB

File metadata and controls

114 lines (86 loc) · 7.01 KB

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

5.1 데이터베이스란?

5.1.1 데이터베이스 관리자, DBMS

  • 데이터베이스를 관리하기 위한 소프트웨어
  • 관리 특징에 따라서 관계형, 객체-관계형, 도큐먼트형, 비관계형 등으로 분류되며 관계형이 가장 많이 사용

H2, MySQL

H2는 자바로 작성되어 있는 RDBMS, 스프링 부트가 지원하는 인메모리 관계형 데이터베이스

꼭 알아야 할 데이터베이스 용어

테이블, 행, 열, 기본키, 쿼리

5.2 ORM 이란?

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

ORM 의 장점과 단점

장점1. SQL 을 직접 작성하지 않고 사용하는 언어로 데이터베이스에 접근

장점2. 객체지향적으로 코드를 작성할 수 있기 때문에 비즈니스 로직에만 집중

장점3. 데이터베이스 시스템이 추상화되어 있기 때문에 MySQL 에서 PostgreSQL 로 전환한다고 해도 추가로 드는 작업이 거의 없으며 종속성 감소

장점4. 매핑하는 정보가 명확하기 때문에 ERD 에 대한 의존도를 낮출 수 있고 유지보수 유리

단점1. 프로젝트의 복잡성이 커질수록 사용 난이도 상승

단점2. 복잡하고 무거운 쿼리는 ORM 으로 해결이 불가능한 경우 발생

5.3 JPA 와 하이버네이트 ?

  • 자바에서는 JPA(Java Persistence API) 를 표준으로 사용
  • JPA 는 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이며 실제 사용을 위해서는 ORM 프레임워크를 추가로 선택
  • 하이버네이트는 JPA 인터페이스를 구현한 구현체이자 자바용 ORM 프레임워크 (내부적으로 JDBC API 사용)
  • 하이버네이트의 목표는 자바 객체를 통해 데이터베이스 종류에 상관없이 데이터베이스를 자유자재로 사용할 수 있게끔 하는데 있음

JPA 와 하이버네이트의 역할

JPA(Java Persistence API): 자바 객체와 데이터베이스를 연결해 데이터 관리. 객체 지향 도메인 모델과 데이터베이스의 다리 역활

하이버네이트(Hibernate): JPA의 인터페이스를 구현. 내부적으로는 JDBC API 사용

5.3.1 엔티티 매니저란?

  • 엔티티
    • 데이터베이스 테이블과 매핑되는 객체를 의미
    • 데이터베이스의 테이블과 직접 연결되다는 특별한 특징이 있어 구분지어 부름
    • 객체이긴 하지만 데이터베이스에 영향을 미치는 쿼리를 실행하는 객체
  • 엔티티 매니저
    • 엔티티를 관리해 데이터베이스와 어플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할 수행
    • 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리 (Entity Manager Factory)
    • 회원 2명이 동시에 회원 가입을 하려는 경우, 회원 1의 요청에 대해서 가입 처리를 할 엔티티 매니저를 엔티티 매니저 팩토리가 생성하면 이를 통해 가입 처리해 데이터베이스에 회원 정보 저장
    • 스프링 부트는 내부에서 엔티티 매니저 팩토리를 하나만 생성해서 관리하고 @PersistenceContext 또는 @Autowired 애너테이션을 사용해서 엔티티 매니저 사용
    • 스프링 부트는 기본적으로 빈은 하나만 생성해서 공유하므로 동시성 문제가 발생할 수 있음, 실제로는 엔티티 매니저가 아닌 실제 엔티티 매니저와 연결하는 프록시 엔티티 매니저를 사용

5.3.2 영속성 컨텍스트란?

  • 엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장한다는 특징
  • 영속성 컨텍스트는 JPA 의 중요한 특징 중 하나로, 엔티티를 관리하는 가상의 공간

[특징]

  • 1차 캐시
    • 내부에 1차 캐시를 가지고 있으며, 캐시의 키는 엔티티의 @Id 애너테이션이 달린 기본키 역할을 하는 식별자이며 값은 엔티티
    • 엔티티를 조회하면 1차 캐시에서 데이터를 조회하고 값이 있으면 반환
    • 값이 없으면 데이터베이스에서 조회해 1차 캐시에 저장한 다음 반환
    • 케새된 데이터를 조회할 때에는 데이터베이스를 거치지ㅣ 않아도 되므로 매우 빠르게 데이터를 조회
  • 쓰기 지연
    • 트랜잭션을 커밋하기 전까지는 데이터베이스에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 모았던 쿼리를 한 번에 실행하는 것을 의미
    • 적당한 묶음으로 쿼리를 요청할 수 있어 데이터베이스 시스템 부담 감소
  • 변경 감지
    • 트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 언티티의 값을 비교해서 변경된 값이 있다면 변경 사항을 감지해 변경된 값을 데이터베이스에 자동으로 반영
    • 쓰기 지연과 마찬가지로 적당한 묶음으로 쿼리를 요청할 수 있고, 데이터베이스 시스템 부담 감소
  • 지연 로딩
    • 지연 로딩(lazy loading)은 쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회하는 것을 의미
    • 반대로 조회할 때 쿼리를 보내 연관된 모든 데이터를 가져오는 즉시 로딩도 있음

5.3.3 엔티티의 상태

  • 엔티티의 4가지 상태
    • 영속성 컨텍스트가 관리하고 있지 않는 분리 상태 (detached)
    • 영속성 컨텍스트가 관리하는 관리 상태 (managed)
    • 영속성 컨텍스트와 전혀 관계가 없는 비영속 성태 (transient)
    • 삭제된 상태 (removed)
  • 상태는 메서드를 호출해 변경할 수 있으며 필요에 따라 엔티티의 상태를 조절해 데이터를 올바르게 유지하고 관리

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

  • 스프링 데이터(Spring Data)는 비즈니스 로직에 더 집중할 수 있게 데이터베이스 사용 기능을 클래스 레벨에서 추상화

5.4.1 스프링 데이터 JPA란?

  • 스프링 데이터 JPA는 스프링 데이터의 공통적인 기능에서 JPA의 유용한 기술이 추가된 기술
  • 스프링 데이터 JPA에서는 스프링 데이터의 인터페이스인 PagingAndSortingrepository 를 상속받아 JpaRepository 인터페이스를 만들었으며, JPA를 더 편리하게 사용하는 메서드를 제공
  • JpaRepository 인터페이스를 상속받고 제네릭에는 관리할 <엔티티이름, 엔티티 기본키의 타입>을 입력하면 기본 CRUD 를 위해 만든 메서드를 사용할 수 있음

public interface MemberRepository extends JpaRepository<Member, Lon> { }

5.4.2 스프링 데이터 JPA에서 제공하는 메서드 사용해보기

  1. MemberService.java 코드 생성

5.5 예제 코드 살펴보기

  1. Member.java
  2. MemberRepository.java