Toby Spring 6

Toby Spring Boot

ํ† ๋น„๋‹˜์˜ ํ† ๋น„์˜ ์Šคํ”„๋ง 6 - ์ดํ•ด์™€ ์›๋ฆฌ ๊ฐ•์˜๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

Github

MY Project

Intro

JDK

  • SDK Man

    $ sdk # sdk man ํ„ฐ๋ฏธ๋„ ์—ด๊ธฐ
    > sdk list java # java ๊ด€๋ จ ๋ชจ๋“  ์„ค์น˜ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „ ํ™•์ธ
    > sdk list java | grep installed # ์„ค์น˜๋œ ๋ฒ„์ „๋งŒ ํ™•์ธ
    > sdk install java [jdk name] # ์ž๋ฐ” ์„ค์น˜
    > sdk use java [jdk name] # ํด๋”์—์„œ ํ•ด๋‹น ๋ฒ„์ „ ์‚ฌ์šฉ
    > sdk env init # ํ”„๋กœ์ ํŠธ ํด๋”์˜ ์‚ฌ์šฉ JDK ์ €์žฅ
    > sdk env # ํ”„๋กœ์ ํŠธ ํด๋”์˜ ์‚ฌ์šฉ JDK ๋ณต๊ตฌ

API

์˜ค๋ธŒ์ ํŠธ์™€ ์˜์กด๊ด€๊ณ„

์˜ค๋ธŒ์ ํŠธ

  • ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋งŒ๋“ค์–ด์ ธ์„œ ์›€์ง์ด๋Š” ๊ฒƒ(=๊ฐ์ฒด)

  • ์˜ค๋ธŒ์ ํŠธ๋Š” ์ผ์„ ํ•˜๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰

  • ์ž๋ฐ”์˜ ์˜ค๋ธŒ์ ํŠธ๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋˜๋Š” ๋ฐฐ์—ด

ํด๋ž˜์Šค

  • ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ

  • ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ƒ์„ธํ•œ ์ •๋ณด(์„ค๊ณ„๋„, ํ”„๋กœํ† ํƒ€์ž…, ๋ชจ๋ธ ..)

์ธ์Šคํ„ด์Šค

  • ์ถ”์ƒ์ ์ธ ๊ฒƒ(ex. ํด๋ž˜์Šค)์— ๋Œ€ํ•œ ์‹ค์ฒด

.

์˜์กด๊ด€๊ณ„

  • ๋ฐ˜๋“œ์‹œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋Œ€์ƒ์ด ์กด์žฌ

    • ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉ, ํ˜ธ์ถœ, ์ƒ์„ฑ, ์ธ์Šคํ„ด์Šคํ™”, ์ „์†ก ๋“ฑ์„ ํ•  ๋•Œ ์˜์กด๊ด€๊ณ„์— ์žˆ๋‹ค๊ณ  ์ด์•ผ๊ธฐ

  • ํด๋ž˜์Šค ์‚ฌ์ด์— ์˜์กด๊ด€๊ณ„๊ฐ€ ์žˆ์„ ๋•Œ ์˜์กด ๋Œ€์ƒ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

  • ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์ด์— ์˜์กด๊ด€๊ณ„๋Š” ์‹คํ–‰๋˜๋Š” ๋Ÿฐํƒ€์ž„์— ์˜์กด๊ด€๊ณ„๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ์‹คํ–‰ ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€๋งŒ, ํด๋ž˜์Šค ๋ ˆ๋ฒจ์˜ ์˜์กด๊ด€๊ณ„์™€๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

.

๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ(Separation of Concerns)

  • ๊ด€์‹ฌ์‚ฌ๋Š” ๋™์ผํ•œ ์ด์œ ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์ฝ”๋“œ์˜ ์ง‘ํ•ฉ

  • API๋กœ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ JSON์„ ์˜ค๋ธŒ์ ํŠธ์— ๋งคํ•‘ํ•˜๋Š” ๊ด€์‹ฌ๊ณผ ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋กœ์ง์€ ๊ด€์‹ฌ์ด ๋‹ค๋ฅด๋‹ค.

  • ๋ณ€๊ฒฝ์˜ ์ด์œ ์™€ ์‹œ์ ์„ ์‚ดํŽด๋ณด๊ณ  ์ด๋ฅผ ๋ถ„๋ฆฌํ•˜์ž.

๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

.

์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ

  • ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ ์—†์ด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์žฅํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์ƒ์†์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์–ด๋–ป๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ค€๋น„ํ•  ๊ฒƒ์ด๊ฐ€์™€ ์–ด๋–ป๊ฒŒ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ธ๊ฐ€๋ผ๋Š” ๊ด€์‹ฌ์‚ฌ๊ฐ€ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ๋ถ„๋ฆฌ๋œ๋‹ค.

  • ์ •๋ณด๋ฅผ ๋‹ด์€ ์˜ค๋ธŒ์ ํŠธ์ธ ExRate๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์„ ์„œ๋ธŒ ํด๋ž˜์Šค์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

    • ๊ฐ์ฒด์ง€ํ–ฅ ๋””์ž์ธ ํŒจํ„ด์— ๋‚˜์˜ค๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์ด์šฉํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ, ์ž๋ฐ”๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ ํ™•์žฅ์„ ์ด์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

    • ๋˜ํ•œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ์€ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ์— ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ

.

ํด๋ž˜์Šค์˜ ๋ถ„๋ฆฌ

  • ๊ด€์‹ฌ์‚ฌ์— ๋”ฐ๋ผ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๊ฒฐ๊ณผ์ ์œผ๋กœ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ์‚ฌ์šฉ ์˜์กด๊ด€๊ณ„๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•ํ•œ ์ฝ”๋“œ ์ˆ˜์ค€์˜ ๊ฒฐํ•ฉ์ด ์ƒ๊ธด๋‹ค.

    • ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฅผ ์ด์šฉํ•˜๋Š” ์ชฝ์˜ ์ฝ”๋“œ๋„ ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • ์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ์ฒ˜๋Ÿผ ์œ ์—ฐํ•œ ๋ณ€๊ฒฝ๋„ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

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

    • ๊ทธ๋ž˜์„œ ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๋ฉด ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๊ฐ€ ์ž˜ ๋œ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ ๋ถ„๋ฆฌ

.

์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…

  • ๋…๋ฆฝ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉํ•  ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ์ •ํ•ด๋‘”๋‹ค.

    • ์ด๋ฅผ ๊ฐ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ์˜์กดํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

  • ํ•˜์ง€๋งŒ, ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ์—๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์ด ๋“ฑ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์„œ๋น„์Šค ์ฝ”๋“œ๋„ ์ผ๋ถ€๋ถ„์ด์ง€๋งŒ ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • ์—ฌ์ „ํžˆ ์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ๋งŒํผ์˜ ์œ ์—ฐ์„ฑ๋„ ๊ฐ€์ง€์ง€ ๋ชปํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…

