Skip to content

Latest commit

ย 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 

README.md

ํ”„๋ ˆ์ž„ ์›Œํฌ, API, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ”„๋ ˆ์ž„์›Œํฌ

  • ์–ด๋– ํ•œ ๋ชฉ์ ์„ ์‰ฝ๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๋ชฉ์ ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ๋ผˆ๋Œ€๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ๊ฒƒ
  • ๋‚ด๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ์— ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฑ„์›Œ๋„ฃ์œผ๋ฉด ์‹คํ–‰ ํ๋ฆ„์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ฃผ๋„ํ•œ๋‹ค
  • ์ฆ‰ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœ โ†’ ์ œ์–ด ์—ญ์ „ (IoC)
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์›น์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Spring boot๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐ URL์ด ์–ด๋–ค ํ•จ์ˆ˜์— ์—ฐ๊ฒฐ๋˜๋Š”์ง€๋งŒ ์ •ํ•œ๋‹ค๋ฉด ๋‚˜๋จธ์ง€์˜ ํ๋ฆ„์€ ๋ชจ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค

API

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค (Application Programming Interface)
  • 2๊ฐœ ์ด์ƒ์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ปจํฌ๋„ŒํŠธ(๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋ถ€ํ’ˆ) ์‚ฌ์ด์—์„œ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค
  • ํ•˜๋‚˜์˜ ์†Œํ”„ํŠธ์›จ์–ด ์•ˆ์— ์กด์žฌํ•˜๋Š” ์—ฌ๋Ÿฌ ์ปจํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๊ณ (ํ•จ์ˆ˜ ํ˜ธ์ถœ), ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ ์•ˆ์˜ ์—ฌ๋Ÿฌ ์†Œํ”„ํŠธ์›จ์–ด ์ปจํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์˜ ์ปจํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค
  • ๊ทธ๋Ÿฌ๋‚˜ API๋ผ๋Š” ๋ง์€ ์ฃผ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์†Œํ†ตํ•˜๋Š” Web API ํ˜ธํ’€์„ ์˜๋ฏธํ•œ๋‹ค
  • ์†Œํ”„ํŠธ์›จ์–ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ง„ ๊ทœ์น™
  • ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๊ฒฝ์šฐ @PostMapping(), @RequestBody, return ๋“ฑ์„ ์‚ฌ์šฉํ•ด ํ†ต์‹  API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด๋Ÿฐ ์–ด๋…ธํ…Œ์ด์…˜๋“ค๋กœ๋งŒ api๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ์ด์™ธ ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ๋“ค์„ ๋ชจ๋‘ ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
  • ๊ฐœ๋ฐœ์ž๊ฐ€ @PostMapping ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์˜€์„ ๋•Œ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ๋’ค์—์„œ ํ•ด์ฃผ๋Š” ์ผ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค
  1. ๋‚ด์žฅ ์›น ์„œ๋ฒ„ ์‹คํ–‰: ํ†ฐ์บฃ(Tomcat) ๊ฐ™์€ ์›น ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰์‹œ์ผœ์„œ ์ธํ„ฐ๋„ท ์š”์ฒญ์„ ๋ฐ›์„ ์ค€๋น„๋ฅผ ํ•œ๋‹ค
  2. ์š”์ฒญ ๋ถ„์„ (๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ): ๋“ค์–ด์˜จ HTTP ์š”์ฒญ์˜ URL("/hello")๊ณผ ๋ฉ”์„œ๋“œ(POST)๋ฅผ ๋ณด๊ณ , ์–ด๋–ค ์ฝ”๋“œ(@PostMapping์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ)์—๊ฒŒ ์ผ์„ ์‹œ์ผœ์•ผ ํ• ์ง€ ์ •ํ™•ํžˆ ์ฐพ์•„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค
  3. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ (JSON โ†’ DTO): @RequestBody๋ฅผ ๋ณด๋ฉด, ์š”์ฒญ ๋ฉ”์‹œ์ง€์— ๋‹ด๊ฒจ ์˜จ JSON ํ˜•์‹์˜ ํ…์ŠคํŠธ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์ž๋ฐ” ๊ฐ์ฒด(DTO)๋กœ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค โ†’ ์—ญ์ง๋ ฌํ™”(Deserialization)
  4. ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ (๊ฐ์ฒด โ†’ JSON): ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”์„œ๋“œ์—์„œ ๊ฐ์ฒด(DTO)๋ฅผ returnํ•˜๋ฉด ์ด๊ฒƒ์„ ๋‹ค์‹œ JSON ํ˜•์‹์˜ ํ…์ŠคํŠธ๋กœ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‘๋‹ต ๋ฉ”์‹œ์ง€์— ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค โ†’ ์ง๋ ฌํ™”(Serialization)

