Publish:

ํƒœ๊ทธ: , ,

์นดํ…Œ๊ณ ๋ฆฌ:

@Transactional์„ ๋ถ™์˜€๋Š”๋ฐ๋„ ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋“ค์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.

๋“ค์–ด๊ฐ€๋ฉฐ

์š”์ฆ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค๊ฐ€ @Transactional์„ ๋ถ™์˜€๋Š”๋ฐ๋„ ๋กค๋ฐฑ์ด ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์„ ๊ฒช์—ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ํŠธ๋žœ์žญ์…˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์˜€๋Š”๋ฐ ์™œ ์•ˆ ๋˜๋Š”์ง€ ํ•œ์ฐธ ํ—ค๋งธ๋‹ค. ๊ทธ๋ž˜์„œ ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์ผ€์ด์Šค๋ฅผ ์ •๋ฆฌํ•ด๋ดค๋‹ค.

๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€ ํ˜ธ์ถœ(self-invocation)

๊ฐ€์žฅ ํ”ํ•œ ๊ฑด ๊ฐ™์€ ํด๋ž˜์Šค ์•ˆ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋‹ค. ์Šคํ”„๋ง์€ ํ”„๋ก์‹œ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ๋‚ด๋ถ€ ํ˜ธ์ถœ(self-invocation)์€ ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋Ÿฐ ์ฝ”๋“œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
public class OrderService {
  public void outer() {
    this.inner(); // ์ด๋ ‡๊ฒŒ ๋ถ€๋ฅด๋ฉด ํŠธ๋žœ์žญ์…˜ ์•ˆ๋จน์Œ
  }

  @Transactional
  public void inner() {
    // ...
  }
}

outer์—์„œ inner๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด this๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ผด์ด๋ผ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฐ๊ตญ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜์ง€ ์•Š๋Š”๋‹ค.

private ๋ฉ”์„œ๋“œ์— @Transactional

๋˜ ํ•˜๋‚˜๋Š” private ๋ฉ”์„œ๋“œ์— @Transactional์„ ๋ถ™์ด๋Š” ๊ฒฝ์šฐ์ธ๋ฐ, ์ด๊ฒƒ๋„ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ @Transactional์€ ๊ธฐ๋ณธ์ ์œผ๋กœ public ๋ฉ”์„œ๋“œ์—๋งŒ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ๊ธฐ์— ๋”ํ•ด CGLIB ์„œ๋ธŒํด๋ž˜์Šค ํ”„๋ก์‹œ๋Š” private(๊ทธ๋ฆฌ๊ณ  final, static) ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์—†์–ด ๊ฐ€๋กœ์ฑ„์ง€๋„ ๋ชปํ•œ๋‹ค. private ๋ฉ”์„œ๋“œ๊ฐ€ ์•ˆ ๋˜๋Š” ๊ฑด ์ด ๋‘ ์ œ์•ฝ์ด ํ•จ๊ป˜ ์ž‘์šฉํ•œ ๊ฒฐ๊ณผ๋‹ค.

์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋กค๋ฐฑ ๋™์ž‘

@Transactional์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กค๋ฐฑํ•˜๋Š” ๋Œ€์ƒ์€ RuntimeException๊ณผ Error๋ฟ์ด๋‹ค. IOException, SQLException ๊ฐ™์€ checked ์˜ˆ์™ธ๋Š” ๋ฉ”์„œ๋“œ ๋ฐ–์œผ๋กœ ๋˜์ ธ์ ธ๋„ ๊ธฐ๋ณธ ์„ค์ •์—์„œ๋Š” ๋กค๋ฐฑ๋˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์ปค๋ฐ‹๋œ๋‹ค. checked ์˜ˆ์™ธ์—์„œ๋„ ๋กค๋ฐฑํ•˜๋ ค๋ฉด @Transactional(rollbackFor = Exception.class)์ฒ˜๋Ÿผ ๋กค๋ฐฑ ๋Œ€์ƒ์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

๋˜ ํ•œ ๊ฐ€์ง€, ํŠธ๋žœ์žญ์…˜ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์˜ˆ์™ธ๋ฅผ try-catch๋กœ ์žก๊ณ  ๋‹ค์‹œ ๋˜์ง€์ง€ ์•Š์œผ๋ฉด ๋กค๋ฐฑ ํŠธ๋ฆฌ๊ฑฐ ์ž์ฒด๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • self injection์„ ํ•œ๋‹ค.
  • ์•„์˜ˆ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์™ธ๋ถ€ ๋นˆ์„ ์ฃผ์ž…๋ฐ›์•„ ํ˜ธ์ถœํ•œ๋‹ค.
  • AOP ํ”„๋ก์‹œ๋ฅผ ์ง์ ‘ ๊บผ๋‚ด ์“ฐ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๊ถŒ์žฅ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

์ •๋ฆฌ

์ •๋ฆฌํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜์€ ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์ด๋ผ ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š” ํ˜ธ์ถœ์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ์ ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค.

๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋Œ“๊ธ€,์ง€์ ,ํ”ผ๋“œ๋ฐฑ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Š

๐Ÿ˜€

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