Transactional

์Šคํ”„๋ง์€ PlatformTransactionManager ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์ถ”์ƒํ™”ํ•˜๊ณ  ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” @Transactional ์• ๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๋นˆ์„ ์ฐพ์œผ๋ฉด, ํ•ด๋‹น ๋นˆ์˜ ์‹ค์ œ ๊ฐ์ฒด ๋Œ€์‹  ํŠธ๋žœ์žญ์…˜ ๋กœ์ง์„ ๋‹ด์€ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก

  • ๋‹ค๋ฅธ ๋นˆ์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ๋•Œ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ค์ œ ๊ฐ์ฒด ๋Œ€์‹  ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…

  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์€ ์ฃผ์ž…๋ฐ›์€ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋ฉฐ, ํ”„๋ก์‹œ๋Š” ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ํ›„ ์‹ค์ œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

ํŠธ๋žœ์žญ์…˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ๋™๊ธฐํ™”

์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜์€ AOP, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(JPA), ์‹ค์ œ DB ์ปค๋„ฅ์…˜์ด ๊ฒฐํ•ฉ๋˜์–ด ๋™์ž‘ํ•œ๋‹ค.

spinner

ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ๊ณผ์ • ๋ฐ ์ฝ”๋“œ ๋ถ„์„

ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

  1. @Transactional ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ์Šคํ”„๋ง์€ AOP๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์‹œ์ž‘

  2. ํ•ด๋‹น ํ”„๋ก์‹œ๋Š” ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰ ์ „ํ›„๋กœ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ จ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” TransactionInterceptor์— ์ œ์–ด๋ฅผ ์œ„์ž„

  3. TransactionInterceptor๋Š” PlatformTransactionManager์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์ปค๋ฐ‹ ์š”์ฒญ

  4. ์‹ค์ œ ์ปค๋ฐ‹ ๊ณผ์ •์€ PlatformTransactionManager์˜ ์ถ”์ƒ ํด๋ž˜์Šค์ธ AbstractPlatformTransactionManager์˜ processCommit ๋ฉ”์„œ๋“œ์—์„œ ๋‹จ๊ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌ

processCommit ๋ฉ”์„œ๋“œ์—์„œ ์ปค๋ฐ‹์˜ ํ•ต์‹ฌ ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ์ฃผ์š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


private void processCommit(DefaultTransactionStatus status) {
    try {
        boolean beforeCompletionInvoked = false;

        try {
            prepareForCommit(status);          // 1. ์ปค๋ฐ‹ ์ค€๋น„
            triggerBeforeCommit(status);       // 2. ์ปค๋ฐ‹ ์ „ ์ฝœ๋ฐฑ
            triggerBeforeCompletion(status);   // 3. ์™„๋ฃŒ ์ง์ „ ์ฝœ๋ฐฑ
            beforeCompletionInvoked = true;

            // ... ์„ธ์ด๋ธŒํฌ์ธํŠธ/ํŠธ๋žœ์žญ์…˜ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๋“ฑ
            else if (status.isNewTransaction()) {
                doCommit(status);              // 4. DB ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ (์ด ์‹œ์ ์— DB ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ)
            }

        } catch (Exception ex) {
            // ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋กค๋ฐฑ ๋ฐ ์˜ˆ์™ธ ์ „ํŒŒ
            throw ex;
        }

        try {
            triggerAfterCommit(status);        // 5. ์ปค๋ฐ‹ ์ดํ›„ ์ฝœ๋ฐฑ
        } finally {
            triggerAfterCompletion(            // 6. ์™„๋ฃŒ ํ›„ ์ฝœ๋ฐฑ
                    status, TransactionSynchronization.STATUS_COMMITTED
            );
        }

    } finally {
        cleanupAfterCompletion(status);        // 7. ํŠธ๋žœ์žญ์…˜ ์ปจํ…์ŠคํŠธ ์ •๋ฆฌ (๋ฆฌ์†Œ์Šค ์–ธ๋ฐ”์ธ๋”ฉ)
    }
}
  1. prepareForCommit: ํ”Œ๋Ÿฌ์‹œ ๋“ฑ ์ปค๋ฐ‹ ์ง์ „ ์ค€๋น„ ์ˆ˜ํ–‰

  2. triggerBeforeCommit: ์ปค๋ฐ‹ ์ „ ์ฝœ๋ฐฑ ์‹คํ–‰

    • ์•„์ง DB ํŠธ๋žœ์žญ์…˜์ด ์‚ด์•„์žˆ๋Š” ์ƒํƒœ

  3. triggerBeforeCompletion: ์™„๋ฃŒ ์ง์ „ ์ฝœ๋ฐฑ ์‹คํ–‰

  4. doCommit: ์‹ค์ œ DB ์ปค๋ฐ‹ ์ˆ˜ํ–‰

    • ์ด ์‹œ์ ์— DB ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ

  5. triggerAfterCommit: ์ปค๋ฐ‹ ์ดํ›„ ์ฝœ๋ฐฑ ์‹คํ–‰

    • DB ํŠธ๋žœ์žญ์…˜์€ ์ด๋ฏธ ์ข…๋ฃŒ๋˜์—ˆ์œผ๋‚˜, ์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜ ์ปจํ…์ŠคํŠธ๋Š” ์•„์ง ์‚ด์•„์žˆ๋Š” ์ƒํƒœ

  6. triggerAfterCompletion: ์™„๋ฃŒ ํ›„ ์ฝœ๋ฐฑ ์‹คํ–‰

  7. cleanupAfterCompletion: ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ ์ •๋ฆฌ