์ฆ‰, ์Šคํ”„๋ง๋ถ€ํŠธ์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ๋ฐ˜๋ณต์ ์ธ ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ž‘์—…์„ ์Šคํ”„๋ง๋ถ€ํŠธ์—๊ฒŒ ์ผ์ž„ํ•œ๋‹ค

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ํ•จ์ˆ˜, ํด๋ž˜์Šค, ๊ฐ์ฒด๋“ค์„ ๋ชจ์•„๋‘” ๋„๊ตฌ๋“ค
  • ๊ฐœ๋ฐœ์ž๋Š” ํ•„์š”ํ•  ๋•Œ ์ง์ ‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์ œ์–ด๊ถŒ์ด ํ•ญ์ƒ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์žˆ๋‹ค

์ œ์–ด ์—ญ์ „๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…

IoC

  • ์ œ์–ด ์—ญ์ „
  • ์ œ์–ด ์—ญ์ „์„ ์‹คํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜ = ์˜์กด์„ฑ ์ฃผ์ž… (DI, Dependency Injection))

DI

  • ์˜์กด์„ฑ ์ฃผ์ž…
  • ๊ฐ์ฒด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ(์˜์กด์„ฑ)์„ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ
  • ์˜์กด์„ฑ์ด๋ž€ ํ•œ ๊ฐ์ฒด๊ฐ€ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค
  • ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์„ธ ๊ฐ€์ง€์˜ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜๋‹ค

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

  • ์˜ˆ๋ฅผ ๋“ค์–ด '์ปคํ”ผ ๋จธ์‹ ' ํด๋ž˜์Šค๋ฅผ ์œ„ํ•ด '์›๋‘'๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•  ๊ฒฝ์šฐ
  • '์›๋‘'๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์•„๋ž˜ '์›๋‘'๋ฅผ ์ƒ์†๋ฐ›๋Š” ์—ฌ๋Ÿฌ ์›๋‘ ํด๋ž˜์Šค(์—ํ‹ฐ์˜คํ”ผ์•„ ์›๋‘, ์ผ€๋ƒ ์›๋‘ ๋“ฑ๋“ฑ)๋ฅผ ์ž‘์„ฑํ•œ๋‹ค
  • ์ปคํ”ผ ๋จธ์‹  ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค '์›๋‘'๋ฅผ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋กœ ์‚ฌ์šฉํ•œ๋‹ค
public class CoffeeMachine {

    // ์ธํ„ฐํŽ˜์ด์Šค ์•ˆ์— ์ฑ„์›Œ์ง€๋Š” ๊ฐ์ฒด๋Š” ์™ธ๋ถ€์—์„œ ๋งŒ๋“ค์–ด์ ธ ์ฃผ์ž…๋จ(์˜์กด์„ฑ ์ฃผ์ž…)
    private CoffeeBean coffeeBean;

    // ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์Œ
    public CoffeeMachine(CoffeeBean coffeeBean) {
        this.coffeeBean = coffeeBean;
    }

    // coffeeBean์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ coffeeBean ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋จ
    // ๊ทธ๋Ÿฌ๋‚˜ CoffeeMachine์€ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด ์•ˆ์— ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์˜ฌ ์ง€ ์•Œ ์ˆ˜ ์—†๊ณ  ์•Œ ํ•„์š”๋„ ์—†์Œ
    public void brew() {
        coffeeBean.brew();
    }
}

2. ์˜์กด๊ด€๊ณ„๋Š” ์ œ 3์ž๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค

  • ์œ„์˜ ์ปคํ”ผ ๋จธ์‹ ์—์„œ ์–ด๋–ค ์›๋‘๋ฅผ ์‚ฌ์šฉํ•  ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ(์ œ 3์ž)๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค
  • ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ปจํ…Œ์ด๋„ˆ๋Š” @Component, @Service ๋“ฑ์˜ ์Šคํ”„๋ง Bean ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์Šค์บ”ํ•œ ๋’ค ํ•„์š”ํ•œ ๋ถ€ํ’ˆ๋“ค์„ ๋ฏธ๋ฆฌ ๋‹ค ๋งŒ๋“ค์–ด๋‘”๋‹ค

