6-1. 데이터베이스 연동[Spring Boot]

JuJaeng2·2023년 12월 11일

이번 글에서는 데이터베이스를 바로 연동해보고 코드를 작성해보기 보다는 먼저 이론적인 부분부터 살펴보도록 할 것이다. 책에 처음 듣는 개념이 많았기 때문에 정리가 먼저 필요하다고 생각이 들었다.

✅ ORM

ORM(Object Relational Mapping)

  • 자바와 같은 객체지향 언어에서 의미하는 객체와 RDB(Relational Database)의 테이블을 자동으로 매핑하는 방법
  • 클래스와 RDB 테이블과의 불일치를 해결해주는 역할
  • 쿼리문 작성이 아닌 코드(메서드)로 데이터 조작을 가능하게 해줌

장점

  • ORM을 사용하면서 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다.
    • 쿼리문을 작성하는 양이 감소 => 개발 비용 감수
    • 객체지향적으로 데이터베이스에 접근 가능 => 코드의 가독성 상승
  • 재사용 및 유지보가 편리하다
    • ORM을 통해 매핑된 객체는 모두 독립적으로 작성되어 있어 재사용이 용이
    • 객체들은 각 클래스로 나뉘어 있어 유지보수가 수월
  • 데이터베이스에 대한 종속성이 줄어든다.
    • ORM을 통해 자동 생성된 SQL문은 객체를 기반으로 데이터베이스 테이블을 관리하기 때문에 데이터베이스에 종속정이지 않음
    • 데이터베이스를 교체하는 상황에서도 비교적 적은 리스크를 부담

단점

  • ORM만으로 온전한 서비스를 구현하기이네는 한계가 있다.
    • 복잡한 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어려움
    • 복잡한 쿼리를 정확한 설계 없이 ORM만으로 구성하게 되면 속도 저하 등의 성능 문제가 발생할 수 있음
  • 애플리케이션의 객체 관점과 데이터베이스의 관계 관점의 불일치가 발생한다.

✅ JPA

JPA(Java Persistence API)

JPA는 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음이다. 그래서 실제 동작이 아닌 어떻식으로 동작해야 하는지에대한 메커니즘을 정리한 표준 명세라고 생가하면 된다.

개발자가 직접 JDBC를 구현하면 SQL에 의존하게 되어서 개발의 효율성이 떨어질 수 있는데 JPA를 사용하면 개발자 대신 SQL을 생성하고 데이터베이스를 조작해서 객체를 자동 매핑해줘서 개발의 효율성을 올릴 수 있다.

JPA 기반의 구현체

  1. 하이버네이트(Hibernate)
  2. 이클립스 링크(EclipseLink)
  3. 데이터 뉴클리어스(DataNucleus)

지금까지 당연하단듯이 하이버네이트를 사용해 왔다. JPA기반의 구현체가 더 있는지는 전혀 몰랐다. 이를 통해서 하이버네이트가 가장 대중적으로 사용되고 있고, 그래서 이책의 저자도 하이버네이트를 기준으로 설명하고 있는것 같다.

하이버네이트(Hibernate)

자바 ORM 프레임워크로 JPA가 정의하는 인터페이스를 구현하고 있는 JPA구현체 중 하나이다.
책에서는 Spring Data JPA를 활용한다.

Spring Data JPA

하이버네이트의 기능을 더욱 편하게 사용하도록 모듈화한 것

  • CRUD에 필요한 인터페이스 제공
  • 하이버네이트의 엔티티 매니저(Entity Manager)를 직접 다루지 않고 레포지토리를 정의해 사용 => 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스 조작

✅ 영속성 컨텍스트

Persistence Context

애플리케이션과 데이터베이스 사이에서 엔티티와 레코드의 괴리를 해소하는 기능과 객체를 보관하는 기능을 수행한다.

엔티티 객체가 영속성 컨텍스트에 들어오면 JPA는 엔티티 객체의 매핑 정보를 데이터베이스에 반영하는 작업을 수행한다.

< 영속성 컨텍스트의 생명주기 >

세션단위의 생명주기를 가진다.

  1. 데이터베이스 접근을 위한 세션 생성
  2. 영속성 컨텍스트 만들어짐
  3. 세션 종료
  4. 영속성 컨텍스트 삭제

이런 과정에서 영속성 컨텍스트에 접근하기 위한 수단으로 엔티티 매니저가 사용된다.

엔티티 매니저(Entity Manager)

엔티티 매니저는 이름 그대로 엔티티를 관리하는 객체이고 데이터베이스에 접근해서 CRUD 작업을 수행한다.

Spring Data JPA를 사용하면 레포지토리를 사용해서 테이터베이스에 접근하는데, 실제 내부 구현체인 SimpleJpaRepository가 레포지토리에서 엔티티 매니저를 사용하는 한다.

엔티티 매니저 팩토리(Entity Manager Factory)

  • Entity Manager를 만들어준다.
  • 데이터베이스에 대응하는 객체
  • 스프링 부트에서는 자동 설정 기능이 있기 때문에 application.properties에서 장성한 최소한의 설정만으로 동작한다.
  • 애플리케이션에서 단 하나만 생성된다.
  • 모든 엔티티가 공유해서 사용

[ 정리 ❗️ ]

엔티티 매니저로 생성된 엔티티 매니저는 엔티티를 영속성 컨텍스트에 추가해서 영속 개체로 만드는 작업을 수행하고, 영속성 컨텍스트와 데이터베이스를 비교하면서 실제 데이터베이스를 대상으로 작업을 수행한다.

엔티티의 생명주기

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

1. 비영속(New)

  • 영속성 컨텍스트에 추가되지 않은 엔티티 객체의 상태

2. 영속(Managed)

  • 영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태

3. 준영속(Detached)

  • 영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태

4. 삭제(Removed)

  • 데이터베이스에서 레코드를 삭제하기 위해 영속성 컨텍스트에 삭제 요청을 한 상태

마무리 😁

개발공부는 하면 할수록 공부할 양이 늘어난다... 정말 빙산같다...
이번 챕터에서는 아무생각없이 사용하던 JPA 레퍼지토리의 동작 방법을 알 수 있었다. 심지어 지금까지 레퍼지토리는 SpringBoot의 기능이라고만 생각하고 JPA에서 제공되는 기능이라는 것을 몰랐다. 지금이라도 알아서 다행이다.
구체적으로 어떻게 Persistence Context가 관리되고 엔티티가 어떻게 엔티티 매니저로 persistence object가 되는지는 알 수 없어서 궁금증이 생겼다. 지금은 아직 입문단계이고 Spring Boot의 기초적인 부분을 다듬어야하는 시기이기 때문에 나중에 실력이 많이 쌓이면 그때 깊게 알아보는 시간을 가지면 좋을것 같다.

다음 포스팅에서는 실제로 SpringBoot와 MariaDB를 연동해보고 로직을 작성해 보도록 하겠다.

profile
다 잘하고 싶은 개발자

0개의 댓글