본문 바로가기
Programming/Spring

[Spring] - 데이터베이스

by jenlve 2024. 2. 13.

ORM(Object Relational Mapping)

▫ 뜻 : 자바와 같은 객체지향 언어에서 의미하는 객체와 RDB(Relational Database)의 테이블을 자동으로 매핑하는 방법 

 

⚠ 객체의 클래스와 데이터베이스의 테이블의 속성은 정확하게 일치하진 않는다

➡️ ORM 이 이 둘의 불일치와 제약사항을 해결하는 역할을 해준다.

ORM의 역할

▫ ORM의 장점

  • 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다.
    • 쿼리문을 작성하는 양이 줄어든다.
    • 객체 지향적으로 DB에 접근할 수 있어 코드의 가독성이 높아진다.
  • 재사용 및 유지 보수가 편리하다. 
    • 객체들은 각 클래스로 나누어져 있어 재사용 및 유지보수가 수월하다.
  • 데이터베이스에 대한 종속성이 줄어든다.
    • ORM을 통해 자동 생성된 SQL문은 객체를 기반으로 DB 테이블을 관리하기 때문에 DB에 종속적이지 않다.

 

▫ ORM의 단점

    • ORM만으론 온전한 서비스를 구현하는데 한계가 있다. 
      • 복잡한 로직이 들어가는 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어렵다. 

JPA(Java Persistence API)

▫ 뜻 : 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음

ORM에서 더 구체화된 스펙을 포함하는 것으로 실제 동작이라기 보단, 어떻게 동작해야 하는지 매커니즘을 정리한 표준 명세로 생각할 수 있다. 

 

JPA의 특징

▫ 내부적으로 JDBC를 사용한다.

➡️ 개발자가 직접 JDBC를 구현할 경우, SQL에 의존하게 되어 개발의 효율성이 떨어지게 된다. 그러나 JPA는 적절한 SQL을 생성해주고 DB를 조작해서 객체를 자동 매핑해주어 개발의 효율성을 높여준다. 

 

▫ JPA 기반의 구현체로는 크게 하이버네이트(Hibernate), 이클립스 링크(EclipseLink), 데이터 뉴클리어스(Data Nucleus)가 있으며, 가장 많이 사용되는 구현체는 하이버네이트(Hibernate)이다. 

대표적인 JPA 구현체

 

 


Spring Data JPA

▫ 뜻 : JPA를 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나이다. 

 

Spring Data JPA의 기능

▫ CRUD 처리에 필요한 인터페이스를 제공해준다.

▫ 하이버네이트의 엔티티 매니저(Entity Manager)를 직접 다루지 않고 리포지토리를 정의해 사용함으로써

스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작한다. 


영속성 컨텍스트

▫ 역할 : 애플리케이션과 데이터베이스 사이에서 엔티티와 레코드의 괴리를 해소하는 기능과

            객체를 보관하는 기능을 수행한다.  

 

영속성 컨텍스트의 특징

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

➡️ DB에 접근하기 위한 세션이 생성되면 영속성 컨텍스트가 만들어지고, 세션이 종료되면 영속성 컨텍스트도 같이 없어진다. 


 

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

 

✅ 엔티티 매니저

▫ 역할 : 엔티티를 관리하는 객체로, 데이터베이스에 접근해서 CRUD 작업을 수행해준다.

➡️  Spring Data JPA에서 Repository를 사용해서 DB에 접근하는데, 실제 내부 구현체인 SimpleJpaRepository에서 EntiityManger를 사용하는 것을 확인해볼 수 있다. 

 

 

▫ 엔티티의 생명주기 : 영속성 컨텍스트에서 다음과 같은 4가지 상태로 구분된다.

 

    비영속(New)

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

 

    영속(Managed)

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

 

    준영속(Detached)

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

 

    삭제(Removed)

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

 

출처 : 스프링 부트 핵심 가이드 [장정우 지음]