JPA ํ์ค ์์ธ ์ฒ๋ฆฌ
JPA์ ํ์ค ์์ธ๋ค์ javax.persistence.PersistenceException์ ์์ ํด๋์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์ธ ํด๋์ค๋ RuntimeException์ ์์์ด๋ค.
JPA ํ์ค ์์ธ๋ ํฌ๊ฒ ๋ณด๋ฉด 2๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ํธ๋์ญ์ ๋กค๋ฐฑ์ ํ์ํ๋ ์์ธ
- ํธ๋์ญ์ ์์ธ๋ฅผ ํ์ํ์ง ์๋ ์์ธ
ํธ๋์ญ์ ๋กค๋ฐฑ์ ํ์ํ๋ ์์ธ๋ ์ฌ๊ฐํ ์์ธ์ด๋ฏ๋ก ๋ณต๊ตฌํด์๋ ์๋๋ค. ์ด ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์ ๊ฐ์ ๋ก ์ปค๋ฐํด๋ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋์ง ์๊ณ ๋์ ์ javax.persistence.RollbackException ์์ธ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ฉด์ ํธ๋์ญ์ ๋กค๋ฐฑ์ ํ์ํ์ง ์๋ ์์ธ๋ ์ฌ๊ฐํ ์์ธ๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ํธ๋์ญ์ ์ ์ปค๋ฐํ ์ง ๋กค๋ฐฑํ ์ง๋ฅผ ํ๋จํ๋ค.
์๋๋ ๋ ๊ฐ์ง ๋ถ๋ฅ์ ์์ธ๋ฅผ ํ๋ก ์ ๋ฆฌํ ๊ฒ์ด๋ค.
ํธ๋์ญ์ ๋กค๋ฐฑ์ ํ์ํ๋ ์์ธ | ์ค๋ช |
javax.persistence.EntityExistException | em.persist ํธ์ถ ์ ์ด๋ฏธ ๊ฐ์ ์ํฐํฐ๊ฐ ์์ผ๋ฉด ๋ฐ์ํ๋ค. |
javax.persistence.EntityNotFoundException | em.getReference๋ฅผ ํธ์ถํ ํ ์ค์ ์ฌ์ฉํ๋ ์์ ์ ์ํฐํฐ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ๋ฐ์. refresh์ lock์์๋ ๋ฐ์ํ๋ค. |
javax.persistence.OptimisticLockException | ๋๊ด์ ๋ฝ ์ถฉ๋ ์ ๋ฐ์ํ๋ค. |
javax.persistence.PessimisticLockException | ๋น๊ด์ ๋ฝ ์ถฉ๋ ์ ๋ฐ์ํ๋ค. |
javax.persistence.RollbackException | EntityTransaction.commit() ์คํจ ์ ๋ฐ์, ๋กค๋ฐฑ์ด ํ์๋์ด ์๋ ํธ๋์ญ์ ์ปค๋ฐ ์์๋ ๋ฐ์ํ๋ค. |
javax.persistence.TransactionRequiredException | ํธ๋์ญ์ ์ด ํ์ํ ๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ๋ฐ์ํ๋ค. ํธ๋์ญ์ ์์ด ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ ์์ฃผ ๋ฐ์ํ๋ค. |
ํธ๋์ญ์ ๋กค๋ฐฑ์ ํ์ํ์ง ์๋ ์์ธ | ์ค๋ช |
javax.persistence.NoResultException | Query.getSingleResult() ํธ์ถ ์ ๊ฒฐ๊ณผ๊ฐ ํ๋๋ ์์ ๋ ๋ฐ์ํ๋ค. |
javax.persistence.NonUniqueResultException | Query,getSingleResult() ํธ์ถ ์ ๊ฒฐ๊ณผ๊ฐ ๋ ์ด์์ด๋ฉด ๋ฐ์ํ๋ค. |
javax.persistence.LockTimeoutException | ๋น๊ด์ ๋ฝ์์ ์๊ฐ ์ด๊ณผ ์ ๋ฐ์ํ๋ค. |
javax.persistence.QueryTimeoutException | ์ฟผ๋ฆฌ ์คํ ์๊ฐ ์ด๊ณผ ์ ๋ฐ์ํ๋ค. |
์คํ๋ง ํ๋ ์์ํฌ์ JPA ์์ธ ๋ณํ
์๋น์ค ๊ณ์ธต์์ ๊ตฌํ ๊ธฐ์ ์ ์ง์ ์์กดํ๋ ๊ฒ์ ์ข์ ์ค๊ณ๋ผ ํ ์ ์๋ค. ์ด๊ฒ์ ์์ธ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์๋ฅผ ๋ค์ด ์๋น์ค ๊ณ์ธต์์ JPA์ ์์ธ๋ฅผ ์ง์ ์ฌ์ฉํ๋ฉด JPA์ ์์กดํ๊ฒ ๋๋ค. ์คํ๋ง ํ๋ ์์ํฌ๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ๋ํ ์์ธ๋ฅผ ์ถ์ํํด์ ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํ๋ค. ์๋๋ JPA์์ธ๊ฐ ์คํ๋ง ์์ธ๋ก ๋ณํ๋๋ ์ข ๋ฅ๋ฅผ ์ ๋ฆฌํ ๊ฒ์ด๋ค.
JPA ์์ธ | ์คํ๋ง ๋ณํ ์์ธ |
javax.persistence.PersistenceException | org.springframework.orm.jpa.JpaSystemException |
javax.persistence.NoResultException | org.springframework.dao.EmptyResultDataAcessException |
javax.persistence.NonUniqueResultException | org.springframework.dao.IncorrectResultSizeDataAceessException |
javax.persistence.LockTimeoutException | org.springframework.dao.CannotAcquireLockException |
javax.persistence.QueryTimeoutException | org.springframework.dao.QueryTimeoutException |
javax.persistence.EntityExistException | org.springframework.dao.DataIntegrityViolationException |
javax.persistence.EntityNotFoundException | org.springframework.orm.jpa.JpaObjectRetrievalFailureException |
javax.persistence.OptimisticLockException | org.springframework.orm.jpa.JpaOptimisticLockingFailureException |
javax.persistence.PessimisticLockException | org.springframework.dao.PessimisticLockingFailureException |
javax.persistence.RollbackException | org.springframework.dao.InvalidDataAceessApiUsageException |
javax.persistence.TransactionRequiredException | org.springframework.transaction.TransactionSystemException |
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ JPA ์์ธ๋ฅผ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ ์ถ์ํ๋ ์์ธ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ์ญํ ์ PersistenceExceptionTranslationPostProcessor์ด๋ค.
์ด๊ฒ์ @Repository ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ๊ณณ์ ์์ธ ๋ณํ AOP๋ฅผ ์ ์ฉํด์ JPA์์ธ๋ฅผ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ถ์ํํ ์์ธ๋ก ๋ณํํด์ค๋ค.
๋ง์ฝ ์์ธ๋ฅผ ๋ฐํํ๊ณ ์ถ์ง ์๋ค๋ฉด
throws์ ์ ๊ทธ๋๋ก ๋ฐํํ JPA ์์ธ๋ JPA ์์ธ์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์ง์ ๋ช ์ํ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด ์๋์ฒ๋ผ ์์ธ๋ฅผ ๋ช ์ํ๋ฉด ํด๋น ์์ธ๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ค. ์ฐธ๊ณ ๋ก java.lang.Exception์ ์ ์ธํ๋ฉด ๋ชจ๋ ์์ธ์ ๋ถ๋ชจ์ด๋ฏ๋ก ์์ธ๋ฅผ ๋ณํํ์ง ์๋๋ค.
@Repository
public class NoResultExceptionTestService {
@PersistenceContext EntityManager em;
public Member findMember() throws javax.persistence.NoResultException{
~~~
}
}
ํธ๋์ญ์ ๋กค๋ฐฑ ์ ์ฃผ์์ฌํญ
ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์์ฌํญ๋ง ๋กค๋ฐฑํ๋ ๊ฒ์ด์ง ์์ ํ ์๋ฐ ๊ฐ์ฒด๊น์ง ์์ํ๋ก ๋ณต๊ตฌํด์ฃผ์ง๋ ์๋๋ค. ์๋ฅผ ๋ค์ด ์ํฐํฐ๋ฅผ ์กฐํํด์ ์์ ํ๋ ์ค์ ๋ฌธ์ ๊ฐ ์์ด์ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ ์๋๋๋ก ๋ณต๊ตฌ๋์ง๋ง ๊ฐ์ฒด๋ ์์ ๋ ์ํ๋ก ์์์ฑ ์ปจํ ์คํธ์ ๋จ์์๋ค. ๋ฐ๋ผ์ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ํํ๋ค.
์๋ก์ด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ EntityManager.clear()๋ฅผ ํธ์ถํด์ ์์์ฑ ์ปจํ ์คํธ๋ฅด๋ฅด ์ด๊ธฐํํ ๋ค์์ ์ฌ์ฉํด์ผ ํ๋ค.
์คํ๋ง ํ๋ ์์ํฌ๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์์ฑ ์ปจํ ์คํธ์ ๋ฒ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธ ์ ๋ต์ธ ํธ๋์ญ์ ๋น ์์์ฑ ์ปจํ ์คํธ ์ ๋ต์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ AOP ์ข ๋ฃ ์์ ์ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ฉด์ ์์์ฑ ์ปจํ ์คํธ๋ ํจ๊ป ์ข ๋ฃํ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋ฌ๋ ๋ฌธ์ ๋ OSIV์ฒ๋ผ ์์์ฑ ์ปจํ ์คํธ์ ๋ฒ์๋ฅผ ํธ๋์ญ์ ๋ฒ์๋ณด๋ค ๋๊ฒ ์ฌ์ฉํด์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ํ๋์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ค. ์ด๋๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑํด์ ์์์ฑ ์ปจํ ์คํธ์ ์ด์์ด ๋ฐ์ํด๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ํด๋น ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๋ฌธ์ ๊ฐ ์๋ค.
์คํ๋ง ํ๋ ์์ํฌ๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ฒ์๋ฅผ ํธ๋์ญ์ ์ ๋ฒ์๋ณด๋ค ๋๊ฒ ์ค์ ํ๋ฉด ํธ๋์ญ์ ๋กค๋ฐฑ์ ์์์ฑ ์ปจํ ์ค๋ฅดํ ์ด๊ธฐํํด์ ์๋ชป๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๋ค
๐ Reference
[์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ]
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ํ์ด๋ฒ๋ค์ดํธ์์ Lazy Loading ์ฌ์ฉ ์ ํ๋ก์ ๊ฐ์ฒด์ ํ๋๊ฐ Null์ธ ํ์ (0) | 2022.01.01 |
---|---|
[JPA] ํธ๋์ญ์ ์ ํ , ์ค์ฒฉ๋ ํธ๋์ญ์ (Transaction Propagation) (0) | 2021.12.27 |
[JPA] ๋ฆฌ์ค๋ - ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ์ ๋ฐ๋ฅธ ์ด๋ฒคํธ ์ฒ๋ฆฌ (3) | 2021.12.21 |
[JPA] @Converter (0) | 2021.12.21 |
[JPA] JPA๊ฐ ์ง์ํ๋ ์ปฌ๋ ์ (0) | 2021.12.21 |