// 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
// 객체를 저장한 상태(영속)
em.persist(member);
em.detach()
를 호출하면 된다.em.clear()
를 호출해서 영속성 컨텍스트를 초기화해도 영속성 컨텍스트가 관리하던 영속 상태의 엔티티는 준영속 상태가 된다. // 회원 엔티티를 영속성 컨텍스트에서 분리 - 준영속 상태
em.detach(member);
// 객체를 삭제한 상태(삭제)
em.remove(member);
위의 에러 및 예외와 관련된 클래스들의 계층구조를 나타내면 아래의 그림과 같다.
블로그 - Java Exception의 계층구조
그림과 같이 Throwable 클래스를 기준으로 Error, Exception 클래스로 나눈다.
그렇다면 Error와 Exception은 무엇이 다를까?
시스템에 비정상적인 상황이 발생했을 때 ‘에러(Error)’가 발생한다. 대표적인 예시로 메모리 부족(OutOfMemoryError
)과 스택오버플로우(StackOverflowError
)처럼 복구할 수 없는 것들은 에러(Error)를 통해 처리한다.
⇒ 에러(Error)는 개발자가 예측하기 쉽지 않고 처리할 수 있는 방법도 따로 없다는 점이 특징이다.
프로그램 실행 중에 개발자의 실수로 예기치 않은 상황이 발생했을 때 예외(Exception)이 발생한다. 예외(Exception)의 예시로는 ArrayIndexOutOfBoundsException
을 들 수 있는데, 배열의 범위를 벗어났을 때를 처리한다. 또, NullPointerException
은 값이 Null 참조변수를 참조할 때를 처리한다. 다른 예시로는, 존재하지 않는 파일의 이름을 입력했을 때, FileNotFoundException
으로 처리해줄 수 있다.
그리고 이 예외는 에러(Error)와 달리 복구할 수 없을 정도의 치명적인 오류가 아니라는 점이 특징이고, 체크 예외(Checked Exception)와 언체크 예외(Unchecked Exception) 두 가지로 구분할 수 있다.
위의 그림(계층구조)에서 RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위클래스들에 해당한다. 체크 예외는 반드시 에러 처리를 해야하는 특징을 가지고 있다(try/catch or throw). 체크 예외에 해당하는 예시를 들어보면 다음과 같다.
FileNotFoundException
: 존재하지 않는 파일의 이름을 입력했을 때ClassNotFoundException
: 실수로 클래스의 이름을 잘못 적었을 때위의 그림(계층구조)에서 RuntimeException의 하위 클래스들에 해당한다. 특징적인 점은, 체크 예외(Checked Exception)와는 달리 * 반드시 에러처리를 해야할 의무는 없다(즉, 에러 처리를 강제하지 않는다)는 점이다.
말 그대로 실행 중, runtime 중에 발생할 수 있는 예외를 의미하고 예시를 들어보면 다음과 같다.
ArrayIndexOutOfBoundException
: 배열의 범위를 벗어났을 때NullPointerException
: null이 참조 변수를 참조했을 때: RuntimeException은 개발자의 실수로 발생하는 것들이기 때문에 에러를 강제하지 않음 (📍이에 대한 예시는 아래와 같다)
public class ArrayTest {
public static void main(String[] args) {
try {
int [] list = {1,2,3,4,5};
System.out.println(list[0]);
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
}
}
위의 코드는 단순히 배열을 만들어서 배열의 원소를 출력하고자 하는데 , try/catch 문을 꼭 사용해야한다.
Checked Exception | Unchecked Exception | |
---|---|---|
처리여부 | 반드시 예외를 처리해야 함 | 명시적인 처리를 강제하지 않음 |
확인시점 | 컴파일 단계 | 실행단계 |
예외발생시 트랜잭션 처리 | roll-back 하지 않음 | roll-back 함 |
대표 예외 | Exception의 상속받는 하위클래스 중 Runtime Exception을 제외한 모든 예외 |
⇒ try-catch로 묶어줄 필요가 있을 때만 Exception 클래스를 확장하고, 일반적으로 실행시 예외를 처리할 수 있는 경우에는 RuntimeException 클래스를 확장해 Unchecked Exception을 사용하는 게 좋다.
1️⃣ 엔티티의 생명주기
🔗 #1-1 자바 ORM 표준 JPA 프로그래밍
2️⃣ Java의 Checked Exception과 Unchecked Exception
🔗 #2-1 블로그 - Gyun’s 개발일지(Checked vs Unchecked
🔗 #2-2 블로그 - Taehyun Hwang(Java Exception 종류)