์ด๋ฒ์ Exception์ ๋ํด์ ๊ณต๋ถ๋ฅผ ์ข ํ๋ค๊ฐ ์ง๊ธ๊น์ง ๋ชจ๋ฅด๊ณ ์ญ ์ฌ์ฉํ์๋ ์ค์ํ ์ฌ์ค์ ์์๋ฒ๋ ธ์ต๋๋ค.
(์ด๊ฒ๋ ๋ชจ๋ฅด๊ณ ๋ฌด์ง์ฑ์ผ๋ก ์ฌ์ฉํ์๋ค๋..ใ ใ ์ฐธ.. ์ด๋ฌ๋ฉด์ ์ฑ์ฅํ๋ ๊ฑฐ๊ฒ ์ฃ ..)
์ฐ์ ์ ๋ง ๊ฐ๋จํ๊ฒ Checked Exception๊ณผ Unchecked Exception์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Checked Exception์ Exception์ ํ์ ์์ธ๋ค ์ค RuntimeException์ ์ ์ธํ ๋ชจ๋ ์์ธ๋ค์ Checked Exception์ด๋ผ ํฉ๋๋ค.
Checked Exception์ ์ปดํ์ผ ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํด์ฃผ์ด์ผ ํ๋ฉฐ, ํด์ฃผ์ง ์๋๋ค๋ฉด ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
์ด์๋ ๋์กฐ์ ์ผ๋ก Unchecked Exception์ RuntimeException๊ณผ ์ด๋ฅผ ์์๋ฐ์ ์์ ์์ธ๋ค์ ๊ฐ๋ฆฌํต๋๋ค.
์ปดํ์ผ ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์์๋ ๋๋ค๋ ๊ฒ์ด ํน์ง์ ๋๋ค.
๊ทธ๋ผ ์ด์ ์ด๋ฒ ํฌ์คํ ์ ์ฃผ์ ์ธ ์์ธ ์ข ๋ฅ์ ๋ฐ๋ฅธ ํธ๋์ญ์ ๋กค๋ฐฑ ์ฒ๋ฆฌ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ธ ์ข ๋ฅ๋ ๋์น์ฑ์ จ๊ฒ ์ง๋ง Checked Exception๊ณผ Unchecked Exception์ ๋๋ค.
์์ธ ์ข ๋ฅ์ ๋ฐ๋ฅธ ํธ๋์ญ์ ๋กค๋ฐฑ ์ฒ๋ฆฌ
Unchecked Exception์ ์์ธ ๋ฐ์์ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ Checked Exception์ ๊ฒฝ์ฐ์๋ ์์ธ ๋ฐ์์ ๋กค๋ฐฑํ์ง ์์ต๋๋ค. (์ ๋ ๋ชจ๋ ์์ธ๋ฅผ ๋ค ๋กค๋ฐฑํ๋ ์ค ์์๋๋ฐ.. ์๋์์ต๋๋ค..ใ ใ )
์ฐธ๊ณ ๋ก Error๊ฐ ๋ฐ์ํด๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑ๋ฉ๋๋ค.
์์ ์ฝ๋๋ฅผ ํตํด ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ ๋ง ๊ฐ๋จํ๊ฒ Member ์ํฐํฐ๊ฐ ์์ต๋๋ค.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Member {
@Id @GeneratedValue(strategy = IDENTITY)
@Column(name = "MEMBER_ID")
private Long id;
private String name;
public Member(String name) {
this.name = name;
}
}
๊ทธ๋ฆฌ๊ณ Member์ ๋ํ Repository์ MemberService๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์์ต๋๋ค.
public interface MemberRepository extends JpaRepository<Member, Long> {
}
@Service
@Transactional
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
public Member createUncheckedEx(){
Member member = new Member("Uncheck-์ ๋ํ");
memberRepository.save(member);
if(true) {
throw new RuntimeException();
}
return member;
}
public Member createCheckedEx() throws IOException {
Member member = new Member("Check-์ ๋ํ");
memberRepository.save(member);
if(true) {
throw new IOException();
}
return member;
}
public Member createEx() throws Exception {
Member member = new Member("Exception -์ ๋ํ");
memberRepository.save(member);
if(true) {
throw new Exception();
}
return member;
}
}
๋ฐฐ์ด๋๋ก, createUncheckedEx()์์๋ ๋กค๋ฐฑ์ด ๋ฐ์ํ์ฌ ์ ์ฅ๋์ง ์๊ณ , ๋๋จธ์ง ๋ ๋ฉ์๋๋ค์ ์์ธ๋ฅผ ๋ฐ์์ํค์ง๋ง ๋กค๋ฐฑ์ ์ํค์ง ์๊ณ DB์ ์ ์ฅ๋ฉ๋๋ค.
์์๋๋ก ์คํ์ํค๋ฉด DB์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋ผ ๋ง์ฝ Checked Exception์ด ๋ฐ์ํ์์ ๋ ๋กค๋ฐฑ๋๊ฒ ๋ง๋๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
์ด๋ฅผ ์์๋ณด๊ธฐ ์ ์ ๋ค์ ๋ฌธ์ฅ์ 100๋ฒ๋ง ๋ฐ๋ณตํ๊ณ ๋์ด๊ฐ๋๋ก ํฉ์๋ค.
"Checked Exception์ ๋ฐ์์ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ์ง ์๋๋ค"
Checked Exception ๋ฐ์ ์ ํธ๋์ญ์ ์ ๋กค๋ฐฑ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
@Transactional ์์ฑ์ ๋ณด๋ฉด rollbackFor ์์ฑ์ด ์กด์ฌํฉ๋๋ค.
์์ด ์ธ๋ ์ฆ์ด ์๋ ์ ๋ ๋ฒ์ญ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ , ์ด์ง๋ง ์ ๋ง์๋๋ก ๋ฐ๊พธ์์ต๋๋ค.
ํธ๋์ญ์ ๋กค๋ฐฑ์ ๋ฐ์์์ผ์ผ ํ๋ ์์ธ ์ ํ์ ๋ํ๋ด๋ Throwable์ ํ์ ํด๋์ค์ธ 0๊ฐ ์ด์์ ์์ธ ํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋์ญ์ ์ RuntimeException ๋ฐ Error์์ ๋กค๋ฐฑ๋์ง๋ง Checked Exception(๋น์ฆ๋์ค ์์ธ)์์๋ ๋กค๋ฐฑ๋์ง ์์ต๋๋ค.
์์ธํ ์ค๋ช ์ org.springframework.transaction.interceptor.DefaultTransactionAttribute.rollbackOn(Throwable)์ ์ฐธ์กฐํ์ธ์. ์ด๊ฒ์ ์์ธ ํด๋์ค ๋ฐ ํด๋น ํ์ ํด๋์ค์ ์ผ์นํ๋ ๋กค๋ฐฑ ๊ท์น์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ(rollbackForClassName๊ณผ ๋์กฐ์ ์ผ๋ก)์ ๋๋ค. org.springframework.transaction.interceptor.RollbackRuleAttribute.RollbackRuleAttribute(Class clazz)์ ์ ์ฌํฉ๋๋ค.
See Also: rollbackForClassName, org.springframework.transaction.interceptor
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ฉด, Checked Exception์ธ ๊ฒฝ์ฐ์๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ ์ ์์ต๋๋ค.
@Transactional(rollbackFor = Exception.class)
public void save() throws Exception {
//์ฝ๋
}
๊ทธ๋ฐ๋ฐ ์์ ๊ฐ์ด ์ฌ์ฉํ๋ค๋ฉด, ์์ ๋ฉ์๋์์๋ Exception์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๊ณ์ ๋ฌด์๋ฏธํ ์์ธ๋ฅผ ๋์ง๊ณ ์ฒ๋ฆฌํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
Unchecked Exception์ผ๋ก ํฌ์ฅํ์ฌ ๋์ ธ๋ผ!
์์ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฐ๋ก Checked Exception์ Unchecked Exception์ผ๋ก ๋ฐ๊พธ์ด ์ฃผ๋ ๊ฒ์ ๋๋ค.
์์ ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ฉด ๋ค์๊ณผ ๊ฐ์์ง๋๋ค.
public Member createCheckedEx() {
Member member = new Member("Check-์ ๋ํ");
memberRepository.save(member);
if(true) {
try {
throw new IOException();
} catch (IOException e) {
throw new RuntimeException();
}
}
return member;
}
(์ฝ๋๊ฐ ์กฐ๊ธ ์๊ธฐ๊ธด ํ์ง๋ง.. ์์๋๊น ์ด๋ฐ ์์ผ๋ก ์์ธ๋ฅผ ๋ฐ๊พธ์ด ์ค๋ค๋ ๊ฒ๋ง ํ์ธํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.)
๐ Reference
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] SpringBoot Test์ ๋กค๋ฐฑ์ด ์๋ํ์ง ์๋ ๊ฒฝ์ฐ (MySQL ์ฌ์ฉ ์) (0) | 2022.05.15 |
---|---|
[JPA] ์ด๋ ค์ฃผ์ธ์ (2) | 2022.03.14 |
[JPA] ํ์ด๋ฒ๋ค์ดํธ์์ Lazy Loading ์ฌ์ฉ ์ ํ๋ก์ ๊ฐ์ฒด์ ํ๋๊ฐ Null์ธ ํ์ (0) | 2022.01.01 |
[JPA] ํธ๋์ญ์ ์ ํ , ์ค์ฒฉ๋ ํธ๋์ญ์ (Transaction Propagation) (0) | 2021.12.27 |
[JPA] ๊ณ ๊ธ ์ฃผ์ - ์์ธ ์ฒ๋ฆฌ (0) | 2021.12.23 |