Spring Boot - ORM, JPA, Spring data
ORM - DB에 많은 신경을쓰지 않고, OOP를 가능하게하는 프로그래밍 기법
JPA - Java ORM 기술에 대한 API 표준 명세(인터페이스)
Hibernate - JPA를 사용하는 프레임워크
Spring Data JPA - JPA를 쉽게 사용하기 위해 스프링에서 제공하는 인터페이스
추상화 정도
Spring Data JPA -> JPA -> Hibernate -> Datasource(DB)
어플리케이션이 발전하면서 내부의 복잡성은 커짐.
OOP는 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공.
RDBMS는 데이터 중심으로 구조화, 집합적인 사고 필요. (추상화, 상속, 다형성 같은 개념이 없다).
Object와 RDB의 패러다임 불일치.
->패러다임 불일치 문제를 해결하는데 시간과 코드 소비.
RDBMS Table 설계와 객체 모델링을 같이 할 경우…
- DB 설계에 중점을 둘 경우 -> 객체 지향의 장점 X
- 객체 모델링에 중점을 둘 경우 -> DB CRUD 작업이 어려워짐(복잡한 SQL 작성)> Object와 RDBMS를 연결하는 중간자(Mapper) 필요!
JPA(ORM)
- 장점
- RDB에 종류와 관계없이 사용 가능하다. (추후 DB 변경이나 코드 재활용에 용이)
- 기본적인 CRUD 제공과 페이징 처리 등 상당 부분 구현. (비지니스 로직에 집중 가능)
- 테이블 생성, 변경 등 엔티티 관리가 간편하다.
- Query 작성에 집중할 필요 X, 빠른 개발이 가능하다.
- 단점
초기 러닝커브단방향, 양방향, 임베디드 관계 등 이해해야할 내용이 많다. (연관관계 이해 없이 잘못 코딩 했을 시 성능상의 문제와 동작이 원하는대로 되지 않는 일이 발생)
MyBatis(SQL Mapper)
- 장점
- JPA에 비해 쉽다.
- SQL의 세부적인 내용 변경 시 좀 더 간편하다.
- 동적 쿼리 사용 시 JPA보다 간편하게 구현 가능.
- 단점
- 데이터 베이스 설정 변경 시 수정할 부분이 너무 많다. (Oracle의 페이징 쿼리를 MySQL에서 사용 불가)
- Mapper작성부터 인터페이스 설계까지 JPA보다 많은 설계와 파일, 로직이 필요하다.
ORM을 위한 기술 표준
- 개발자는 메소드만 호출하면 JPA가 SQL로 변환해서 DB에 전송. 얻은 결과 역시 객체로 자동 매핑
- 필요할땐 JPA에서 쿼리를 직접 작성하여 사용가능
저장 : jpa.persist(member)
조회 : Member member = jpa.find(Member.class, member id)
수정 : member.setName(“change_name”)
연관객체 조회 : Team team = member.getTeam();
JPA는 크게 2가지 기능을 제공
- Entity와 Table의 Mapping
- Entity를 실제적으로 사용하는 Entity Manager
Entity Manager는 Entity에 대해 CRUD 작업을 진행 -> Entity를 관리하는 가상의 DB
EntityManager em = emf.createEntityManager();
- Entity Manager
- Entity를 DB에 CRUD하는 작업을 담당.
- Entity를 관리하는 가상의 DB
- 하나의 Persistence Context 를 보유.
Persistence
- 프로그램이 종료되어도 생성된 데이터가 사라지지 않는 특성
- 영속성을 갖지 않을경우… 프로그램이 종료시 생성된 데이터는 모두 사라진다.
- 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여한다. => Persistence Contextem.persist(member);
Persistence Context (Entity Manager)
- Entity를 영구히 저장하는 환경
- 1차 캐시를 지원, 엔티티의 수정이 잦을 경우 DB 접근없이 CRUD 작업 가능
- 1차 캐시에 있는 엔티티는 동일성을 보장. (캐싱 기능)
- 쓰기 지연 저장소를 구현, SQL 저장/삭제를 최적화. (버퍼링 기능, 지연 로딩)
- 변경된 엔티티가 있을 경우, 변경을 감지하여 Update SQL 실행 (Dirty Checking)
- New/Transient 영속성 컨텍스트와 전혀 관계가 없는 상태
- Managed - 영속성 컨텍스트에 저장된 상태
- Detached - 영속성 컨텍스트에 저장되어 있다가 분리된 상태
- Removed 삭제된 상태
JPA를 실질적으로 사용하는 구현체. (Hibernate가 JPA 보다 먼저 등장)
- Object/Relational Mapping(ORM)
- 객체/관계의 매핑을 제공한다.
- JPA Provider
- Java Persistance API를 구현하여 제공한다. 이를 통해 JPA를 지원하는 모든 환경에서 쉽게 사용할 수 있다.
- Idiomatic persistence
- 객체지향 패러다임에서 자연스럽게 Persistance class를 개발할 수 있게 도와준다.
- High Performance
- 개발자 생산성 및 런타임 측면에서 그냥 JDBC 코드를 쓴것보다 우수한 성능을 제공함.
- Scalability
- 어플리케이션이 서버 클러스터에서 작동하고 확장성이 뛰어난 아키텍처를 제공하도록 설계됨.
- Reliable
- 수많은 Java 개발자들이 사용하여 안전성 및 품질이 입증됨.
ORM : Programming technique JPA : Programming Interface
Hibernate : Framework
Spring Data JPA : Programming Interface