.

๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์˜ ๋ถ„๋ฆฌ

  • ์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ์ง€๋งŒ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์„œ๋น„์Šค๋Š” ์—ฌ์ „ํžˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํŠน์ • ํด๋ž˜์Šค์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

    • ์ž์‹ ์ด ์–ด๋–ค ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค๋ฉด ๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์„ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

    • ์ด ๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์„ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ์•ž์˜ ์˜ค๋ธŒ์ ํŠธ์—๊ฒŒ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

    • ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ์˜์กด๊ด€๊ณ„์—์„œ ์ž์œ ๋กœ์›Œ์ง„๋‹ค.

  • ์ดํ›„์—๋Š” ์˜ค์ง ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋”๋ผ๋„ ์„œ๋น„์Šค์˜ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • ๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์„ ๊ฐ€์ง„ ์•ž์˜ ํด๋ž˜์Šค(Client)๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•œ ๊ฒƒ์„ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์˜ ๋ถ„๋ฆฌ

์˜ค๋ธŒ์ ํŠธ ํŒฉํ† ๋ฆฌ

  • Client๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ์„œ์˜ ์ฑ…์ž„๊ณผ ์„œ๋น„์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์ด์˜ ๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์„ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. โ†’ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ์˜ ๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์„ ๊ฐ€์ง„ ์ฝ”๋“œ๋ฅผ ObjectFactory๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

    • ObjectFactory๋Š” ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋ฅผ ์„ ์ •ํ•˜๊ณ  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์˜์กด๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•ด์„œ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ํŒฉํ† ๋ฆฌ

์›์น™๊ณผ ํŒจํ„ด

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์›์น™๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ ๋””์ž์ธ ํŒจํ„ด

๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(Open-Closed Principle)

  • ํด๋ž˜์Šค๋‚˜ ๋ชจ๋“ˆ์€ ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

  • ํด๋ž˜์Šค๊ฐ€ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ๋•Œ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๋†’์€ ์‘์ง‘๋„์™€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„(High Coherence and low coupling)

  • ์‘์ง‘๋„๊ฐ€ ๋†’๋‹ค๋Š” ๊ฒƒ์€ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ด ํ•˜๋‚˜์˜ ์ฑ…์ž„ ๋˜๋Š” ๊ด€์‹ฌ์‚ฌ์— ์ง‘์ค‘๋˜์–ด ์žˆ๋‹ค๋Š” ๋œป.

    • ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ๋•Œ ํ•ด๋‹น ๋ชจ๋“ˆ์—์„œ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„์ด ํฌ๋‹ค.

  • ์ฑ…์ž„๊ณผ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ๋Š” ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„, ์ฆ‰ ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

์ „๋žต ํŒจํ„ด(Strategy Pattern)

  • ์ž์‹ ์˜ ๊ธฐ๋Šฅ ๋งฅ๋ฝ(Context)์—์„œ, ํ•„์š”์— ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ†ต์งธ๋กœ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌ์‹œํ‚ค๊ณ , ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌ์ฒด์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํด๋ž˜์Šค๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ์„œ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด.

  • Collections.sort()๋Š” ์ •๋ ฌ์— ์‚ฌ์šฉํ•  ์ „๋žต ์˜ค๋ธŒ์ œํŠธ๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค.

์ œ์–ด์˜ ์—ญ์ „(Inversion of Control)

  • ์ œ์–ด๊ถŒ ์ด์ „์„ ํ†ตํ•œ ์ œ์–ด๊ด€๊ณ„ ์—ญ์ „ - ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์›๋ฆฌ

  • ์ œ์–ด๊ถŒ์ด ์„œ๋น„์Šค โ†’ ํด๋ผ์ด์–ธํŠธ โ†’ ObjectFactory ๋กœ ์ด์ „

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

Dependency Injection

Introduction to the Spring IoC Container and Beans

BeanFactory

  • ์Šคํ”„๋ง์˜ BeanFactory๊ฐ€ ์•ž์—์„œ ๋งŒ๋“  ObjectFactory๊ฐ€ ์ œ๊ณตํ•˜๋˜ ๊ธฐ๋Šฅ์„ ๋Œ€์ฒดํ•œ๋‹ค.

  • BeanFactory๋Š” ObjectFactory์˜ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

Bean

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋นˆ(bean)์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(Dependency Injection)

  • IoC๋Š” ์Šคํ”„๋ง์˜ ๋™์ž‘์›๋ฆฌ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ๋™์ž‘์›๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์šฉ์–ด์ด๋‹ค.

  • ๊ทธ๋ž˜์„œ ์Šคํ”„๋ง๊ณผ ๊ฐ™์ด ์˜ค๋ธŒ์ ํŠธ์˜ ์˜์กด๊ด€๊ณ„์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์Šคํ”„๋ง๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š”, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(Dependency Injection) ํŒจํ„ด, ์ค„์—ฌ์„œ DI๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์šฉ์–ด๊ฐ€ ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ์— ์˜ํ•ด์„œ ์ œ์•ˆ๋˜์—ˆ๊ณ  ์Šคํ”„๋ง ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ, ๋˜ ์ด ์›์น™์„ ๋”ฐ๋ผ์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์…œ๋ช…ํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๊ธฐ์ˆ ์—์„œ๋„ ๋„“๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

  • ์Šคํ”„๋ง์ด ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋˜ ์‹œ๊ธฐ์—๋Š” IoC๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„์— DI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ IoC๋ผ๋Š” ์šฉ์–ด๋„ ๊ฐ™์ด ์“ฐ์ด๊ธฐ๋„ ํ•œ๋‹ค.

  • ์Šคํ”„๋ง์€ IoC/DI ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ์‹์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ๋„ ๋งŽ์ด ์žˆ๋‹ค.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

์ปจํ…Œ์ด๋„ˆ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‹ด์•„๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋„๋ก ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹น

  • ๋ณดํ†ต ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ๋ฟ ์•„๋‹ˆ๋ผ ์ƒ๋ช…์ฃผ๊ธฐ(lifecycle)๊นŒ์ง€ ๋‹ด๋‹น

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋นˆ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์˜์กด๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๋‹ด๋‹น

    • ๋นˆ ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณต

๊ตฌ์„ฑ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•

  • @Configuration, @Bean ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๊ตฌ์„ฑ์ •๋ณด ํด๋ž˜์Šค์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด์งˆ ์˜ค๋ธŒ์ ํŠธ์™€ ์˜์กด๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ๋Š”, ๊ฐ™์€ ๊ตฌ์„ฑ์ •๋ณด๋ฅผ ์ œ๊ณต ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์˜ˆ์ „์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๋˜ XML์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ @Component ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์ฐพ์•„๋ณด๋Š” ๋นˆ ์Šค์บ๋‹ ๋ฐฉ์‹๊ณผ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณด๊ณ  ์˜์กด ๋นˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํƒ€์ž… ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • ๋นˆ ์ •๋ณด๋ฅผ ์Šค์บ๋‹์— ์˜ํ•ด์„œ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒฝ์šฐ์—๋Š” @ComponentScan ์• ๋…ธํ…Œ์ด์…˜์ด ์‚ฌ์šฉ๋œ๋‹ค.

  • ์‹ค์ œ๋กœ๋Š” ๋นˆ ์Šค์บ๋‹ ๋ฐฉ์‹๊ณผ @Configuration/@Bean์„ ๊ฐ€์ง„ ๊ตฌ์„ฑ์ •๋ณด ํด๋ž˜์Šค ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ˜ผํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๊ตฌ์„ฑ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•

์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(Singleton Registry)

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์„ ๊ฐ€์ง„๋‹ค.

  • private ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†ํ•  ์ˆ˜ ์—†๋‹ค

  • ์‹ฑ๊ธ€ํ†ค์€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค๋‹ค

  • ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ฑ๊ธ€ํ†ค์ด ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค

  • ์‹ฑ๊ทธํ†ค์˜ ์‚ฌ์šฉ์€ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค

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

  • ์ด๋ ‡๊ฒŒ ์‹ฑ๊ธ€ํ†ค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹ฑ๊ธ€ํ†ค์„ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค.

  • ์Šคํ”„๋ง์˜ ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ  ์ ์šฉ๋˜๋Š” ๋ฒ”์œ„๋ฅผ ๋นˆ์˜ ์Šค์ฝ”ํ”„(scope)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  • ์Šคํ”„๋ง์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นˆ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋„๋ก ํ•œ๋‹ค.

  • ํ•„์š”์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋นˆ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

DI์™€ ๋””์ž์ธ ํŒจํ„ด

๋””์ž์ธ ํŒจํ„ด์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹

  • ์‚ฌ์šฉ ๋ชฉ์ (purpose)

  • ์Šค์ฝ”ํ”„(scope)

์Šค์ฝ”ํ”„์— ์˜ํ•ด์„œ ๋ถ„๋ฅ˜ํ•˜๋ฉด ํ™•์žฅ์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค ํŒจํ„ด๊ณผ ์˜ค๋ธŒ์ ํŠธ ํŒจํ„ด์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ํด๋ž˜์Šค ํŒจํ„ด: ์ƒ์†(inheritance)์„ ์ด์šฉ

  • ์˜ค๋ธŒ์ ํŠธ ํŒจํ„ด: ํ•ฉ์„ฑ(composition)์„ ์ด์šฉ

๋Œ€๋ถ€๋ถ„์˜ ๋””์ž์ธ ํŒจํ„ด์€ ์˜ค๋ธŒ์ ํŠธ ํŒจํ„ด์ด๋‹ค.

  • ๊ฐ€๋Šฅํ•˜๋ฉด ์˜ค๋ธŒ์ ํŠธ ํ•ฉ์„ฑ์„ ์ƒ์†๋ณด๋‹ค ๋” ์„ ํ˜ธํ•˜๋ผ๋Š” ๋””์ž์ธ ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ฐ์ฒด์ง€ํ–ฅ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅธ ๊ฒƒ์ด๋‹ค.

  • ์ „๋žต ํŒจํ„ด์€ ์˜ค๋ธŒ์ ํŠธ ํ•ฉ์„ฑ์„ ์ด์šฉ

  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด : ์˜ค๋ธŒ์ ํŠธ์— ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ/์ฑ…์ž„์„ ๋™์ ์œผ๋กœ ๋ถ€์—ฌํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด

design-patterns

์˜์กด์„ฑ ์—ญ์ „ ์›์น™(Dependency Inversion Principle)

  • (1). ์ƒ์œ„ ์ˆ˜์ค€์˜ ๋ชจ๋“ˆ(ex. package)์€ ํ•˜์œ„ ์ˆ˜์ค€์˜ ๋ชจ๋“ˆ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

    • ๋‘˜ ๋ชจ๋‘ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

  • (2). ์ถ”์ƒํ™”๋Š” ๊ตฌ์ฒด์ ์ธ ์‚ฌํ•ญ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

    • ๊ตฌ์ฒด์ ์ธ ์‚ฌํ•ญ์€ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

DIP๋Š” ๋จผ์ € ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์ถ”์ƒํ™”์— ์˜์กดํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ์†Œ์œ ๊ถŒ์˜ ์—ญ์ „๋„ ํ•„์š”ํ•˜๋‹ค

Separate Interface Pattern

  • ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ทธ ๊ตฌํ˜„์„ ๋ณ„๊ฐœ์˜ ํŒจํ‚ค์ง€์— ์œ„์น˜์‹œํ‚ค๋Š” ํŒจํ„ด

  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ์œ„์น˜ํ•˜๊ฒŒ ํ•œ๋‹ค.

  • ๋งŒ์•ฝ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฟ์ธ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๊ฐœ์˜ ํŒจํ‚ค์ง€๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ๋ถ„ํ•ด๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

์˜์กด์„ฑ ์—ญ์ „ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅด๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•.

(1) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ถ”์ƒํ™”ํ•˜๊ธฐ.

(2) ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์ถ”์ƒํ™”์—๋งŒ ์˜์กดํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ.

(3) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“ˆ๋กœ ์ด์ „(์—ญ์ „)์‹œํ‚ค๊ธฐ.

์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)

ํ…Œ์ŠคํŠธ

์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ(Automated Test)

  • ์ˆ˜๋™์œผ๋กœ ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ํ™œ์šฉํ•˜๋Š”๋ฐ ํ•œ๊ณ„

  • ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด์ ธ ์–ธ์ œ๋“  ์‹คํ–‰ํ•ด์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”

    • ์ด๋ฅผ ํ†ตํ•ด์„œ ์ง€์†์ ์ธ ๊ฐœ์„ ๊ณผ ์ ์ง„์ ์ธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅ

๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“œ๋Š” ํ…Œ์ŠคํŠธ

  • ํ…Œ์ŠคํŠธ๋ฅผ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ณ  ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ

  • ํ…Œ์ŠคํŠธ ์ž‘์„ฑ๊ณผ ์‹คํ–‰์ด ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์˜ ์ผ๋ถ€

  • ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ๊ณผ ์‹คํ–‰ ๊ณผ์ •์„ ํšจ์œจ์ ์œผ๋กœ ์ง„ํ–‰

.

