ORM (Object Relation Mapping)란 무엇일까?
- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해 주는 것을 말한다.
- database와 OOP를 둘 다 잘 알고 있어야 한다.
기존 database SQL을 직접 다룰 때의 문제점
- 코드의 반복이 발생함, 예를들어 insert into(...) ... 계속 반복
- SQL에 의존적인 개발을 하게됨.
- 로직을 쿼리로 처리하게 되는 경우가 생김.
- 쿼리가 길어지면 가독성도 떨어지고 무엇보다 테스트를 하려면 쿼리를 날려야한다..
- 유지보수성 - 테이블에 변경이 있다면, 연관된 모든 쿼리를 변경해줘야 함.
- 로직을 쿼리로 처리하게 되는 경우가 생김.
- 특정 db벤더사에 의존하게 됨.
- DB종류마다 약간 씩 문법도 다른 경우가 존재.
- 중간에 DB를 바꾸게되면 골치아픔.
ORM과 RDB의 차이
ORM | RDB | |
데이터(엔티티) | 객체 ( class ) | 테이블 |
연관관계 | 속성 ( 관계매핑) | FK, join key |
ORM의 장점
- 객체지향적이기 때문에 비즈니스로직 및 코드에 집중할 수 있다.
- Boilerplate code가 줄어든다.
- 코드의 재사용과 유지보수성이 좋아진다.
- DBMS의 종속성이 줄어든다.
ORM의 단점
- N+1문제 등 해결해야될 문제들이 존재한다.
- 생성되는 쿼리 속도 등의 문제
- 설계가 잘못되면 일관성이 무너지거나 성능 저하 문제 발생 함.
이정도면 ORM을 사용할 이유는 충분한 것 같다.
JPA - Java Persistence API
- JAVA의 ORM 표준 인터페이스
- Application과 JDCB 사이에서 동작한다.

JPA의 구현체 종류
- Hibernate
- Spring Data JPA -> JPA를 한단계 추상화시킨 Repository interface 제공
영속성 컨텍스트란? (Persistence context)
- 엔티티를 영구 저장하는 환경으로, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 논리적인 개념이다. EntityManager를 통해서 영속성 컨텍스트에 접근한다.
- 엔티티매니저의 persist() 메소드를 사용하면 엔티티를 영속성 컨텍스트에 엔티티를 저장할 수 있다.
- 하나의 엔티티매니저가 하나의 영속성 컨텍스트를 생성 및 접근할 수도 있고,
여러 매니저가 하나의 영속성컨텍스트를 공유할수도 있다. - 엔티티를 식별자값(@Id, PK)으로 구분하기 때문에 식별자값이 반드시 필요 하다.
영속성 컨텍스트 사용의 이점
- 1차 캐시 역할을 해준다. -> find 메소드를 사용하면 1차적으로 캐시에서 찾아보고 없을 시 DB를 조회한다.
- 엔티티를 캐시에서 가져오기 때문에 동일성 보장할 수 있고, 그렇기에 == 연산자로 엔티티를 비교할 수 있음.
- 트랜잭션을 지원하는 쓰기지연 : 커밋 전까지 엔티티를 저장하지 않고 내부 쿼리저장소에 insert sql을 저장해뒀다가 커밋할때 한번에 반영한다. -> I/O가 줄어 효율적인 프로그래밍이 가능
- 변경감지 기능 -> JPA는 영속성 컨텍스트에 보관할 때, 스냅샷을 함께 보관하고 플러쉬 시점에서 스냅샷과 비교해 수정된 부분을 DB에 반영한다.
- 지연로딩 (Laye loading) -> 데이터가 실제로 사용되는 순간에 쿼리를 날려 가져올 수 있다. 효율적인 프로그래밍 가능.
엔티티의 생명주기
- jpa 엔티티는 기본적으로 entityManger가 관리하고 다양한 메소드가 존재한다.
- 비영속(new/transient) : 영속성 컨텍스트와 관계가 없는 상태
- 영속 (managed) : 영속성 컨텍스트에 저장된 상태
- persist()가 사용됐거나, DB에서 가져와 1차 캐시에 저장된 상태
- 준영속 (detached) : 영속성 컨텍스트에 저장됐다가 분리된 상태, 더이상 JPA에서 관리되지 않음.
- entityManger.detach()로 특정 엔티티만 분리시킬 수 있고, merge()로 다시 영속시킬 수 있다.
- entityManger.clear()로 영속성 컨텍스트를 초기화하거나 em.close()로 닫아도 준영속 상태로 만들 수 있다.
- 삭제 (removed) : 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한 상태

Entity manager
- DB에 엑세스하는 역할을 담당. 말 그대로 엔티티 관리자
- thread safe하지 않아 thread 사이 공유를 하면 안된다.
- Entity manger factory로 생성한다.
- Entity manger factory는 스프링 설정정보를 읽어와 DB커넥션 풀도 생성하므로 생성비용이 크다.
- 애플리케이션 전체에서 한번만 생성하고 공유해서 사용해야한다. Thread safe 하다.
- spring boot에서는 Entity manger factory를 직접 제공해준다.
'jpa' 카테고리의 다른 글
Jpa 연관관계 정리 (0) | 2022.08.22 |
---|
댓글