Spring/Spring JPA ํ™œ์šฉ

[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 3. ํšŒ์› ์„œ๋น„์Šค ๊ฐœ๋ฐœ

hello_u 2023. 2. 21. 20:54

 

@Service
@Transactional(readOnly = true)
public class MemberService

 

@Service

 

์Šคํ”„๋ง์—์„œ ์„œ๋น„์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜.

 

์‚ฌ์‹ค @Component ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ๊ฑฐ์˜ ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋น„์Šค ๋ ˆ์ด์–ด ํด๋ž˜์Šค ์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

 

@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

insert ์ฟผ๋ฆฌ๊ฐ€ ์—†์Œ

 

๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ ์ง€์›, ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ 

 

ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ๊ฐ•์ œ๋กœ ๋กค๋ฐฑ (์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ๋กค๋ฐฑ)

 

 

@Rollback(value = false)

 

๋กค๋ฐฑ๋˜์ง€ ์•Š๋„๋ก  false ์„ค์ •ํ•˜๊ธฐ 

 

commit

 

 

 

@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 ๊ด€๋ จ๋œ ๋ณ„๋„์˜ ์ถ”๊ฐ€ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard

 

์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1 - ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด ์˜ˆ์ œ๋กœ, ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA๋ฅผ ํ™œ์šฉํ•ด์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA๋ฅผ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•

www.inflearn.com