JUnit ํ…Œ์ŠคํŠธ

  • JUnit์€ ์ผ„ํŠธ ๋ฒก๊ณผ ์—๋ฆญ ๊ฐ๋งˆ๊ฐ€ ์ฒ˜์Œ ๊ฐœ๋ฐœํ•œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ ๋„๊ตฌ

  • ์ž๋ฐ” ์™ธ์˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ๋„ ์œ ์‚ฌํ•˜๊ฒŒ ๊ฐœ๋ฐœ๋˜์–ด์ง€๋ฉด์„œ ์ด๋ฅผ ํ†ตํ‹€์–ด xUnit์ด๋ผ๊ณ  ๋ถˆ๋ฆผ

JUnit 5

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜๊ณ , ์Šคํ”„๋ง์„ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ

  • Junit์€ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘๋ฐฉ์‹์œผ๋กœ ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ

    • ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ , ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก

JUnit ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

.

PaymentService ํ…Œ์ŠคํŠธ

  • ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋Š” ์–ธ์ œ๋“  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ญ์ƒ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด์•ผ ํ•œ๋‹ค.

  • ๋•Œ๋กœ๋Š” ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ, ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ๊ฐ™์ด ์ฝ”๋“œ์—์„œ ์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์ผ๊ด€๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค.

PaymentServiceTest

ํ…Œ์ŠคํŠธ์™€ DI

ํ…Œ์ŠคํŠธ ๋Œ€์—ญ(Test Double, Imposter), ์Šคํ…(Stub), ๋ชฉ(Mock)

Stub Test

.

์Šคํ”„๋ง DI๋ฅผ ์ด์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์—ฌ๊ธฐ์„œ ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋Œ€์ƒ๊ณผ ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ์—์„œ ์ฐธ๊ณ ํ•  ๋นˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์Šคํ”„๋ง์€ ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ํ…Œ์ŠคํŒ… ์ง€์› ๊ธฐ์ˆ ์„ ์ œ๊ณตํ•œ๋‹ค.

.

JUnit์—์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ @ExtendWith๊ณผ @ContextConfiguration์„ ์ด์šฉํ•œ๋‹ค.

@ExtendedWith

  • JUnit5 ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๊ฐ€ ์Šคํ”„๋ง ํ…Œ์ŠคํŒ… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •

  • @ContextConfiguration๊ณผ ๊ฒฐํ•ฉ๋œ ํ•ฉ์„ฑ ์• ๋…ธํ…Œ์ด์…˜์ธ @SpringJUnitConfig์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

@ContextConfiguration

Autowired

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— @Autowired๊ฐ€ ๋ถ™์€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉฐ ์Šคํ”„๋ง ํ…Œ์ŠคํŠธ์— ์˜ํ•ด์„œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ํƒ€์ž…๊ณผ ์ผ์น˜ํ•˜๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ๋นˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฃผ์ž…ํ•ด์ค€๋‹ค.

  • @Autowired ์™ธ์—๋„ ์Šคํ”„๋ง์—์„œ ์ง€์›ํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์• ๋…ธํ…Œ์ด์…˜์„ ์ง€์›ํ•œ๋‹ค.

Spring Test

.

ํ•™์Šต ํ…Œ์ŠคํŠธ(Learning Test)

  • ์ผ„ํŠธ ๋ฒก์˜ ํ…Œ์ŠคํŠธ์ฃผ๋„๊ฐœ๋ฐœ์ด๋ผ๋Š” ์ฑ…์—์„œ ์†Œ๊ฐœ๋œ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์˜ ํ•œ ๊ฐ€์ง€

  • ํ•™์Šต ํ…Œ์ŠคํŠธ๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“ค์ง€ ์•Š์€ ์ฝ”๋“œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, API ๋“ฑ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ

  • ํ•™์Šต ํ…Œ์ŠคํŠธ์˜ ๋ชฉ์ ์€ ์‚ฌ์šฉํ•  API๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ด๋ณด๋ฉด์„œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์ธ

  • ํ•™์Šต ํ…Œ์ŠคํŠธ๋Š” ์ผ„ํŠธ ๋ฒก์˜ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ๊ณผ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด์˜ ํด๋ฆฐ ์ฝ”๋“œ์—์„œ ์†Œ๊ฐœ

Learning Test

Clock์„ ์ด์šฉํ•œ ์‹œ๊ฐ„ ํ…Œ์ŠคํŠธ

.

๋„๋ฉ”์ธ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด

  • ๋„๋ฉ”์ธ ๋กœ์ง, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์–ด๋””์— ๋‘˜ ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํŒจํ„ด

    • (1) ํŠธ๋žœ์žญ์…˜ ์Šคํฌ๋ฆฝํŠธ - ์„œ๋น„์Šค ๋ฉ”์†Œ๋“œ(PaymentService.prepare)

    • (2) ๋„๋ฉ”์ธ ๋ชจ๋ธ - ๋„๋ฉ”์ธ ๋ชจ๋ธ ์˜ค๋ธŒ์ ํŠธ(Payment)

๋„๋ฉ”์ธ ์˜ค๋ธŒ์ ํŠธ ํ…Œ์ŠคํŠธ

.

๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“œ๋Š” ํ…Œ์ŠคํŠธ

  • ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๊ธฐ๋Šฅ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑ

  • ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ

  • ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉ

  • ํ…Œ์ŠคํŠธ ์ž‘์„ฑ๊ณผ ์‹คํ–‰๋„ ๊ฐœ๋ฐœ ๊ณผ์ •์˜ ์ผ๋ถ€์ด๋‹ค

ํ…œํ”Œ๋ฆฟ

ํ…œํ”Œ๋ฆฟ(Template)

  • ๊ณ ์ •๋œ ์ž‘์—… ํ๋ฆ„ ์•ˆ์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ฝœ๋ฐฑ ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด(Template Method Pattern)

  • ์ƒ์†์„ ์ด์šฉํ•ด์„œ ๊ณ ์ •๋œ ํ…œํ”Œ๋ฆฟ๊ณผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ํ›… ๋ฉ”์†Œ๋“œ ๋“ฑ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ํŒจํ„ด

  • ๊ณ ์ •๋œ ํ‹€์˜ ๋กœ์ง์„ ๊ฐ€์ง„ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๋ฅผ ์Šˆํผํด๋ž˜์Šค์— ๋‘๊ณ , ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์„ ์„œ๋ธŒํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ์— ๋‘๋Š” ๊ตฌ์กฐ

  • ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…(SAM)์˜ ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ๋žŒ๋‹ค ์˜ค๋ธŒ์ ํŠธ

์ฝœ๋ฐฑ(Callback)

  • ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ

  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋˜์ง€๋งŒ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน์ • ๋กœ์ง์„ ๋‹ด์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ชฉ์ 

  • ํ…œํ”Œ๋ฆฟ์— ๋ฉ”์†Œ๋“œ ์ฃผ์ž… ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌ

๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ฃผ์ž…(method call injection)

  • DI์˜ ์ผ์ข…์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ตฌ์„ฑ ์ •๋ณด์— ํฌํ•จ๋˜์ง€ ์•Š๊ณ  ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์‹œ์ ์— ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

  • ์Šคํ”„๋ง์˜ ๋ฃฉ์—… ๋ฉ”์†Œ๋“œ ์ฃผ์ž…(lookup method injection)๊ณผ๋Š” ๋‹ค๋ฅด๊ณ , ๋Ÿฐํƒ€์ž„ ์ƒ์†์„ ํ†ตํ•ด์„œ ๋ฉ”์†Œ๋“œ์˜ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹

ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด(Template Callback Pattern)

  • ์ฝ”๋“œ ์ค‘์—์„œ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉฐ ์ผ์ •ํ•œ ํŒจํ„ด์œผ๋กœ ์œ ์ง€๋˜๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง„ ๋ถ€๋ถ„(ํ…œํ”Œ๋ฆฟ)์„ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์„ฑ์งˆ์„ ๊ฐ€์ง„ ๋ถ€๋ถ„(์ฝœ๋ฐฑ)์œผ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์‹œ์ผœ์„œ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ํ…œํ”Œ๋ฆฟ๊ณผ ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ ์šฉ๋˜๋Š” ์ œ์–ด์˜ ์—ญ์ „์œผ๋กœ ์„ค๋ช… ๊ฐ€๋Šฅ

    • ์ปจํ…์ŠคํŠธ์— ์ „๋žต(์ฝœ๋ฐฑ)์„ ๊ต์ฒดํ•ด์„œ ์“ฐ๋Š” ์ „๋žต ํŒจํ„ด์˜ ํŠน๋ณ„ํ•œ ์ผ€์ด์Šค๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์Œ

    • ์ฝœ๋ฐฑ์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ  ๋Œ€๋ถ€๋ถ„ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋งŒ ๊ฐ€์ง

  • ์ฝœ๋ฐฑ์„ ์ด์šฉํ•ด์„œ ํ™•์žฅ์„ฑ์„ ์ถ”๊ตฌํ•˜๋Š” ๋ฐฉ์‹์€ ์Šคํ”„๋ง์„ ๋งŒ๋“  ๋กœ๋“œ ์กด์Šจ์ด ์“ด J2EE Design And Development์—์„œ ์ฒ˜์Œ ์†Œ๊ฐœ

    • ์ฑ…์—์„œ ์˜ˆ๋กœ๋“  ํ…œํ”Œ๋ฆฟ์€ JDBC๋ฅผ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ์— ์ ์šฉํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง„ JdbcTemplate์ด๊ณ , ํ›„์— ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ํฌํ•จ

ํŒจํ„ด ์ ์šฉ ์ „ ๋ฆฌํŽ™ํ† ๋ง

ํŒจํ„ด ์ ์šฉ

๋””ํดํŠธ ์ฝœ๋ฐฑ๊ณผ ํ…œํ”Œ๋ฆฟ ๋นˆ ์ ์šฉ

์Šคํ”„๋ง ์ œ๊ณต ํ…œํ”Œ๋ฆฟ

RestTemplate

RestTemplate ๋Š” HTTP API ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ…œํ”Œ๋ฆฟ

  • ๊ฐ€์žฅ ์ „ํ˜•์ ์ธ ์Šคํ”„๋ง์˜ ํ…œํ”Œ๋ฆฟ๊ณผ ์ฝœ๋ฐฑ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ ๊ธฐ์ˆ 

  • ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋™๊ธฐ ๋ฐฉ์‹์˜ REST ํด๋ผ์ด์–ธํŠธ ๊ธฐ์ˆ ์˜ ํ•˜๋‚˜

  • GET, POST ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ HTTP API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ์— ํŽธ๋ฆฌ

  • ๋‹ค์–‘ํ•œ HTTP API ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ์ตœ๊ทผ์— ์Šคํ”„๋ง์— ์ถ”๊ฐ€๋œ RestClient์„ ์ด์šฉํ•˜๋ฉด ๋ชจ๋˜ํ•œ API ์Šคํƒ€์ผ๋กœ ๋œ HTTP API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ง€์›

HTTP Client ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™•์žฅ : ClientHttpRequestFactory

  • HTTP Client ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์„œ ClientHttpRequest๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ „๋žต

    • SimpleClientHttpRequest (HttpURLConnection)

    • JdkClientHttpRequest (HttpClient)

    • NettyClientRequest

    • JettyClientRequest

    • OkHttp3ClientReque

Message Body ๋ณ€ํ™˜ ์ „๋žต : HttpMessageConverter

RestTemplate.doExecute()