ํŠธ๋žœ์žญ์…˜ ์šฐ์„  ์ˆœ์œ„

@Transactional ์• ๋…ธํ…Œ์ด์…˜์€ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์šฐ์„ ์ˆœ์œ„๋Š” ๋” ๊ตฌ์ฒด์ ์ด๊ณ  ์ž์„ธํ•œ ๊ฒƒ์ด ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•œ๋‹ค.

  1. ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ

  2. ํด๋ž˜์Šค

  3. ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ

  4. ์ธํ„ฐํŽ˜์ด์Šค

์ž๊ธฐ ํ˜ธ์ถœ(Self Invocation)

@Transactional์ด ์ ์šฉ ๋์„ ๋•Œ ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ์€ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋Š”๋ฐ, ๋งŒ์•ฝ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ณดํ†ต์˜ ๊ฒฝ์šฐ๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ, ๋Œ€์ƒ ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ฒŒ ๋˜์–ด ์œ„์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ external ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ ํ”„๋ก์‹œ ํ˜ธ์ถœ

  2. ํ”„๋ก์‹œ์—์„œ external ๋ฉ”์„œ๋“œ์— ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜ ์—†์ด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  3. ์‹ค์ œ external ๋ฉ”์„œ๋“œ ์‹คํ–‰

  4. external ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ internal ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  5. ์‹คํ–‰ ๋œ internal ๋ฉ”์„œ๋“œ๋Š” ์‹ค์ œ ๊ฐ์ฒด์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ•ด๊ฒฐ๋ฐฉ์•ˆ๋“ค์ด ์กด์žฌํ•˜์ง€๋งŒ ๋ณดํ†ต ์‹ค๋ฌด์—์„œ๋Š” ๋ณ„๋„ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ดˆ๊ธฐํ™” ์‹œ์ 

์Šคํ”„๋ง ์ดˆ๊ธฐํ™” ์‹œ์ ์—๋Š” ํŠธ๋žœ์žญ์…˜ AOP๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•œ ๋กœ์ง์ด ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ์ ์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์™„์ „ํžˆ ์ƒ์„ฑ๋˜๊ณ  ๋‚œ ๋’ค์— ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ํŠธ๋žœ์žญ์…˜ ์˜ต์…˜

@Transactional ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—” ๊ธฐ๋ณธ๊ฐ’์ด ์ ์šฉ๋œ๋‹ค.

์• ๋…ธํ…Œ์ด์…˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. rollbackFor / noRollbackFor

