@Service
@Transactional(readOnly = true)
public class MemberService
@Service
์คํ๋ง์์ ์๋น์ค๋ฅผ ์ง์ ํ๋ ์ด๋ ธํ ์ด์ .
@Transactional
JPA์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด๋ ๋ก์ง๋ค์ ํธ๋์ญ์ ์์์ ์คํ๋๋๋ก ํ๋ค .
DB์ ๊ด๋ จ๋, ํธ๋์ญ์ ์ด ํ์ํ ์๋น์ค ํด๋์ค ํน์ ๋ฉ์๋์ @Transactional ์ด๋ ธํ ์ด์ ์ ๋ฌ์์ฃผ๋ฉด๋๋ค.
@Transactional์ด ๋ถ์ ๋ฉ์๋๋ ๋ฉ์๋๊ฐ ํฌํจํ๊ณ ์๋ ์์ ์ค์ ํ๋๋ผ๋ ์คํจํ ๊ฒฝ์ฐ ์ ์ฒด ์์ ์ ์ทจ์ํ๋ค.
- readOnly=true - ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์๋ ์ฝ๊ธฐ ์ ์ฉ ๋ฉ์๋์ ์ฌ์ฉ , ์ฝ๊ฐ์ ์ฑ๋ฅ ํฅ์
- readOnly=false(default) - ๋ฐ์ดํฐ ๋ณ๊ฒฝํ ๋๋ ์ ์ฉ X
ํธ๋์ญ์ (Transaction)์ด๋ ?
๋ชจ๋ ์์ ๋ค์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ด์ผ ์์ ๋ฌถ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฉํ๊ณ ,
์ด๋ค ์์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋๋ ์ด์ ์ ์๋ ๋ชจ๋ ์์ ๋ค์ด ์ฑ๊ณต์ ์ด์๋๋ผ๋
์์๋ ์ผ์ฒ๋ผ ์์ ํ ๋๋๋ฆฌ๋ ๊ฒ์ด ํธ๋์ญ์ ์ ๊ฐ๋
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฐ ๋ ํธ๋์ญ์ ์ ์ ์ฉํ๋ฉด
๋ฐ์ดํฐ ์ถ๊ฐ, ๊ฐฑ์ , ์ญ์ ๋ฑ์ผ๋ก ์ด๋ฃจ์ด์ง ์์ ์ ์ฒ๋ฆฌํ๋ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋
๋ชจ๋ ์์ ๋ค์ ์์ํ๋ก ๋๋๋ฆด ์ ์๋ค.
๋ชจ๋ ์์ ๋ค์ด ์ฑ๊ณตํด์ผ๋ง ์ต์ข ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋๋ก ํ๋ค.
https://tecoble.techcourse.co.kr/post/2021-05-25-transactional/
ํ์ ๊ธฐ๋ฅ ํ ์คํธ
@SpringBootTest
@Transactional
class MemberServiceTest
@SpringBootTest : ์คํ๋ง ๋ถํธ ๋์ฐ๊ณ ํ ์คํธ(์ด๊ฒ ์์ผ๋ฉด @Autowired ๋ค ์คํจ)
@Transactional

๋ฐ๋ณต ๊ฐ๋ฅํ ํ ์คํธ ์ง์, ๊ฐ๊ฐ์ ํ ์คํธ๋ฅผ ์คํํ ๋๋ง๋ค ํธ๋์ญ์ ์ ์์ํ๊ณ
ํ ์คํธ๊ฐ ๋๋๋ฉด ํธ๋์ญ์ ์ ๊ฐ์ ๋ก ๋กค๋ฐฑ (์ด ์ด๋ ธํ ์ด์ ์ด ํ ์คํธ ์ผ์ด์ค์์ ์ฌ์ฉ๋ ๋๋ง ๋กค๋ฐฑ)
@Rollback(value = false)
๋กค๋ฐฑ๋์ง ์๋๋ก false ์ค์ ํ๊ธฐ
@Autowired EntityManager em;
em.flush();
์์์ฑ ์ปจํ ์คํธ์ ์๋ ๋ณ๊ฒฝ์ด๋ ๋ฑ๋ก ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋๋ก ํจ
์์ธ ๋ฐ์ ํ ์คํธ
try-catch๋ฌธ์ ๊ตฌ์กฐ
try {
memberService.join(member2); // ์์ธ ๋ฐ์
} catch (IllegalStateException e){
return;
}
try { ์์ธ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฌธ์ฅ }
catch (Exception e) { Exception ์ด ๋ฐ์ํ์ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฌธ์ฅ }
assertThrows
assertThrows(IllegalStateException.class, () -> {
memberService.join(member2);
});
Assertions.assertThrows์ ๋ ๋ฒ์งธ ์ธ์์ธ memberService.join(member2)๋ฅผ ์คํํ์ฌ
์ฒซ ๋ฒ์งธ ์ธ์์ธ ์์ธ ํ์ ๊ณผ ๊ฐ์์ง(ํน์ ์บ์คํ ์ด ๊ฐ๋ฅํ ์์ ๊ด๊ณ์ ์์ธ์ธ์ง) ๊ฒ์ฌํฉ๋๋ค.
ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ํ ์ค์
ํ ์คํธ๋ ์ผ์ด์ค ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์คํํ๊ณ , ๋๋๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ์ด ์ข๋ค.
๊ทธ๋ฐ ๋ฉด์์ ๋ฉ๋ชจ๋ฆฌ DB๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ด์์ ์ด๋ค.
test/resources/application.yml
url: jdbc:h2:mem:testdb
์ด์ ํ ์คํธ์์ ์คํ๋ง์ ์คํํ๋ฉด ์ด ์์น์ ์๋ ์ค์ ํ์ผ์ ์ฝ๋๋ค.
(๋ง์ฝ ์ด ์์น์ ์์ผ๋ฉด src/resources/application.yml ์ ์ฝ๋๋ค.)

์คํ๋ง ๋ถํธ๋ datasource ์ค์ ์ด ์์ผ๋ฉด, ๊ธฐ๋ณธ์ ์ ๋ฉ๋ชจ๋ฆฌ DB๋ฅผ ์ฌ์ฉํ๊ณ ,
driver-class๋ ํ์ฌ ๋ฑ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฅผ ๋ณด๊ณ ์ฐพ์์ค๋ค.
์ถ๊ฐ๋ก ddl-auto ๋ create-drop ๋ชจ๋๋ก ๋์ํ๋ค.
๋ฐ๋ผ์ ๋ฐ์ดํฐ์์ค๋, JPA ๊ด๋ จ๋ ๋ณ๋์ ์ถ๊ฐ ์ค์ ์ ํ์ง ์์๋ ๋๋ค.
์ค์ ! ์คํ๋ง ๋ถํธ์ JPA ํ์ฉ1 - ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ - ์ธํ๋ฐ | ๊ฐ์
์ค๋ฌด์ ๊ฐ๊น์ด ์์ ๋ก, ์คํ๋ง ๋ถํธ์ JPA๋ฅผ ํ์ฉํด์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ๊ณ ๊ฐ๋ฐํฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์คํ๋ง ๋ถํธ์ JPA๋ฅผ ์ค๋ฌด์์ ์ด๋ป๊ฒ ํ์ฉํด์ผ ํ๋์ง ์ดํดํ ์ ์์ต๋๋ค., - ๊ฐ
www.inflearn.com