ORM(Object Relational Mapping)
ORM(Object Relational Mapping)
객체 관계 매핑을 의미하는 ORM, 객체 지향 언어에서 객체(클래스)와 RDB(Relational DataBase)의 테이블(Table)을 자동으로 매핑하는 방법입니다. 여기서 클래스는 테이블과 매핑하기 위해 만들어진 것이 아니기 때문에 서로 간의 불일치가 존재합니다. 이러한 불일치를 해결하는 방법이 바로 ORM 입니다.

ORM의 장단점
장점
- DB쿼리를 객체지향적으로 조작 가능 >> 쿼리문을 작성하는 양이 감소
- 재사용 및 유지보수가 편리 >> 객체들은 클래스로 나뉘어져있기 때문에 유지보수가 편리
- DB에대한 종속성이 감소 >> ORM을 통해 자동 생성된 SQL문은 객체 기반으로 테이블 관리하기 때문에 종속적이지 않음
단점
- ORM만으로는 복잡한 쿼리를 구현 불가능 >> 구현하더라고 성능 저하 이슈가 발생할 수 있음
- 객체 관점과 DB의테이블 관계 관점이 불일치
- Java의 경우 객체 참조를 통해 특정 값에 접근하는 방식으로
member.getCompany().getAddress로 접근, RDBMS의 경우 조인을 통해 여러 테이블의 값을 추출하는 방식 - RDBMS의 경우 기본 키를 통해 동일성을 정의하지만, 자바는 두 객체의 값이 같아도 다르다고 판단
- Java는 상속의 개념이 존재, RDBMS는 상속 개념 존재 X
- Java의 경우 객체 참조를 통해 특정 값에 접근하는 방식으로
JPA (Java Persistence API)
JAVA에서 채택된 ORM 기술 표준으로 채택된 인터페이스 집합입니다. JPA는 실제로 동작하는 것이 아니라 어떻게 동작해야 하는지 메커니즘을 정리한 표준 명세로라고 보시면 됩니다. JPA는 내부적으로 JDBC를 사용합니다. 개발자가 JDBC를 구현하면 SQL에 의존하게 되어 개발의 효율성이 떨어집니다. JPA는 개발자 SQL을 구현하는게 아니라 적절한 SQL을 대신 생성하고 데이터베이스를 컨트롤해 객체를 자동 매핑해주는 역할을 합니다.

JPA 기반 구현체
- 하이버네이트(Hibernate)
- 이클립스링크(EclipsLink)
- 데이터 뉴클리어스(DataNucleus)
하이버네이트(Hibernate)
자체적으로 객체나 멤버 변수 테이블이나 Row 매핑해주고, 자동으로 적절한 쿼리를 생성해주는 ORM의 프레임워크, JPA의 인터페이스를 구현한 구현체 중 하나입니다. Spring에서는 하이버네이트를 편하게 사용하도록 모듈화한 Spring
Data JPA을 제공합니다.
Spring Data JPA
Spring Data JPA는 JPA를 편리하게 사용하게 해주는 스프링 하위 프로젝트입니다. CRUD 처리에 필요한 인터페이스를 제공하며, 하이버네이트의 엔티티 매니저를 직접 다루지 않고 리포지토리 정의해 사용함으로써 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 컨트롤합니다.

영속성 컨텍스트
영속성 컨텍스트(Persistence Context)는 어플리케이션과 데이터베이스 사이에서 객체와 테이블의 불일치를 해소하면서, 객체를 보관합니다. 엔티티 객체(클래스 객체) 영속성 컨텍스트에 들어오면 JPA는 언테티 객체의 매핑 정보를 데이터베이스에 반영합니다. 엔티티 객체가 영속성 컨텍스트에 들어와 JPA의 관리 대상이 되는 부분부터 해당 객체는 영속 객체(Persistence Object)가 됩니다. 이렇게 엔티티를 영속성 컨텍스트로 만들 때, 엔티티 매니저를 사용합니다.

엔티티 매니저
엔티티 매니저는 엔티티를 관리하는 객체로 DB에 접근해 CRUD작업을 수행합니다. Spring Data JPA는 리포지토리를 사용해 DB에 접근하지만 내부 구현체에는 엔티티 매니저를 사용하고 있습니다.엔티티 매니저는 엔티티 매니저 팩토리로 생성되는데, 엔티티 매니저 팩토리는 DB에 대응하는 객체로서 스프링 부트에서는 application.yml에 있는 JPA의 관련 정보만으로도 동작할수 있습니다. 엔티티 매니저 팩토리로 생성된 엔티티 매니저는 엔티티를 영속성 컨텍스트에 추가해서 영속 객체 만들고, 이를 DB에 대응시키면서 데이베이스를 컨트롤하게 됩니다.
엔티티 생명주기
- 비영속(New) : 영속성 컨텍스트에 추가되지 않은 엔티티 객체
- 영속(Managed) : 영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태
- 준영속(Detached) : 영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태
- 삭제(Removed) : 데이베이스에서 레코드를 삭제하기 위해 영속성 컨테스트에 삭제를 요청한 상태