공통 질문
- JPA의 생명주기(Lifecycle)에 대해 설명해주세요.
- 영속성 컨텍스트에서 1차 캐시의 역할은 무엇인가요?
- JPA의 dirty checking(변경 감지)은 어떻게 동작하나요?
- JPQL(Java Persistence Query Language)이란 무엇인가요? 기본 SQL과의 차이점을 설명해주세요.
- Criteria API란 무엇이며, JPQL과 비교했을 때의 장단점을 설명해주세요.
JPA의 생명주기(Lifecycle)에 대해 설명해주세요.
Transient(일시적, 순간의)비영속 : persistent context에 없을 때
Persistent(고집센, 지속의) 영속 : persistent context 저장되었을 때
- em.persist()로 영속성 컨텍스트에 저장됨
Detached(분리된) 준영속 : persistent context에서 분리되었을 때
- em.detach()로 인해 영속성 컨텍스트와 분리됨
Removed 삭제 : entity가 삭제 요청 상태
- em.remove()로 인해 DB에서 삭제됨
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
// Getters and Setters
}
public void lifecycleExample(EntityManager em) {
// 1. 비영속 상태
User user = new User();
user.setName("Alice");
user.setAge(25);
// 2. 영속 상태
em.persist(user); // 영속성 컨텍스트에 저장됨
em.flush(); // DB에 반영
// 3. 준영속 상태
em.detach(user);
// 4. 삭제 상태
em.remove(user);
em.flush(); // DB에서 삭제
}
영속성 컨텍스트에서 1차 캐시의 역할은 무엇인가요?
db에 직접 접근 안하고, 1차 캐시에서 entity를 조회
성능 최적화를 위해 활용
public void firstLevelCacheExample(EntityManager em) {
// 영속 상태로 엔티티 저장
User user = new User();
user.setName("Bob");
user.setAge(30);
em.persist(user); // INSERT 쿼리 실행 X (1차 캐시에만 저장)
// 1차 캐시에서 조회
User cachedUser = em.find(User.class, user.getId()); // INSERT 쿼리 실행 (flush) 후 1차 캐시에서 조회
System.out.println("Name: " + cachedUser.getName());
}
//em.persist()는 영속성 컨텍스트에 엔티티를 저장하지만, 데이터베이스에는 반영되지 않습니다.
//em.find()에서 엔티티를 조회하려고 할 때, 필요하면 자동으로 flush()를 호출하여 데이터베이스에 반영한 뒤 조회를 진행합니다.
// flush()를 호출하지 않아도 트랜잭션 커밋 시점 또는 필요한 쿼리가 실행되기 전 플러시가 발생합니다.
JPA의 dirty checking(변경 감지)은 어떻게 동작하나요?
persistence context 내에 있는 entity들을 관리하는데, 변경 사항을 감지
변경된 entity를 transaction commit시 update함
public void dirtyCheckingExample(EntityManager em) {
User user = new User();
user.setName("Charlie");
user.setAge(28);
em.persist(user);// 영속 상태로 엔티티 저장,
em.flush(); // INSERT INTO User ...
// 엔티티 변경 (Dirty Checking)
user.setAge(29);
em.flush(); // 자동으로 update, UPDATE User SET age = 29
}
JPQL(Java Persistence Query Language)이란 무엇인가요? 기본 SQL과의 차이점을 설명해주세요.
entity 객체를 대상으로 하는 쿼리 language
sql이랑 유사
table이 아닌, entity class, field를 기준으로 쿼리를 작성
public void jpqlExample(EntityManager em) {
// JPQL로 데이터 조회
List<User> users = em.createQuery("SELECT u FROM User u WHERE u.age > :age", User.class)
.setParameter("age", 25)
.getResultList();
users.forEach(user -> System.out.println(user.getName()));
}
Criteria API란 무엇이며, JPQL과 비교했을 때의 장단점을 설명해주세요.
criteria api는 jpql을 동적으로 생성하는 방법
jpql보다 가독성이 떨어짐
동적 쿼리 생성에 유리
public void criteriaApiExample(EntityManager em) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);
query.select(root).where(cb.greaterThan(root.get("age"), 25));
List<User> users = em.createQuery(query).getResultList();
users.forEach(user -> System.out.println(user.getName()));
}
'학습 기록 (Learning Logs) > CS Study' 카테고리의 다른 글
JPA-advanced-question (0) | 2024.12.12 |
---|---|
JPA-optimized-performance (0) | 2024.12.12 |
JPA-mapping (0) | 2024.12.12 |
JPA-default (0) | 2024.12.12 |
database (0) | 2024.12.09 |