protected <T> T doExecute(URI url, @Nullable String uriTemplate, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor<T> responseExtractor) throws RestClientException {
  • HTTP API ํ˜ธ์ถœ workflow๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๋กœ ๋‘ ๊ฐœ์˜ ์ฝœ๋ฐฑ์„ ๋ฐ›์Œ

  • RequestCallback

    • void doWithRequestใ—ClientHttpRequest requestใ˜ throws IOException;

  • ResponseExtractor

    • T extractDataใ—ClientHttpResponse responseใ˜ throws IOException;

  • execute(), getForObject(), postForEntity() ๋“ฑ ํŽธ๋ฆฌํ•œ ๋ฉ”์†Œ๋“œ ์ œ๊ณต

RestTemplate ํ™œ์šฉ

In addition

JdbcTemplate

  • SQL ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋“ฑ๋ก, ์ˆ˜์ •, ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ

JdbcClient

  • ์Šคํ”„๋ง 6์—๋Š” JdbcTemplate์„ ์ข€ ๋” ๋ชจ๋˜ํ•˜๊ฒŒ ๋งŒ๋“  JdbcClient๊ฐ€ ์ถ”๊ฐ€

  • JdbcTemplate์—์„œ ์‚ฌ์šฉํ•˜๋Š” RowMapper์™€ ๊ฐ™์€ ์ฝœ๋ฐฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

TransactionTemplate

  • ์Šคํ”„๋ง์˜ ํŠธ๋žœ์žญ์…˜ ์ถ”์ƒํ™” ๊ธฐ์ˆ ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ํŠธ๋žœ์žญ์…˜ ์ž‘์—…์šฉ ํ…œํ”Œ๋ฆฟ

  • @Transactional์ด ์ œ๊ณตํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„์„ค์ • ๊ธฐ๋Šฅ์„ TransactionTemplate์œผ๋กœ๋„ ๋ชจ๋‘ ์ ์šฉ ๊ฐ€๋Šฅ

  • JDBC, JPA, MyBatis, Hibernate ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ธฐ์ˆ ์— ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

JmsTemplate

HibernateTemplate

SqlSessionTemplate

์˜ˆ์™ธ

The Java Tutorials Exceptions

์˜ˆ์™ธ๋Š” ์ •์ƒ์ ์ธ ํ๋ฆ„์˜ ์ง„ํ–‰์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์ด๋ฒคํŠธ

  • ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉ

  • ๋งŽ์€ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜, ๋ฒ„๊ทธ๋กœ ๋ฐœ์ƒ

  • ์žฌ์‹œ๋„, ๋Œ€์•ˆ์„ ํ†ตํ•ด ์˜ˆ์™ธ ์ƒํ™ฉ์„ ๋ณต๊ตฌํ•ด์„œ ์ •์ƒ ํ๋ฆ„์œผ๋กœ ์ „ํ™˜์„ ๋Œ€๋น„

Error

  • ์‹œ์Šคํ…œ์— ๋น„์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ๋˜๊ณ  ์ฃผ๋กœ JVM์—์„œ ๋ฐœ์ƒ

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณต๊ตฌ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†๋Š” ์ข…๋ฅ˜์˜ ์˜ˆ์™ธ์˜ ์Šˆํผ ํด๋ž˜์Šค

  • OutOfMemoryError, ThreadDeath

Exception (checked exception)

  • Exception์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณต๊ตฌ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋ชจ๋“  ์˜ˆ์™ธ์˜ ์Šˆํผ ํด๋ž˜์Šค

    • ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด RuntimeException์ด๋‚˜ ์ ์ ˆํ•œ ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์˜ ์˜ˆ์™ธ๋กœ ์ „ํ™˜ํ•ด์„œ ๋˜์ง€๊ธฐ

  • ์–ธ์ฒดํฌ ์˜ˆ์™ธ/๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒ๋˜๋Š” ์˜ˆ์™ธ๋Š” ์ฒดํฌ ์˜ˆ์™ธ๋กœ ๋ถ„๋ฅ˜

  • ์ฒดํฌ ์˜ˆ์™ธ๋Š” catch๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์žก์•„๋‚ด๋“ ๊ฐ€, ๋ฉ”์†Œ๋“œ์—์„œ throws๋ฅผ ์ •์˜ํ•ด์„œ ๋ฉ”์†Œ๋“œ ๋ฐ–์œผ๋กœ ๋˜์ ธ์•ผ ํ•จ

RuntimeException (unchecked exception)

  • ๋ช…์‹œ์ ์ธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ•์ œ๋˜์ง€ ์•Š์Œ

  • catch/throws๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ๋ฌธ์ œ ์—†์ด ์ปดํŒŒ์ผ

JPA

์ž๋ฐ”์—์„œ RDB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ธฐ์ˆ (JDBC, JPA, MyBatis..)์€ DB์™€์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” DataSource๋ฅผ ์‚ฌ์šฉ

EmbeddedDatabaseBuilder

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์žฅํ˜• DB(H2, HSQL, Derby)๋ฅผ ๋น ๋ฅด๊ฒŒ ์…‹์—…ํ•˜๊ณ  DataSource๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋นŒ๋”

LocalContainerEntityManagerFactoryBean

  • EntityManagerFactory๋ฅผ XML ์—†์ด ์Šคํ”„๋ง์˜ ๋นˆ ์„ค์ •์šฉ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ์—์„œ ๊ฐ„๋‹จํžˆ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

JPA์˜ EntityManager๋Š” EntityManagerFactory๊ฐ€ ์žˆ์–ด์•ผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • Repository, EntityManagerFactory, DataSource ๋Š” Bean์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ๊ด€๋ฆฌ

  • ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ์ž๋™ ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ์ด์šฉํ•ด JPA ์‚ฌ์šฉ ์‹œ EntityManagerFactory, DataSource ๋นˆ์„ ์ž๋™์œผ๋กœ ๋“ฑ๋ก

JPA๋ฅผ ์ด์šฉํ•œ Order ์ €์žฅ

EntityManager์™€ ํŠธ๋žœ์žญ์…˜

์ฝ”๋“œ์— ์˜ํ•ด์„œ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ๊ฐ€์ ธ์™€ JPA์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

// Non-managed environment idiom
EntityManager em = emf.createEntityManager();
EntityTransaction tx = null;
try {
    tx = em.getTransaction();
    tx.begin();

    // do some work
    ...

    tx.commit();
}
catch (RuntimeException e) {
    if ( tx != null && tx.isActive() ) tx.rollback();
    throw e; // or display error message
}
finally {
    em.close();
}

Order ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ ์˜ˆ์™ธ

JDBC๋ฅผ ์ˆ˜ํ–‰์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋Š” SQLException์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ์„œ ๋˜์ ธ์ง„๋‹ค.

JPA๋ฅผ ์ด์šฉํ•˜๋Š” ์ฝ”๋“œ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฃผ๋กœ JDBC์˜ SQLException์„ ๋žฉํ•‘ํ•ด์„œ JPA์˜ ํ‘œ์ค€ ์˜ˆ์™ธ๋กœ ๋งŒ๋“ค์–ด์„œ ๋˜์ ธ์ง„๋‹ค.

  • jakarta.persistence.PersistenceException ํ‘œ์ค€ JPA์˜ ์˜ˆ์™ธ ์•ˆ์— JPA์˜ ๊ตฌํ˜„ ๊ธฐ์ˆ (Hibernate ๋“ฑ)์˜ ์˜ˆ์™ธ๊ฐ€ ๋‹ค์‹œ ๋žฉํ•‘๋˜์–ด์„œ ๋˜์ ธ์ง„๋‹ค

Order ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ ์˜ˆ์™ธ

DataAccessException ์ถ”์ƒํ™”

JDBC SQLException

  • JDBC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ชจ๋“  ๊ธฐ์ˆ ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ

    • JDBC, MyBatis, JPA ...

  • DB ์—๋Ÿฌ์ฝ”๋“œ์— ์˜์กดํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ๊ธฐ์ˆ ์— ์˜์กด์ ์ธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

DataAccessException

  • DB์˜ ์—๋Ÿฌ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์— ๋…๋ฆฝ์ ์ธ ์˜ˆ์™ธ ๊ตฌ์กฐ

  • ์ ์ ˆํ•œ ์˜ˆ์™ธ ๋ฒˆ์—ญ(exception translation) ๋„๊ตฌ๋ฅผ ์ œ๊ณต

์Šคํ”„๋ง์˜ ๋ฐ์ดํ„ฐ ์˜ˆ์™ธ ์ถ”์ƒํ™”๊ฐ€ ์ ์šฉ๋˜๋ฉด JDBC์˜ SQLException, JPA์˜ ์˜ˆ์™ธ ๋“ฑ์ด ์Šคํ”„๋ง์ด ์ •์˜ํ•œ ์˜ˆ์™ธ ๊ณ„์ธต๊ตฌ์กฐ์˜ ์˜ˆ์™ธ๋กœ ๋ฒˆ์—ญ๋˜๊ณ , ์‹ค์ œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋Š” ๋ž˜ํ•‘๋œ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ

๊ธฐ์ˆ ์˜ ๋ณ€ํ™”๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์ž.

-DataAccessException๊ณผ ์˜ˆ์™ธ ์ถ”์ƒํ™”

์„œ๋น„์Šค ์ถ”์ƒํ™”

์ž๋ฐ” ์„œ๋ฒ„ ๊ธฐ์ˆ (J2Ee/JavaEE)์€ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๋ ˆ์ด์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ด์šฉ

์„œ๋น„์Šค

์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋นˆ์ด ์กด์žฌํ•˜๋Š” ๊ณ„์ธต ๊ตฌ์กฐ

.

์„œ๋น„์Šค

  • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋‚˜ ๋ชจ๋“ˆ

  • ์„œ๋น„์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์Œ(stateless)

    • ์ƒํƒœ์—†๋Š” ์‹ฑ๊ธ€ํ†ค ์Šคํ”„๋ง ๋นˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ ํ•ฉ(@Component, @Service)

  • ๋ณดํ†ต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง/๋„๋ฉ”์ธ ๋กœ์ง์˜ ์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ๊ณ„์ธต์„ ์„œ๋น„์Šค ๊ณ„์ธต(Service Layer)์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ๊ทธ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค.

.

์„œ๋น„์Šค์˜ ์ข…๋ฅ˜

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋น„์Šค (application service)

    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์‹œ์ž‘์ , ์ข…๋ฃŒ๊ฐ€ ๋˜๋Š” ๊ฒฝ๊ณ„์— ์žˆ๋Š” ์„œ๋น„์Šค

  • ๋„๋ฉ”์ธ ์„œ๋น„์Šค (domain servic)

    • ๋„๋ฉ”์ธ ๋ชจ๋ธ ํŒจํ„ด์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋กœ๋Š” ํ‘œํ˜„ํ•˜๊ธฐ ํž˜๋“  ๋กœ์ง์„ ๋‹ด๋Š” ์„œ๋น„์Šค

  • ์ธํ”„๋ผ ์„œ๋น„์Šค (infrastructure service)

    • ๋„๋ฉ”์ธ/์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๊ณ , ๊ธฐ์ˆ ์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค

    • ๋ฉ”์ผ, ์บ์‹œ, ํŠธ๋žœ์žญ์…˜, ๋ฉ”์‹œ์ง•..

    • ์„œ๋น„์Šค ์ถ”์ƒํ™”์˜ ๋Œ€์ƒ

Application Service

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋„๋ฉ”์ธ/์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง (๋„๋ฉ”์ธ ์˜ค๋ธŒ์ ํŠธ/์—”ํ‹ฐํ‹ฐ ํ™œ์šฉ)

  • @Service ๋นˆ์œผ๋กœ ๊ตฌ์„ฑ

  • Application/Service ๊ณ„์ธต์— ์กด์žฌ

  • ์ธํ”„๋ผ ์„œ๋น„์Šค์˜ ๋„์›€์ด ํ•„์š”

    • ์ธํ”„๋ผ ๋ ˆ์ด์–ด์— ์กด์žฌํ•˜๋Š” ๊ธฐ์ˆ ์— ๊ฐ€๋Šฅํ•œ ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•จ

  • PaymentService - ExRateService์— ์ ์šฉ๋œ DIP

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋น„์Šค ๋„์ž…

๊ธฐ์ˆ ์— ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค

OrderService

  • ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ  JPA์— ์˜์กด

  • JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Repository, Transaction Manager ์— ์˜์กด

Order

  • @Entity๊ฐ€ ๋ถ™์€ JPA ์—”ํ‹ฐํ‹ฐ๋กœ ์ž‘์„ฑ

    • ์ปดํŒŒ์ผ ์‹œ์ ์—๋งŒ JPA ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กด

  • ํด๋ž˜์Šค ์ฝ”๋“œ์—๋Š” JPA ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์Œ

  • JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„์—๋Š” JPA ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜์ง€ ์•Š์Œ

Order์—์„œ JPA ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ

  • @Entity์€ ์ปดํŒŒ์ผํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ๋งŒ ๊ฐ€์ง

  • ์—”ํ‹ฐํ‹ฐ์˜ ๋™์ž‘์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ธฐ์ˆ ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์™ธ๋ถ€ XML ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์‚ฌ์šฉ

Order์—์„œ JPA ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ

ํŠน์ • ๊ธฐ์ˆ (JPA)์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋น„์Šค

ํŠธ๋žœ์žญ์…˜ ์„œ๋น„์Šค ์ถ”์ƒํ™”

Transaction์€ ๋ฐ์ดํ„ฐ ๊ธฐ์ˆ ์— ๋”ฐ๋ผ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค

  • JDBC

  • JPA

  • MyBatis

  • Jooq

์ถ”์ƒํ™”

  • ๊ตฌํ˜„์˜ ๋ณต์žกํ•จ๊ณผ ๋””ํ…Œ์ผ์„ ๊ฐ์ถ”๊ณ  ์ค‘์š”ํ•œ ๊ฒƒ๋งŒ ๋‚จ๊ธฐ๋Š” ๊ธฐ๋ฒ•

  • ์—ฌ๋Ÿฌ ์ธํ”„๋ผ ์„œ๋น„์Šค ๊ธฐ์ˆ ์˜ ๊ณตํ†ต์ ์ด๊ณ  ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜

  • ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ์ผ๊ด€๋œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ

์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ์ˆ ์˜ ํ•ต์‹ฌ์€ ํŠธ๋žœ์žญ์…˜ ์ถ”์ƒํ™”

๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์— ์ƒ๊ด€์—†์ด ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ํŠธ๋žœ์žญ์…˜ ์ธํ„ฐํŽ˜์ด์Šค์ธ PlatformTransactionManager ์ œ๊ณต

  • PlatformTransactionManager

    • ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ํŠธ๋žœ์žญ์…˜์„ ์œ„ํ•œ ๊ณตํ†ต์ ์ธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ถ”์ƒํ™”

      public interface PlatformTransactionManager extends TransactionManager {
          TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
      
          void commit(TransactionStatus status) throws TransactionException;
      
          void rollback(TransactionStatus status) throws TransactionException;
      }
  • JpaTransactionManager, DataSourceTransactionManager, JtaTransactionManager, HibernateTransactionManager

    • ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ ๊ธฐ์ˆ ๋“ค์„ ์ค‘๊ฐ„์—์„œ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ

ํŠธ๋žœ์žญ์…˜ ์„œ๋น„์Šค ์ถ”์ƒํ™”

JDBC ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ 

JdbcClient

  • Spring 6.1์—์„œ ์ถ”๊ฐ€

  • SQL์„ ์‚ฌ์šฉํ•˜๋Š” JDBC ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋„๋ก ์ง€์›(์ผ์ข…์˜ ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ)

    • SQL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ์•ˆ์ „ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ์ถ”์ƒํ™”๊ฐ€ ์ ์šฉ๋œ DB ์•ก์„ธ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ๊ฐ€๋Šฅ

  • ์Šคํ”„๋ง์˜ JdbcTemplate์˜ ๋Œ€์ฒด

JDBC๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•  ๋•Œ๋Š” JdbcTransactionManager๋ฅผ Transaction Manager Object๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉ

JDBC ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ธฐ์ˆ 

ํŠธ๋žœ์žญ์…˜ ํ…Œ์ŠคํŠธ

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

  • ํŠนํžˆ JDBC์ฒ˜๋Ÿผ ์ž๋™ ์ปค๋ฐ‹์ด ๋˜๊ฑฐ๋‚˜ SpringDataJPA์ฒ˜๋Ÿผ ๊ธฐ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ตฌํ˜„์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์•Œ์•„์„œ ์ ์šฉํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

    • ๋ชจ๋“  ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๋ฉด ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ง„ํ–‰๋œ ๊ฒƒ์ธ์ง€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ชผ๊ฐœ์ง„ ๊ฒƒ์ธ์ง€ ํ™•์ธ์ด ์–ด๋ ค์›€

  • ํŠธ๋žœ์žญ์…˜ ์ค‘๊ฐ„์— ์‹คํŒจํ•˜๋Š” ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋กค๋ฐฑ ์—ฌ๋ถ€๋กœ ํ™•์ธ ๊ฐ€๋Šฅ

แ„แ…ณแ„…แ…ขแ†ซแ„Œแ…ขแ†จแ„‰แ…งแ†ซ แ„แ…ฆแ„‰แ…ณแ„แ…ณ

ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ

์Šคํ”„๋ง์˜ ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ๋Š” ProxyFactoryBean๊ณผ AOP ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค.

แ„แ…ณแ„…แ…ขแ†ซแ„Œแ…ขแ†จแ„‰แ…งแ†ซ แ„‘แ…ณแ„…แ…ฉแ†จแ„‰แ…ต

@Transactional and AOP

์Šคํ”„๋ง์ด ๋งŒ๋“ค์–ด์ฃผ๋Š” ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ

  • @Tranactional์ด ๋ถ™์€ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑ

Spring Proxy AOP

  • AOP๋Š” ์Šคํ”„๋ง์—์„œ ๊ทธ๋‹ค์ง€ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ ํ•ต์‹ฌ ๊ธฐ์ˆ  ์ค‘์˜ ํ•˜๋‚˜

  • ํ™œ์šฉ ์šฉ๋„๊ฐ€ ์ œํ•œ์ ์ด๋ฉด์„œ ๋ง‰์ƒ ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ๋งค์šฐ ์–ด๋ ค์›€

  • ์Šคํ”„๋ง์ด ๋งŒ๋“ค์–ด ๋†“์€ ํŠธ๋žœ์žญ์…˜๊ณผ ๋ณด์•ˆ ๊ธฐ์ˆ ์—์„œ๋Š” ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ

  • ์ง์ ‘ ํ™œ์šฉํ•˜๋ ค๋ฉด ๊ฝค ๋งŽ์€ ํ•™์Šต์ด ํ•„์š”

  • AOP๋Š” ์•„๋‹ˆ๋”๋ผ๋„ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ/ํ”„๋ก์‹œ ํŒจํ„ด์˜ ๋™์ž‘์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด ํ•„์š”ํ•œ ๊ณณ์— ํ™œ์šฉ ๊ฐ€๋Šฅ

@Transactionalแ„€แ…ช AOP

์Šคํ”„๋ง์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœํ•  ๊ฒƒ์ธ๊ฐ€?

์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ์ž‘์—…

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์Šคํ”„๋ง ๋นˆ ์„ ์ •

  • ๊ตฌ์„ฑ์ •๋ณด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ž‘์„ฑ

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ค€๋น„

์Šคํ”„๋ง ๊ตฌ์„ฑ์ •๋ณด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

  • ์Šคํ”„๋ง ๋นˆ์˜ ์ •์˜(ํด๋ž˜์Šค, ์ด๋ฆ„, ์ƒ์„ฑ์ž, ํ”„๋กœํผํ‹ฐ, ์˜คํ† ์™€์ด์–ด๋ง)

  • ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ์ •๋ณด (@Component, @Autowired)

  • ์ž๋ฐ” ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ์ •๋ณด (@Configuration, @Bean)

  • ์ž๋™ ๊ตฌ์„ฑ์ •๋ณด(SpringBoot @AutoConfiguration)

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์ธํ”„๋ผ ๋นˆ ํ™œ์šฉ

  • ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ์ž๋™ ๊ตฌ์„ฑ๊ณผ ํ”„๋กœํผํ‹ฐ ์„ค์ • ํ†ตํ•ด ํ™œ์šฉ ๊ฐ€๋Šฅ

  • ์ž๋™ ๊ตฌ์„ฑ์— ์˜ํ•ด ๋‚ด๋ถ€์—์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋นˆ์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ด

  • ํ”„๋กœํผํ‹ฐ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ด์šฉํ•œ ์ปค์Šคํ† ๋งˆ์ด์ง•

  • @Bean ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์ด์šฉํ•œ ๊ตฌ์„ฑ

  • @Enable๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ

์Šคํ”„๋ง์˜ ๊ฐ ๋ชจ๋“ˆ ๊ธฐ์ˆ  ํ™œ์šฉ

  • ์Šคํ”„๋ง๊ณผ ์ด์— ๋Œ€์‘๋˜๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ํ•™์Šต

  • ํ…Œ์ŠคํŠธ

  • ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค (JDBC, JPA)

  • ์›นMVC

  • REST Client 4๊ฐ€์ง€

  • ํƒœ์Šคํฌ ์‹คํ–‰, ์Šค์ผ€์ค„๋ง

  • ์บ์‹œ

  • ๋ฆฌ์•กํ‹ฐ๋ธŒ

์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ / ์—์ฝ”์‹œ์Šคํ…œ

  • Spring Boot

  • Spring Data

  • Spring Security

  • Spring Cloud

  • Spring Session

  • Spring Integration

  • Spring Modulith

  • Spring Batch

  • Spring AI

  • ..


๋ฒˆ์™ธ. ์Šคํ”„๋ง๊ณผ JDK ์—…๊ทธ๋ ˆ์ด๋“œ

  • ์ƒˆ๋กœ์šด ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ ํ›„ ์ฐธ๊ณ ํ•ด์„œ ๋ณ€๊ฒฝ

    • gradle/wrapper/gradle-wrapper.properties

    • build.gradle

    • settings.gradle

  • ๋ณ€๊ฒฝ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ํ™•์ธ

Last updated