3. ์˜์กด๊ด€๊ณ„๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•œ๋‹ค

  • ์œ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•œ ๋ถ€ํ’ˆ๋“ค์€ CoffeeMachine ํด๋ž˜์Šค์˜ ์™ธ๋ถ€(์ปจํ…Œ์ด๋„ˆ)๋กœ ๋ถ€ํ„ฐ ์ฃผ์ž…๋œ๋‹ค
  • ์ฃผ์ž…์„ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์€ @Autowired
  • ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ์‹์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค
  1. ์ƒ์„ฑ์ž ์ฃผ์ž… : ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…. ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค (์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ @Autowired ์ƒ๋žต ๊ฐ€๋Šฅ/๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹)
  2. ์ˆ˜์ •์ž ์ฃผ์ž… : ์„ธํ„ฐ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ์— @Autowired๋ฅผ ๋ถ™์—ฌ ์ฃผ์ž…
  3. ํ•„๋“œ ์ฃผ์ž… : ๋ณ€์ˆ˜ ์ž์ฒด์— @Autowired๋ฅผ ๋ฐ”๋กœ ๋ถ™์—ฌ์„œ ์ฃผ์ž…
  • ์ด๋ฅผ ํ†ตํ•ด CoffeeMachine์€ CoffeeBean๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๊ธฐ์— ์›ํ•œ๋‹ค๋ฉด ๊ตฌ์ฒด์ ์ธ ์›๋‘ ํด๋ž˜์Šค๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์ด๋‹ค

์ฆ‰, ์›๋ž˜๋ผ๋ฉด CoffeeMachine ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ์›ํ•˜๋Š” ์›๋‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ์–ด ์—ญ์ „์œผ๋กœ ์ธํ•ด CoffeeMachine๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ปคํ”ผ ์›๋‘๋ฅผ ์ƒ์„ฑํ•˜๊ณ  CoffeeMachine ๋‚ด๋กœ ์ฃผ์ž…ํ•ด์ค€๋‹ค

์ด์ฒ˜๋Ÿผ ๊ฐ ๊ฐ์ฒด๋ผ์ง€์˜ ์˜์กด์„ฑ์ด ์กด์žฌํ•  ๋•Œ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์œผ๋ฉด ์˜์กด๊ด€๊ณ„๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๊ฐœ๋ฐœ์ž์˜ ๋ถ€๋‹ด์ด ์ค„์–ด๋“ ๋‹ค


์„œ๋ธ”๋ฆฟ

์ž๋ฐ” ์„œ๋ธ”๋ฆฟ

  • ์›น ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์„œ๋ฒ„ ์ธก(์Šคํ”„๋ง๋ถ€ํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธก) ํ”„๋กœ๊ทธ๋žจ
  • ๊ธฐ์กด์˜ ์„œ๋ฒ„๋Š” ์ •์ ์ธ ์ž๋ฃŒ๋งŒ์„ ์ฃผ๊ณ ๋ฐ›์•˜๋‹ค
  • ๊ทธ๋Ÿฌ๋‚˜ ์›น์— ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์š”๊ตฌ๋˜๋ฉด์„œ ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์— ๋งž์ถ˜ ๋™์ ์ธ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์ƒ๊ฒผ๋‹ค
  • ์ด๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์„œ๋ธ”๋ฆฟ์ด๋ฉฐ ์ž๋ฐ”์—์„œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค

์„œ๋ธ”๋ฆฟ์˜ ๋™์ž‘ ๋ฐฉ์‹

