본문 바로가기
Java/Spring

[Spring Boot] 스프링 부트와 데이터 베이스 연동

by Dev_Green 2023. 3. 27.

1. ORM

ORM의 역할

  ORM(Object Relational Mapping)은 객체지향프로그램에서의 객체(Objects)와 관계형 데이터베이스의 테이블을 자동으로 매핑하는 기술이다. 이를 이용하여 개발자는 DB에 대한 쿼리문이 아닌 자바 코드(메서드)로 DB의 데이터를 조작할 수 있다.

1.1. 장점

  • 데이터베이스에 대한 종속성이 줄어든다.
    • 데이터베이스 교체 시에 비교적 적은 소요 발생
  • 복잡한 쿼리 작성에 대한 소요를 줄임으로써 비즈니스 로직 개발에 더욱 집중할 수 있다.

1.2. 단점

  • 객체지향프로그램의 객체와 데이터베이스의 테이블 사이의 관점 불일치가 발생한다.
    • 상속: RDMS에는 상속의 개념이 없다.
    • 연관관계: 자바에서는 객체를 참조함으로써 연관성을 나타내지만 RDBMS에서는 외래키를 삽입함으로써 연관관계를 맺는다. 또한 객체 사이에는 방향성이 존재하지만 RDBMS에서 외래키를 삽입하는 것은 양방향이기 때문에 방향성이 없다.
  • ORM만으로는 온전한 서비스를 구축하기에 무리가 있다.
    • 복잡한 서비스의 경우 직접 쿼리를 구현할 필요가 있기 때문에 쿼리에 대한 지식 없이 ORM에만 의존하는 것은 지양해야 한다.

2. JPA

  JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준으로 채택된 인터페이스 모음이다. 인터페이스이기 때문에 구현체를 통해 작동하는데 구현체에는 대표적으로 Hibernate, EclipseLink, DataNucleus가 있다. 이 중 가장 많이 사용되는 것이 Hibernate이다.

3. Hibernate

  하이버네이트는 자바의 ORM 프레임워크로, JPA가 정의하는 인터페이스를 구현하고 있는 JPA 구현체 중 하나이다.

3. 1. Spring Data JPA

 

  우리가 흔히 스프링부트 애플리케이션 클래스에 @EnableJpaRepository를 적용하고 리포지토리 인터페이스에서 JpaRepository 인터페이스를 상속받음으로써 사용하는 JPA는 JPA 그 자체가 아니라 하이버네이트의 기능을 더욱 편하게 사용하도록 모듈화한 Spring Data JPA 라이브러리이다.
  이는 CRUD 처리에 필요한 인터페이스를 제공하며, 하이버네이트의 EntityManager를 직접 다루지 않고 리포지토리를 통해 DB에 대한 쿼리를 생성해준다. 

4. 영속성 컨텍스트(Persistence Context)

  영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 기능을 수행한다.

4. 1. 엔티티 매니저

  엔티티 매니저는 엔티티를 관리하는 객체이다. 이 객체를 통해 DB에 접근해서 CRUD 작업을 수행하는데 이 과정에서 엔티티 매니저는 엔티티 객체를 영속성 컨텍스트에 영속 객체(Persistence Object)로 보관하여 관리한다. 
  Spring Data JPA를 사용하면 리포지토리를 사용해서 DB에 접근하는데, 내부 구현을 살펴보면 이또한 결국은 엔티티 매니저를 사용한다.

4. 2. 엔티티의 생명주기

엔티티 객체 상태

영속성 컨텍스트에서 엔티티 객체는 다음의 네 가지 상태로 구분된다.

  1. 비영속(New)
    • 아직 영속성 컨텍스트에 추가되지 않은 상태
  2. 영속(Managed)
    • 영속성 컨텍스트에 의해 관리되고 있는 상태
  3. 준영속(Detached)
    • 영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태
  4. 삭제(Removed)
    • DB에서 레코드를 삭제하기 위해 영속성 컨텍스트에 삭제 요청을 한 상태

 

 

[참고 자료] 스프링 부트 핵심 가이드 장정우 지음