Summary : ORM(JPA)를 통해서 데이터베이스를 객체 접근하듯 할 수 있음 / Hibernate는 JPA의 구현체
JPA의 원리 : EntityManagerFactory가 EntityManager를 생성하면,
이 EntityManager가 엔티티를 영속성 컨택스트에 올리고, 영속성 컨택스트와 DB를 비교하며 DB를 조작함
💡 6.2 ORM
- Object Relational Mapping의 약자
- 직역하자면 '객체 관계 매핑'
- java의 객체(entity)와 table을 자동으로 매핑하는 방법
- 쿼리문이 아니라 메서드로 데이터를 조작할 수 있음
- 우리는 자바의 ORM인 JPA를 사용할 것이므로 이후의 내용이 모두 JPA에도 적용된다고 생각하면 됨
📌 ORM의 장점
- 쿼리를 작성하는 양이 현저히 줄어 개발 비용이 줄어듦
- 재사용 및 유지보수가 편리함
- DB에 대한 종속성이 들어들어서 DB를 교체하는 상황에서도 리스크가 적음 (e.g H2 -> MySQL)
📌 ORM의 단점
- 복잡한 쿼리를 구현할 수 없음 → ORM만으로는 온전한 서비스를 구현하기 힘듦
- 어플리케이션 관점과 DB관점의 불일치가 생길 수 있음
- 1) 자동 설계
ORM은 필요한 테이블을 자동으로 설계하는데
이때문에 테이블의 수가 클래스의 수보다 많아질 수 있음 (특히 관계 태이블) - 2) 상속
table에는 상속이라는 개념이 없음 - 3) 식별
DB는 PK가 같으면 동일한 데이터라 식별하지만, 객체는 값이 같더라도 동일한 객체로 식별하지 않기도 함 - 4) 참조
자바는 객체 자체를 참조하여 연관성을 나타내는 반면, DB는 FK를 이용해서 연관성을 나타냄
또한 자바에서는 참조의 방향이 있지만, table은 양방향 관계만 존재 - 5) 접근 방식
자바는 참조를 이용해서 객체에 접근하지만, (즉, 참조하는 객체 자체를 필드로 갖는 형식)
table은 여러 table을 JOIN하여 접근함
💡 6.3 JPA
- 자바의 ORM 기술 표준 (그냥 JPA가 ORM 역할을 한다고 생각하면 무난)
- ORM 보다 더 구체화된 인터페이스를 제공
- 내부적으로 JDBC를 사용 (cf. JBDC는 자바에서 DB 접속을 도와주는 자바 API)
- JPA 구현체로는 Hibernate, EclipseLink, DataNucleus가 있음 (가장 많이 사용되는 것은 Hibernate)
💡 6.4 Hibernate
📌 6.4.1 Spring Data JPA
- Hibernate의 기능을 더 편하게 사용하게하는 라이브러리
- 하이버데이트의 EntityManager를 직접 다루지 않고 레포지토리를 통해 쿼리를 동적으로 생성한다.
- cf. 지금까지 해온 프로젝트에서 항상 spring-boot-starter-data-jpa 의존성을 추가했었는데,
spring-boot-starter-data-jpa는 spring-data-jpa에 의존하므로 결과적으로 항상 spring-data-jpa를 써온 샘이다.
📌 6.5 Persistence Context (영속성 컨텍스트)
- 엔티티와 레코드(db 데이터) 사이의 괴리를 해소하는 역할
- 엔티티를 영구 저장하는 환경
- 영속성 컨텍스트는 엔티티 메니저를 생성할 때 하나 만들어짐
- 원리 : 엔티티가 영속성 컨텍스트에 들어오면 JPA는 해당 엔티티를 바탕으로 데이터베이스를 구성함
- 영속성 컨텍스트에 들어와 JPA의 관리 대상이 되는 시점부터 해당 객체를 영속 객체(Persistence Object)라고 함
- 영속성 컨텍스트는 세션 단위의 생명주기를 가짐
즉, db에 접근하기 위한 세션이 생성되면 영속성 컨텍스트가 만들어짐
세션이 종료되면 영속성 컨텍스트도 없어짐 - EntityManager는 영속성 컨텍스트에 접근하기 위한 수단으로 사용됨
📌 6.5.1 Entity Manager(엔티티 매니저)
- 데이터베이스에 접근해서 CRUD 작업을 수행함 (JPA의 기능 대부분을 엔티티 메니저가 제공)
- Spring Data JPA는 엔티티 메니저를 통해서 리포지토리를 사용해서 데이터베이스에 접근
- 앤티티 매니저 '팩토리'는 클라이언트에 요청이 올 때마다 엔티티 매니저를 생성
- 엔티티 매니저 팩토리는 애플리케이션에서 단 하나만 생성되며, 모든 엔티티가 공유해서 사용함
- 엔티티 매니저 팩토리가 생성한 엔티티 매니저는
엔티티를 영속성 컨텍스트에 추가해서 영속 객체로 만드는 작업을 수행하고,
영속성 컨텍스트와 데이터베이스를 비교하면서 데이터베이스를 대상으로 작업을 수행함
📌 6.5.2 엔티티의 생명주기
- 비영속(New)
영속성 컨텍스트에 추가되지 않은 엔티티 객체의 상태 - 영속(Managed)
영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태 - 준영(Detached)
영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태 - 삭제(Removed)
데이터베이스에서 레코드를 삭제하기 위해 영속성 컨텍스트에 삭제 요청을 한 상태
'Spring Boot > 스프링 부트 핵심 가이드' 카테고리의 다른 글
[SpringBoot] 7.4.5-6 컨트롤러 테스트 (0) | 2023.09.22 |
---|---|
[SpringBoot] 7.1-4 테스트 코드 (0) | 2023.09.22 |
[SpringBoot] 5.6-7 Swagger와 Logback (0) | 2023.07.30 |
[SpringBoot] 5.3-5 POST, PUT, DELETE API 만들기 (0) | 2023.07.30 |
[SpringBoot] 5.2 GET API 만들기 (0) | 2023.07.30 |