JPA Repositori를 통한 일반적인 검색 기능은 여러가지 샘플을 통해 살펴보았습니다.
이번장에서는 영속성(Persistence)관점에서 Repository기능을 살펴보겠습니다.
persistence 두번째의미이며, 상태를 저장하고 유지한다는점에서 IT전반적으로 사용되어지는 단어입니다.
JPA Repository
JPA를 사용하면 데이터베이스 사용을위해 어플리케이션 레이아웃에 영속성을 위한 저장소(Repository)가 존재합니다.
JPA Repository 가 항상 이렇게 작동되는것은 아니나, DB객체를 직접 저장하지 않고 중간객체를 통해
DB를 효율적으로 이용한다는것입니다.
JPA 저장소는 SQL직접호출 방식과 비교해 아래와 같은 특징이 있습니다.
- 기존 SQL/SP를 직접 호출하여 값을 얻어 처리하는 방식은, 로컬에 반환된 값을 사용하고 버리는 상태가 필요없는 방식이며 매번 호출이 필요합니다.
- 기존에는 상태가 없기때문에 데이터중심적 설계방식이였다고하면, JPA에서는 중간상태가 있기때문에 메시지 중심 설계 방식도 고려해야합니다.
- JPA에서는 저장소를 통해, 같은 값을 다시 읽는것을 시도할때 SQL중복호출을 막고 효율적인 읽기전략을 수행할수 있습니다.(Proxy전략,캐싱전략)
- JPA에서 쓰기전략은 어플리케이션 예외까지 트랜잭션영역에 포함할수 있으며, Repository에 임시저장후 원하는 타이밍에 실제 Update(Push)를 할수가 있습니다.
장점을 간략하게 요약하면 다음과같습니다.
- 1차 캐시기능
- 동일성보장
- 트랜잭션을 지원하는 쓰기지연
- 변경감지
- 지연로딩
위와같은 장점이 있다고, SQL 직접호출방에서 배운 데이터베이스의 개념을 몰라도 될까요?
그것은 큰 착각입니다. JPA는 반복적인 SQL작성시간을 줄여주지만, 기존에 존재하지않던
중간 영속성 객체까지 잘 다뤄야하기 때문에 JPA의 특성과 더불어 관계형 DB의 특성을 같이 잘알고 있어야 합니다.
단순한 검색및 집계처리에 대한 사용법을 다시한번 정리하였습니다.
Persitence Context
PersitenceContext 는 JPA를 이해하는데 가장 중요한 단어이며 ,직역하여 엔티티를 영구저장하는 환경이라는뜻입니다.
Persitence VS OraCle
JPA 영속성 라이프 사이클 | 오라클 DBMS 아키텍쳐 |
---|---|
DBMS에서도 사용자의 질의에 반응하여, 즉시 물리적인 디스크에 IO를 발생시키지 않습니다.
대량요청 처리의 안전과 성능을 위해 중간 레벨의 몇가지 Instance가 존재하며
이것은 데이터베이스를 사용하는 어플리케이션 에서 제어할수 있는 요소가 아닙니다.
DBMS에서 이루어지는 몇가지 기능인 캐시처리/지연쓰기 전략등 중앙집중화된 기능을
어플리케이션에서 축소화된 형태로 활용가능하며, 이것이 필요없으면 즉시처리전략으로 수행도가능합니다.
이것은 DB중앙에 집중된 부하기능을 어플리케이션이 분담처리할수 있다란 것입니다.
이 부분은 오라클 아키텍쳐와 비교하여 JPA의 영속성기능이 DBMS기능중 어떠한 부분이 닮아 있는지
비교하면서 개념을 익히는것이 도움이될듯합니다.
PersitenceContent를 잘 설명하는 참고자료입니다. ( 정리하는시점에도 이해가 안되고 어려운부분이 있네요, 우선 참고자료로만 언급합니다. )
- https://www.java-forums.org/ocpjbcd/52967-tutorial-review-jpa-entitymanager-operations-component-developer-exam.html
- http://wckhg89.tistory.com/10
JPA를 통한 즉시처리 데이터 제어 구현은 분명 코드가 짧고 쉽습니다. 하지만 JPA의 목적은
쉽게 사용하는것만이 다가 아닙니다.
성능분산 데이터처리 어플리케이션 설계를 위해 관계형 DB의 영속성개념과
JPA에서의 영속성 개념 두가지를 모두 잘이해해야 한다는점은 분명
어려운 난이도를 요구하며, 기존에는 도전조차 하지 못했던 과제일수도 있습니다.
CRUD Repository
실제 JPA에서 쓰기/삭제/읽기처리가되는 영속성 제어를, JPA 기본 인터페이스인
CrudRepository를 활용하여 살펴보도록 하겠습니다.
Insert
장점: 데이터 입력을 위해, 추가구현없이 CrudRepository만 사용하면되며 객체접근법 활용이 가능합니다.
단점: 단순한 Insert에서 단점은 없어보이나, 은닉된 트랜젝션 처리가 어떻게 되는지 살펴볼필요가 있습니다.
//선언 public interface GroupRepository extends CrudRepository<GroupInfo, Long> { } public interface UserRepository extends CrudRepository<User, Long> { } //사용 GroupInfo newGroup = new GroupInfo(); newGroup.setName("학생"); groupRepository.save(newGroup); // 사용자 생성 User addUser = new User(); addUser.setName("minsu"); addUser.setEmail("test@x.com"); addUser.setGroupInfo(newGroup); //SQL문에서는 외래키인 그룹ID를 지정하겠지만,객체모델에서는 이미 알고있는 참조지정을 합니다. userRepository.save(addUser);