์ „ํ†ต์ ์ธ ๋™์ž‘ ๋ฐฉ์‹

  1. ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ์„œ ์š”์ฒญ(HTTP Request)๊ฐ€ ๋‚ ์•„์˜จ๋‹ค
  2. ์„œ๋ธ”๋ฆฟ ๋งค๋‹ˆ์ €๋Š” ํ•ด๋‹น ์š”์ฒญ์˜ web.xml ํŒŒ์ผ์„ ๋ณด๊ณ  ๋‹ด๋‹น ์„œ๋ธ”๋ฆฟ์„ ํ™•์ธํ•œ ๋’ค HttpServletRequest๋ฅผ ๋‹ด๋‹น ์„œ๋ธ”๋ฆฟ์—๊ฒŒ ๋„˜๊ฒจ์ค€๋‹ค
  3. ๋‹ด๋‹น ์„œ๋ธ”๋ฆฟ์€ ์„œ๋น„์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๋กœ์ง์„ ์‹คํ–‰ํ•œ๋‹ค
  4. ์„œ๋ธ”๋ฆฟ์€ ์™„์„ฑ๋œ ๊ฒฐ๊ณผ๋Š” HttpServletResponse์— ๋‹ด์•„ ์„œ๋ธ”๋ฆฟ ๋งค๋‹ˆ์ €์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค
  5. ์‚ฌ์šฉ์ด ๋๋‚œ HttpServletRequest์™€ HttpServletResponse๋ฅผ ์‚ญ์ œํ•œ๋‹ค

์Šคํ”„๋ง ๋™์ž‘ ๋ฐฉ์‹

  1. ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ์„œ ์š”์ฒญ(HTTP Request)๊ฐ€ ๋‚ ์•„์˜จ๋‹ค
  2. DispatcherServlet๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ URL์„ ๋ณด๊ณ  ๋‹ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ํ•ด๋‹น ์š”์ฒญ์„ ๋„˜๊ธด๋‹ค
  3. ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋กœ์ง์ด ์‹คํ–‰๋œ๋‹ค
  4. ์™„์„ฑ๋œ ๊ฒฐ๊ณผ๋Š” View ํ˜น์€ JSON์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค
  5. DispatcherServlet์€ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ HTTP Response๋กœ ์ „๋‹ฌํ•œ๋‹ค

์ฐจ์ด์ 

  • ์Šคํ”„๋ง ๋™์ž‘ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐ URL ์š”์ฒญ๋งˆ๋‹ค ๋‹ด๋‹น ์„œ๋ธ”๋ฆฟ์„ ์ง€์ •ํ•  ํ•„์š” ์—†์ด DispatcherServlet์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ์ฐฝ๊ตฌ๊ฐ€ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ๋ถ„๋ฐฐํ•œ๋‹ค
  • ๊ฐœ๋ฐœ์ž๋Š” HttpServletRequest, Response ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๋ฉฐ ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ์ „ ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค
  • web.xml ํŒŒ์ผ์— ์–ด๋–ค URL์„ ์–ด๋–ค ์„œ๋ธ”๋ฆฟ์ด ์ฒ˜๋ฆฌํ• ์ง€ ์ผ์ผ์ด ๋“ฑ๋กํ•  ํ•„์š” ์—†์ด @GetMapping, @PostMapping ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ URL์„ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ

  • ์„œ๋ธ”๋ฆฟ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์—ญํ• 
  • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ํ˜ธ์ถœ, ์ข…๋ฃŒํ•˜๋Š” ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค
  • ๋Œ€ํ‘œ์ ์ธ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ†ฐ์บฃ์ด ์žˆ๋‹ค
  • ํ†ฐ์บฃ์€ ์‹ค์ œ๋กœ ์›น ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋ฉฐ Java Server Page์™€ ์„œ๋ธ”๋ฆฟ์ด ์ž‘๋™ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด์ค€๋‹ค
  • ์›๋ž˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ์†Œํ†ต์„ ์œ„ํ•ด์„œ๋Š” Socket์„ ๋งŒ๋“ค๊ณ , listen(), accept(), connect() ๋“ฑ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค
  • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ API๋กœ ์ œ๊ณตํ•˜์—ฌ ๊ฐ„ํŽธํ™”ํ•˜์˜€๋‹ค

Bean

