[TIL] ๐ŸŒฑ SpringBoot ๋ฐฐ์› ๋˜ ๋‚ด์šฉ ์ •๋ฆฌํ•˜๊ธฐ

์œค๊ฒฝยท2021๋…„ 8์›” 21์ผ
1

Spring Boot

๋ชฉ๋ก ๋ณด๊ธฐ
26/79
post-thumbnail
post-custom-banner

์ง€๊ธˆ๊นŒ์ง€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  java์ฝ”๋“œ๋กœ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ดค๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ๋ฅผ ์ ์šฉํ•ด SOLID ์›์น™์„ ์ค€์ˆ˜ํ•˜๋„๋ก ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ค๋ช…ํ•ด๋ณด๋ผ๊ณ  ํ•˜๋ฉด ... ๋ชป ํ•  ๊ฒƒ ๊ฐ™๋‹ค !!
๊ทธ๋ž˜์„œ !! ์˜ค๋Š˜์€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ญ‰ ์‚ดํŽด๋ณด๋ฉฐ ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ ค๊ณ  ํ•œ๋‹ค.


์ฐธ๊ณ  ํฌ์ŠคํŠธ

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์™œ ์“ธ๊นŒ?

๊ฐ์ œ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
(๊ทธ๋ž˜์„œ ๋Œ€๊ทœ๋ชจ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.)

โœ”๏ธ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ด?

์ด๋Š” ๋‹คํ˜•์„ฑ์„ ์ด์•ผ๊ธฐํ•œ๋‹ค. ๋‹คํ˜•์„ฑ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ด์•ผ๊ธฐํ•œ๋‹ค.

์ „์— ๋“ค์—ˆ๋˜ ์˜ˆ์‹œ๋ฅผ ๋Œ์ด์ผœ๋ณด์ž.

๋กœ๋ฏธ์˜ค์™€ ์ค„๋ฆฌ์—ฃ๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ์— ๋Œ€ํ•œ ์˜ˆ์‹œ๊ฐ€ ๊ธฐ์–ต๋‚˜๋Š”๊ฐ€? ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๊ฐ•์กฐํ–ˆ์—ˆ๋‹ค.

๋กœ๋ฏธ์˜ค์˜ ์—ญํ• , ์ค„๋ฆฌ์—ฃ์˜ ์—ญํ• ์€ ์–ด๋–ค ๋ฐฐ์šฐ๊ฐ€ ๋งก๋“  ๋Œ€์ฒด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋‹ค๊ณ  ํ‘œํ˜„ํ–ˆ๋‹ค.

์ด๋ฅผ ์ž๋ฐ”์˜ ์‹œ์„ ์œผ๋กœ ๋ณด๋ฉด ์—ญํ• ์€ ์ธํ„ฐํŽ˜์ด์Šค, ๊ตฌํ˜„์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค, ๊ตฌํ˜„ ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ๊ทธ๋ž˜์„œ ๋ญ, ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๋ญ๊ฐ€ ์ข‹๋‹ค๋Š”๊ฑฐ์•ผ?

์ด๋ ‡๊ฒŒ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์„œ๋ฒ„์˜ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
์Šคํ”„๋ง์—์„œ IoC(์ œ์–ด์˜ ์—ญ์ „), DI(์˜์กด๊ด€๊ณ„ ์ฃผ์ž…)๋„ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ด ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ  ํฌ์ŠคํŠธ

โญ๏ธ SOLID ์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™

SRP ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

: Single responsibility principle

  • ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ๋‹ค๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ

โญ๏ธ OCP ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™

: Open/closed principle

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

LSP ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

: Liskov substitution principle

  • ํ”„๋กœ๊ทธ๋žจ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋‹คํ˜•์„ฑ์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ทœ์•ฝ์„ ๋‹ค ์ง€์ผœ์•ผ ํ•œ๋‹ค. ์ฆ‰, ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—‘์…€์€ ํ›„์ง„์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

ISP ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

: Interface segregation principle

  • ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค.
    ์ฆ‰, ํ•˜๋‚˜์— ๋ชฐ์•„๋„ฃ์ง€ ๋ง๊ณ  ์ž˜ ์ชผ๊ฐœ์–ด๋ณด์ž.
  • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ , ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

โญ๏ธ DIP ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™

: Dependency inversion principle

  • ๊ตฌํ˜„ ํด๋ž˜์Šค(๊ตฌํ˜„)์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์ธํ„ฐํŽ˜์ด์Šค(์—ญํ• )์— ์˜์กดํ•˜๋ผ

