![]() |
|
1. JPA(Java Persistence API)?
ORM 기술을 구현하기 위해 만들어져 사용되어 온 프레임워크가 Hibernate 이고,
시간이 지나면서 Hibernate 이외에도 ORM 기술을 구현하는 프레임워크(TopLink, CoCobase) 가 등장하였다.
그리고 이런 ORM 기술을 구현한 프레임워크에 대한 표준화가 이루어 졌는데,
그 결과로 만들어진 것이 JPA 인 것이다.
JDBC API 가 어플리케이션과 DMBS 사이에서 인터페이스 역할을 해 주기 때문에,
개발자는 사용할 DB 의 드라이버만 변경해 주면 되는 것처럼,
(DB 드라이버는 JDBC 표준에 맞추어 DB 관련 처리가 구현되어 있고, DB 드라이버는 각 DB 회사가 알아서 만들어 놓았다)
개발자는 ORM 을 기술을 사용할 때, JPA 인터페이스에 맞추어 구현되어 있는
Hibernate, TopLink, CoCoBase 프레임워크 중 골라서 사용하면 된다.
만약, JPA 같은 표준 인터페이스가 없다면,
ORM 기술을 사용하기 위한 Hibernate, TopLink, CoCoBase 의 필드와 메소드가 다를 것이다.
같은 기능을 가지는 메소드인데 Hibernate 에서는 냥냥고고( ), TopLink 에서는 멍멍고고( )로 정의되어 있다면,
사용하는 개발자가 ORM 프레임워크를 변경해야 할 때 난감할 것이다.
그래서 JPA API 가 이 기능은 통일해서 냥이최고( ) 로 구현하라고 강제하는 것이다(인터페이스의 중요 기능).
ORM 프레임워크를 사용하면 개발자가 객체를 데이터베이스에 저장할 때 SQL을 직접 작성할 필요 없이,
자바 컬렉션에 저장하는 것처럼 ORM 프레임워크에 저장하면 된다.
객체를 받은 ORM 프레임워크는 저장된 자바 객체를 분석해서 적절한 SQL을 생성하고 데이터베이스에 저장시킨다.
2. 영속성(Persistence)
이렇게 엔티티의 변경사항을 데이터베이스에 자동으로 반영하는 기능을 변경감지(Dirty Checking)이라 한다.
3. JPA 메소드
(2) detach( )
특정 엔티티를 준영속 상태로 만든다.
준영속 상태가 된 엔티티는 더이상 영속 컨텍스트의 관리를 받지 않으며,
영속 컨텍스트가 지원하는 어떤 기능도 동작하지 않게 된다.
영속 상태가 영속성 컨텍스트로에게 관리(managed)되는 상태라고 하면,
준영속 상태는 영속성 컨텍스트로부터 분리(detached)된 상태이다.
(3) clear( )
영속성 컨텍스트를 초기화 한다.
영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만든다.
(4) close( )
영속성 컨텍스트를 종료한다.
영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모둔 준영속 상태가 된다.
영속 상태의 엔티티는 주로 영속성 컨텍스트가 종료되면서 준영속 상태가 된다.
개발자가 직접 준영속 상태로 만드는 일은 거의 없다.
(5) merge( )
준영속 상태의 엔티티의 특징
① 거의 비영속 상태에 가깝다. 영속성 컨텍스트가 관리하지 않으므로 영속성 컨텍스트가 제공하는 어떠한 기능도 동작하지 않는다.
② 식별자 값을 가지고 있다. 비영속 상태의 엔티티는 식별자(엔티티를 구분하기 위한 유일한 값, ID)를 가지지 않고 있을 수도 있지만,
준영속 상태는 이미 한 번 영속 상태였기 때문에, 식별자 값을 가지고 있다.
merge( )는 준영속 상태의 엔티티를 이용해서 새로운 영속 상태의 엔티티를 반환한다.
실행되었을 때 일어나는 일
① 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회
(1차 캐시에 엔티티가 없으면 데이터베이스에서 엔티티를 조회하고 1차 캐시에 저장)
② 조회한 영속 엔티티에 준영속 엔티티의 값을 채워 넣는다.
③ 생성된 새로운 영속 엔티티를 반환한다.
새롭게 생성된 영속 상태의 엔티티를 가지고 이제 영속성 컨텍스트가 지원하는 기능을 사용할 수 있다.
준영속 상태의 엔티티를 영속 상태로 변경하는 것이 아니라, 새로운 영속 상태의 엔티티를 만들어서,
준영속 상태의 엔티티 값을 영속 상태의 엔티티에 채워 넣어서 반환하는 점에 주의해야 한다.
그리고, 준영속 뿐만 아니라, 비영속 상태의 엔티티도 병합하여 새로운 영속 상태의 엔티티를 만들어 반환한다.
자세한 내용은 위의 엔티티 변경 참조.
(6) find( )
식별자 값을 가지고 엔티티를 찾아서 반환한다.
자세한 내용은 위의 엔티티 조회 참조
(7) persist( )
자바 어플리케이션에서 생성된 엔티티를 영속성 컨텍스트와 데이터베이스에 저장한다.
자세한 내용은 위의 엔티티 생성 참조
(8) remove( )
식별자 값을 가지고 엔티티를 찾아서 삭제한다.
자세한 내용은 위의 엔티티 삭제 참조
'Programming > Spring' 카테고리의 다른 글
Maven / Spring 기본 (0) | 2017.08.18 |
---|---|
JPA 스프링 연동 (0) | 2017.08.14 |
Mybatis (0) | 2017.08.13 |
Spring Layered Architecture (0) | 2017.08.09 |
Spring MVC (annotation 기반) (0) | 2017.08.08 |
댓글