Page History
Info |
---|
JPA Repositori를 통한 일반적인 검색 기능은 여러가지 샘플을 통해 살펴보았습니다. 이번장에서는 영속성(Persistence)관점에서 Repository기능을 살펴보겠습니다. persistence 두번째의미이며, 상태를 저장하고 유지한다는점에서 IT전반적으로 사용되어지는 단어입니다. 몇가지 연관 되어 사용되는 용어를 정리하였습니다.
|
Table of Contents |
---|
JPA Repository
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
...
실습을 한 내용을 간략하게 다시 요약 해보겠습니다.
Expand | ||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||
검색및 집계 처리검색 함수쿼리장점: 바람직한 네이밍룰에의해 검색 기능을 작동시킬수있다. 단점: 아규멘트가 길어질수록,네이밍도 같이 길어진다.
JPQL을 사용한 집계처리장점:SQL친화적으로 검색 인터페이스를 작성할수 있다. 단점:지원되지 않는 SQL문은 작동안한다.
Native 쿼리장점:네이티브 SQL문을 맘것 활용할수 있다. 단점:맵핑및 아규멘트전달에 어려움이 있으며, 다른 DB로의 호환성을 포기해야할수도 있다.
SQL 윈도우함수를 대체하는 랭킹처리장점:특수한 기능구현이 가능하고 어플리케이션에게 연산부담을 시킬수있다. 단점:커스텀한 로직이 늘어나 관리가 안될수 있으니 , 효율적인 SQL문 작성법부터 알아보자
QueryDSL 지원이되는 저장소장점:여러가지 검색옵션을 조합을 할수 있으며, 대표적으로 null 인자값에대해 유연하게 대처할수 있다. 단점: 초기셋팅이 번거럽고, DSL사용을위하 QEntityObject가 메타빌드로 자동추가 생성이 된다. (어플리케이션이 엔티티증가에따라 무거워진다는것)
참고 원본문서:
데이터 변경(Insert,Update,Delete)스토어 프로시져 이용장점: 전통적인 SP개발 방식을 이용할수 있다. 단점: 형상관리 분리로 인해, 서비스로직을 분리 관리해야하며, 상태가 없기때문에 JPA 중간저장소 기능을 100%활용못할수 있음 예를 들면, 높은 TPS요구에대해 EntityManager의 커넥션풀 기능이 비활성화되어 커넥션 Max에러가 발생할수 있음(직접관리해야함)
|
Persitence Context
PersitenceContext 는 JPA를 이해하는데 가장 중요한 단어이며 , 엔티티를 저장하고 유지하는 논리적인 장치쯤으로 생각해두자
...
- 엔티티 식별자값 '@Id' 가 반드시 존재해야함 ( 기본키가 있어야된다는 의미)
- 엔티티에 저장된(Managed) 엔티티는 트랜젝션에 커밋하는순간 반영되며, JPA에서는 Flush라고함
- 이점: 1차캐시,동일성보장,트랜잭션을 지원하는 쓰기지연,변경감지,지연로딩
오라클과 비교해보는 JPA 영속성 장치
Expand | ||||||
---|---|---|---|---|---|---|
|
JPA 제공 Repository
JPA Repository는 목적에따라 3가지로 구분이됩니다. 역활이 지정이 되지않았다고 하면
...
- PaginAndSortingRepository : 페이징과 소팅이되는 조회용 저장소
- CrudRepository : 데이터 업데이트에 관련된 저장소
- JpaRepository : 위 두가지 기능 모두 활용가능하며 추가로 일부 영속성관련 제어가능
CRUD Repository
JPA에서는 기본적인 데이터 삽입/수정/조회를 위해 추가적인 구현없이 기본적인 기능을 제공하는
...
단순한 데이터 변경 서비스에서는 CrudRepository만으로도 충분합니다.
인터페이스 준비
아래와 같이 조작할 엔티티(테이블)을 지정하는 인터페이스를 준비하면,
...
No Format |
---|
/선언 public interface UserRepository extends CrudRepository<User, Long> { } |
서비스 로직정의
데이터 제어는, 제공되는 일괄적이고 단순한 save,delete,find 3가지만 이용하여
...
No Format |
---|
public class UserUpdateService{ .... @Autowired private UserRepository userRepository; public User jpatest1C(String groupname,String name) { GroupInfo newGroup = new GroupInfo(); newGroup.setName(groupname); groupRepository.save(newGroup); // 사용자 생성 User addUser = new User(); addUser.setName(name); addUser.setEmail("test@x.com"); addUser.setGroupInfo(newGroup); return userRepository.save(addUser); } public void jpatest1U(User user) { user.setName(user.getName() + "_mody"); userRepository.save(user); } public void jpatest1D(User user) { userRepository.delete(user); } public void japtestList() { // 사용자 조회 Iterable<User> userList = userRepository.findAll(); userList.forEach(item->System.out.println( String.format("V1 Name:%s GroupName:%s", item.getName(),item.getGroupInfo().getName() ) )); } |
사용예
OOP(객체) 접근방식을 통하여, 실제 데이터베이스의 저장소 변경을 할수가 있습니다.
...
Expand | ||
---|---|---|
| ||
실제로 아래와같은 SQL문이 차례로 수행됩니다.(SQL약식표현) insert com.example.demo.data2.User – minsu,학생A 추가 insert com.example.demo.data2.User – minsu,학생B 추가 update com.example.demo.data2.User –첫번째 추가된 minsu의 이름변경 delete com.example.demo.data2.User –두번째 추가된 minsu data 삭제 japtestList() ==> 결과( 첫번째 추가된 이름이 변경된 minsu만 조회됨 V1 Name:minsu_mody GroupName:학생A |
Custom Repository
조회및 트랜잭션에 관련된 비지니스 로직이 복잡할시 CrudRepository의 인터페이스로는
...
여기서 앞장에서 설명하지 못한 JPA의 중요요소인 영속성에대한 기능도 함께 설명하여 살펴보도록하겠습니다.
인터페이스 준비
Code Block | ||||
---|---|---|---|---|
| ||||
public interface MyAddressRepository { void someTest(Address2 address2); } public class AddressRepositoryImpl implements MyAddressRepository { @PersistenceContext private EntityManager em; @Override @Transactional public void someTest(Address2 address2) { em.refresh(address2); em.detach(address2); em.persist(address2); em.lock(address2, null); em.flush(); } } public interface AddressRepository extends CrudRepository<Address2, Long>,MyAddressRepository { } |
네이밍 룰
네이밍 | 설명 |
---|---|
MyAddressRepository | 인터페이스이며, 커스텀함 함수규격을 미리 설명을 해놓아야합니다. 네이밍 특성 : 특성+테이블명+저장소 My + Address + Repository |
AddressRepositoryImpl | 커스텀한 구현체를 정의합니다. 네이밍 특성: 테이블명+저장소+구현 MyAddressRepositoryImpx ( X ) |
AddressRepository | 최종 사용가능해진 저장소이름입니다. JPA의 기본 저장소 특성과함께 사용자 정의 기능을 함께 사용가능합니다. 네이밍특성: 테이블명+저장소 |
...