์ฐธ๊ณ  ํฌ์ŠคํŠธ

DI: Dependency Injection

์˜์กด๊ด€๊ณ„ ์ฃผ์ž… or ์˜์กด์„ฑ ์ฃผ์ž…

๋กœ๋ฏธ์˜ค์™€ ์ค„๋ฆฌ์—ฃ๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ ์˜ˆ์‹œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์—ญํ• ์€ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์—ญํ• ์„ ๋ˆ„๊ฐ€ ๋งก์„์ง€๋Š” ๋ˆ„๊ฐ€ ์ •ํ•ด์ฃผ์ง€?

๐Ÿค”: ๋กœ๋ฏธ์˜ค๊ฐ€ ์ค„๋ฆฌ์—ฃ์„ ์„ญ์™ธํ•˜๊ฑฐ๋‚˜ ์ค„๋ฆฌ์—ฃ์ด ๋กœ๋ฏธ์˜ค๋ฅผ ์„ญ์™ธํ•ด์•ผํ•˜๋‚˜?

๋ง๋„ ์•ˆ๋˜๋Š” ์†Œ๋ฆฌ. ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ์ฃผ์ง€ ๋ง์ž -`ะดยด-!!
๋ณ„๋„์˜ ๊ณต์—ฐ ๊ธฐํš์ž(AppConfig)๋ฅผ ๋ชจ์‹œ์ž

Appconfig๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ๋™์ž‘ ๋ฐฉ์‹์„ ๊ตฌ์„ฑ(config)ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ ๊ฐ์ฒด ์ƒ์„ฑ/์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์ž…์žฅ์—์„œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋ ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. = ๋งก์€ ์ผ์ด ์ค„์–ด๋“ฆ. (์‹คํ–‰์—๋งŒ ์ง‘์ค‘)


์ฐธ๊ณ  ํฌ์ŠคํŠธ

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

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ = ์ธํ„ฐํŽ˜์ด์Šค = ApplicationContext

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

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

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๊ณผ์ •
1. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
2. ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก
3. ์Šคํ”„๋ง ๋นˆ ์˜์กด๊ด€๊ณ„ ์„ค์ • (์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ค์ • ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•ด ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…(DI)ํ•œ๋‹ค.)


์ฐธ๊ณ  ํฌ์ŠคํŠธ

BeanFactory & ApplicationContext

BeanFactory๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฒƒ์ด ApplicationContext
(BeanFactory + ๋ถ€๊ฐ€๊ธฐ๋Šฅ)

โœ”๏ธ BeanFactory

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค
  • ์—ญํ• : ์Šคํ”„๋ง ๋นˆ ๊ด€๋ฆฌ, ์กฐํšŒ

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ ๊ธฐ๋Šฅ ๋Œ€๋ถ€๋ถ„์€ BeanFactory ์ œ๊ณต ๊ธฐ๋Šฅ

โœ”๏ธ ApplicationContext

  • BeanFactory๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฒƒ์ด ApplicationContext
    (BeanFactory + ๋ถ€๊ฐ€๊ธฐ๋Šฅ)

๐Ÿ“Œ ApplicationContext ๋ถ€๊ฐ€๊ธฐ๋Šฅ

  • ๊ตญ์ œํ™” ๊ธฐ๋Šฅ
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฒคํŠธ
  • ํŽธ๋ฆฌํ•œ ๋ฆฌ์†Œ์Šค ์กฐํšŒ

BeanFactory, ApplicationContext = ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ


๐Ÿ“Œ ๋‹จ์ถ•ํ‚ค (mac)

command + ,(๋ฐ˜์ ): preferences

preferences โ†’ keymap ๊ฒ€์ƒ‰: ๋‹จ์ถ•ํ‚ค ํ™•์ธ

command + shift + enter: tap ์น  ๋•Œ ;(์„ธ๋ฏธ์ฝœ๋ก )๊นŒ์ง€ ๋„ฃ์–ด ํ•œ ์ค„ ์™„์„ฑ

psvm + enter: public static void main(String[] args){} ์ƒ์„ฑ

command + n: toString() ์„ ๊ฒ€์ƒ‰ํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ (์ถœ๋ ฅ์„ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ•จ)

command + shift + t: ํ…Œ์ŠคํŠธ ์ƒ์„ฑ

option + enter + Add static import - : Assertions.assertThat์„ static์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

profile
๊ฐœ๋ฐœ ๋ฐ”๋ณด ์ด์‚ฌ ์ค‘
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€