반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.
* 시작전에 보조 클래스 만들기
- EntityManagerFactory를 static으로 담고있는 EMF 클래스를 생성한다.
- EMF 내에 init()메소드를 통해 초기화, close()를 통해 emf를 닫는다.
- EntityManager가 필요할 때는 createEntityManager() 메소드를 통해 생성한다.
* 엔티티 단위 CRUD 처리
- EntityManager가 제공하는 메소드 이용
- persist()
- find()
- remove()
- merge()
* 저장
- EntityManager#persist(Object entity)
- persist()는 @Entity로 매핑한 객체를 인자로 받는다
- NewUserService 객체에서는 EM을 만들고 트랜잭션을 시작한 뒤 유저를 저장(persist)하고 커밋한다.
* 조회
- EntityManager#find(Class<T> entityClass, Object parimaryKey)
- find()는 특별한 식별자를 갖는 객체를 찾을 때 사용한다.
- Class 는 @Entity로 매핑한 클래스가 된다.
- primariKey는 식별자에 해당하는 값을 전달한다.
- 'em.find(User.class, email)' 코드는 User와 매핑된 테이블에서 id가 email인 데이터를 읽어와서 user로 반환한다.
- 이 때 null인지의 여부를 판단해야 한다.
- 이 때 Entity로 매핑하지 않은 클래스를 첫 번째 parameter로 전달하거나 @Id로 매핑한 식별자 타입과 같지 않은 값을 두 번째 parameter로 전달하면 예외가 발생한다.
- String str = em.find(String.class, "1");
- User user = em.find(User.class, 11);
* 수정
- 트랜잭션 범위 내에서 변경된 값을 자동 반영
- 영속 컨텍스트는 트랜잭션 범위(tx.begin() ... tx.commit()) 내에서 유지된다.
- DB에서 find()메소드를 통해 객체를 읽어오고 해당 객체의 상태를 변경하면 트랜잭션 커밋 시 변경된 값이 자동으로 DB에 반영된다.
* 삭제
- EntityManager#remove(Object entity)
- remove()메소드에 find()메소드로 읽어온 객체를 전달하면 삭제가 가능하다.
- find()로 읽어오지 않은 객체를 전달하면 에러가 발생한다.
- 트랜잭션 범위 외에서 remove()를 전달해도 에러가 발생한다.
- 삭제 대상이 존재하지 않으면
- 찾아온 user 객체를 remove()에 전달했는데 커밋하기 이전에 다른 process가 해당하는 객체를 DB에서 삭제하면 예외가 발생한다.
- 따라서 예외 처리를 통해 내가 삭제를 시도하려는 데이터가 없을 때에 대비할 수 있다.
* 정리
- EntityManager를 사용해서 Entity 단위로 CRUD 처리
- 변경은 트랜잭션 범위 안에서 실행
- persist()
- 수정
- remove()
반응형
'Programming > JPA & Spring Data JPA 기초' 카테고리의 다른 글
05. 엔티티 식별자 생성 방식 (0) | 2023.02.23 |
---|---|
04. 엔티티 매핑 설정 (0) | 2023.02.22 |
02. 코드 구조 & 영속 컨텍스트 (0) | 2023.02.20 |
01. 일단 해보기 (0) | 2023.02.20 |
00. 들어가며 (0) | 2023.02.17 |
댓글