본문 바로가기

학습 기록 (Learning Logs)/CS Study

JPA-features

 

 


공통 질문

  1. JPA 생명주기(Lifecycle) 대해 설명해주세요.
  2. 영속성 컨텍스트에서 1 캐시의 역할은 무엇인가요?
  3. JPA dirty checking(변경 감지) 어떻게 동작하나요?
  4. JPQL(Java Persistence Query Language)이란 무엇인가요? 기본 SQL과의 차이점을 설명해주세요.
  5. 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