Page History
...
Expand | ||
---|---|---|
| ||
|
Persitence
...
Persitence는 다음과 같은 사전적의미를 가지고 있습니다.
...
- persistent route : 웹호출시 노드가 변경안되도록 라우터가 IP기반으로 유지해줍니다. 서버캐시기능을 가진 웹서비스에서 중요한 요소입니다.
- persitent FSM : AKKA에서 사용되는 단어이며, 분산환경에서 액터의 상태머신을 유지해줍니다.
- redis persitence : 메모리DB인 redis의 상태가 휘발되지 않게 IO장치에도 저장하는 기능입니다.
- rdb persitence : 가장 대표적인 데이터베이스입니다. 지속성보다 영구성의 의미가 더강하며 가장 강력합니다.
JPA Repository
...
JPA Repository는 목적에따라 3가지로 구분이됩니다. 역활이 지정이 되지않았다고 하면
...
실습을 한 내용을 간략하게 다시 요약 해보겠습니다.
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 | ||||||
---|---|---|---|---|---|---|
|
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객체를 이용할수가 있습니다. 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의 기본 저장소 특성과함께 사용자 정의 기능을 함께 사용가능합니다. 네이밍특성: 테이블명+저장소 |
영속성을 활용한 쓰기지연
위 그림이 중요한 이유는, 각 상태를 이해하고 즉시쓰기전략이 아닌 지연쓰기 전략의
...
영속성을 이해하기위해서, 하나의 함수(트랜젝션에) 다양한 데이터 변경 처리를 진행해보겠습니다.
사용예
Code Block | ||||
---|---|---|---|---|
| ||||
public class AddressRepositoryImpl implements MyAddressRepository { @PersistenceContext private EntityManager em; @Override @Transactional public void addAddress() { //비영속( 단순하게 엔티티 객체만 생성함) Address2 address2 = new Address2(); address2.setName("영희"); address2.setSex("여"); address2.setAddress("서울/마포"); //엔티티 저장하고, 준영속화(분리함) em.persist(address2); em.detach(address2); // 첫번째 데이터를 찾아서 삭제대기... Address2 firstAddress = em.find(Address2.class, 1L ); em.remove(firstAddress); //엔티티를 다시 영속 관리객체로 복귀 em.merge(address2); //추가된 엔티티의 데이터가 변경되었음으로 변경감지. address2.setName("영희2"); //마지막 상태 Db반영(쓰기지연) em.flush(); //준영속 //em.detach(address2); //다시영속시킴 //em.merge(address2); //예외발생-롤백 //assertTrue(false); } |
...