Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- repository
- docker
- analytics4
- 애널리틱스4
- pat발급
- 트랜잭션
- JPQL
- git branch 삭제
- 프로시저
- db종류
- git
- java
- spring
- Python
- exe
- EntityManager
- jetbrain
- gtihub
- JPA
- git pat
- ci/cd
- MariaDB
- ==
- 오블완
- 티스토리챌린지
- chown
- IntelliJ
- Jenkins
- 자동배포
Archives
- Today
- Total
hanker
Spring - JPA EntityManager 완벽 정복 본문
반응형
EntityManager는 데이터베이스와 애플리케이션 사이에서 데이터를 관리하는 도구이다.
즉, 프로그램에서 사용하는 객체(엔티티)를 데이터베이스에 저장하거나, 데이터베이스에서 불러오고, 수정하거나 삭제하는 일을 담당한다.
- 생명주기 관리: 프로그램에서 객체가 생성되거나 사라질 때, 그 상태를 추적하고 적절한 시점에 데이터베이스에 저장하거나 삭제하는 일을 함.
- 데이터베이스와 상호작용: 객체를 데이터베이스에 저장할 때, EntityManager가 그 중간에서 데이터를 저장, 수정, 삭제, 조회하는 작업을 대신 처리해줌.
즉, 개발자가 일일이 SQL 문을 작성하지 않고, EntityManager가 알아서 데이터베이스와 소통하도록 도와주는 중간 관리자 역할을 하게 된다.
주요 기능
- 영속성 컨텍스트* 관리: 엔티티의 상태를 추적하고 관리
- CRUD** 연산: 엔티티의 생성, 조회, 수정, 삭제 작업을 수행
- 쿼리 실행: JPQL(Java Persistence Query Language) 또는 네이티브 SQL 쿼리를 실행
- 트랜잭션 관리: 데이터베이스 트랜잭션과 연계하여 작업
주요 메서드
메서드명 | 기능 |
persist() | 새로운 엔티티를 영속성 컨텍스트에 추가 (insert) |
find() | 주어진 ID로 엔티티를 데이터베이스에서 조회 (select) |
merge() | 분리된 상태의 엔티티를 영속성 컨텍스트에 병합 (update) |
remove() | 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제 (delete) |
createQuery() | JPQL(Java Persistence Query Language) 쿼리를 생성하고 실행 |
createNativeQuery() | 네이티브 SQL 쿼리를 실행 |
flush() | 영속성 컨텍스트의 변경사항을 데이터베이스에 동기화 (즉시 반영) |
refresh() | 엔티티의 상태를 데이터베이스의 최신 상태로 새로고침 |
detach() | 엔티티를 영속성 컨텍스트에서 분리 |
contains() | 주어진 엔티티가 현재 영속성 컨텍스트에서 관리되고 있는지 확인 |
메서드 예제
- persist()
private final EntityManager em;
/**
* persist(): 새 엔티티를 영속성 컨텍스트에 추가
* @param id hanker
* @param pw 1234
* @param name Han-ker
*/
public void createUser(String id, String pw, String name) {
User user = new User();
user.setUserId(id);
user.setPassword(pw);
user.setUserName(name);
em.persist(user);
}
결과 (insert)
반응형
- find()
private final EntityManager em;
/**
* find(): 주어진 ID로 엔티티 조회
* @param id : 14L
* @return User
*/
public User getUser(Long id) {
return em.find(User.class, id);
}
결과 (select)
- merge()
private final EntityManager em;
/**
* merge(): 분리된 엔티티를 영속성 컨텍스트에 병합
* getUserSn : 14L
* getUserId : hanker-T
* getPassword : 4321
* getUserName : Han-ker-T
* @param user
*/
public void updateUser(User user) {
em.merge(user);
}
결과 (update)
- remove()
private final EntityManager em;
/**
* remove(): 엔티티 삭제
* @param id : 14L
*/
public void deleteUser(Long id) {
User user = em.find(User.class, id);
if (user != null) {
em.remove(user);
}
}
결과 (delete) 삭제 후 다시 생성시킴
- createQuery()
private final EntityManager em;
/**
* createQuery(): JPQL 쿼리 생성 및 실행
* @param name : Han-ker
* @return
*/
public List<User> findUsersByUserName(String name) {
return em.createQuery("SELECT u FROM User u WHERE u.userName = :name", User.class)
.setParameter("name", name)
.getResultList();
}
결과
- createNativeQuery()
/**
* createNativeQuery(): 네이티브 SQL 쿼리 실행
* @param name : Han-ker
* @return
*/
public List<User> findUsersNative(String name) {
return em.createNativeQuery("SELECT * FROM user WHERE user_name = ?", User.class)
.setParameter(1, name)
.getResultList();
}
결과
- flush()
private final EntityManager em;
/**
* flush() : 변경사항을 데이터베이스에 동기화
*/
public void flushChanges() {
em.flush();
}
- refresh()
private final EntityManager em;
/**
* refresh() : 엔티티를 데이터베이스 상태로 새로고침
* @param user
*/
public void refreshUser(User user) {
em.refresh(user);
}
- detach()
/**
* detach(): 엔티티를 영속성 컨텍스트에서 분리
* @param user
*/
public void detachUser(User user) {
em.detach(user);
}
- contains()
/**
* contains(): 엔티티가 영속성 컨텍스트에 있는지 확인
* @param user
* @return
*/
public boolean isManaged(User user) {
return em.contains(user);
}
마치며
- persist(), remove(), flush(), refresh(), detach()는 void를 반환하지만, 엔티티의 상태나 데이터베이스에 직접적인 영향을 미친다
- find()와 merge()는 엔티티 객체를 반환합니다. find()는 기존 엔티티를 반환하고, merge()는 병합된 엔티티의 새로운 인스턴스를 반환한다.
- createQuery()와 createNativeQuery()는 즉시 결과를 반환하지 않고, 쿼리를 실행할 수 있는 객체를 반환합니다. 실제 결과를 얻으려면 이 객체의 getResultList() 또는 getSingleResult() 메서드를 호출해야 한다.
- contains()는 엔티티의 영속성 상태를 확인하는 데 유용하며, boolean 값을 반환한다.
참고.
* 영속성 컨텍스트 : 엔티티 객체가 데이터베이스에 저장되거나, 불러오거나, 삭제되는 동안 그 상태를 관리하는 일종의 메모리 공간
** CRUD : CRAETE, READ, UPDATE, DELETE
끝.
반응형