์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ์Šคํ”„๋ž‘ ํŠธ๋žœ์žญ์…˜์˜ ๋กค๋ฐฑ ์ •์ฑ…์œผ๋กœ ๊ธฐ๋ณธ ์ •์ฑ…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์–ธ์ฒดํฌ ์˜ˆ์™ธ: ๋กค๋ฐฑ

  • ์ฒดํฌ ์˜ˆ์™ธ: ๋กค๋ฐฑํ•˜์ง€ ์•Š๊ณ  ์ปค๋ฐ‹

์ด ์˜ต์…˜์— ์ถ”๊ฐ€๋กœ ๋กค๋ฐฑํ•  ์˜ˆ์™ธ๋ฅผ ์ง€์ •ํ•˜๊ฒŒ ๋˜๋ฉด, ํ•ด๋‹น ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋กค๋ฐฑํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฐ˜๋Œ€๋กœ noRollbackFor ์˜ต์…˜์€ ๋กค๋ฐฑํ•˜์ง€ ์•Š์„ ์˜ˆ์™ธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. isolation

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์ง€์ •์œผ๋กœ ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์„ค์ •ํ•œ ํŠธ๋žœ์žญ์…˜ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•˜๋Š” DEFAULT๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

3. timeout

ํŠธ๋žœ์žญ์…˜ ํƒ€์ž„์•„์›ƒ์„ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์œผ๋กœ ๊ธฐ๋ณธ๊ฐ’์€ -1๋กœ ๋ฌด์ œํ•œ์ด๋‹ค.

4. readOnly

  • false: ์ฝ๊ธฐ ์“ฐ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ํŠธ๋žœ์žญ์…˜

  • true: ์ฝ๊ธฐ ์ „์šฉ ํŠธ๋žœ์žญ์…˜(๋“œ๋ผ์ด๋ฒ„๋‚˜ DB์— ๋”ฐ๋ผ ์ฝ๊ธฐ ์ „์šฉ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ)

5. propagation

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์˜ต์…˜์œผ๋กœ ๊ธฐ๋ณธ๊ฐ’์€ REQUIRED๋กœ, ๋Œ€๋ถ€๋ถ„ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ต์…˜
์„ค๋ช…
๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ X
๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ O

REQUIRED

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ

์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ

๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ

REQUIRES_NEW

ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ(์ปค๋„ฅ์…˜ ์ถ”๊ฐ€ ์ ์œ )

์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ

์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ

SUPPORT

ํŠธ๋žœ์žญ์…˜ ์ง€์›

ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰

๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ

NOT_SUPPORTED

ํŠธ๋žœ์žญ์…˜ ๋ฏธ์ง€์›

ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰

ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰(๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ๋ณด๋ฅ˜)

MANDATORY

ํŠธ๋žœ์žญ์…˜์ด ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•จ

์˜ˆ์™ธ ๋ฐœ์ƒ

๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ

NEVER

ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰

์˜ˆ์™ธ ๋ฐœ์ƒ

isolation , timeout , readOnly ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜์Œ ์‹œ์ž‘๋  ๋•Œ๋งŒ ์ ์šฉ๋˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ํ๋ฆ„ - REQUIRED ์˜ต์…˜

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์˜ต์…˜์ด REQUIRED์ธ ๊ฒฝ์šฐ ์ด๋ฏธ ํŠธ๋žœ์žญ์…˜์ด ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์ด๋ผ๋„ ๋ฐœ์ƒํ•˜๋ฉด ์ „์ฒด ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๊ณ , ํ•˜๋‚˜์˜ ๋กค๋ฐฑ์ด๋ผ๋„ ๋ฐœ์ƒํ•˜๋ฉด ์ „์ฒด ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๋ฉฐ, ๊ทธ ์›๋ฆฌ์™€ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํŠธ๋žœ์žญ์…˜ ์š”์ฒญ/์‘๋‹ต ํ๋ฆ„

๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜ ์‹คํŒจ๋กœ ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๋Š” ์˜ˆ์‹œ

์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์—์„œ ์˜ˆ์™ธ๋ฅผ ๊ฐ์‹ธ์„œ ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ์˜ˆ์™ธ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ–ˆ์ง€๋งŒ, ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋กค๋ฐฑ ๋งˆํ‚น๋๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋œ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

Last updated