Bean

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ”์˜ ๊ฐ์ฒด
  • ์Šคํ”„๋ง์€ ๋นˆ์„ ํ†ตํ•ด ๊ฐ์ œ๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•œ ํ›„ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค
  • ์Šคํ”„๋ง์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์กด์žฌ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์ด "์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ"์ด๋‹ค
  • ์Šคํ”„๋ง์€ ์›น์—์„œ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘ํ•  ๋•Œ ๋งŒ๋“ค์–ด ์ž๊ธฐ๋“ค๋ผ๋ฆฌ ์•Œ์•„์„œ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค
  • ์Šคํ”„๋ง ๋นˆ์˜ ๋ฒ”์œ„๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฐ์ฒด์ด๋‹ค
  • ๊ทธ ๋ฒ”์œ„๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ถ€ํ„ฐ Controller ๊ณ„์ธต ์ „์ฒด, Service ๊ณ„์ธต ์ „์ฒด, Repository ๊ณ„์ธต ์ „์ฒด๋กœ ๋‹ค์–‘ํ•˜๋‹ค
  • ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์ฝ”๋“œ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค

์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์ฃผ์ž…

  • @Component โ†’ @Autowired
  • ์Šคํ”„๋ง์—์„œ๋Š” new ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•œ๋‹ค
  • @Controller, @Service, @Repository ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜๋“ค ์•ˆ์— ๋ช…์‹œ์ ์œผ๋กœ @Component ์–ด๋…ธํ…Œ์ด์…˜์ด ๋“ค์–ด์žˆ๋‹ค
  • ์ฆ‰ @Component ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์Šคํ”„๋ง์€ @Controller, @Service, @Repository ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋“ค์„ ์Šค์บ”ํ•˜๋ฉฐ Bean์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค

๋ช…์‹œ์  ๋นˆ ์ •์˜

  • @Configuration โ†’ @Bean
  • @Configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ Bean์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค์— @Configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ฃผ๊ณ  ์–ธํ•˜๋Š” ๋ฉ”์†Œ๋“œ์— @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ ์›ํ•˜๋Š” ๋นˆ์˜ ์ƒ์„ฑ, ์†Œ๋ฉธ์„ ์„ค์ •์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํ•ด๋‹น ๋ฐฉ๋ฒ•์˜ ์žฅ์ ์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค (์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ์— @Component๋ฅผ ๋ถ™์ผ ์ˆ˜๋Š” ์—†์Œ)

์ฆ‰, IoC(์ œ์–ด ์—ญ์ „) ์ปจํ…Œ์ด๋„ˆ๋Š” ์œ„์˜ ๋ชจ๋“  ๊ณผ์ •์„ ๊ฑฐ์ณ POJO(Plain Old Java Object, ์ˆœ์ˆ˜ ์ž๋ฐ” ๊ฐ์ฒด) ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค!


SOLID์™€ AOP

SOLID

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์œ ์—ฐํ•˜๊ณ  ์œ ์ง€/๋ณด์ˆ˜ํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ 5๊ฐ€์ง€ ์„ค๊ณ„ ์›์น™

  1. S : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™. ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž
  2. O : ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™. ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๊ณ  ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  3. L : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™. ํ•˜์œ„ ํƒ€์ž…์€ ์–ธ์ œ๋‚˜ ์ƒ์œ„ ํƒ€์ž…์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ๋Œ€์ฒดํ–ˆ์„ ๋•Œ, ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค (์ž์‹์€ ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ์˜ ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•  ๊ฒƒ)
  4. I : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๋ฉฐ ๊ตฌ์ฒดํ™” ์‹œ, ๋ถˆํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ ๋œ๋‹ค.
  5. D : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™. ์–ธ์ œ๋“  ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ธ๋ถ€์ ์ธ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ์ถ”์ƒํ™”(์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค

์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™๊ณผ ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์˜ ๋‚ด์šฉ์€ ์ด์–ด์ง€๋Š” ๋‚ด์šฉ - ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™(DIP)์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ „์ œ ์กฐ๊ฑด์ด ๋ฐ”๋กœ ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™(LSP)์ด๋‹ค

AOP

  • AOP(๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ 'ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง'๊ณผ ์—ฌ๋Ÿฌ ๊ณณ์— ํฉ์–ด์ ธ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” '๊ณตํ†ต ๊ธฐ๋Šฅ'์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹
  • ์Šคํ”„๋ง์—์„œ๋Š” ์ฃผ๋กœ ๋กœ๊ทธ ๊ธฐ๋ก, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ, ๋ณด์•ˆ ๊ฒ€์‚ฌ ๊ฐ™์€ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ AOP๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์ฝ”๋“œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค