티스토리 뷰

1. JPA 엔티티 생명주기

 

JPA에서 엔티티는 EntityManager에 의해 영속성 컨텍스트(Persistence Context) 에서 관리되는데, 엔티티의 상태, 즉 생명주기는 크게 4가지 상태가 있다. 

- 비영속(new/transient), 영속(managed), 준영속(detached), 삭제(removed) 

 

EntityManager의 메소드를 통해서 각각의 상태가 될 수 있다.

 

1) 비영속 

영속성 컨텍스트와 아무 관련이 없는 상태이다. 즉 순수한 객체 상태를 의미한다.

 

2) 영속

- persist(entity)

EntityManager를 사용해서 Persistence Context에 저장한 이후의 상태를 영속 상태라고 한다. EntityManager의 persist() 호출 이후 엔티티는 영속화 된다.  

위 em 변수는 EntityManager 이고, persist()는 인자에 해당하는 엔티티를 영속성 컨텍스트에 저장시키겠다는 의미이다. 

em.persist(member)가 실행 되고 나면, 즉 영속화 되면 영속성 컨텍스트의 1차 캐시에는 member와 키 값에 해당 엔티티의 id 값이 저장된다. 아직 DB에 저장되지는 않은 상태이다. 

 

- find(Entity.class, entity) 

EntityManager의 구현체에는 find() 라는 메소드가 있는데, DB의 기본 키 값에 매핑되어 있는 정보를 찾는 메소드다. find() 가 호출되면 엔티티 매니저는 먼저 1차 캐시를 먼저 확인한다. 1차 캐시에 찾는 키 값에 해당하는 정보가 없으면, DB에 연결해서 검색한다. 만약 정보가 있다면, 영속성 컨텍스트에 반환시켜 1차 캐시에 저장, 즉 영속화 시키고 값을 반환한다. 

따라서 find()도 영속상태를 위한 함수 중 하나라고 할 수 있다.

 

persist()와 find() 이외에 JPQL을 사용하여 조회한 엔티티도 마찬가지의 원리로 영속성 컨텍스트에 의해 관리된다. 

 

3) 준영속 

영속성 컨텍스트에서 관리되던 엔티티가 더 이상 관리되지 않는 상태가 준영속 상태이다. EntityManager의 detach()나, close(), clear()를 호출하면 해당 엔티티는 준영속 상태가 된다.

 

-detach(entity) 

특정 엔티티만 준영속 상태로 전환하는 메소드다.

detach()가 호출되면, 영속성 컨텍스트의 1차 캐시와 쓰기 지연 SQL 저장소에서 해당 entity객체의 정보들이 모두 제거된다. 

 

-clear()

 영속성 컨텍스트 전체를 초기화해서, 모든 엔티티를 준영속 상태로 만들어준다. 이는 영속성 컨텍스트 자체를 새로 만든 것과 동일한 효과를 가져온다.

 

-close()

영속성 컨텍스트가 종료되면서, 안에 있던 엔티티들이 더 이상 관리되지 않는 상태가 된다.

 

4) 삭제

 

- remove()

엔티티를 영속성 컨텍스트, DB 모두에서 삭제한다.

 

생명주기 간 관계를 표현한 그림 -  "자바ORM 표준 JPA 프로그래밍(김영한)"

 

 

2. Java의 Checked Exception과 Unchecked Exception

 

- Checked Exception

일반 예외라고 불리는 모든 예외를 말한다. 이 예외들은 개발자가 예상하고 복구를 해야 하는 예외들을 말한다. RuntimeExceptinon 하위의 에러를 제외한 전부이다.

Checked Exception이란 명칭을 가지고 있는 이유는, 해당 에러들은 컴파일러가 예외처리 코드의 여부를 컴파일 시점에 검사하기 때문이다. ClassNotFoundException, IOException, SQLException 등이 있다. 

try catch 블록, throw를 통해 에러 처리를 반드시 해줘야 한다. 

 

- Unchecked Exception

RuntimeException 하위에 있는 모든 예외들을 말한다. 프로그램 내부에서 발생하는, 일반적으로 예측 불가능한 예외들을 말한다. 대표적으로 NullPointerException이 있다.

이 예외들에 대해선 예외 처리 의무가 없다. 

https://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

 

The Catch or Specify Requirement (The Java™ Tutorials > Essential Java Classes > Exceptions)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

이 두 가지에 대해서 어떤 상황에 어떤 것을 써야하는 지에 대한 의견이 분분한 것 같다.

 Checked Exception을 사용하면 개발자가 일일이 예외처리를 해줘야 하고, 프로그램의 크기가 방대해질 때 생산성이 저하될 수 있다는 단점이 있다. 그리고 대부분의 예외가 사실 복구 가능하지 않음에도 불구하고 구태여 CheckedException으로 선언할 필요가 없다는 것이다.

 하지만 개발자가 직접 예외 처리를 해야할 만큼 신뢰성과 복원력을 가지고 있다는 것을 검증하기에는 CheckedException이 필요하다는 의견도 있는 것 같다. 

 

'솝 키워드 과제' 카테고리의 다른 글

4차 세미나 키워드 과제  (0) 2024.05.08
2차 세미나 키워드 과제  (2) 2024.04.07
1차 세미나 키워드 과제  (0) 2024.03.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
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 31
글 보관함