[ @Controller์™€ @RestController ]

 

Spring - @Controller์™€ @RestController ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ์ฝ”๋“œ

[ SpringMVC์— ๋Œ€ํ•˜์—ฌ ] Spring - Spring MVC๋ฅผ ์•Œ์•„์•ผ ์‹œ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.์ฒ˜์Œ์—” ๋Œ€์ถฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๋ คํ–ˆ์ง€๋งŒ,์ด๋Ÿด์ˆ˜๊ฐ€! ์•„๋Š” ๊ฒƒ์ด ๋ฏธ์•ฝํ•˜๋‹ˆ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์œผ๋กœ ์•Œ์•„์•ผํ•˜๋Š”

post-this.tistory.com

 

 

 

 

[ Hello,World ์ถœ๋ ฅํ•˜๊ธฐ ]

 

Spring - [IntelliJ] Hello World ์ถœ๋ ฅํ•˜๊ธฐ

[ Spring MVC์— ๋Œ€ํ•˜์—ฌ ] Spring - Spring MVC๋ฅผ ์•Œ์•„์•ผ ์‹œ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.์ฒ˜์Œ์—” ๋Œ€์ถฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๋ คํ–ˆ์ง€๋งŒ,์ด๋Ÿด์ˆ˜๊ฐ€! ์•„๋Š” ๊ฒƒ์ด ๋ฏธ์•ฝํ•˜๋‹ˆ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์œผ๋กœ ์•Œ์•„์•ผํ•˜๋Š”

post-this.tistory.com

 


 

 

Controller ์•ˆ์—
@GetMapping( )์ด๋ผ๋Š” ์กด์žฌ์˜€๋‹ค.


๊ณผ์—ฐ @GetMapping์€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

 

 

 

๋ฐ์ดํ„ฐ์—๋Š” ๋‘๊ฐ€์ง€ ์ „์†ก๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

 

 

GET

  • URL(์ฃผ์†Œ)์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ์‹œ์ผœ ๋ณด๋‚ธ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋Š” ํ—ค๋”์— ํฌํ•จ๋˜์–ด์žˆ๋‹ค.
  • URL์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜์–ด ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค.
  • ์บ์‹ฑ(๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊นŒ์šด ๊ณณ์— ์ž„์‹œ๋กœ ์ €์žฅํ•œ ํ›„, ๋น ๋ฅด๊ฒŒ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ”„๋กœ์„ธ์Šค)ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฃผ๋กœ ์กฐํšŒ, ๊ฒ€์ƒ‰ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

POST

  • URL(์ฃผ์†Œ)์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋””์— ํฌํ•จํ•œ๋‹ค.
  • URL์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜์–ด์žˆ์ง€ ์•Š์•„ GET๋ฐฉ์‹ ๋ณด๋‹จ ๋ณด์•ˆ์ด ๋†’๋‹ค.
  • ์บ์‹ฑ((๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊นŒ์šด ๊ณณ์— ์ž„์‹œ๋กœ ์ €์žฅํ•œ ํ›„, ๋น ๋ฅด๊ฒŒ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ”„๋กœ์„ธ์Šค)ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์ €์žฅ, ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 


 

 

 

 

@GetMapping( )

  • Get ์š”์ฒญ์„ ํ•˜๋Š” API ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.
  • ๊ฒฝ๋กœ ๋งคํ•‘์— ๋”ฐ๋ผ ์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
    (๋งคํ•‘, ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ • ํ˜น์€ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งํ•œ๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, ๊ฐ•๋‚จ ๋ง›์ง‘์„ ๊ฒ€์ƒ‰ํ–ˆ์„์‹œ ๊ฐ•๋‚จ์— ์žˆ๋Š” ๋ชจ๋“  ์‹๋‹น์ด ๊ฒ€์ƒ‰๋˜๋Š” ๊ฒฝ์šฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋งค์นญ์€ ํ‚ค = 180cm ์ผ๋Œ€์ผ๋กœ ๋งž๋Š” ๊ฒฝ์šฐ)
  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฐ˜ํ™˜๊ฐ’์€ ํ•˜๋‚˜์ง€๋งŒ ๊ฒฝ๋กœ๋Š” ๋‹ค์ค‘์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

 

์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•ด๋ณด์ž.

 

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ํŽ˜์ด์ง€ ๋ฐ˜ํ™˜์€ ์•„๋‹ˆ๊ณ  @RestController(์ง๋ ฌํ™”๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด์ด ํŽ˜์ด์ง€์— ๋ณด์ด๊ฒŒ ํ•ด์ฃผ๋Š”)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ์˜ ์ผ๋ถ€์ด๋‹ค.

Controller ๋‚ด๋ถ€ ์ฝ”๋“œ

@GetMapping("")
    public String helloWorld() {
        return "Hello, World";
	}

 

  1. @GetMapping("")์œผ๋กœ ("")์— ๊ฒฝ๋กœ๊ฐ€ ์ ํ˜€์žˆ์ง€ ์•Š์•„ ๋ฃจํŠธ๋ฅผ(๋ฉ”์ธ ํŽ˜์ด์ง€) ์˜๋ฏธํ•œ๋‹ค.
  2. @GetMapping("") = ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์ธ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด
  3. "Hello, World"๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋ผ. (@RestController๋ฅผ ์ด์šฉํ•˜์—ฌ)

 

 

 

๊ทธ๋Ÿฌ๋ฉด ์ด๋ฒˆ์—” ํŽ˜์ด์ง€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ ์‚ดํŽด๋ณด์ž.

 

Controller ๋‚ด๋ถ€ ์ฝ”๋“œ

@GetMapping("")
public String homePage() {
    return "First";
}

 

  1. page๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ .html ํ˜น์€ .jsp๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
  2. ๋ฃจํŠธ ๊ฒฝ๋กœ("")๋กœ ๋“ค์–ด๊ฐ„๋‹ค๋ฉด
  3. First๋ผ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ๋Š” ๋ช…๋ น์ด DispatcherServlet์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค.
  4. DispatcherServlet์€ ViewResolver๋กœ ์ „๋‹ฌํ•˜๊ณ 
  5. ViewResolver๊ฐ€ First๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํŽ˜์ด์ง€๋ฅผ ์ฐพ์•„ ์ตœ์ข…์ ์œผ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋„๋ก ํ•œ๋‹ค.

 

 


 

 

 

 

@RequestMapping

  • ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ์ง€์ •๊ฐ€๋Šฅํ•˜๋‹ค.
  • value, method, params, headers, consumes, produces์˜ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๊ทธ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ Get, Post ๋“ฑ ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์†์„ฑ์ด ํ•˜๋‚˜๋ผ๋„ ๋‹ฌ๋ผ์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ Handler๊ฐ€ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด @RequestMapping์—์„œ ์กฐํšŒํ•˜๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ ํŽธ๋ฆฌํ•˜๋„๋ก ๋งŒ๋“ค์–ด๋‚ธ ๋ฒ„์ „์„ @GetMapping ๋“ฑ.. ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

 

์ด๊ฒƒ๋„ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด์ž.

@RequestMapping(value = "", method = RequestMethod.GET)
public String helloWorld() {
    return "Hello,Wrold!";
}

=

@GetMapping("")
    public String helloWorld() {
        return "Hello, World";
    }

 

@RequestMapping์€ method์— .GET์œผ๋กœ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ• ๊ฑด์ง€ ๋ช…์‹œํ•˜๊ณ  ์žˆ๋‹ค. 

 

๋” ์ž์„ธํ•œ ๊ฑด ๋‚˜์ค‘์— ์ž‘์„ฑํ•˜๊ฒ ๋‹ค.

 

 

 


 

 

 

 

๋ชฉ์ ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์–ด๋…ธํ…Œ์ด์…˜

  • @PostMapping =  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒŒ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. (Post์˜ ํŠน์ง•์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ ๊ฒƒ)
  • @PutMapping = ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ๊ฐฑ์‹ ํ•˜๋‹ค.
  • @DeleteMapping = ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • @PatchMapping = ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ˆ˜์ •๋œ ๋ถ€๋ถ„๋งŒ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

@GetMapping์„ ํฌํ•จํ•˜์—ฌ ์œ„์˜ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์€ @RequestMapping์—์„œ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋” ํŽธ๋ฆฌํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. @RequestMapping์—์„œ ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ์กฐํ•ฉํ•ด ์›ํ•˜๋Š” ์ž‘๋™๋ฐฉ์‹์„ ๋งŒ๋“ค์–ด์•ผํ–ˆ๋‹ค๋ฉด, ์œ„์˜ ์–ด๋…ธํ…Œ์ด์…˜์€ ์†์„ฑ์˜ ์กฐํ•ฉ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์„ ์ค„์—ฌ์ค€ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.


 

 

@GetMapping์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ํ•œ ์ค„๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ๋กœ์— ๋งž์ถฐ ๋ฐ˜ํ™˜๋  ํŽ˜์ด์ง€๋ฅผ ๊ณจ๋ผ์ฃผ๋Š” ์—ญํ• ์ธ ๊ฒƒ ๊ฐ™๋„ค์š”.
@RequestMapping์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ์— ์ •๋ฆฌํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

 

 

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

 

๐Ÿชฝ

ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”

 

 


 

 

 

- @GetMapping์˜ ๊ฐœ๋…

 

GetMapping ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋‹ค์ค‘๋งตํ•‘ํ•˜๊ธฐ

@GetMapping ์–ด๋…ธํ…Œ์ด์…˜์€ HTTP GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งตํ•‘(@RequestMapping) ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ๋ฉ”์„œ๋“œ(url)์— ๋”ฐ๋ผ ์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ๋Š”

youngjinmo.github.io

 

 

 

- Get๊ณผ Post

 

Controller์˜ PostMapping, GetMapping ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ

ใ…‡ GET/POST ์ดํ•ดํ•˜๊ธฐ 1) GET ๋ž€? - URL์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ์‹œ์ผœ ์š”์ฒญ - ๋ฐ์ดํ„ฐ๋ฅผ ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์ „์†ก - URL์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜์–ด ๋ณด์•ˆ์— ์ทจ์•ฝ - ์บ์‹ฑํ•  ์ˆ˜ ์žˆ์Œ => ์ฃผ๋กœ ์กฐํšŒํ• ๋•Œ๋งŒ ์‚ฌ์šฉ 2) POST ๋ž€? - URL์—

tjdwns4537.tistory.com

 

 

 

- @RequestMapping ๋™์ž‘๋ฐฉ์‹

 

[Spring] @RequestMapping์ด๋ž€ ๊ทธ๋ฆฌ๊ณ  ๋™์ž‘ ๋ฐฉ์‹

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Spring ๊ฐœ๋ฐœ ์‹œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” @RequestMapping์˜ ๊ฐœ๋… ๋ฐ ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ •๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. [๋ชฉ์ฐจ] 1. @RequestMapping์ด๋ž€? 2. @RequestMapping ์ž‘์„ฑ ์˜ˆ์‹œ 3. @RequestMapping ๋™์ž‘ ๋ฐฉ์‹ 1. @RequestMapping

backendcode.tistory.com

 

 

 

- @RequestMapping ์˜ต์…˜

 

[Spring] @RequestMapping ์˜ต์…˜

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์˜ ์˜ต์…˜๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตญ๋น„ ๊ณผ์ •์„ ๋“ค์œผ๋ฉฐ, ๊ธฐ์กด์— ์•Œ๊ณ  ์žˆ๋˜ @RequestMapping ์˜ต์…˜๋“ค๊ณผ ๋‹ค๋ฅธ ์˜ต์…˜๋“ค์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ธฐ์กด์— ์•Œ๊ณ  ์žˆ

backendcode.tistory.com

 

 

 

- ๋งคํ•‘๊ณผ ๋งค์นญ

 

#002.๋งคํ•‘๊ณผ ๋งค์นญ์˜ ์ฐจ์ด, ์•Œ๊ณ  ๊ณ„์„ธ์š”?

์ฃผ๋‹ˆ์–ด ๊ธฐํš์ž ์‹œ์ ˆ, ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์ผํ•˜๋ฉด์„œ ๋งค์นญ(Matching)์ด๋ž€ ๋‹จ์–ด์™€ ๋งคํ•‘(Mapping)์ด๋ž€ ๋‹จ์–ด๋ฅผ ์ž์ฃผ ๋“ค์—ˆ์—ˆ๋Š”๋ฐ, ๋‹น์‹œ๋งŒ ํ•ด๋„ ์ด ๋‘ ๋‹จ์–ด์˜ ์ฐจ์ด๋ฅผ ์ž˜ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๊ฐœ๋ฐœ์ž ๋งˆ๋‹ค ์–ด๋–ค ๊ฐœ๋ฐœ์ž๋Š”

yamestyle.com

 

 

 

 

 

[ SpringMVC์— ๋Œ€ํ•˜์—ฌ ]

 

Spring - Spring MVC๋ฅผ ์•Œ์•„์•ผ ์‹œ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฒ˜์Œ์—” ๋Œ€์ถฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๋ คํ–ˆ์ง€๋งŒ,์ด๋Ÿด์ˆ˜๊ฐ€! ์•„๋Š” ๊ฒƒ์ด ๋ฏธ์•ฝํ•˜๋‹ˆ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์œผ๋กœ ์•Œ์•„์•ผํ•˜๋Š” ๊ฐœ๋…์„ ์ฐจ๊ทผ์ฐจ๊ทผ ์ •๋ฆฌํ•ด๋ณผ๊นŒ ํ•œ๋‹ค.๋‘๋‘ฅ, Spring MVC๋ž€?์•„๋งˆ ์ •๋ณด์ฒ˜

post-this.tistory.com

 

 

 

 

[ Hello World ์ถœ๋ ฅํ•˜๊ธฐ ]

 

Spring - [IntelliJ] Hello World ์ถœ๋ ฅํ•˜๊ธฐ

[ Spring MVC์— ๋Œ€ํ•˜์—ฌ ] Spring - Spring MVC๋ฅผ ์•Œ์•„์•ผ ์‹œ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.์ฒ˜์Œ์—” ๋Œ€์ถฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๋ คํ–ˆ์ง€๋งŒ,์ด๋Ÿด์ˆ˜๊ฐ€! ์•„๋Š” ๊ฒƒ์ด ๋ฏธ์•ฝํ•˜๋‹ˆ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์œผ๋กœ ์•Œ์•„์•ผํ•˜๋Š”

post-this.tistory.com

 


 

 

Hello, World๋ฅผ ์ถœ๋ ฅํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ @Controller๊ฐ€ ์•„๋‹Œ @RestController๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์™œ @RestController๋ฅผ ์‚ฌ์šฉํ•œ๊ฑธ๊นŒ?

 

 

 

 

@Controller

  • @Controller๋Š” ์ฃผ๋กœ view๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ViewResolver๋ฅผ ํ†ตํ•ด view๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • AnnotationMethodHandlerAdapter ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฉ”์†Œ๋“œ ๋‹จ์œ„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ด ์ข‹๋‹ค.
  • @Controller๋Š” 200 OK(์„ฑ๊ณต์„ ์•Œ๋ฆฌ๋Š” ์ƒํƒœ ์ฝ”๋“œ)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด๋‚ธ๋‹ค.

 

 

@RestController

  • @Controller์— @ResponseBody๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
  • Controller๋ฅผ ํ†ตํ•ด Json ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
  • HttpMessageConverter๋ฅผ ํ†ตํ•ด Json ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ์ฒด๋Š” Json์œผ๋กœ Serialize(์ง๋ ฌํ™”)๋˜์–ด ๋ฐ˜ํ™˜๋œ๋‹ค.
  • @RestController๋Š” 200 OK(์„ฑ๊ณต์„ ์•Œ๋ฆฌ๋Š” ์ƒํƒœ ์ฝ”๋“œ)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด๋‚ธ๋‹ค.

 

 

 

๊ฒฐ๋ก ์ ์œผ๋กœ @Controller๋Š” View๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ , @RestController๋Š” Hello, World ๊ฐ™์€ ์–ด๋–ค Json ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ @RestController๋Š” Json ๋ฐ˜ํ™˜์ด ๋˜๋Š”๊ฑธ๊นŒ?

 

 

 

 

์ง๋ ฌํ™”

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

 

 

 

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

 

 

 

 

 

Q. @Controller๋Š” Json ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜์„ ๋ชปํ•˜๋‚˜?

 

A. ๊ทธ๊ฑด ์•„๋‹ˆ๋‹ค. ํ•  ์ˆ˜ ์žˆ๋‹ค. @ResponseBody๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด Json ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ณธ๋ž˜ @Controller๋Š” ViewResolver๊ฐ€ ์ž‘๋™ํ•˜์—ฌ view๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ํ•˜์ง€๋งŒ @ResponseBody๋ฅผ ๋ถ™์ด๋ฉด @RestController์ฒ˜๋Ÿผ HttpMessageConverter๊ฐ€ ๊ฐœ์ž…ํ•˜๊ฒŒ ๋˜์–ด ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ MessageConverter์—๋Š” ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜(๋‹จ์ˆœ ๋ฌธ์ž์—ด์ธ์ง€, ๊ฐ์ฒด์ธ์ง€...)์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธMessageConverter๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

// @ResponseBody๋ฅผ ๋ถ™์ธ ์ฝ”๋“œ
@Controller
public class HelloController {

    @GetMapping("")
    @ResponseBody
    public String helloWorld() {
        return "Hello, World";
    }

}

 

<๊ฒฐ๊ณผ>

๐Ÿ‘

 

 

 


 

 

 

 

Http ์ƒํƒœ ์ฝ”๋“œ

  • ํŠน์ • HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค.
  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์„ฑ๊ณต์‘๋‹ต์€ 200 OK๊ฐ€ ์žˆ๋‹ค.

 

- ๋” ๋‹ค์–‘ํ•œ ์ƒํƒœ ์ฝ”๋“œ

 

HTTP ์ƒํƒœ ์ฝ”๋“œ - HTTP | MDN

HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋Š” ํŠน์ • HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์‘๋‹ต์€ 5๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค: ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์‘๋‹ต, ์„ฑ๊ณต์ ์ธ ์‘๋‹ต, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ, ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ, ๊ทธ๋ฆฌ๊ณ 

developer.mozilla.org

 

 

 

 

Q. @RestController์˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์„ฑ๊ณต ์ƒํƒœ ์ฝ”๋“œ๋Š” 200 OK๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ ์ƒํƒœ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜?

A. ResponseEntity๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

1) ResponseEntity.ok()๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ (200 OK)

// ์˜ˆ์ œ ์ถœ์ฒ˜ - mangkyu.tistory (๋ง๋‚˜๋‹ˆ ๊ฐœ๋ฐœ์ž๋‹˜)

  @GetMapping(value = "/users")
    public ResponseEntity<User> findUserWithResponseEntity(@RequestParam String userName){
        return ResponseEntity.ok(userService.findUser(userName));
    }

 

 

2) ResponseEntity.status(HttpStatus.CREATED)๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ (201 Created)

@GetMapping(value = "/users")
public ResponseEntity<User> findUserWithCreatedResponse(@RequestParam String userName){
    return ResponseEntity.status(HttpStatus.CREATED).body(userService.findUser(userName));
}

 

์ฝ”๋“œ ์„ค๋ช… :

  1. @GetMapping โ–ป users ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. ResponseEntity<User> โ–ป User(User ์•ˆ์— ์žˆ์„ ์–ด๋–ค ์ •๋ณด๋“ค, ์ด๋ฆ„+๋‚˜์ด+์ฃผ์†Œ์™€ ๊ฐ™์€...) ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•˜๋‹ค๋Š” ๋œป. (ResponseEntity๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜)
  3. @RequestParam  โ–ป ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋ฐ”์ธ๋”ฉ(๊ตฌ์ฒด์ ์ธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •, ์ด๋ฆ„ = ๋ฏธ๋‚˜ + ๋‚˜์ด = 10์„ธ + ์ฃผ์†Œ = ์„œ์šธํŠน๋ณ„์‹œ์™€ ๊ฐ™์€...) ๊ทธ๋Ÿฐ๋ฐ userName์ด ์˜†์— ๋ถ™์—ˆ๋‹ค. ์ด ์˜๋ฏธ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฐ’์œผ๋กœ userName์ด ๋“ค์–ด์˜ค๋ฉด(์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ) userName ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (๋ฏธ๋‚˜๋ผ๋Š” ๊ฐ’์ด url๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๋ฉด ๊ทธ ๊ฐ’์„ userName์— ์ €์žฅํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ทธ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.)
  4. ResponseEntity.status  โ–ป ์‘๋‹ต์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•˜๋„๋ก ํ•œ๋‹ค.
  5. HttpStatus.CREATED  โ–ป 201 Created๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์œผ๋ฉฐ, ์ž์›์ด ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์„ฑ๊ณต ์ƒํƒœ ์‘๋‹ต ์ฝ”๋“œ์ด๋‹ค. 
  6. findUser(userName)  โ–ป userName์„ ์ฐพ์•„์„œ User ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ฒฐ๋ก  : users๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ํ•ด๊ฒฐํ•œ ํ›„ ์„ฑ๊ณต์ ์ด๋ฉด 201 CREATED๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๋ฐ˜ํ™œํ•  ๋•Œ User ๋‚ด์šฉ๋„ ๊ฐ™์ด ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•ด๋ผ. 

 

 

 

 

 

 

Q. ๊ทธ๋ ‡๋‹ค๋ฉด @Controller๋Š” ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

 

A. @RestController์™€ ๊ฐ™์ด ResponseEntity.status๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, HttpServletResponse ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด  HttpServletResponse response์™€ response.setStatus(HttpStatus.CREATED.value()); ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด 201 CREATED๋กœ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    @GetMapping("/users")
    public String findUser(@RequestParam String userName, HttpServletResponse response) {        
        response.setStatus(HttpStatus.CREATED.value());
    }

 

 

 


 

 

์ด๋ฒˆ์—๋Š” @Controller์™€ @RestController์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐ๋ณด๋‹ค ์ •๋ฆฌํ•˜๋Š”๋ฐ ์˜ค๋ž˜๊ฑธ๋ ค์„œ ์กฐ๊ธˆ ๋‹นํ™ฉ์Šค๋Ÿฌ์› ๋„ค์š”...

 

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

 

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

 

๐Ÿชฝ

ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”

 

 


 

 

- @Controller์™€ @RestController์˜ ์›๋ฆฌ์™€ ์ฐจ์ด ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ์ฝ”๋“œ

 

[Spring] @Controller์™€ @RestController ์ฐจ์ด

Spring์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ง€์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์€ @Controller์™€ @RestController๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ Spring MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ์ธ @Controller์™€ Restuful ์›น์„œ๋น„์Šค์˜ ์ปจํŠธ๋กค๋Ÿฌ์ธ @RestController์˜ ์ฃผ์š”ํ•œ ์ฐจ์ด์ 

mangkyu.tistory.com

 

 

 

- ๋‹ค์–‘ํ•œ Controller์— ๋Œ€ํ•ด์„œ

 

[Spring] Controller์˜ ์ข…๋ฅ˜์™€ ๋‹ค์–‘ํ•œ ์ „๋žต

1. Controller์˜ ์ข…๋ฅ˜ 1) Servlet - javax.servlet.Servlet์„ ์ƒ์†ํ•œ ํด๋ž˜์Šค๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. @Component("/home") // bean ์ด๋ฆ„์„ ์ด์šฉํ•œ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘ ๋ฐฉ์‹ ์ด์šฉ public class HomeServlet extends HttpServlet { protected void

kimcoder.tistory.com

 

 

 

- ์ง๋ ฌํ™”์— ๋Œ€ํ•ด์„œ

 

์ง๋ ฌํ™” - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ์ง๋ ฌํ™”(็›ดๅˆ—ๅŒ–) ๋˜๋Š” ์‹œ๋ฆฌ์–ผ๋ผ์ด์ œ์ด์…˜(serialization)์€ ์ปดํ“จํ„ฐ ๊ณผํ•™์˜ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€ ๋ฌธ๋งฅ์—์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋‚˜ ์˜ค๋ธŒ์ ํŠธ ์ƒํƒœ๋ฅผ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ ํ™˜๊ฒฝ

ko.wikipedia.org

 

 

 

 

- @RequestParam์— ๋Œ€ํ•ด์„œ

 

๐ŸŒฑ @RequestParam ๊ฐœ๋… ์ •๋ฆฌ

@RequestParam ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค @ResponseBody @RequestMapping("/request-param") public String requestParamV2( @RequestParam("username") Strin

yummy0102.tistory.com

 

 

 

- HttpservletResponse์— ๋Œ€ํ•ด์„œ

 

์„œ๋ธ”๋ฆฟ(Servlet) - HttpservletResponse ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•, HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋‹จ์ˆœ ํ…์ŠคํŠธ & HTML & API JSON

์ธํ”„๋Ÿฐ ๊น€์˜ํ•œ ๋‹˜์˜ ์Šคํ”„๋ง ๊ฐ•์˜์ด๋ฉฐ, ์„น์…˜ 2 - ์„œ๋ธ”๋ฆฟ(Servlet)๋ฅผ ์ •๋ฆฌํ•œ๋‹ค. ์‹ค์Šตํ˜• ๊ต์œก์œผ๋กœ ์ž์„ธํ•œ ์„ค๋ช…์ด ๊ถ๊ธˆํ•˜๋ฉด ์ˆ˜๊ฐ•์„ ๊ถŒ์žฅํ•œ๋‹ค. (์‹ค์Šต์€ ๋ชจ๋‘ ์˜›๋‚  ๋ฐฉ์‹์ด๋ฉฐ, ํ˜„์žฌ๋Š” ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ

loopstudy.tistory.com

 

 

 

- ๋‹ค์–‘ํ•œ ์ƒํƒœ ์ฝ”๋“œ

 

HTTP ์ƒํƒœ ์ฝ”๋“œ - HTTP | MDN

HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋Š” ํŠน์ • HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์‘๋‹ต์€ 5๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค: ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์‘๋‹ต, ์„ฑ๊ณต์ ์ธ ์‘๋‹ต, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ, ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ, ๊ทธ๋ฆฌ๊ณ 

developer.mozilla.org

 

 

 

- ์Šคํ”„๋ง์‚ฌ์ „

 

ResponseBody (Spring Framework 6.1.14 API)

Annotation that indicates a method return value should be bound to the web response body. Supported for annotated handler methods. As of version 4.0 this annotation can also be added on the type level in which case it is inherited and does not need to be a

docs.spring.io

 

 

 

 

- @ResponseStatus์— ๋Œ€ํ•˜์—ฌ

 

Spring์—์„œ ํŠน์ • HTTP ์‘๋‹ต ์ƒํƒœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ

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

devel-repository.tistory.com

 

 

 

์ฒ˜์Œ์—” ๋Œ€์ถฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๋ คํ–ˆ์ง€๋งŒ,
์ด๋Ÿด์ˆ˜๊ฐ€! ์•„๋Š” ๊ฒƒ์ด ๋ฏธ์•ฝํ•˜๋‹ˆ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์œผ๋กœ ์•Œ์•„์•ผํ•˜๋Š” ๊ฐœ๋…์„ ์ฐจ๊ทผ์ฐจ๊ทผ ์ •๋ฆฌํ•ด๋ณผ๊นŒ ํ•œ๋‹ค.

๋‘๋‘ฅ, Spring MVC๋ž€?

์•„๋งˆ ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ๋ฅผ ์ค€๋น„ํ•˜๊ฑฐ๋‚˜, IT๊ด€๋ จ ์ „๊ณต์ž๋ผ๋ฉด ํ•œ ๋ฒˆ์€ ๋“ค์–ด๋ดค์„ MVC.
์ด๋ฒˆ ๊ธฐํšŒ์— ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

 

 

 

 

๐Ÿชฝ

"ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

 

 

 


 

[ Hello World๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ]

 

Spring - [IntelliJ] Hello Word ์ถœ๋ ฅํ•˜๊ธฐ

์•„์ฃผ ๊ฐ„๋‹จํ•œ ์‹ค์Šต์„ ํ•ด๋ณผ๊นŒํ•œ๋‹ค.  Hello, World ์ถœ๋ ฅํ•˜๊ธฐ๐ŸŽƒ1. Spring initializr ์ƒ์„ฑํ•˜๊ธฐ. https://start.spring.io/  โ–ก  Dependencies - SpringWeb ์„ ํƒํ•˜๊ธฐ.โ–ก  Java ํ•ด๋‹นํ•˜๋Š” ๋ฒ„์ „์— ์„ ํƒํ•˜๊ธฐ.    โœ”๏ธŽ  [Mac ๊ธฐ

post-this.tistory.com

 


 

 

 

1. MVC

  • Model - View - Controller๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.
  • Model, View, Controller๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์›€์ง์ธ๋‹ค. (๊ฐ์ž ๋งก์€ ๋ถ„์•ผ๋งŒ ํ•ด๊ฒฐํ•œ๋‹ค)
  • MVC ์‚ฌ์šฉ์‹œ, ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.
  • MVC ์‚ฌ์šฉ์‹œ, ์ค‘๋ณต์ฝ”๋“œ ์ œ๊ฑฐ๊ฐ€ ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜์— ์ข‹๋‹ค.
  • MVC ์‚ฌ์šฉ์‹œ, ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.

 

(1)  View

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํ™”๋ฉด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž, ์‚ฌ์šฉ์ž๊ฐ€ ์›น ๊ฒ€์ƒ‰์ฐฝ์— [apple]์ด๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ธธ ์š”์ฒญํ–ˆ๋‹ค.

 

(2)  Controller

  • View์™€ Model์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ค‘๊ฐ„์—์„œ ์ƒํ˜ธ์ž‘์šฉ ์—ญํ• ์„ ํ•ด์ค€๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ Controller๊ฐ€ ๋ฐ›์•˜๋‹ค. (DispatcherServlet๋ผ๋Š” Front Controller๊ฐ€ ๋ฐ›์Œ)
  • Controller๋Š” ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด [apple]์ด๋ž€ ๋‹จ์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ Model์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

 

(3)  Model

  • ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•œ๋‹ค
  • ์ด๋•Œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š” ์ž‘์—…์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ Model์ด๋ผ ํ•œ๋‹ค.
  • Controller์—๊ฒŒ ์˜จ ์š”์ฒญ์„ ์ž˜ ๋ฐ›์•˜๋‹ค.
  • Model์€ [apple]์ด๋ž€ ๋‹จ์–ด ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„ Controller์—๊ฒŒ ๋‹ค์‹œ ์ „๋‹ฌํ•œ๋‹ค.
  • Controller๋Š” ๋ฐ›์€ ์ •๋ณด๋ฅผ ๋‹ค์‹œ View์—๊ฒŒ ๋ณด๋‚ด๊ณ  View๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

 

 


 

 

2. Spring MVC ๊ตฌ์„ฑ์š”์†Œ์™€ ์ˆœ์„œ

์ถœ์ฒ˜: https://www.geeksforgeeks.org/spring-mvc-framework/

 

1๋ฒˆ

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์š”์ฒญ(Requeest)์ด ๋“ค์–ด์™”๋‹ค.
  • ์š”์ฒญ์€ ํŠน์ • URL๊ณผ ํ•จ๊ป˜ ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋Š”๋ฐ GET, POST ๋“ฑ HTTP ๋ฉ”์„œ๋“œ๊ฐ€ ํ•จ๊ป˜ ์ „๋‹ฌ๋œ๋‹ค.

 

 

2๋ฒˆ•3๋ฒˆ

  • ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Front Controller์ธ DispatcherServlet์ด ์š”์ฒญ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.
  • DispatcherServlet์€ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  Controller๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด HandlerMapping์„ ์ด์šฉํ•œ๋‹ค.
  • ๊ทธ๋ ‡๊ฒŒ HandlerMapping์€ ๋“ค์–ด์˜จ ์š”์ฒญ ๊ฒฝ๋กœ์™€ HTTP ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ Controller๋ฅผ ์ •ํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

์ถœ์ฒ˜: https://www.geeksforgeeks.org/spring-mvc-framework/

 

 

 

4๋ฒˆ•5๋ฒˆ

  • HadlerMapping์ด ์ฐพ์€ Controller๋Š” ์š”์ฒญ์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • Controller๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์˜ˆ์‹œ๋กœ ํšŒ์›๊ฐ€์ž…์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์‡ผํ•‘๋ชฐ์—์„œ ๊ฒฐ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ)์„ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ํ˜น์€ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
  • ์‰ฝ๊ฒŒ ๋งํ•ด View๋กœ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ด๊ณ , Model And View๊ฐ€ ๊ฒฐ๊ณผ์— ๋‹ด๊ฒจ DispatcherServlet์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

6๋ฒˆ•7๋ฒˆ

  • ๋ฐ˜ํ™˜๋œ ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ ์ ˆํ•˜๊ฒŒ ๋ณด์—ฌ์ค„ View๋ฅผ ๊ณ ๋ฅผ ๊ฒƒ์ด๋‹ค.
  • View Resolver๋Š” Controller๊ฐ€ ๋ฐ˜ํ™˜ํ•œ View ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ View ํŒŒ์ผ์„ ์ „๋‹ฌํ•œ๋‹ค.

 

 

์ถœ์ฒ˜: https://www.geeksforgeeks.org/spring-mvc-framework/

 

 

 

8๋ฒˆ

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

 

 

10๋ฒˆ

  • View์—์„œ Rendering๋œ ๊ฒฐ๊ณผ๋Š” DispatcherServlet์— ๋ฐ˜ํ™˜๋œ๋‹ค.
  • ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์ด ์š”์ฒญํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ฒŒ๋œ๋‹ค.

 

 


 

 

3. Spring MVC ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

 

(1) DispathcerServlet

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ MVC๋Š” DispatcherServlet๊ฐ€ ์—†๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ์— Controller๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๊ณ , ์ง์ ‘์ฒ˜๋ฆฌ๋„ ํ•œ๋‹ค.
  • DispatcherServlet์ด ์žˆ๊ธฐ์—” ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

 

 

(2) @๋กœ ์‹œ์ž‘ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์˜ ์œ ๋ฌด

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

 

 

(3) Ioc(์ œ์–ด์˜ ์—ญ์ „)์™€ DI(์˜์กด์„ฑ์ฃผ์ž…)

  • ๊ฐ์ฒด๊ฐ„์˜ ์˜์กด์„ฑ์„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

 

 


 

 

 

4. SpringMVC๋Š” ์–ด๋–ค์‹์œผ๋กœ ๊ตฌ์„ฑ์„ ํ•ด์•ผํ•˜๋Š”๊ฐ€?

์‡ผํ•‘๋ชฐ์—์„œ ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž.

 

 

(1) Controller

์ฃผ๋ฌธ์ด ๋“ค์–ด์™”์„ ๋•Œ ์ฃผ๋ฌธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Controller๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

@RestController  ํ˜น์€ Controller
@RequestMapping("/์š”์ฒญ์ด ๋“ค์–ด์˜จ ๊ฒฝ๋กœ")
public class OrderController {

 ์ฃผ๋ฌธ ์š”์ฒญ์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ , ํ•ด๋‹นํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์œผ๋กœ ๋„˜๊ธด๋‹ค.

 ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ์„ฑ๊ณต์‹œ ์–ด๋–ป๊ฒŒ ๋ฐ˜ํ™˜ํ• ์ง€
 ์ƒํƒœ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด๋Š” ๋“ฑ...

}

 

 

 

(2) Service

์ฃผ๋ฌธ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

@Service
public class OrderServiceImpl implements OrderService {

 ์ฃผ๋ฌธ๋‚ด์—ญ์„ ์ง์ ‘ ์ฒ˜๋ฆฌ

 ์˜ˆ์‹œ๋กœ, ์ฃผ๋ฌธ์ด ๋“ค์–ด์˜จ ์ƒํ’ˆ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜
 ์ƒ์„ฑ๋œ ์ฃผ๋ฌธ์„ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋“ฑ...
 ๊ฒฐ๊ณผ๋ฅผ ๋ˆ„๊ตฌ์—๊ฒŒ ๋ฐ˜ํ™˜ํ• ์ง€๊นŒ์ง€ ์ •ํ•˜๋Š” ๊ณณ

}

 

 

 

(3) Repository

์ฃผ๋ฌธ ๋‚ด์—ญ์„  ์ €์žฅํ•  ์ €์žฅ์†Œ

public interface OrderRepository <Order, Long> {

 Order๊ณผ ์—ฐ๊ฒฐ๋œ ์ €์žฅ์†Œ๋กœ ์ž‘์—… ์ˆ˜ํ–‰

}

 

 

 

(4) Entity

์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋กœ ์ฃผ๋ฌธ์ด ๋“ค์–ด์˜ค๋ฉด ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”

@Entity
public class Order {

 ์ฃผ๋ฌธ ๊ณ ์œ ์˜ ID๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜
 ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ฃผ๋ฌธ์„ ํ•˜๋‚˜์˜ ์ƒํ’ˆ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋„๋ก ํ•˜๊ฑฐ๋‚˜
 ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฃผ๋ฌธ์„ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋Š” ๊ฒƒ ๋“ฑ...
   
}

 

 

 

(5) DTO
์š”์ฒญ๊ณผ ์‘๋‹ต๋งŒ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋งŒ ๋‹ด๋‹น, ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด

public class OrderRequest {

 ์ฃผ๋ฌธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๊ฐ์ฒด
 ์ƒํ’ˆ ID, ์ˆ˜๋Ÿ‰...

}

public class OrderResponse {

 ์ฃผ๋ฌธ ์™„๋ฃŒํ•œ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ ๊ฐ์ฒด
 ์ฃผ๋ฌธ ID, ์ด ๊ฐ€๊ฒฉ...

}

 

 

 


 

์‚ฌ์‹ค ์Šคํ”„๋ง์˜ ํŒจํ„ด์—๋Š” MVC๋งŒ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋” ๋‹ค์–‘ํ•œ ๋””์ž์ธ ํŒจํ„ด์ด ์กด์žฌํ•˜์ง€๋งŒ, ๋ชจ๋ธ - ๋ทฐ - ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์šฉ๋„๋ฅผ ๋‚˜๋ˆ„๊ณ  ์„œ๋กœ์˜ ์—ญํ• ์—” ์นจ๋ฒ”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํฐ ์žฅ์ ์ด ๋˜์–ด MVC๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋‚ด์šฉ์ด ๋งŽ์•˜๋‹ค.

์ดํ•ดํ•œ ๋‚ด์šฉ๊นŒ์ง€๋งŒ ๋ธ”๋กœ๊ทธ์— ์ ์–ด๋ณด์•˜๋‹ค.

์•„๋ž˜ ์ ์–ด๋‘” ์ถœ์ฒ˜์— ๋“ค์–ด๊ฐ€ ํ•œ ๋ฒˆ์”ฉ ์ฝ์–ด๋ณธ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 


 

- spring ์ถœ์ฒ˜

 

์šฐ๋ฆฌ๋Š” ์™œ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? - Java spring์˜ ํŠน์ง•

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

joychae.tistory.com

 

 

- Spring MVC ์ถœ์ฒ˜

 

A Comprehensive Guide To Spring MVC | SevenMentor Training

Explore A Comprehensive Guide to Spring MVC, covering key concepts, architecture, and components for building robust, scalable Java web applications.

www.sevenmentor.com

 

 

- Spring MVC์˜ ์žฅ์  ์ถœ์ฒ˜

 

Spring vs Spring MVC vs Spring Boot: A Detailed Comparison for Java Developers

In the ever-evolving landscape of Java development, the Spring Framework has emerged as a powerhouse,...

dev.to

 

 

 

- Spring MVC ์ถœ์ฒ˜

 

[Spring] Web MVC ํŒจํ„ด์˜ ํ๋ฆ„๊ณผ Controller, View, Model ๊ตฌํ˜„๋ฒ•

์Šคํ”„๋ง MVC ํŒจํ„ด์˜ ํ๋ฆ„, ํŠน์ง•, ๊ตฌ์„ฑ์š”์†Œ, ์‹คํ–‰ ์ˆœ์„œ. Controller, View, Model ๊ตฌํ˜„๋ฒ•

velog.io

 

 

 

- Spring MVC ์ถœ์ฒ˜

 

[Spring MVC] ์Šคํ”„๋ง MVC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? - ์Šคํ”„๋ง MVC ๊ตฌ์กฐ ์ดํ•ด

๋ณธ ๋‚ด์šฉ์€ ์˜จ๋ผ์ธ ๊ฐ•์˜ ์‚ฌ์ดํŠธ ์ธํ”„๋Ÿฐ์˜ ๊น€์˜ํ•œ ๋‹˜์˜ ๊ฐ•์˜ ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. '์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ ' ์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜ ์›น

ittrue.tistory.com

 

 

- Mapping ์ถœ์ฒ˜

 

[JAVA] Web์—์„œ์˜ ๋งตํ•‘(Mapping)์ด๋ž€??

์˜ค๋Š˜์€ Mapping์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๊ฒ ๋‹ค. ๋งตํ•‘์ด๋ž€? ํ•ด๋‹น ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€๋ฅดํ‚ค๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Ex) http~/action.do ๋ผ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ• ๋•Œ ์ด url์ด ๊ทธ๋Œ€๋กœ ์œ ์ถœ๋˜๋ฉด ๋ณด์•ˆ์ƒ ์ทจ์•ฝํ• 

wjdvnadldzm.tistory.com

 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>



8์›” ์ „์— ๋‹ค ๋๋‚ด๊ธฐ๋กœ ํ•œ ๊ณ„ํš,,,! ๊ฐ•์˜๋Š” ๋ชจ๋‘ ๋“ค์—ˆ์ง€๋งŒ ์™œ์ธ์ง€ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ์€ ๋ฏธ๋ค„์กŒ๋‹ค. ๊ทธ๋ž˜๋„ ์˜์ƒ ๋‹ค ๋“ค์€๊ฒŒ ์–ด๋””๋ƒ๋ฉฐ ์•ฝ๊ฐ„์˜ ์œ„๋กœ์™€ ํ•จ๊ป˜ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ์„ ํ•ด๋ณด๋ คํ•œ๋‹ค. ์ฝ”๋กœ๋‚˜๋กœ ์ธํ•ด ์ฒด๋ ฅ์ด ๋ฐ•์‚ด๋‚œ๊ฑด์ง€, ๊ทธ๋ƒฅ ์ด๋ฏธ ๋ฐ•์‚ด๋‚œ๊ฑธ ๋‚ด๊ฐ€ ๋ชฐ๋ž๋˜ ๊ฑด์ง€ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ์œ„๊ฒฝ๋ จ ํ„ฐ์ง€๋ฉฐ ๊ธธ๋ฐ”๋‹ฅ์— ์ฃผ์ €์•‰๋Š” ์ธ์ƒ์ด์–ด๋„ ์˜ค๋Š˜๋„ ํ™”์ดํŒ…!! ๋ชจ๋‘๋“ค ํ™”์ดํŒ…!



 

๐Ÿงธ 

 


 

๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๋ ˆ์ธ ๊ผฌ์šฐ- ๐Ÿงธ

 • scope

ใ„ด class :  SingletonTest, SingletonWithPrototypeTest1, PrototypeTest

 • web

ใ„ด class :  LogDemoController, LogDemoService

• common

ใ„ด class :  MyLogger

 


 

Q. ๋นˆ ์Šค์ฝ”ํ”„๋ž€?

A. ๋นˆ์ด ์‚ฌ์šฉ๋˜์–ด์ง€๋Š” ๋ฒ”์œ„์ด๋‹ค.

 

 

โœ”๏ธ  SingletonTest

 

โ–บ  ๊ฒฐ๊ณผ

 

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฒƒ์€ ์‹ฑ๊ธ€ํ†ค ๋นˆ ์Šค์ฝ”ํ”„๋‹ค. ์‹ฑ๊ธ€ํ†ค ๋นˆ ์Šค์ฝ”ํ”„๋Š” ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ์‹œ์ž‘๋˜์–ด ๋๋‚ ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค. ๋˜ ๊ฐ™์€ ์š”์ฒญ์— ๋Œ€ํ•ด ๊ฐ™์€ ์ธ์Šคํ„ด์Šค ๋นˆ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ  PrototypeTest

 

@Scope("prototype")
static class PrototypeBean {

}

 

@Scope("prototype")

: ๋นˆ์˜ ์Šค์ฝ”ํ”„๋ฅผ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. 

 

 

โ–บ  ๊ฒฐ๊ณผ

ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์š”์ฒญ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ๋นˆ ์Šค์ฝ”ํ”„๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์œ ์ง€๋˜์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž…์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๊ณผ ์ดˆ๊ธฐํ™”(Prototype.init 2๋ฒˆ ์š”์ฒญ๋œ ๊ฒƒ์„ ๋ณด๋ฉด)๊นŒ์ง€๋งŒ ๊ด€์—ฌํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— Predestroy ๋ฉ”์„œ๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. (ํ˜„์žฌ ์‹คํ–‰ ๊ฒฐ๊ณผ์—์„œ Prototype.destroy๊ฐ€ ์žˆ์ง€๋งŒ, ๋”ฐ๋กœ ์ฝ”๋“œ์— prototypeBean1.destroy();๋ฅผ ์ ์–ด์„œ ๊ทธ๋Ÿฐ๊ฒƒ์ด๋‹ค.)

 

 

 

 


 

 

โœ”๏ธ  SingletonWithPrototypeTest1

 

โ–บ  ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์‹ฑ๊ธ€ํ†ค์„ ํ•จ๊ป˜ ์“ธ ๊ฒฝ์šฐ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ 

    @Scope("singleton")
    static class ClientBean {

	private final PrototypeBean prototypeBean;
        
        @Autowired
        public ClientBean(PrototypeBean prototypeBean) {
        	this.prototypeBean = prototypeBean;
        }

        public int logic() {
            prototypeBean.addCount();
            int count = prototypeBean.getCount();
            return count;
        }
    }

 

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค์ธ ClientBean ๋‚ด๋ถ€์— ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์„ ์–ธ๋˜์—ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ์•Œ๋‹ค์‹œํ”ผ ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์ƒ์„ฑ์‹œ์  ๋”ฑ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๊ณ  ๊ทธ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ์ค‘๋ณตํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.(์ด๋ฏธ ํ• ๋‹น๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ™์€ ๋นˆ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐ™์€ ์ธ์Šคํ„ด์Šค ํ• ๋‹น) ๊ทธ๋Ÿฌ๋‹ˆ ๊ทธ ๋‚ด๋ถ€์— ํ•จ๊ป˜ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž…๋„ ๋ณธ๋ž˜์˜ ํŠน์„ฑ์ด ์•„๋‹Œ ์‹ฑ๊ธ€ํ†ค ๋นˆ์„ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

Q. ๋งŒ์•ฝ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณ„์† ํ˜ธ์ถœ๋˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์€ ๋”์ด์ƒ ํ”„๋กœํ† ํƒ€์ž…์ด ์•„๋‹ˆ๊ณ  ์‹ฑ๊ธ€ํ†ค์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‚˜?

A. ๋งž๋‹ค. ๊ทธ ํŠน์„ฑ์ด ์‹ฑ๊ธ€ํ†ค์ด ๋˜์—ˆ์œผ๋‹ˆ, ๋”์ด์ƒ ํ”„๋กœํ† ํƒ€์ž…์ด ์•„๋‹ˆ๋‹ค.

 

 

 

 

โ–บ  ์ฃผ์ž… ์‹œ์  ์ฐจ์ด

static class ClientBean {
 
         @Autowired
         private ApplicationContext ac;
         
         public int logic() {
             PrototypeBean prototypeBean = ac.getBean(PrototypeBean.class);
             prototypeBean.addCount();
             int count = prototypeBean.getCount();
             return count;
	}
}

 

์ „ ์ฝ”๋“œ๋Š” ์‹ฑ๊ธ€ํ†ค ๋นˆ ๋‚ด๋ถ€์— ํ”„๋กœํ† ํƒ€์ž…์ด ์„ ์–ธ๋˜์—ˆ๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ๋Š” ApplicationContext๋ฅผ ์ด์šฉํ•ด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. logic ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ac(ApplicationContext)๋ฅผ ํ†ตํ•ด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋งค๋ฒˆ ์š”์ฒญํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

 

 

 

โ–บ  ObjectFactory

static class ClientBean {

	@Autowired
	private ObjectProvider<PrototypeBean> prototypeBeanProvider;
 
	public int logic() {
		PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
		prototypeBean.addCount();
		int count = prototypeBean.getCount();
		return count;
	}
}

 

ObjectProbvider

: ์ง€์ •ํ•œ ๋นˆ์„ ์ฐพ์•„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋Œ€์‹  ์ฐพ์•„์ฃผ๋Š” DL ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. / ์Šคํ”„๋ง์— ์˜์กด์ ์ด๋‹ค.

 

 

 

- ObjectProvider ์ถœ์ฒ˜

 

ObjectProvider (Spring Framework 6.1.13 API)

Return a sequential Stream over all matching object instances, pre-ordered according to the factory's common order comparator. In a standard Spring application context, this will be ordered according to Ordered conventions, and in case of annotation-based

docs.spring.io

 

- ObjectFactory ์ถœ์ฒ˜

 

ObjectFactory (Spring Framework 6.1.13 API)

Defines a factory which can return an Object instance (possibly shared or independent) when invoked. This interface is typically used to encapsulate a generic factory which returns a new instance (prototype) of some target object on each invocation. This i

docs.spring.io

 

 

 

 

โ–บ  JSR-330 Provider

static class ClientBean {

    @Autowired
    private Provider<PrototypeBean> prototypeBeanProvider;

    public int logic() {
        PrototypeBean prototypeBean = prototypeBeanProvider.get();
        prototypeBean.addCount();
        int count = prototypeBean.getCount();
        return count;
    }
}

 

Provider< >

:  < > ์•ˆ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์ง€์—ฐ, ์˜ต์…˜, ์˜์กด์ ์ธ ๊ฒฝ์šฐ์ธ ์ˆœํ™˜์ฐธ์กฐ๋ฌธ์ œ์— ์“ด๋‹ค.

 

 

- Provider ์ถœ์ฒ˜

 

Provider (Jakarta EE 8 Specification APIs)

T get() Provides a fully-constructed and injected instance of T.

jakarta.ee

 

 

 

 


 

 

 

 

โœ”๏ธ  MyLogger

๊ฐ€์งœ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ๊ทธ ์š”์ฒญ์„ ์œ„ํ•œ ํด๋ž˜์Šค

@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {

 

value

: ์›น ์Šค์ฝ”ํ”„์˜ ์ข…๋ฅ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ํ˜„์žฌ๋Š” Http ์š”์ฒญ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  ๋‚˜๊ฐˆ๋•Œ ๊ฐ€์ง€ ์œ ์ง€๋˜๋Š” request๋กœ ๋˜์–ด์žˆ๋‹ค.

 

 

ProxyMode

: GoF ๋‹ค์ž์ธ ํŒจํ„ด์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ด๋‚˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ง€์—ฐํ•˜๊ฑฐ๋‚˜, ์ ‘๊ทผ์„ ์ œ์–ดํ•  ๋•Œ, ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

ScopedProxyMode์˜ ์ข…๋ฅ˜

- DEFAULT : ํ”„๋ก์‹ฑ ์—†์Œ
- NO : ํ”„๋ก์‹ฑ ์—†์Œ (DEFAULT์™€ ๊ฐ™์Œ)
- INTERFACE : ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์  ํ”„๋ก์‹ฑ ์ƒ์„ฑ
- TARGET_CLASS : ๋Œ€์ƒ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ CGLIB ํ”„๋ก์‹œ ์ƒ์„ฑ
- SCOPED_PROXY INTERFACES : INTERFACE ํ˜น์€ TARGET_CLASS ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน๋ณ„ํ•œ ๋‹จ์ถ•ํ˜• ๊ฐ’์ด๋‹ค.

 

 

๊ณ ๊ฐ์ด ์„œ๋น„์Šค๋ฅผ ์–ธ์ œ ์š”์ฒญํ• ์ง€ ๋ชจ๋ฅธ๋‹ค. ๊ฑฐ๊ธฐ๋‹ค 

 

 

 

- ProxyMode  ์ถœ์ฒ˜

 

ProxyMode in Spring Framework

The Spring Framework is a comprehensive and powerful framework for building enterprise-grade Java applications. One of its core features is…

medium.com

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

public void setRequestURL(String requestURL) {
    this.requestURL = requestURL;
}

public void log(String message) {
    System.out.println("[" + uuid + "]" + "[" + requestURL + "]" + message);
}

@PostConstruct
public void init() {
    uuid = UUID.randomUUID().toString();
    System.out.println("[" + uuid + "] request scope bean create:" + this);
}

 

setter๋ฅผ ํ†ตํ•ด requestURL์„ ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ Http ์š”์ฒญ์ด ์˜ค๋ฉด @PostConstruct๋ฅผ ํ†ตํ•ด uuid๋ฅผ random์œผ๋กœ ๋งŒ๋“ค์–ด log๋กœ ๋ณด๋‚ธ๋‹ค.

 

 

Q. requestURL์€ ๋นˆ์ด ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์„ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— setter๋กœ ๋ฐ›๋Š”๋ฐ ์™œ ์ƒ์„ฑ์‹œ์ ์„ ๋ชจ๋ฅผ๊นŒ?

A. ํ˜„์žฌ MyLogger์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, requestURL์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ๋ฐ›์•„์˜จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ฑฐ๊ธฐ๋‹ค MyLogger์€ request ์Šค์ฝ”ํ”„๋กœ ์ •์˜๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋Š”๊ฑด Http์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ทธ ํ›„์— requestURL ๊ฐ’์ด ๊ฒฐ์ •๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ requestURL ๋นˆ์€ ์ƒ์„ฑ์‹œ์ ์€ ์•Œ ์ˆ˜ ์—†๋‹ค. ์ผ๋‹จ ์š”์ฒญ์ด ์žˆ์–ด์•ผํ•˜๋Š”๋ฐ ์š”์ฒญ์ด ์–ธ์ œ ์˜ฌ์ง€ ๋ชจ๋ฅด๋ฉฐ ๋‹ค๋ฅธ ํด๋ž˜์Šค(์„œ๋น„์Šค๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ)์— requestURL์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

 


 

 

 

 

โœ”๏ธ  LogDemoController

๋กœ๊ฑฐ๊ฐ€ ์ž˜ ์ž‘๋™๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ์šฉ ์ปจํŠธ๋กค๋Ÿฌ

 

@Controller
@RequiredArgsConstructor
public class LogDemoController {

    private final LogDemoService logDemoService;
    private final MyLogger myLogger;

 

@ReqiredArgsConstructor (Lombok)

: ์ดˆ๊ธฐํ™” ๋˜์ง€์•Š์€ final ํ•„๋“œ๋‚˜, @NonNull์ด ๋ถ™์€ ํ•„๋“œ์— ๋Œ€ํ•ด ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, @Autowired๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

 

 

LogDemoService์™€ MyLogger ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•ด์ค€๋‹ค. private์™€ final๋กœ ์„ ์–ธํ•œ ์ด์œ ๋Š” ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •์„ ๋ชปํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์™ธ๋ถ€์—์„œ ์ˆ˜์ •๋  ๊ฒฝ์šฐ ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

- @ReqiredArgsConstructor ์ถœ์ฒ˜

 

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

 

projectlombok.org

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

@RequestMapping("log-demo")
@ResponseBody
public String longDemo(HttpServletRequest request) {
    String requestURL = request.getRequestURI().toString();
    myLogger.setRequestURL(requestURL);

 

@RequestMapping( )

: ๋“ค์–ด์˜จ ์š”์ฒญ์„ ํŠน์ • ๋ฉ”์„œ๋“œ์™€ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” @RequestMapping์— ๋Œ€ํ•ด ๊ด„ํ˜ธ ์•ˆ์— ์–ด๋–ค value๊ฐ’์ด๋‚˜ method๊ฐ’์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋Š”๊ฑด ์š”์ฒญ๋ฐฉ์‹์— ๊ด€๊ณ„์—†์ด url์ด ์ผ์น˜ํ•˜๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ("log-demo")๋ผ๊ณ  ์ ํ˜€์žˆ์œผ๋‹ˆ, log-demo ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ Http ์š”์ฒญ์„ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

 

 

@ResponseBody

: Http ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜, ์‘๋‹ต ๋ฐ”๋””๋ฅผ JSON, XML, ๋ฌธ์ž์—ด ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

 

getRequestURL

: ์š”์ฒญ์— ์‚ฌ์šฉ๋œ URL๋กœ ๋ถ€ํ„ฐ URL ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

 

toString( )

: ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

HttpServletRequest๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ Http ์š”์ฒญ์„ ๋‹ด๊ณ  ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด MyLogger์—์„œ ๊ฐ€์งœ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค๋„๋ก ํ–ˆ์œผ๋‹ˆ, Http ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด logDemo์—์„œ HttpServletRequest์— ๊ฐ€์งœ ํ”„๋ก์‹œ๋ฅผ ๋„ฃ๊ณ  ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ ํ›„์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ URL ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด myLogger.set- ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด MyLogger์—์„œ URL ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

 

 

- @RequestMapping ์ถœ์ฒ˜

 

Spring @RequestMapping์ด๋ž€? ์ž‘์„ฑ๋ฐฉ๋ฒ•, ์˜ˆ์‹œ

1. @RequestMapping์ด๋ž€ @RequestMapping์€ ํด๋ผ์ด์–ธํŠธ์ด ์š”์ฒญ(url)์— ๋งž๋Š” ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ๊ทธ ์œ„์น˜์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฅด๋‹ค. ํด๋ž˜์Šค ๋ ˆ๋ฒจ : ๊ณตํ†ต ์ฃผ์†Œ ๋ฉ”

sharonprogress.tistory.com

 

 

- @ResponseBody ์ถœ์ฒ˜

 

[Spring] @RequestBody / @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜ ์ด๋ž€?

์Šคํ”„๋ง์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ @RequestBody , @ResponseBody๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ด ์–ด๋…ธํ…Œ์ด์…˜๋“ค์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ? ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ๋น„๋™๊ธฐ ํ†ต์‹  ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ํ†ต

cheershennah.tistory.com

 

 

- getrequestURL ์ถœ์ฒ˜

 

request ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ ๊ฐ„๋‹จ์ •๋ฆฌ ๋ฐ getRequestURL()๊ณผ getRequestURI() ์ฐจ์ด

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

tnsgud.tistory.com

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

 

myLogger.log("controller test");
logDemoService.logic("testId");
return"OK";

 

"controller test"๋ผ๋Š” ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ myLogger์— ์žˆ๋Š” log๋ฅผ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ ๋ฐ‘์— ์ค„์€ logDemoService์— logic์— "testId"๋ผ๋Š” ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ logic ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. retuen "OK"๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ OK๋ผ๋Š” ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

 

 


 

 

 

 

โœ”๏ธ  LogDemoService

์ฃผ์–ด์ง„ id์™€ ํ•จ๊ป˜ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ์„œ๋น„์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌ

 

private final MyLogger myLogger;

public void logic(String id) {
    myLogger.log("service id = " + id);
}

 

์•„๊นŒ LogDemoController์—  ์ฝ”๋“œ ์ชฝ์— logDemoService.logic("testId");๊ฐ€ ์žˆ์—ˆ๋‹ค. testId๋ฅผ logic ๋ฉ”์„œ๋“œ์— ๋ณด๋‚ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐ›์€ ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  logic ๋ฉ”์„œ๋“œ๋Š” MyLogger์— ์žˆ๋Š” log๋ฉ”์„œ๋“œ์— id๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด log ๋ฉ”์„œ๋“œ์— ํ•„์š”ํ•œ uuid์™€ URL ๊ทธ๋ฆฌ๊ณ  id๊ฐ€ ๋ชจ๋‘ ์ž˜ ์ถœ๋ ฅ๋˜๊ฒŒ ๋œ๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ  ์ด์ •๋ฆฌ

 ์ด๋ฒˆ์— ๋ฐฐ์šด ๊ฒƒ์€ ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„์™€ ์›น ์Šค์ฝ”ํ”„์— ๊ด€ํ•œ ๊ฒƒ์ด์—ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„๋Š” ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„์™€ ๋‹ค๋ฅด๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋ฐ›์•„ ์“ด๋‹ค๋Š” ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ฃผ๋กœ ์‹ฑ๊ธ€ํ†ค๊ณผ ํ•จ๊ป˜ ์“ฐ์ผ ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„์—” ํฐ ๋ฌธ์ œ์ ‘์ด ์žˆ์—ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ๋‚ด๋ถ€์— ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„๋ฅผ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊ฐ€์ง€ ์œ ์ง€๋˜๋Š” ํŠน์„ฑ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐ€ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ทธ ๋ถ€๋ถ„์„ ์ฃผ์ž…์‹œ์ ์„ ๋‹ค๋ฅด๊ฒŒํ•˜๊ฑฐ๋‚˜, ObjectProvider๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, JSR-330 Provider๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. (ํ•˜์ง€๋งŒ ์‚ฌ์‹ค์ƒ ์“ธ ์ผ์ด ๋งŽ์ด ์—†๋‹ค๋Š” ๊ฒƒ) 

 

 ์•„๋งˆ ์›น์Šค์ฝ”ํ”„๋Š” ์›น๊ฐœ๋ฐœ์„ ํ•˜๋ฉฐ ์‹ค๋ฌด์ ์œผ๋กœ ํ•„์š”ํ•œ ๋‚ด์šฉ์ผ ๋“ฏ ํ•˜๋‹ค. ์›น์Šค์ฝ”ํ”„๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋ฌธ์ œ์ ์€ request ์Šค์ฝ”ํ”„ ๋นˆ์ด ์‹ค์ œ ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ฐ€์งœ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋‹จ ์žˆ๋Š” ์ฒ™์„ ํ•œ ๋’ค, ๋‚˜์ค‘์— ํ•„์š”ํ•œ ๋ถ€๋ถ„์—์„œ ์‹ค์ œ ์Šค์ฝ”ํ”„ ๋นˆ์ด ์žˆ๋Š” ๊ณณ์„ ํ–ฅํ•ด ์ƒ์„ฑ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. 

 

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

 ๋ชจ๋‘๋“ค ๊ฑด๊ฐ•ํ•˜๊ธธ ๋ฐ”๋ผ๋ฉฐ...๐ŸŽƒ 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

์ฝ”๋กœ๋‚˜ ํœด์œ ์ฆ์œผ๋กœ ๊ธฐ๋ ฅ์—†์Œ๊ณผ ์กฐ๊ธˆ๋งŒ ์›€์ง์—ฌ๋„ ์˜จ๋ชธ์ด ์•„ํ””์„ ๊ฒช๊ณ  ์žˆ์ง€๋งŒ, ์•‰์•„์„œ ๊ณต๋ถ€ํ•˜๋Š” ๊ฑด ํฐ ๊ธฐ๋ ฅ์ด ๋“ค์ง€ ์•Š์•„ ์–ด์ฐŒ์ €์ฐŒ ํ•˜๊ณ  ์žˆ๋‹ค. ์˜ค๋Š˜์€ ๋…ธํŠธ๋ถ ์กด์ด ์žˆ๋Š” ์Šคํ„ฐ๋””์นดํŽ˜์—์„œ ๊ณต๋ถ€๋ฅผ ํ–ˆ๋Š”๋ฐ ์•„์ฃผ ์พŒ์ ํ•˜๊ณ  ์ข‹๋‹ค. ์–ด๋А ํ•œ์ผ ์—” ๋ฒŒ๋ ˆ๊ฐ€ ์žˆ๋Š”์ง€ ์‚๋ฆฌ๋ฆญ- ํ•˜๊ณ  ์šธ์–ด ์ž์—ฐ์นœํ™”์ ์ธ ๋А๋‚Œ์ด ๋ฌผ์”ฌ๋‚œ๋‹ค. ํ”ผ๊ณค์— ์ฉ”์–ด ๋‹คํฌ์„œํด์ด ์ฝ”๊นŒ์ง€ ๋‚ด๋ ค์™”์ง€๋งŒ ์˜ค๋Š˜๋„ ํ™”์ดํŒ…!!

 



๐Ÿงธ 

 


 

๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๋ ˆ์ธ ๊ผฌ์šฐ- ๐Ÿงธ

 • lifecycle

ใ„ด class : NetworkClient, beanLifeCycleTest

 


 

โœ”๏ธ  ๊ฒฐ๊ณผ๊ฐ’ null

 

โ–บ  BeanLifeCycleTest

@Configuration
static class LifeCycleConfig {
         @Bean
         public NetworkClient networkClient() {
             NetworkClient networkClient = new NetworkClient();
             networkClient.setUrl("http://hello-spring.dev");
             return networkClient;
         }
}

 

@Configuration

:  bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ์œ„ํ•ด ์„ค์ • ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•˜๋ฉฐ bean์ด ๋“ฑ๋ก๋  ๋•Œ ์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅํ•ด์ค€๋‹ค.

 

 

@Bean

:  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์ปดํฌ๋„ŒํŠธ(์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ๋œ ์กฐ๊ฐ)์ด๋‹ค. 

 

 

๋นˆ์€ NetworkClient ํƒ€์ž…์˜ networkClient๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. NetworkClient๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ณ  ์œ ์—ฐํ•˜๊ณ  ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ณ€์ˆ˜ networkClient๋ฅผ ์„ ์–ธํ•œ๋‹ค. NetworkClient๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์กด์žฌํ•˜๋ฉฐ ๊ทธ ํด๋ž˜์Šค ๋‚ด์—๋Š” setter๋ฅผ ํ†ตํ•ด url์„ ๋ฐ›๊ณ ์ž ํ•  ๊ฒƒ์ด๋‹ค. (๋‹ค๋ฅธ ํด๋ž˜์Šค์— url์„ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด์„œ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ!) ํ•ด๋‹น url์„ ์„ค์ •ํ•ด์ค€ํ›„ networkClient๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

 

 

Q. ๋งŒ์•ฝ NetworkClient ํƒ€์ž…์œผ๋กœ ๋นˆ์„ ์„ค์ •ํ•ด๋‘๊ณ  ํด๋ž˜์Šค ์ด๋ฆ„์ด NetWorkClient๋กœ ๋‹ค๋ฅด๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

A. ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ๋นˆ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๊ฒŒ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์˜๋„๋Œ€๋กœ ๋™์ž‘๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

- @Configuration ์ถœ์ฒ˜

 

[Spring] @Configuration ์ด๋ž€?

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” @Configuration์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์ ์— ๋Œ€ํ•˜์—ฌ ์ •๋ฆฌํ•ด๋ณผ๊นŒ ํ•œ๋‹ค. 1. @Configuration ์ด๋ž€? " data-ke-type="html"> HTML ์‚ฝ์ž… ๋ฏธ๋ฆฌ๋ณด๊ธฐํ•  ์ˆ˜ ์—†๋Š” ์†Œ์Šค Spring์—์„œ Bean์„ ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์„ค

blogshine.tistory.com

 

- @bean ์ถœ์ฒ˜

 

๐ŸŸข [Spring] ์Šคํ”„๋ง ๋นˆ(Bean) ์ด๋ž€?

๐Ÿ“Œ ์Šคํ”„๋ง ๋นˆ(Bean) ์ด๋ž€? ๋นˆ(Bean)์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ์ฆ‰, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๋œปํ•˜๋ฉฐ, ํ•˜๋‚˜ ์ด์ƒ์˜ ๋นˆ(Bean)์„ ๊ด€๋ฆฌ

dev-wnstjd.tistory.com

 

 

 

 

โ–บ  NetworkClient

public NetworkClient() {
	System.out.println("์ƒ์„ฑ์ž ํ˜ธ์ถœ, url = " + url); 
	connect();
	call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€");
}

 

๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ๋กœ ์ƒ์„ฑ์ž ๋ถ€๋ถ„์—์„œ connect( );๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์•„์ง url์„ setter๋กœ ๋ฐ›์•„์˜ค๊ธฐ์ „ connect( );๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํ•˜๊ฒŒ๋„ null ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

 

 

 

 

 


 

 

 

Q. ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์„ ํ•˜๋Š” ์ด์œ ๋Š”?

A. ์Šคํ”„๋ง ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์ œ๋Œ€๋กœ ์ง€์ผœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

 

 

 

โœ”๏ธ  ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ

 

โ–บ  ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฒคํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ - ์Šคํ”„๋ง ๋นˆ ์ƒ์„ฑ - ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… - ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ - ์‚ฌ์šฉ - ์†Œ๋ฉธ์ „ ์ฝœ๋ฐฑ

: ์Šคํ”„๋ง ๋นˆ์ด ์ƒ์„ฑ๋œ ํ›„ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์ด๋ค„์ ธ์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ฃผ์ž…์ด ๋ชจ๋‘ ์ด๋ค„์ง€๊ณ  url์„ ๋ฐ›์•„์˜ค์ง€์•Š๊ณ , ๋นˆ์ด ์ฃผ์ž…์ด ๋˜๊ธฐ ์ „ connect( )ํ•˜๊ณ ์ž ํ–ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ’์€ null๋กœ ๋‚˜์˜ค๋ฉฐ ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.  ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์„ ์ฝ”๋“œ์— ๋„ฃ์–ด ์˜์กด๊ด€๊ณ„๊ฐ€ ๋ชจ๋‘ ์ฃผ์ž…๋˜๊ณ ๋‚˜์„œ ๊ทธ ํ›„์— ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

 

โ–บ  ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์˜ ์žฅ์ 

1. ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๋”ฐ๋ผ ๋งค๋ฒˆ ๋นˆ์ด ์ผ๊ด€๋œ ์ƒํƒœ์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.  

2. ๋นˆ์ด ํŒŒ๊ดด๋˜๊ธฐ ์ „ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•  ์‹œ๊ฐ„์„ ์ค€๋‹ค.

3. ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ํ•œ ๊ณณ์— ๋ชจ์•„๋‘ฌ์„œ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ ์ธํ„ฐํŽ˜์ด์Šค InitializingBean, DisposableBean

 

โ–บ  NetworkClient

    @Override
    public void afterPropertiesSet() throws Exception {
    	connect();
	call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€");
    }

 

afterPropertiesSet( )

:  ์ธํ„ฐํŽ˜์ด์Šค InitializingBean์„ ์ƒ์†๋ฐ›์œผ๋ฉด ๊ทธ ์•ˆ์— ์ •์˜๋œ afterPropertiesSet ๋ฉ”์„œ๋“œ๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋๋‚˜๋ฉด ์ดˆ๊ธฐํ™”๋ฅผ ์ง€์›ํ•œ๋‹ค.

 
 
    @Override
    public void destroy() throws Exception {
        disConnect();
    }

 

destroy( )

:  ์ธํ„ฐํŽ˜์ด์Šค DisposableBean์„ ์ƒ์†๋ฐ›์œผ๋ฉด ๊ทธ ์•ˆ์— ์ •์˜๋œ destroy ๋ฉ”์„œ๋“œ๋กœ ๋นˆ์ด ํŒŒ๊ดด๋  ๋•Œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

 

 

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

 

 

 

- InitializingBean ์ถœ์ฒ˜

 

InitializingBean (Spring Framework 6.1.12 API)

Interface to be implemented by beans that need to react once all their properties have been set by a BeanFactory: e.g. to perform custom initialization, or merely to check that all mandatory properties have been set. An alternative to implementing Initiali

docs.spring.io

 

 

- DisposableBean ์ถœ์ฒ˜

 

DisposableBean (Spring Framework 6.1.12 API)

Interface to be implemented by beans that want to release resources on destruction. A BeanFactory will invoke the destroy method on individual destruction of a scoped bean. An ApplicationContext is supposed to dispose all of its singletons on shutdown, dri

docs.spring.io

 

 

 

 

 


 

 

 

 

โœ”๏ธ  ๋นˆ ๋“ฑ๋ก์— ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ ์ง€์ •

 

โ–บ  BeanLifeCycleTest

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
    NetworkClient networkClient = new NetworkClient();
    networkClient.setUrl("http://hello-spring.dev");
    return networkClient;
}

 

initMethod

: ์ดˆ๊ธฐํ™” ์ค‘์— ๋นˆ ์ธ์Šคํ„ฐ์Šค์—์„œ ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ์˜ ์„ ํƒ์  ์ด๋ฆ„์ด๋‹ค. 

 

 

destroyMethod

: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‹ซ์„ ๋•Œ ๋นˆ ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์˜ ์„ ํƒ์  ์ด๋ฆ„์ด๋‹ค. ๋นˆ ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด destroy๊ฐ€ ์žˆ๋Š”์ง€ ์œ ์ถ”ํ•˜๋ฉฐ close( ), shutdown( ) ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ธ์ˆ˜ ์—†๋Š” ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋งŒ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์ ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

 

 

 

- initMethod์™€ destroyMethod ์ถœ์ฒ˜

 

Bean (Spring Framework 6.1.12 API)

The optional name of a method to call on the bean instance upon closing the application context, for example a close() method on a JDBC DataSource implementation, or a Hibernate SessionFactory object. The method must have no arguments but may throw any exc

docs.spring.io

 

 

 

โ–บ  NetworkClient

public void init() { 
	System.out.println("NetworkClient.init"); 
	connect();
	call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€");
}

public void close() {
         System.out.println("NetworkClient.close");
         disConnect();
}

 

init( )

:  initMethod๋ฅผ ํ˜ธ์ถœํ•  ์„ ํƒ์  ์ด๋ฆ„์ด ๋˜๊ฒ ๋‹ค.

 

 

close( )

: destroyMethod๋ฅผ ํ˜ธ์ถœํ•  ์„ ํƒ์  ์ด๋ฆ„์ด ๋˜๊ฒ ๋‹ค.

 

 

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์Šคํ”„๋ง ์ฝ”๋“œ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์„ค์ • ์ •๋ณด์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ”„๋ง์—์„œ ๊ถŒ๊ณ ํ•˜๋Š” ๋ฐฉ์‹์€ ์•„๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ๋„ ์žˆ์ง€๋งŒ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์—์„œ ์ด๋ฆ„์ด ๋‹ฌ๋ผ์งˆ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ๋„)

 

 

 

 

 


 

 

 

 

 

โœ”๏ธ  ์• ๋…ธํ…Œ์ด์…˜ @PostConstruct, @PreDestroy

 

โ–บ  NetworkClient

์Šคํ”„๋ง์—์„œ ๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

	@PostConstruct
	public void init() {
		System.out.println("NetworkClient.init"); connect();
		call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€");
	}
    
	@PreDestroy
	public void close() {
		System.out.println("NetworkClient.close");
		disConnect();
	}

 

 

@PostConstruct

:  ์˜์กด์„ฑ ์ฃผ์ž…์ด ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•˜๋ฉฐ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ๋ฉ”์„œ๋“œ๋Š” ํ•˜๋‚˜๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

@PreDestroy

:  ์ธ์Šคํ„ด์Šค๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ์ฝœ๋ฐฑ ์•Œ๋ฆผ์ด๋ฉฐ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ๋ฉ”์„œ๋“œ๋Š” ๋ณด์œ ํ•˜๊ณ  ์žˆ๋˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

 

- @PostConstruct ์ถœ์ฒ˜

 

PostConstruct (Java(TM) EE 7 Specification APIs)

JavaScript is disabled on your browser. @Documented @Retention(value=RUNTIME) @Target(value=METHOD) public @interface PostConstruct The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any

docs.oracle.com

 

 

 

 

- @PreDestroy ์ถœ์ฒ˜

 

PreDestroy (Java(TM) EE 7 Specification APIs)

JavaScript is disabled on your browser. @Documented @Retention(value=RUNTIME) @Target(value=METHOD) public @interface PreDestroy The PreDestroy annotation is used on methods as a callback notification to signal that the instance is in the process of being

docs.oracle.com

 

 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

์ฝ”๋กœ๋‚˜์— ๊ฑธ๋ ค ์ผ์ฃผ์ผ์€ ๋ˆ„์›Œ์žˆ๋‹ค ์‚ด์•„๋‚ฌ๋‹ค. ๋จน๊ณ  ์ž๊ณ ๋งŒ ๋ฐ˜๋ณตํ•˜๋‹ˆ ๋‚˜ํƒœํ•จ์˜ ๋ํŒ์™•์ด ๋˜์–ด๋ฒ„๋ ธ๋Š”๋ฐ... ์ด๋ ‡๊ฒŒ ๋‹ค์‹œ ๊ณต๋ถ€๋ฅผ ํ•˜๋ ค๋‹ˆ ๋ฐฐ๋กœ ํž˜๋“  ๊ฒƒ ๊ฐ™๋‹ค. 8์›”์—” ๊ผญ ๊ฐ•์˜๋ฅผ ๋‹ค ๋“ฃ๊ฒ ๋‹ค๊ณ  ๋‹ค์งํ–ˆ์—ˆ๋Š”๋ฐ,,, ์–ผ๋งˆ ๋‚จ์ง€ ์•Š์€ ์‹œ๊ฐ„ ๋‹ค๋ฅธ ๊ณต๋ถ€ ์ œ์ฒ˜๋‘๊ณ  8์›” ์•ˆ์— ๋๋‚ด๋ณผ๊นŒ ํ•œ๋‹ค. (๊ณผ์—ฐ ํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋‚˜?) ์•„๋ฌดํŠผ ๋ชจ๋‘๋“ค ํ™”์ดํŒ…!!!!



๐Ÿงธ 

 


 

๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๋ ˆ์ธ ๊ผฌ์šฐ- ๐Ÿงธ

 • order

ใ„ด class : OrderServiceImpl

 • annotation

ใ„ด interface : MainDiscountPolicy

 • HelloLombok

 

 • AllBeanTest

ใ„ด class : AllBeanTest

 • AutoWiredTest

ใ„ด class : AutoWiredTest


 

โœ”๏ธ  OrderServiceImpl

 

โ–บ  ์ƒ์„ฑ์ž ์ฃผ์ž…

์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์ด ๋˜๊ฒ ๋‹ค.

 

private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;

     

final

: ์ดˆ๊ธฐํ™”๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. 

 

 

final์„ ํ†ตํ•ด ์ƒ์„ฑ์ž์— ๊ฐ’์ด ์ œ๋Œ€๋กœ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž์— ๊ฐ’์„ ๋นผ๋จน์€ ๊ฑธ ๋น ๋ฅด๊ฒŒ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์ถ”์ฒœํ•œ๋‹ค.

 

 

Q. final์„ ์•ˆ์“ฐ๊ฒŒ ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜?

A. ์ฝ”๋“œ ๊ฐœ๋ฐœ์ด ํ•œ์‚ฌ๋žŒ์œผ๋กœ ์ด๋ค„์ง€๋Š”๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฒŒ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฑฐ๊ธฐ๋‹ค ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ๋Œ์•„๊ฐ€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ์ˆ˜์ •์— ์šฉ์ดํ•˜๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…์—์„œ final์„ ๋ถ™์—ฌ์•ผ๋งŒ ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. (๊ทผ๋ฐ ๊ทธ๋ ‡๋ฐ๋˜๋ฉด ์ƒ์„ฑ์ž ์ฝ”๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ ์–ด๋ ต์ง€ ์•Š์„๊นŒ..?)

 

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

 

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
    this.memberRepository = memberRepository;
    this.discountPolicy = discountPolicy;
}

 

 

@Autowired

: ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ๋Š”๋ฐ, ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์ ์œผ๋กœ ์ฃผ์ž…์ด ๋œ๋‹ค.

 

 

OrderServiceImpl์€ ํด๋ž˜์Šค  MemberRepository์™€ DiscountPolicy์— ์žˆ๋Š” memberRepository์™€ discountPolicy๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ƒ์„ฑ์ž(๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ)๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ ์ƒ์„ฑ์ž๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ํ• ๋‹น๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์ด๋ค„์ง€๊ฒŒ ๋œ๋‹ค.

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

(์ด๋ ‡๊ฒŒ ์ดํ•ดํ•˜๊ธด ํ–ˆ๋‹ค...)

 

 

 

 

 

 

โ–บ  ์ˆ˜์ •์ž ์ฃผ์ž…

setter๋กœ ํ†ตํ•ด ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…, ์˜์กด๊ด€๊ณ„๋ฅผ ๋ˆ„๋ฝํ•ด๋„ ์‹คํ–‰์€ ๋œ๋‹ค.

 

private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;

    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    
    @Autowired
    public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }

 

 

setter๋Š” @Autowired๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด๊ด€๊ณ„๋ฅผ ๋ฐ›๊ฒŒ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ ํด๋ž˜์Šค์ธ MemberRepository์™€ DiscountPolicy์—์„œ memberRepository์™€ discountPolicy์— ๋Œ€ํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๊ฐ์ฒด๋ฅผ final ์—†์ด ์„ ์–ธํ•  ๋•Œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ƒ์„ฑ์ž ์ฃผ์ž…์—์„œ๋Š” final์„ ํ†ตํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ–ˆ์ง€๋งŒ setter๋Š” final์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ์ƒํƒœ์— ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. setter๋Š” ์„ค์ •ํ•˜๋ ค๋Š” ํ•„๋“œ์™€ ๋™์ผํ•œ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์•ผํ•˜๋ฉฐ, ์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ ๊ทœ์•ฝ์„ ํ†ตํ•ด set---๋ผ๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ทœ์น™์ด ์ƒ๊ฒผ๋‹ค. 

 

 

- setter๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ƒํƒœ ๋ฐ”๊พธ๊ธฐ ์ถœ์ฒ˜

 

[JAVA] ๊ฒŒํ„ฐ(getter)์™€ ์„ธํ„ฐ(setter)

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

myblog1128.tistory.com

 

 

 

 

Q. ์ƒ์„ฑ์ž๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. setter๋Š” ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ๋ฐ›์•˜๋‹ค. ์™œ ๊ทธ๋Ÿฐ๊ฒƒ์ธ๊ฐ€?

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

 

 

 

 

 

 

โ–บ  ํ•„๋“œ ์ฃผ์ž…

ํ•„๋“œ์— ๋ฐ”๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… (์‚ฌ์šฉํ•˜์ง€๋ง์ž)

 

 

    @Autowired
    private MemberRepository memberRepository;
    @Autowired
    private DiscountPolicy discountPolicy;

 

OrderServiceImpl์— ๊ฐ ํด๋ž˜์Šค MemberRepository์™€ DiscountPolicy์— ๊ด€ํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋ฐ”๋กœ ์ด๋ค„์ง„๋‹ค.

 

 

 

 

 


 

 

 

 

โœ”๏ธ  AutowiredTest

 

@Test
void AutoWiredOption() {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}

 

 

AnnotationConfigApplicationContext

:  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

 

static class TestBean {

    @Autowired(required = false)
    public void setNoBean1(Member noBean1) {
        System.out.println("noBean1 = " + noBean1);
    }

    @Autowired
    public void setNoBean2(@Nullable Member noBean2) {
        System.out.println("noBean2 = " + noBean2);
    }

    @Autowired
    public void setBean3(Optional<Member> nobean3) {
        System.out.println("nobean3 = " + nobean3);
    }


}

 

@Autowired(required = false)

: ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ํ˜ธ์ถœ ์ž์ฒด๊ฐ€ ์•ˆ๋œ๋‹ค.

 

 

@Nullable

: ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์–ด๋„ ํ˜ธ์ถœ์€ ๋˜์ง€๋งŒ null๊ฐ’์ด ๋œ๋‹ค.

 

 

Optional< >

: ์Šคํ”„๋ง ๋นˆ์ด ์—†์œผ๋ฉด Optional empty๋กœ ๋“ค์–ด์˜จ๋‹ค.

 

 

ํ˜„์žฌ Member ํด๋ž˜์Šค์—๋Š” nobean1, nobean2, nobean3๊ณผ ๊ด€๋ จ๋œ bean์ด ๋“ฑ๋ก๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. nobean1์˜ required = true๋กœ ํ•˜๊ฒŒ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ๋œ๋‹ค. 

 

 

 

Q. AnnotationConfigApplicationContext๋ฅผ ์„ ์–ธ์„ ๋”ฐ๋กœํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

A. AnnotationConfigApplicationContext๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•ด์•ผํ•œ๋‹ค. AnnotationConfigApplicationContext์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ ํ›„์— bean์„ ๊ด€๋ฆฌํ•˜๊ณ  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ฒŒ ๋œ๋‹ค. static class TestBean์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๋นˆ์ด ๋œ๋‹ค. ๋งŒ์ผ ๋”ฐ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  static class TestBean์— ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ์ฃผ๊ธฐ๊ฐ€ ๊ผฌ์ผ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์Šคํ”„๋ง์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์–ด์•ผํ•  ๋นˆ์ด ๊ทธ ์•ˆ์—์„œ ์Šคํ”„๋ง์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ ์–ธํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ์ฃผ๊ธฐ๊ฐ€ ๊ผฌ์—ฌ ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 


 

 

 

 

Q.  ๋กฌ๋ณต(LomBok) ์ด๋ž€?

A. ์ฝ”๋“œ ๋ฐ˜๋ณต ์ž‘์„ฑ์„ ์ค„์—ฌ์ฃผ๋Š” ์ฝ”๋“œ ๋‹ค์ด์–ดํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

 

 

โœ”๏ธ  OrderServiceImpl (LomBok)

 

 @Component
 @RequiredArgsConstructor
 public class OrderServiceImpl implements OrderService {
     private final MemberRepository memberRepository;
     private final DiscountPolicy discountPolicy;
}

 

 

 @RequiredArgsConstructor

: ์ดˆ๊ธฐํ™” ๋˜์ง€์•Š์€ final ํ•„๋“œ๋‚˜, @NonNull์ด ๋ถ™์€ ํ•„๋“œ์— ๋Œ€ํ•ด ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, @Autowired๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์˜์กด์„ฑ ์ฃผ์ž…ํ•œ๋‹ค.

 

 

 

 

- @RequiredArgsConstructor ์ถœ์ฒ˜

 

@RequiredArgsConstructor๋ž€?

Lombok์œผ๋กœ ์Šคํ”„๋ง์—์„œ DI(์˜์กด์„ฑ ์ฃผ์ž…)์˜ ๋ฐฉ๋ฒ• ์ค‘์— ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์ž„์˜์˜ ์ฝ”๋“œ์—†์ด ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. @RequiredArgsConstructor๋Š” ์ดˆ๊ธฐํ™” ๋˜์ง€์•Š์€ final ํ•„๋“œ๋‚˜, @NonNull ์ด ๋ถ™์€ ํ•„๋“œ

dreamcoding.tistory.com

 

 

 

- ๋กฌ๋ณต ์‚ฌ์šฉ ์˜ˆ์‹œ ์ถœ์ฒ˜

 

[java] ๋กฌ๋ณต lombok ์ด๋ž€?

Lombok ์ด๋ž€ Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฐ˜๋ณต๋˜๋Š” getter, setter, toString .. ๋“ฑ์˜ ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ ์ž‘์„ฑ ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ์ฝ”๋“œ ๋‹ค์ด์–ดํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Java์—์„œ ๋ณดํ†ต model ํด๋ž˜์Šค๋‚˜ Entity ๊ฐ™์€ ๋„๋ฉ”์ธ ํด๋ž˜์Šค ๋“ฑ์—๋Š” ์ˆ˜๋งŽ

pig-programming.tistory.com

 

 

 


 

 

 

 

โœ”๏ธ  Autowired ํ•„๋“œ ๋ช… ๋งค์น˜

 

<๊ธฐ์กด ์ฝ”๋“œ>

@Autowired
 private DiscountPolicy discountPolicy

 

 

ํ•„๋“œ๊ฐ€ ๋‘ ๊ฐœ (rateDiscountPolicy, fixDiscountPolicy)๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

 

<๋ณ€๊ฒฝ ํ›„ ์ฝ”๋“œ>

 @Autowired
 private DiscountPolicy rateDiscountPolicy

 

 

@Autowired๋Š” DiscountPolicy๋ฅผ ํƒ€์ž…์˜ ๋นˆ์„ ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•ด DiscountPolicy๋ฅผ ์ฐพ์•„๋‚˜์„œ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ DiscountPolicy ํƒ€์ž…์—๋Š” rateDiscounPolicy์™€ fixDiscountPolicy์ธ ๋™์ผ ํƒ€์ž…์˜ ๋นˆ์ด ๋‘ ๊ฐœ๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ฒŒ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํƒ€์ž… ๊ธฐ๋ฐ˜์—์„œ ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋กœ ์ˆ˜์ •์‹œ์ผœ์ค€ ๊ฒƒ์ด๋‹ค. rateDiscountPolicy ๋นˆ์ด ์ œ๋Œ€๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋นˆ์œผ๋กœ ์ฃผ์ž…ํ•œ๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ  @Qualifier ์‚ฌ์šฉ

 

 

โ–บ  ๋นˆ ๋“ฑ๋ก์‹œ @Qualifier  ์ถ”๊ฐ€ ๊ตฌ๋ถ„์ž ์ ์–ด์ฃผ๊ธฐ

 

 @Component
 @Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}

 

 

Q. ๊ฐ™์€ ํƒ€์ž…์˜ ๋‹ค๋ฅธ ๋นˆ์—๋„ @Qualifier์„ ๊ผญ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๊ฐ€?

A. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด์„œ ๊ผญ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ์„œ ๋ฌด์กฐ๊ฑด ๋ถ™์—ฌ์•ผํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ๊ฐ™์€ ํƒ€์ž…์˜ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ๊ตฌ๋ถ„์ž๋ฅผ ๋ถ™์ด์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋นˆ์„ ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•  ๋•Œ  ๊ตฌ๋ถ„์ž๋ฅผ ๋ถ™์ด์ง€ ์•Š์€ ๋˜ ๋‹ค๋ฅธ ๋นˆ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋‹ค๋ฅธ ๋นˆ์—๋„ @Qualifier์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„์ง€์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์•„๋ณด์ธ๋‹ค. 

 

 

 

 

โ–บ  ์ƒ์„ฑ์ž ์ž๋™ ์ฃผ์ž…

public OrderServiceImpl(MemberRepository memberRepository
		,@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {

 

์—ฌ๊ธฐ์„œ @Qulifier์„ ๋ถ™์—ฌ์ฃผ๋ฉด ์„œ๋กœ ๊ฐ™์€ @Qulifier์„ ์ฐพ์œผ๋Ÿฌ ๋‹ค๋‹Œ๋‹ค. ๋งŒ์ผ ๋ถ™์ด์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•ด๋„ mainDiscountPolicy์ธ ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ์œผ๋Ÿฌ ๋‹ค๋‹ ๊ฒƒ์ด๋‹ค. 

 

 

 

 


 

 

 

โœ”๏ธ  @Primary ์‚ฌ์šฉ

 @Component
 @Primary
 public class RateDiscountPolicy implements DiscountPolicy {}

 

@Primary๋ฅผ ๋ถ™์—ฌ์„œ DiscountPolicy์˜ ํƒ€์ž…์—์„œ RateDiscountPolicy ๋นˆ์ด ๊ฐ€์žฅ ์šฐ์„ ์ ์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปค๋„ฅ์…˜ ํš๋“์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ @Primary๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ํš๋“์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ @Qualify๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•˜๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ  MainDiscountPolicy

์• ๋…ธํ…Œ์ด์…˜ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ

 

 

 @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
 ElementType.TYPE, ElementType.ANNOTATION_TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Qualifier("mainDiscountPolicy")

 

@Target

: ์• ๋…ธํ…Œ์ด์…˜ ์ ์šฉ ๋Œ€์ƒ

 

 

@Retention

: ์• ๋…ธํ…Œ์ด์…˜ ์ง€์† ์‹œ๊ฐ„ ๊ฒฐ์ •

 

 

@Documented

: ์• ๋…ธํ…Œ์ด์…˜ ์ •๋ณด๋ฅผ javadoc์œผ๋กœ ์ž‘์„ฑํ•œ ๋ฌธ์„œ์— ํฌํ•จ

 

 

@Qualifier("mainDiscountPolicy")` ์ด๋ ‡๊ฒŒ ๋ฌธ์ž๋ฅผ ์ ์œผ๋ฉด ์ปดํŒŒ์ผ์‹œ ํƒ€์ž… ์ฒดํฌ๊ฐ€ ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์• ๋…ธํ…Œ์ด์…˜์„ ์ง์ ‘ ๋งŒ๋“ค์ฃผ์—ˆ๋‹ค. 

 

 

 

- ์• ๋…ธํ…Œ์ด์…˜ ์ถœ์ฒ˜

 

[Java] ์ž๋ฐ” ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ ๋ฐ ํ™œ์šฉ

๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜ (Meta Annotation) ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์€ ์–ด๋…ธํ…Œ์ด์…˜์— ๋ถ™์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ฆ‰, ์‚ฌ์šฉํ•  ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์€ ์‚ฌ์šฉํ•  ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ ์šฉ๋Œ€์ƒ ๋˜

ittrue.tistory.com

 

 

 

@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy { } 

 

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…์ด๋‚˜ ์ˆ˜์ •์ž ์ฃผ์ž…์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

 

 


 

 

 

โœ”๏ธ  AllBeanTest

ํ•ด๋‹น ํƒ€์ž…์˜ ๋ชจ๋“  ๋นˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Map๊ณผ List๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

โ–บ  findAllBean( )

 
   ApplicationContext ac
     = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);

	DiscountService discountService = ac.getBean(DiscountService.class);
        Member member = new Member(1L, "userA", Grade.VIP);
        int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");

 

AutoAppConfig์™€ DiscountService ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ac๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  DiscountService ๊ฐ์ฒด๋ฅผ ์ฐพ์•„  DiscountService ํƒ€์ž…์˜ discountService ์ด๋ฆ„์œผ๋กœ ํ•ด๋‹น ๋นˆ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. member๋Š” 10000์„ ์ฃผ๋ฌธํ–ˆ๊ณ , Vip ๋“ฑ๊ธ‰์œผ๋กœ fixDiscountPolicy๋ฅผ ์จ์„œ discount๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

 

 

 

- getBean ์ถœ์ฒ˜

 

[Spring] getBean() ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•

Spring ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ApplicationContext๋ฅผ ํ†ตํ•ด ๋นˆ(Bean) ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ApplicationContext๋Š” getBean() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋“ฑ๋ก๋œ ๋นˆ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” getBean(

jjangadadcodingdiary.tistory.com

 

 

 

 

โ–บ  DiscountService

public DiscountService(Map<String, DiscountPolicy> policyMap,List<DiscountPolicy> policies){
            this.policyMap = policyMap;
            this.policies = policies;
}

 

์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ƒ์„ฑ์ž๋Š” DiscountPolicy ํƒ€์ž…์„ <๋นˆ์ด๋ฆ„, ๋นˆ> ์Œ์œผ๋กœ ๋ฐ›๋Š” Map์ด ์žˆ๊ณ , ๋ชจ๋“  DiscountPolicy ๋นˆ์„ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ›๋Š” List๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. 

 

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

 

 public int discount(Member member, int price, String discountCode) {
            DiscountPolicy discountPolicy = policyMap.get(discountCode); 
            return discountPolicy.discount(member, price);
}

 

์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค. discountCode๋Š” Test ์ฝ”๋“œ์—์„œ fixDiscountPolicy๋กœ ๋ฐ›์•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฉด policyMap์„ ํ†ตํ•ด fixDiscountPolicy ๋นˆ์„ ์ฐพ์•„ discountPolicy๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด discountPolicy๋Š” fixDiscountPolicy๊ฐ€ ๋˜๋Š”๊ฑฐ๊ณ  fixDiscountPolicy์˜ ์ •์ฑ…์ธ 'Vip๋Š” ์–ผ๋งˆ๋ฅผ ๊ตฌ๋งคํ•˜๋“  1000์›์„ ํ• ์ธํ•ด์ฃผ๋Š” ๊ฒƒ'์— ๋งž์ถฐ ํ• ์ธ์ด ์ง„ํ–‰๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด member๋Š” vip์ด๋ฉฐ 10000์›์„ ๊ตฌ๋งคํ–ˆ๋‹ค๋Š” test ์ฝ”๋“œ์— ๋งž์ถฐ 1000์›์„ ํ• ์ธํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Map๊ณผ List๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์— ๋งž๋Š” ๋ชจ๋“  ๋นˆ์„ ๊ฐ€์ ธ์˜จ ํ›„, ๊ณ ๊ฐ ํ˜น์€ ํ…Œ์ŠคํŠธ์— ๋งž๋Š” ๋นˆ์„ ์ฐพ์•„ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 

 

Q. ๋ชจ๋“  ๋นˆ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ผญ Map๊ณผ List ๋‘˜ ๋‹ค ์จ์•ผํ•˜๋Š”๊ฑธ๊นŒ?

A. ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. Map์€ <ํ‚ค ํ˜น์€ ์ด๋ฆ„>์„ ๊ฐ€์ง€๊ณ  ๋นˆ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ๊ฒƒ์ด๊ณ , List๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ชจ๋“  ๋นˆ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ˜„์žฌ๋Š” ์ ์€ ๋นˆ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์‹ค๋ฌด๋Š” ํ›จ์”ฌ ๋งŽ์€ ๋นˆ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ˜น์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ํŠน์„ฑ์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊นŒ์ง€ ์–ด์ฐŒ์ €์ฐŒ ์™”๋‹ค. ์‚ฌ์‹ค ๋ธ”๋กœ๊ทธ ์ •๋ฆฌ๋งŒ ์•„๋‹ˆ์—ˆ์–ด๋„ ๊ฐ•์˜๋Š” ํ•œ๋‹ฌ ์•ˆ์— ๋๋ƒˆ์„ ๋“ฏ... ๊ทธ๋ž˜๋„ ๋ธ”๋กœ๊ทธ ์ •๋ฆฌํ•˜๋ฉด์„œ ํ‰์†Œ ๊ทธ๋ƒฅ ๋„˜๊ฒผ์„ ์งˆ๋ฌธ๋“ค ๋ชฝ๋•… ์ฐพ์•„๋ณด๋Š” ์ค‘์ด๋‹ค. ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ ๊ทธ๋งŒํผ ๋‚ด ๋จธ๋ฆฌ์˜ ์ง€์‹๋„ ํ•˜๋‚˜ ๋‘˜ ์ฑ„์›Œ์ง€๊ณ  ์žˆ์Œ์„ ๋А๋‚€๋‹ค. (์‚ฌ์‹ค ๋ธ”๋กœ๊ทธ ์ •๋ฆฌ์— ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค ํ˜„ํƒ€์™€์„œ ์ฃผ์ ˆ์ฃผ์ ˆ ์ ์–ด๋ณธ๋‹ค) ์ด๋ฒˆ ์„น์…˜ 6์€ ๊ฐ•์˜๊ฐ€ ์งง์•„์„œ ๋นจ๋ฆฌ ๋๋‚ ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ธฐ๋Œ€๊ฐ์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ์ง‘ ์—์–ด์ปจ ๊ณ ์žฅ๋‚˜์„œ ์•ˆ๋‚˜์˜ค์ง€๋งŒ,,,๐Ÿฅฒ ๋”์œ„ ์ด๊ฒจ๋‚ด๊ณ ! ๋ชจ๋‘๋“ค ํ™”์ดํŒ…!!!

 

 

 

๐Ÿงธ 


 

๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๋ ˆ์ธ ๊ผฌ์šฐ- ๐Ÿงธ

  • main
    ใ„ด class : AutoAppConfig
  • test - scan
    ใ„ด class : AutoAppConfigTest

  • test - scan - filter
    ใ„ด class : BeanA, BeanB, ComponentFilterAppConfigTest

    ใ„ด Annotation : MyExcludeComponent, MyIncludeComponent

 

 


 

Q.  ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด๋ž€?

A. ์„ค์ •์ •๋ณด๊ฐ€ ์—†์–ด๋„ ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•œ๋‹ค.

 

 

 

โœ”๏ธ  AutoAppConfig

์ปดํฌ๋„ŒํŠธ ์Šค์บ” ์„ค์ •

 

@ComponentScan(
        basePackages = "hello.core.member",
        basePackageClasses = AutoAppConfig.class,
        excludeFilters = @ComponentScan.Filter
			(type = FilterType.ANNOTATION, classes = Configuration.class)
)

 

 

@ComponentScan

: @Component์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ streotype(@Service, @Repository, @Controller.)์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ€์—ฌ๋œ ํด๋ž˜์Šค๋“ค์„ ์ž๋™์œผ๋กœ Scanํ•˜์—ฌ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

 

 

basePackages

:  String์œผ๋กœ ์ž…๋ ฅ๋œ ํŒจ์บ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง์ ‘ ์Šค์บ”ํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

 

basePackageClasses

์ ํžŒ ํด๋ž˜์Šค๊ฐ€(ํŒจํ‚ค์ง€ ์•ˆ) ์œ„์น˜ํ•œ ๊ณณ๋ถ€ํ„ฐ ๋ชจ๋“  ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ€์—ฌ๋œ ํด๋ž˜์Šค๋ฅผ bean์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค. 

 

 

excludeFilters 

:  ๊ฐ์ฒด๋ฅผ ์ œ์™ธํ•œ๋‹ค. (AppConfig์— ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•œ ๊ฒƒ๋“ค์€ ๋นผ์ค€๋‹ค)

 

 

includeFilters

@Component ์–ด๋…ธํ…Œ์ด์…˜์ด ์‚ฌ์šฉ๋œ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์œผ๋ฉด,  includeFilters ์„ค์ •์„ ์‚ฌ์šฉํ•œ๋‹ค. ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํด๋ž˜์Šค๋งŒ์„ ์Šค์บ”ํ•˜๋„๋ก ์ง€์ •ํ•œ๋‹ค. 

 

 

 

- @ComponentScan ์ถœ์ฒ˜

 

Spring - @ComponentScan ์–ด๋…ธํ…Œ์ด์…˜์ด๋ž€?

@ComponentScan @Componentscan ์–ด๋…ธํ…Œ์ด์…˜์€ @Component์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ streotype(@Service, @Repository, @Controller.)์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ€์—ฌ๋œ Class๋“ค์„ ์ž๋™์œผ๋กœ Scanํ•˜์—ฌ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ

galid1.tistory.com

 

 

- @ComponentScan ์ถœ์ฒ˜

 

[Spring] @ComponentScan - basePackages, basePackageClasses

@ComponentScan@Configuration์ด ๋ถ™์€ ๋นˆ ์„ค์ • ์ž๋ฐ”ํด๋ž˜์Šค์— ๋ถ™์—ฌ์„œ ์Šคํ…Œ๋ ˆ์˜ค ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ...

blog.naver.com

 

 

 

Q. basePackages๋ณด๋‹ค basePackagesClasses๋ฅผ ์“ฐ๋Š”๊ฑธ ๊ถŒ์žฅํ•œ๋‹ค. ์™œ ๊ทธ๋Ÿฐ ๊ฒƒ์ผ๊นŒ?

A. ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•ด์•ผํ•œ๋‹ค. ์ปจํฌ๋„ŒํŠธ ์Šค์บ”์„ ํ•˜๋ ค๋ฉด @SpringBootApplication์„ ์‚ดํŽด๋ด์•ผํ•œ๋‹ค. @SpringBootApplication์—๋Š” @ComponentScan์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  @ComponentScan์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ์‹œ์ž‘์ง€์ ์ด๋‹ค. @ComponentScan์„ ๋ถ™์ด๊ณ  ์žˆ๋Š” ๊ทธ ํด๋ž˜์Šค๋ถ€ํ„ฐ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ์‹œ์ž‘ํ•œ๋‹ค. ์„ค์ •ํ•ด ๋†“์€ ํŒจํ‚ค์ง€๋“ค ์ค‘์—์„œ, ํ•ด๋‹น ํŒจํ‚ค์ง€์™€ ํ•˜์œ„ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด์„œ @Component ๊ฐ™์€ ์Šคํ…Œ๋ ˆ์˜ค ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์ฐพ์•„์„œ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ€๋Š”๊ฒŒ spring์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ฒฝ๋กœ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฐ๋ฐ basePackages๋Š” ๋‚ด๊ฐ€ ์ง์ ‘ ๊ฒฝ๋กœ๋ฅผ ์ ๋Š” ๊ฒƒ์œผ๋กœ springboot์—์„œ ์ œ๊ณต๋˜๋Š” ์ตœ์ƒ์œ„ ํŒจํ‚ค์ง€๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ฒŒ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. springboot์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๊ณ  ํ–ฅํ›„ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์ค€๋‹ค.

 

 

- basePackage๋ฅผ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ์ด์œ  ์ถœ์ฒ˜

 

spring[5] ComponentScan๊ณผ Component

Component Sacn ์ง€๊ธˆ๊นŒ์ง€ ๋นˆ์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ AppConfig class์— ์‚ฌ์šฉ์ž๊ฐ€ ์ผ์ผํžˆ @Bean์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฑด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋„ˆ๋ฌด ๊ท€์ฐฎ์€ ์ž‘์—…์ด๊ณ  ๋ˆ„๋ฝํ•˜๊ฒŒ ๋˜๋ฉด ํฐ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ

ililil9482.tistory.com

 

- ComponentScan ๋™์ž‘ ์ถœ์ฒ˜

 

์Šคํ”„๋ง ํ•ต์‹ฌ ๊ธฐ์ˆ -03.@Component์™€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”

IoC ์ปจํ…Œ์ด๋„ˆ 4๋ถ€ : @Component์™€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”

jaeuk2274.github.io

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

 

public class AutoAppConfig {

}

 

ํ˜„์žฌ AutoAppConfig ํด๋ž˜์Šค์˜ ์—ญํ• ์€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ๋‚˜ ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” ์ ์ง€ ์•Š๋Š”๋‹ค.

 

 

 

 


 

 

 

 

โœ”๏ธ  OrderServiceImpl

์˜์กด๊ด€๊ณ„์ž๋™์ฃผ์ž…

 

@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
    
    ...
}

 

 

@Component

@Component ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋ฉด Bean Configuration ํŒŒ์ผ์— Bean์„ ๋”ฐ๋กœ ๋“ฑ๋กํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

@Autowired

์ƒ์„ฑ์ž์—์„œ ์—ฌ๋Ÿฌ ์˜์กด๊ด€๊ณ„๋„ ํ•œ๋ฒˆ์— ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

• @Component
: Bean ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ(์ปดํฌ๋„ŒํŠธ ์Šค์บ”์— ์‚ฌ์šฉ), IoC์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž๋™์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ๋˜๋ฉด Sigleton์ด๋‹ค. 

• @Controller
: ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ์— ์‚ฌ์šฉํ•˜๋ฉฐ, Dispatcher(HTTPํ”„๋กœํ† ์ฝœ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ๋ฐ›์•„ ์ ํ•ฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์œ„์ž„)์€ @Controller๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ํ™•์ธํ•ด์„œ @RequestMapping์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ํ™•์ธํ•ฉํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

• @Service
: ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์— ์žˆ์œผ๋ฉฐ ์ €์žฅ์†Œ ๊ณ„์ธต์„ ์‚ฌ์šฉํ•œ๋‹ค.

• @Repository
: ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ณ„์ธต์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์ฃผ๋กœ ์ปดํฌ๋„ˆ๋Š” ์Šค์บ” ๋Œ€์ƒ์ด ๋˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์Šคํ”„๋ง๋ถ€ํŠธ์™€ JPA๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•ด์„œ @Repository๋ฅผ ์ ์šฉํ•œ ๋นˆ์„ ํ”„๋ก์‹œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

• @Configuration
:  ์„ค์ •ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ, Bean์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์• ๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์‹ฑ๊ธ€ํ†ค์„ ์œ ์ง€ํ•˜๋„๋ก ์ถ”๊ฐ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

- @Controller, @Service ์ถœ์ฒ˜

 

@Controller, @Service, @Repository ์ฐจ์ด

๊ฐœ์š” ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์•„๋งˆ ๊ฐ€์žฅ ์ฒ˜์Œ ์ ‘ํ–ˆ๋˜ ๊ฒƒ์ด @Controller, @Service, @Repository์˜€๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ๋ฌด์˜์‹์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๊ฐ ์ฐจ์ด์ ์€ ์žˆ์„๊นŒ? ์žˆ๋‹ค๋ฉด ์–ด๋–ค ๊ฒƒ์ผ๊นŒ? ์•Œ์•„๋ณด๋„๋ก ํ•ด๋ณด

escapefromcoding.tistory.com

 

 

- @Repository ์ถœ์ฒ˜

 

@Repository ๊ธฐ๋Šฅ

@Repository ๋Š” ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์• ๋„ˆํ…Œ์ด์…˜์ด๋‹ค. ๋ณดํ†ต์€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์˜ ๋Œ€์ƒ์ด ๋˜๊ธฐ ์œ„ํ•ด ์ ์šฉํ•˜์ง€๋งŒ ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ(PersistenceExceptionTranslationPostP

hoonsmemory.tistory.com

 

 

- @Configuration ์ถœ์ฒ˜

 

[Spring] @Configuration ๊ฐœ๋…๊ณผ ์žฅ์ 

๋”๋ณด๊ธฐ 1. @Configuration ์ด๋ž€? : @Configuration์ด๋ผ๊ณ  ํ•˜๋ฉด ์„ค์ •ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์• ๋…ธํ…Œ์ด์…˜ or Bean์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์• ๋…ธํ…Œ์ด์…˜์ด๋‹ค. ๋”๋ณด๊ธฐ 2. @Configuration์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ญ๊ฐ€ ์ข‹์€๋ฐ? : @Configuration ์• 

castleone.tistory.com

 

 

 

 


 

 

 

 

โœ”๏ธ  AutoAppConfigTest

์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด ์ž˜ ์ž‘๋™๋˜๋Š”์ง€ ํ™•์ธ

 

 @Test
    void basicScan() {
        AnnotationConfigApplicationContext ac 
				 = new AnnotationConfigApplicationContext(AutoAppConfig.class);

 

 

AnnotationConfigApplicationContext๋Š” AutoAppConfig์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ ์Šคํ”„๋ง ์„ค์ • ํด๋ž˜์Šค๋กœ ์ธ์‹ํ•œ๋‹ค. AutoAppConfig์— @Configuration์„ ์ ์–ด๋†“์•˜์œผ๋‹ˆ ์ธ์‹์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. AutoAppConfig์—๋Š” ์•„๊นŒ @Componentscan์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ์ ์–ด๋†“์•˜๋‹ค. ๊ทธ๋Ÿผ ๊ทธ๊ฑธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์Šค์บ”ํ•ด ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค. ๋ชจ๋“  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜๋ฉดAnnotationConfigApplicationContext๋Š” ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

        MemberService memberService = ac.getBean(MemberService.class);
        assertThat(memberService).isInstanceOf(MemberService.class);
    }

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ MemberService ํƒ€์ž…์˜ ๋นˆ์„ ์กฐํšŒํ•œ๋‹ค. ์กฐํšŒ๋œ ๋นˆ์ด MemberServiceํƒ€์ž…์ธ์ง€ ๊ฒ€์ฆํ•˜์—ฌ ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

 

assertThat(A).isInstanceOf(B);

: isInstanceOf() ๋Š” ํ•ด๋‹น ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋‹ค. 

 

 

 

 


 

 

 

โœ”๏ธ  MyExcludeComponent

์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•  ์• ๋…ธํ…Œ์ด์…˜

 

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {

}

 

 

@interface 

: ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์™ธ์—, ์‚ฌ์šฉ์ž๊ฐ€ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. @interface๋Š” ํด๋ž˜์Šค๋‚˜ ๋ณ€์ˆ˜๋ฅผ ํŠน์ • ๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

@Target

:  ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  annotation์ด ๋ถ€์ฐฉ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค. 

@Target({ElementType.TYPE})์€ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์„œ, Enum ๋˜๋Š” Record์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

 

@Retention

: ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์–ธ์ œ๊นŒ์ง€ ์œ ์ง€ํ• ๊ฑด์ง€ ์ง€์ •ํ•œ๋‹ค.

@Retention(RetentionPolicy.RUNTIME)์€ Java๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๋™์•ˆ ์œ ์ง€ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

 

@Documented

:  ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ javadoc์œผ๋กœ ์ž‘์„ฑํ•œ ๋ฌธ์„œ์— ํฌํ•จ๋˜๋„๋ก ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

 

Q. Docummented๋ฅผ ์จ์„œ ๋ฌธ์„œ์— ํฌํ•จ๋˜๋„๋กœ ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?

A. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด์•˜์„ ๋•Œ ์–ด๋–ค ์ฝ”๋“œ์ธ์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์„ ์™œ ์ผ๋Š”์ง€ ๋“ฑ ์„ค๋ช…์„ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— @Documented๋ฅผ ํ•จ๊ป˜ ์ ์–ด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์˜ ์ดํ•ด๋ฅผ ๋•๋Š”๋‹ค. ํŠนํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ๋ฐœํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

 

 

- @Target @Retention ์ถœ์ฒ˜

 

[Spring] ์ปค์Šคํ…€ Annotation ๋งŒ๋“ค๊ธฐ

๋‚˜๋งŒ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์ž

velog.io

 

 

- @Docummented ์ถœ์ฒ˜

 

[Java] ์ž๋ฐ” ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ ๋ฐ ํ™œ์šฉ

๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜ (Meta Annotation) ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์€ ์–ด๋…ธํ…Œ์ด์…˜์— ๋ถ™์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ฆ‰, ์‚ฌ์šฉํ•  ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์€ ์‚ฌ์šฉํ•  ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ ์šฉ๋Œ€์ƒ ๋˜

ittrue.tistory.com

 

 

 

 


 

 

 

 

โœ”๏ธ  BeanB

์ปดํฌ๋„ŒํŠธ ์Šค์บ”์—์„œ ์ œ์™ธํ•  ํด๋ž˜์Šค

 

@MyExcludeComponent
public class BeanB {

}

 

์•„์ง๊นŒ์ง„ ์ œ์™ธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. @MyExcludeComponent๋ฅผ ์ ์–ด์ฃผ์–ด ์•„๊นŒ ๋งŒ๋“ค์—ˆ๋˜ ์• ๋…ธํ…Œ์ด์…˜๊ณผ ์—ฐ๊ฒฐํ–ˆ๋‹ค.

 

 

Q. ์™œ ์• ๋…ธํ…Œ์ด์…˜์„ ๋งŒ๋“œ๋Š”๊ฐ€?

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

 

 

 

 


 

 

 

 

โœ”๏ธ ComponentFilterAppConfigTest

 

BeanA beanA = ac.getBean("beanA", BeanA.class);
Assertions.assertThat(beanA).isNotNull();

 

getBean

: ac(์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ)์—์„œ beanA ์ด๋ฆ„์œผ๋กœ BeanA๋ผ๋Š” ํƒ€์ž…์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

 

 

Assertions.assertThat(A).isNotNull( )

: A๊ฐ€ Null์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

 

 

- Assertions.assertThat().isNotNull() ์ถœ์ฒ˜

 

[Spring] Junit5 Assertions, assertThat()

์ด ๊ธ€์€ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ๋“ค์„ ๊ธฐ๋กํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋‚˜ ๊ณ ์ณ์•ผ ํ•  ์‚ฌํ•ญ๋“ค์ด ์žˆ๋‹ค๋ฉด ์ง€์  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! โ›…๏ธ Assertions ์ด์ „ ํฌ์ŠคํŠธ์—์„œ Junit5๋ฅผ ํ†ตํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

m42-orion.tistory.com

 

 

 

 

assertThrows(
        NoSuchBeanDefinitionException.class,
        () -> ac.getBean("beanB", BeanB.class));
}

 

 

NoSuchBeanDefinitionException

: BeanFactory์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋นˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

NoSuchBeanDefinitionException.class, () -> ac.getBean("beanB", BeanB.class)์€ BeanB๋ฅผ beanB๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ฐ€์ง€๊ณ  ์™”๋Š”๋ฐ ๊ทธ๊ฒŒ ์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋นˆ ์ธ์Šคํ„ด์Šค์—ฌ์•ผ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

- NoSuchBeanDefinitionException  ์ถœ์ฒ˜

 

NoSuchBeanDefinitionException (Spring Framework 6.1.11 API)

Return the required type of the missing bean, if it was a lookup by type that failed.

docs.spring.io

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

@ComponentScan(
            includeFilters = @Filter(classes = MyIncludeComponent.class),
            excludeFilters = @Filter(classes = MyExcludeComponent.class)
    )

 

 

@Filter

: ํ•„ํ„ฐ๋Š” ์ฃผ๋กœ ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ์ฆ, ๊ถŒํ•œ ์ฒดํฌ ๋“ฑ์—  ์“ด๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์ด DispatcherServlet์— ์ „๋‹ฌ๋˜๊ธฐ ์ „, ํ—ค๋”๋ฅผ ๊ฒ€์‚ฌํ•ด ์ธ์ฆ ํ† ํฐ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€, ์˜ฌ๋ฐ”๋ฅธ์ง€, ์˜ณ์ง€ ์•Š์€์ง€ ๋“ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.

 

 

- Filter ์ถœ์ฒ˜

 

spring - ์Šคํ”„๋ง์—์„œ์˜ ํ•„ํ„ฐ ๊ฐœ๋… ๋ฐ ์˜ˆ์ œ

๋ธ”๋กœ๊ทธ์—์„œ ์‚ฌ์šฉํ•œ ์†Œ์Šค์ฝ”๋“œ๋Š” https://github.com/97e57e/BLOG ์—์„œ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Filter ๋ž€? ์‚ฌ์‹ค ํ•„ํ„ฐ๋Š” ์Šคํ”„๋ง์˜ ๋…์ž์ ์ธ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ ์ž๋ฐ” ์„œ๋ธ”๋ฆฟ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ

gardeny.tistory.com

 

 

 

excludeFilters

:  ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋Œ€์ƒ์„ ์Šค์บ”์—์„œ ์ œ์™ธ์‹œํ‚จ๋‹ค.

 

 

Q. ๊ทธ๋Ÿผ ๋‹ค์‹œ ํฌํ•จ์‹œํ‚ค๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜?

A. includeFilters = @Filter(classes = MyExcludeComponent.class)๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

 

- excludeFilters ์ถœ์ฒ˜

 

component scan

@Component ํด๋ž˜์Šค ์„ ์–ธ๋ถ€ ์œ„ ์ชฝ์— @Component ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด @Configuration ํด๋ž˜์Šค์— ๋ณ„๋„๋กœ Bean ๋“ฑ๋ก ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š์•„๋„ ์Šคํ”„๋ง์ด ํŒจํ‚ค์ง€ ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•ด์„œ Bean์œผ๋กœ ๋“ฑ๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

hyeon9mak.github.io

 

 

@ComponentScan์„ ํ†ตํ•ด ์†์„ฑ์„ ์‚ดํŽด๋ณธ๋‹ค. ์†์„ฑ์—” MyExcludeComponent๋ฅผ excludeFiltersํ•˜๋ผ๊ณ  ์ ํ˜€์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด MyExcludeComponent๋ฅผ ์ œ์™ธ์‹œํ‚ค๋„๋ก ๋˜์–ด์žˆ์œผ๋‹ˆ @MyExcludeComponent๊ฐ€ ๋ถ™์–ด์žˆ์œผ๋ฉด ์ œ์™ธ์‹œํ‚ค๋„๋ก ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ BeanB์—๋Š” @MyExcludeComponent๊ฐ€ ๋ถ™์–ด์žˆ์œผ๋‹ˆ ์ œ์™ธ๊ฐ€ ๋˜์—ˆ๋‹ค.

 

 

 

 


 

๐ŸŒท

 

์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ @ComponentScan์„ ์“ฐ๊ณ  { } ์•ˆ์— ์›ํ•˜๋Š” ํŠน์„ฑ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ์„ ์•Œ์•„๋ดค๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์— ๋Œ€ํ•œ ์š”๊ตฌ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ถ์€ ๊ฒจ์šฐ @interface์™€ ํด๋ž˜์Šค๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 


 

 

 

๋งŒ์ผ ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฐ•์˜์™€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜จ๋‹ค๋ฉด,

AppConfig์˜ MemberRepository ์•ž์— static์ด ๋ถ™์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ผ!

 

 

 

 

 

Q. ์™œ static์„ ์“ฐ๋ฉด ์ธ์Šคํ„ด์Šค ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ํ• ๋‹น๋ ๊นŒ?

 

A. static์„ ๋ถ™์ด๊ฒŒ ๋˜๋ฉด spring์˜ bean ๋ผ์ดํ”„ ์‚ฌ์ดํด ๊ด€๋ฆฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ํƒ€์ž…์˜ bean์ด ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค.

 

 

 


 

 

๐Ÿ‘๏ธ‍๐Ÿ—จ๏ธ  static ์ด๋ž€?

 

1. ํด๋ž˜์Šค ๋ ˆ๋ฒจ์˜ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ์— ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ํ•ด๋‹น ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. static ๋ฉค๋ฒ„๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋  ๋•Œ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๋ฉฐ, ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ณตํ†ต์˜ ์ž์›์ด ๋ฉ๋‹ˆ๋‹ค.

3. ํด๋ž˜์Šค ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ , ๊ฐ์ฒด ์ƒ์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

- Static ์ถœ์ฒ˜

 

์ž๋ฐ”์˜ ์Šคํƒœํ‹ฑ(static) ํ‚ค์›Œ๋“œ ์ดํ•ดํ•˜๊ธฐ

์ž๋ฐ”์˜ ์Šคํƒœํ‹ฑ(static) ํ‚ค์›Œ๋“œ์˜ ์—ญํ• , ์‚ฌ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ฃผ์˜์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

f-lab.kr

 

 

 

 

 

๐Ÿ‘๏ธ‍๐Ÿ—จ๏ธ  static์ด spring์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์–ด๋–ป๊ฒŒ ๊ผฌ๋Š” ๊ฒƒ์ธ๊ฐ€?

(์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•œ ๊ฑด ์•„๋‹™๋‹ˆ๋‹ค๐Ÿฅฒ)

 

 

1. ์›๋ž˜ spring์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์€ @Configuration ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  @bean ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.

 

2. ๊ทธ๋Ÿฐ๋ฐ static์„ bean ๋ฉ”์„œ๋“œ์— ์ •์˜ํ•˜๊ฒŒ ๋˜๋ฉด, static์˜ ํŠน์„ฑ์ธ ๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ํ•ด๋‹น ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์—  1๋ฒˆ์˜ ์‚ฌ์ดํด์„ ๋”ฐ๋ผ๊ฐ€์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. 

 

3. ๊ทธ๋ ‡๊ธฐ์— ๋ฉ”์„œ๋“œ๊ฐ€ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ํ˜ธ์ถœ๋˜์–ด(static์˜ ํŠน์ง•) @Configuration์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—†์ด๋„ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ  spring์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊นจ๊ฒŒ ๋งŒ๋“ค์–ด ์‹ฑ๊ธ€ํ†ค ๋ณด์žฅ์„ ํ•ด์ฃผ์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

 


 

 

 

๐Ÿ‘๏ธ‍๐Ÿ—จ๏ธ  static๊ณผ spring bean์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

 

  static bean
๊ณตํ†ต์  • ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค = static์€ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ    /    bean์€ ์Šคํ”„๋ง์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ๊ณต์œ 
 
(์–ด๋””์„œ๋“ ์ง€ ๊ทธ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”) ์ „์—ญ์ ์ธ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

๋ผ์ดํ”„์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค = static์€ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘๋ถ€ํ„ฐ ๋๋‚ ๋•Œ๊นŒ์ง€  /   bean์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด 
๋‹ค๋ฅธ์  static์€ ์˜์กด์„ฑ ์ฃผ์ž…์ด ์•ˆ๋œ๋‹ค.
   bean์€ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

static์€ ์ฃผ๋กœ ์–ด๋–ค ์ƒํƒœ๋‚˜ ๋™์ž‘์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด 
   bean์€ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ, ์˜์กด์„ฑ์ฃผ์ž…, ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

static์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„ ์–ธ
   bean์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ.
 

 

 

- static๊ณผ bean์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์  ์ถœ์ฒ˜

 

[Spring] Static ๊ฐ์ฒด์™€ Bean์˜ ์ฐจ์ด

์˜๋ฌธ์  ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ ์ƒ์ˆ˜ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ, ๋ฉ”๋ชจ๋ฆฌ์— ๋ฏธ๋ฆฌ ์˜ฌ๋ ค๋‘๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ƒ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ์ˆ˜ ํด๋ž˜์Šค๋ฅผ static final์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๊ทธ

bbogle2.tistory.com

 

 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

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

 

 

 

๐Ÿงธ 




๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๐Ÿงธ

    •  singleton
      ใ„ด class : SingletonService, SingletonTest, StatefulService, StatefulServiceTest, ConfigurationSingletonTest 
    • AppConfig

 


 

Q.  ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

A. ์‹ฑ๊ธ€ํ†ค์ด ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

โœ”๏ธ  SingletonTest

 

โ–บ pureContainer

์ˆœ์ˆ˜ ์ž๋ฐ”์ฝ”๋“œ๋กœ ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•œ๋‹ค.

 

AppConfig appConfig = new AppConfig();

MemberService memberService1 = appConfig.memberService();
MemberService memberService2 = appConfig.memberService();
์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ AppConfig์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. appConfig์— ์žˆ๋Š” memberService ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ ํƒ€์ž…์€ MemberService์ด๋ฉฐ ๊ฐ ์ด๋ฆ„์€ memberService1๊ณผ memberService2๊ฐ€ ๋œ๋‹ค.

์œ„์˜ ์ฝ”๋“œ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์ง€๋„, ์Šคํ”„๋ง์„ ์ด์šฉํ•˜์ง€๋„ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— memberService1๊ณผ memberService2๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค. ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋‹ค์ˆ˜ ๊ณ ๊ฐ์˜ ๋™์‹œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ณ ๊ฐ์ด ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค AppConfig๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์ด ๋งŽ์€ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

 

 

โ–ธ  ๊ฒฐ๊ณผ

๊ฐ ๊ฐ’์ด 6a472554์™€ 7ff2a664๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

Assertions.assertThat(memberService1).isNotSameAs(memberService2);

 

assertThat(A).isNotSameAs(B)

: ๋Œ€์ƒ A์™€ ๋Œ€์ƒ B์˜ ์ฃผ์†Œ๊ฐ’์ด ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ

 

Q. assertThat(A).isEqualTo(B)์™€ assertThat(A).isSameAs(B)์™€ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€?
A. isEqualTo๋Š” ๋Œ€์ƒ์˜ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๊ณ  isSameAs๋Š” ๋Œ€์ƒ์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

์˜ˆ์‹œ) isEqualTo
String A = "Hi";
String B = "Hi";

assertThat(A).isEqualTo(B);โ€‹



์˜ˆ์‹œ) isSameAs (==)

String A = "Hi";
String B = A;

assertThat(A).isSameAs(B);

 

 

 

 


 

 

 

โœ”๏ธ SingletonService

์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

private static final SingletonService instance = new SingletonService();

 

private

: ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ํ•œ๋‹ค.

 

static

:  instance ๋ณ€์ˆ˜๊ฐ€ ํด๋ž˜์Šค ์ˆ˜์ค€์—์„œ ๊ด€๋ฆฌ๋˜๊ฒŒ ํ•˜๋ฉฐ, ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋  ๋•Œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.

 

final

: ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

 

 

Q. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์— static์€ ์™œ ์“ฐ๋Š”๊ฑธ๊นŒ? 

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

 

 

 

- ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด๊ณผ static์˜ ๊ด€๋ จ ์ถœ์ฒ˜

 

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด( Singleton Pattern ) ๊ณผ static - Java ๋””์ž์ธ ํŒจํ„ด

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž€? ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด static์€ ์ „์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์•„ ๋ณด์ด๊ณ  ๊ฐ์ฒด ์ง€ํ–ฅ์ด ์•„๋‹ˆ๋ผ๋Š” ์ฃผ์žฅ์— ์ด๋Ÿฌํ•œ ๋น„ํŒ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž ๋‚˜์™”๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ, ์–ด๋–ค

100100e.tistory.com

 

 

Q. ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค์˜ ์ฐจ์ด

A. ๊ฐ์ฒด๋Š” ์„ ์–ธ, ์ธ์Šคํ„ด์Šค๋Š” ์‹ค์ฒดํ™”๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์„ ๋•Œ, ์ธ์Šคํ„ด์Šค๋Š” ๊ทธ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์œ„์— ์˜ฌ๋ ค์กŒ์„ ๋•Œ๋ฅผ ๋งํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ํŠน๋ณ„ํ•œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ํ•œ๋‹ค. (์šฉ์–ด์˜ ์˜๋ฏธ๊ฐ€ ์กฐ๊ธˆ ๋‹ค๋ฅผ ๋ฟ, ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.)

Dog myDog = new Dog(); 
Dog anotherDog = new Dog();


์œ„์˜ ๋‘ ์ฝ”๋“œ์—์„œ myDog์™€ anotherDog๋Š” Dog ํด๋ž˜์Šค์˜ ๊ฐ์ฒด์ด์ž ์ธ์Šคํ„ด์Šค์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, ๊ฐ์ฒด์ง€๋งŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

- ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค์˜ ์ฐจ์ด์  ์ถœ์ฒ˜

 

instance๋ž€?

์ธ์Šคํ„ด์Šค๋ž€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object Oriented Programming)์—์„œ class์— ์†Œ์†๋œ ๊ฐœ๋ณ„์ ์ธ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, user๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  hong์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ, hong์ด๋ผ๋Š” ๊ฐ์ฒด๋Š” user

velog.io

 

 

 

•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

public static SingletonService getInstance() {
        return instance;
    }
SingletonService์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ , getInstance( ) ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ ‘๊ทผํ•œ๋‹ค. 
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ static์œผ๋กœ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ getInstance( )์ธ ๋“ฏ ํ•˜๋‹ค.

 

 

  private SingletonService() {

    }

 

์ƒ์„ฑ์ž

: ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ

 

 

Q. ์ƒ์„ฑ์ž๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ๋ฌด์—‡์ธ๊ฐ€?

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

	public Book() {	}                          // ๊ธฐ๋ณธ์ƒ์„ฑ์ž
	
	public Book(String title, int price) {    // ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ์ƒ์„ฑ์ž
		this.title = title;
		this.price = price;
	}

 

		Book b1 = new Book();                // ๊ฐ์ฒด์ƒ์„ฑ - ๊ธฐ๋ณธ์ƒ์„ฑ์ž ํ˜ธ์ถœ๋จ
		Book b2 = new Book("๊ตญ์–ด์ฑ…", 3000);   // ๊ฐ์ฒด์ƒ์„ฑ - ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ์ƒ์„ฑ์ž ํ˜ธ์ถœ๋จ

 

 

 

- ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ์„ค๋ช… ์ถœ์ฒ˜

 

[Java] ์ž๋ฐ” - ์ƒ์„ฑ์ž์˜ ๋ชฉ์ , ํŠน์ง•, ์‚ฌ์šฉ๋ฒ• (Constructor)

์ž๋ฐ” - ์ƒ์„ฑ์ž์˜ ๋ชฉ์ , ํŠน์ง•, ์‚ฌ์šฉ๋ฒ• 1. ์ƒ์„ฑ์ž์˜ ๋ชฉ์  ์ƒ์„ฑ์ž(Constructor)๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน์ˆ˜ ๋ชฉ์ ์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ)๋กœ ๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 2. ์ƒ์„ฑ์ž์˜ ํŠน

kadosholy.tistory.com

 

 

Q. ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์˜ ์ƒ์„ฑ์ž๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์ธ๊ฐ€? ์™œ ์“ฐ๋Š”๊ฑธ๊นŒ?

A. ์œ„์˜ ์ƒ์„ฑ์ž๋Š” ๊ธฐ๋ณธ์ƒ์„ฑ์ž์™€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์ผ๋‹จ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” public์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š”๋ฐ, ์œ„์˜ ์ฝ”๋“œ๋Š” private๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•œ ๋ช…์‹œ์  ์ƒ์„ฑ์ž(๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š”)๋‹ค.  private๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

 

 

••• ์—ฐ๊ฒฐ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ™•์ธํ•˜๊ธฐ •••

 

 

โœ”๏ธ  SingletonTest

 

โ–บ singletonServiceTest

SingletonService singletonService1 = SingletonService.getInstance();
SingletonService singletonService2 = SingletonService.getInstance();
SingletonService์˜ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก private ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  static, final, private๋กœ ์ธ์Šคํ„ด์Šค ๋ณ€๊ฒฝ์„ ๋ถˆ๊ฐ€ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด getInstance ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

getInstance( )๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜์—ฌ singletonService1๊ณผ singletonService2์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค ๋‚ด์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

โ–บ singleton ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘ ์‚ดํŽด๋ณด๊ธฐ

# SingletonService
private static final SingletonService instance = new SingletonService();
# SingletonTest
SingletonService singletonService1 = SingletonService.getInstance();
SingletonService singletonService2 = SingletonService.getInstance();

 

ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋˜๋ฉด instance ๋ณ€์ˆ˜๊ฐ€ ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์ ์žฌ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ instance ์‹ค์ œ ๊ฐ’์ด ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, instance๋ผ๊ณ  ์ด๋ฆ„๋งŒ ๋ถ™์—ฌ์ง„ ๊ป๋ฐ๊ธฐ๋งŒ ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์žˆ์œผ๋ฉฐ ์‹ค์ œ ๊ฐ์ฒด๋Š” ํž™ ์˜์—ญ์— ์ €์žฅ๋˜์–ด์žˆ๋‹ค. ๋ฉ”์„œ๋“œ ์˜์—ญ์—๋Š” ํž™ ์˜์—ญ์— ์žˆ๋Š” ์‹ค์ œ ๊ฐ์ฒด๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ’ ์œ„์น˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.

singletonService1์€ ์Šคํƒ ์˜์—ญ์— ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด singletonService1์€ ๋ฉ”์„œ๋“œ ์˜์—ญ์˜ instance๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํž™์˜ ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. ๊ทธ ํ›„ singletonService2๊ฐ€ ์ƒ์„ฑ๋˜์–ด๋„ singletonService1์™€ ๊ฐ™์ด ๋ฉ”์„œ๋“œ ์˜์—ญ์ด ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” instance ํž™์˜ ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ƒ์„ฑํ•ด๋„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ static์„ ๋ถ™์ด์ง€ ์•Š๊ฒŒ ๋˜๋ฉด instance๋Š” ๋ฉ”์„œ๋“œ์— ์ ์žฌ๋˜์ง€ ์•Š๊ณ  ํž™์— ์ ์žฌ๋œ๋‹ค. ์ด๋•Œ ์Šคํƒ์—๋Š” ๊ฐ์ฒด ์‚ฌ์šฉ์„ ์š”๊ตฌํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด ํž™ ์˜์—ญ์— ์žˆ๋Š” instance๋Š” ๊ณ„์†ํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— new SingletonService( )๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ instance์˜ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

โ–บ ๊ฒฐ๋ก 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด DIP,OCP๋ฅผ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”๊ตฌ๋‚˜ private ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ์œ ์—ฐ์„ฑ๋„ ๋–จ์–ด์ง„๋‹ค.

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

 

 

 

 


 

 

 

 

โœ”๏ธ SingletonTest

 

โ–บ springContainer

// ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฝ”๋“œ ์ •์˜
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

MemberService memberService1 = ac.getBean("memberService", MemberService.class);
MemberService memberService2 = ac.getBean("memberService", MemberService.class);
AppConfig์— ์ •์˜๋˜์–ด์žˆ๋Š” memberService๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋นˆ์„ MemberService ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์„ฑ์— ์˜ํ•ด ๊ฐ™์€ ๋นˆ ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

 

 

๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ  StatefulService

๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์œ ํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์€ ๋ฌด์ƒํƒœ๋กœ ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค.

 

 

โ–บ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์„ค๊ณ„ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ 

# StatefulService
private int price; 

public void order(String name, int price) { 
	...
	this.price = price; 
}
# StatefulServiceTest

statefulService1.order("userA", 20000);
statefulService2.order("userB", 10000);

int price = statefulService1.getPrice();
System.out.println("price = " + price);

 

์ฒ˜์Œ์— order์— 20000์ด ๋“ค์–ด์™”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด this๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๊ฐ’์€ ํ•„๋“œ์— ์žˆ๋Š” price๋กœ ๋“ค์–ด๊ฐ€๋ฉด์„œ ๊ฐ’์ด ๊ณต์œ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ userB๊ฐ€ 10000์„ ์ฃผ๋ฌธํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์‹œ ํ•„๋“œ๋Š” 10000์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๊ฐ’์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ๋Œ๋ ค์ง€๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ์ด๋ ‡๊ฒŒ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ price์˜ ๊ฐ’์€ 10000์ด ๋˜๊ณ  ๊ทธ ํ›„์— statefulService1์˜ price๋ฅผ ์ถœ๋ ฅํ•˜๋‹ˆ ๋งˆ์ง€๋ง‰ ์ƒํƒœ์˜€๋˜ 10000์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

 

 

โ–บ ๋ฌด์ƒํƒœ๋กœ ์„ค๊ณ„ํ•˜๊ธฐ

public int order(String name, int price) {
        ...
        return price;
    }
order ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€๊ฒฉ์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ , ๊ฐ ์š”์ฒญ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

 

 

 

โœ”๏ธ  StatefulServiceTest

 

โ–บ TestConfig

 	@Bean
        public StatefulService statefulService() {
            return new StatefulService();
        }
@Bean์„ ์จ์„œ ๊ฐ„๋‹จํ•œ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

 

 

•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

	StatefulService statefulService1 = ac.getBean(StatefulService.class);
        StatefulService statefulService2 = ac.getBean(StatefulService.class);
statefulService1๊ณผ statefulService2์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์š”๊ตฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด TestConfig์— ์žˆ๋Š” StatefulService๋กœ ๊ฐ€์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

	int userAprice = statefulService1.order("A", 2000);
        int userBprice = statefulService2.order("B", 1000);
StatefulService์˜ order ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ๋‚ด๋ถ€์ƒํƒœํ•„๋“œ price์— ๊ฐ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค

 

 

 

 


 

 

 

โœ”๏ธ  ์ž๋ฐ” ์ฝ”๋“œ์˜ ์‹ฑ๊ธ€ํ†ค ์œ ์ง€๋ฒ•

 

โ–บ AppConfig

    @Bean
    public MemberService memberService() {
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
        System.out.println("call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }
    
    @Bean
    public OrderService orderService() {
        System.out.println("call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), rateDiscountPolicy());
    }
์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด memberService์—์„œ memberRepository๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  memberRepository์— ์žˆ๋Š” MemoryMemberRepository๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. memberRepository์—์„œ MemoryMemberRepository๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. orderService์—์„œ memberRepository๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  memberRepositorysms MemoryMemberRepository๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ด 3๋ฒˆ์˜ MemoryMemberRepository๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉด์„œ ์‹ฑ๊ธ€ํ†ค์ด ๊นจ์ ธ๋ณด์ธ๋‹ค. ๊ณผ์—ฐ ์ง„์งœ๋กœ ์‹ฑ๊ธ€ํ†ค์ด ๊นจ์ง€๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

 

 

 

โ–บ MemberServiceImpl

    public MemberRepository getMemberRepository() {
    	return memberRepository;
    }
memberRepository๊ฐ€ private final๋กœ ์ •์˜๋˜์–ด์žˆ๊ธฐ์— ์™ธ๋ถ€ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ memberRepository๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ดgetMemberRepository๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋•Œ memberRepository๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ MemoryMemberRepository์— ์ƒ์†๋˜์–ด์žˆ๋‹ค.

 

 

 

โ–บ ConfigurationSingletonTest

        MemberRepository memberRepository1 = memberService.getMemberRepository();
        MemberRepository memberRepository2 = orderService.getMemberRepository();

        System.out.println("memberService -> memberRepository1 = " + memberRepository1);
        System.out.println("orderService -> memberRepository2 = " + memberRepository2);
        System.out.println("memberRepository = " + memberRepository);
memberService์™€ orderService๋Š” getMemberRepository๋ฅผ ํ†ตํ•ด memberRepository์˜ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ถœ๋ ฅ ๊ฒฐ๊ณผ memberRepository๋Š” ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ๋˜์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

 

โ–บ ์ด์œ ์— ๋Œ€ํ•˜์—ฌ

@Configuration
public class AppConfig {
@Configuration์ด ๋ถ™๊ฒŒ๋˜๋ฉด AppConfig๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์Šคํ”„๋ง์ด CGLIB๋ผ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ AppConfig ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ AppConfig์— AppConfig@CGLIB๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด์„œ ์‹ค์ œ ์‹คํ–‰์€ AppConfig@CGLIB๊ฐ€ ๋œ ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ @Configuration์„ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด @Bean์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

๐ŸŒท

 

์ด๋ ‡๊ฒŒ ์‹ฑ๊ธ€ํ†ค์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€, ์Šคํ”„๋ง์ด ์‹ฑ๊ธ€ํ†ค์„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ณด์žฅํ•ด๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด์ ์œผ๋กœ ๋นˆ์„ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ๋˜์—ˆ์ง€๋งŒ,

@Configuration์„ ํ†ตํ•ด ์ž๋ฐ” ์ฝ”๋“œ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

 

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋นˆ ์ด๋ฆ„๊ณผ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์ค€๋‹ค. Public๊ณผ ํ•จ๊ป˜ ์“ด ๊ฒƒ์€ ํƒ€์ž…๊ณผ ์ด๋ฆ„์ด ๋œ๋‹ค. ์˜ˆ์‹œ๋กœ public MemberService memberService( )์˜ ๊ฒฝ์šฐ MemberService๋Š” ํƒ€์ž…์ด ๋˜๊ณ  memberService๋Š” ๋นˆ์˜ ์ด๋ฆ„์ด ๋œ๋‹ค. return new์™€  ํ•จ๊ป˜ ์“ฐ์ด๋ฉด ๋นˆ ๊ฐ์ฒด๊ณผ ๋œ๋‹ค. ์˜ˆ๋กœ return MemberServiceImpl(memberRepository( ))์˜ ๊ฒฝ์šฐ MemberServiceImpl์ด ๋นˆ ๊ฐ์ฒด๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅ๋˜์–ด ๊ด€๋ฆฌ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—” ๋นˆ์ด ์ œ๋Œ€๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ๊ฒƒ์ด๋‹ค.

 

 


 

[ โ—€๏ธŽ ]

 

 

[Spring] ๊น€์˜ํ•œ ๊ธฐ๋ณธํŽธ_ ์„น์…˜ 4. ๊ฐ์ฒด์ง€ํ–ฅ์›๋ฆฌ์ ์šฉ

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

post-this.tistory.com

 

 

 

 

 

๐Ÿงธ

์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”


 

๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๋ ˆ์ธ ๊ผฌ์šฐ- ๐Ÿงธ

test์— ์ด 3๊ฐ€์ง€์˜ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

  • beanfind
    ใ„ด ApplicationContextInfoTest, ApplicationContextBasicFindTest, ApplicationnContextExtendsFindTest
         , ApplicationContextSameBeanFindTest
  • beandefinition
    ใ„ด BeanDefinitionTest
  • xml
    ใ„ด XmlAppContext

 


 

โœ”๏ธ  beanfind_ApplicationContextInfoTest

 

โ–บ  findAllBean

: ๋‚ด๋ถ€์— ํฌํ•จ๋œ Bean์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

AnnotationConfigApplicationContext ac 
= new AnnotationConfigApplicationContext(AppConfig.class);

 

 

AnnotationConfigApplicationContext

: Bean์œผ๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” context๊ณ  ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

ApplicationContext๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” AnnotationConfigApplicationContext์ด๋ฉฐ ํ˜„์žฌ ๊ฐ•์˜์—์„œ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด๋‹ค. ์„น์…˜ 4 ๊ฐ•์˜์—์„œ AppConfig์— @Configuration๊ณผ @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ํ˜น์€ ํ”„๋กœํŒŒ์ผ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

 

 

ใ…ค- ApplicationContext ์„ค๋ช… ์ถœ์ฒ˜

 

[Spring] ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context)์™€ ์Šคํ”„๋ง์˜ ์‹ฑ๊ธ€ํ†ค(Singleton)

์ด๋ฒˆ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context) [ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context)๋ž€? ] Spring์—์„œ๋Š” ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„

mangkyu.tistory.com

 

 

 

- AnnotationConfigApplicationContext ์ถœ์ฒ˜

 

Bean ๊ฐ์ฒด๋“ค์˜ ๋งŒ๋‚จ์˜ ๊ด‘์žฅ : AnnotationConfigApplicationContext

AnnotationConfigApplicationContext AnnotationConfigApplicationContext ์€ Bean์œผ๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” context ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. AnnotationConfigApplicationContext ์„ ํ†ตํ•ด ํ˜„์žฌ ์–ด๋–ค Bean ๊ฐ์ฒด๋“ค

jindevelopetravel0919.tistory.com

 

 

 

-  AnnotationConfigApplication  ์ถœ์ฒ˜

 

[Spring] AnnotationConfigApplicationContext์˜ ์—ญํ• ๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•

Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜๋กœ AnnotationConfigApplicationContext๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. AnnotationConfigApplicationContext๋Š” Java ๊ธฐ๋ฐ˜์˜ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ(Bean)

jjangadadcodingdiary.tistory.com

 

 

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์† AppConfig์˜ ๋นˆ์ด๋ฆ„๊ณผ ๋นˆ๊ฐ์ฒด

 

 

 

 

••• ์ด์–ด์„œ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

 

String[] beanDefinitionNames = ac.getBeanDefinitionNames();

 

 

getBeanDefinitionNames( )

: ํŒฉํ† ๋ฆฌ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  bean์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  @bean์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋“ฑ๋ก๋œ ์‹ฑ๊ธ€ํ†ค Bean์€ ๋ฌด์‹œํ•œ๋‹ค. ๋˜ํ•œ ๊ณ„์ธต๊ตฌ์กฐ๋„ ๋ฌด์‹œํ•œ๋‹ค. 

 

ac๋Š” AppConfig์— ๋“ฑ๋ก๋œ bean์— ๋Œ€ํ•œ ์„ค์ • ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. ํ•˜์ง€๋งŒ getBeanDefinitionNames๋Š” ๋‚ด๋ถ€์˜ ๋ชจ๋“  bean์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ์ •์˜๋˜์–ด์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋ฅผ ์‚ดํŽด๋ณด๋ฉด AppConfig์˜ ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด์„œ Spring์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”๋กœํ•˜๋Š” ๋‚ด๋ถ€ ๋นˆ๋“ค๋„ ์ž๋™์ ์œผ๋กœ ํ•จ๊ป˜ ๋“ฑ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋‚ด๋ถ€ ๋นˆ๋“ค๋„ ๋ชจ๋‘ ๋ณด๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ getBeanDefinitionNames()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

- getBeanDefinitionNames ์ •์˜ ์ถœ์ฒ˜

 

ListableBeanFactory (Spring Framework 6.1.11 API)

Extension of the BeanFactory interface to be implemented by bean factories that can enumerate all their bean instances, rather than attempting bean lookup by name one by one as requested by clients. BeanFactory implementations that preload all their bean d

docs.spring.io

 

 

 

ใ…คใ…ค••• ๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println ("name = " + beanDefinitionName + "object = " + bean); }

 

 

getBean( );

: ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ bean์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

Object

: ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ์ž๋ฐ” ํด๋ž˜์Šค์— ๋”ฐ๋กœ extendsํ•˜์ง€ ์•Š์œผ๋ฉด java.lang.Object๋ฅผ ์ƒ์†ํ•œ๋‹ค. ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์œผ๋ฉฐ ๋ชจ๋“  ํƒ€์ž…์„ ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

beanDefinitionNames๋Š” ๋ชจ๋“  ๋นˆ์„ ๋ฐ˜ํ™˜ ๋ฐ›์•„์˜จ ๋ฌธ์ž์—ด์ด๋‹ค. for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ beanDefinitionNames์— ๋“ค์–ด์žˆ๋Š” ๋นˆ ์ด๋ฆ„์„ beanDefinitionName ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.  ๊ทธ๋ฆฌ๊ณ  ac.getBean์„ ์ด์šฉํ•˜์—ฌ ๋นˆ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋ฉฐ ์ด๋•Œ bean์— ์ €์žฅ๋˜๋Š” ํƒ€์ž…์€ Object๋กœ ๋ชจ๋“  ํƒ€์ž…์„ ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ๋‚ด๋ถ€์— ์žˆ๋Š” ๋นˆ๊นŒ์ง€ ๋ชจ๋‘ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋ž˜ <๊ฒฐ๊ณผ>๋ฅผ ๋ณด๋ฉด name์€ ๋นˆ์˜ ์ด๋ฆ„์ด ์ถœ๋ ฅ๋˜์—ˆ๊ณ  object๋Š” ์ง€์ •๋œ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค. ์ฆ‰ discountPolicy๋Š” hello.core.discount.RateDiscountPolicy์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

<๊ฒฐ๊ณผ>
name = discountPolicy
object = hello.core.discount.RateDiscountPolicy@246f8b8b

์š”๋”ด์‹์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.๐Ÿป

 

 

Q.๊ผญ beanDefinitionName ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์ค˜์•ผํ•˜๋Š”๊ฑด๊ฐ€? 

A.
๊ผญ ๊ทธ๋Ÿดํ•„์š”๋Š” ์—†๋‹ค. ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ.

String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
    String beanName = beanDefinitionNames[i];
    System.out.println("Bean Name " + (i + 1) + ": " + beanName);
}โ€‹

์ด๋Ÿฐ์‹์œผ๋กœ ๊ทธ๋ƒฅ ๋ณ€์ˆ˜์—†์ด ๋ฐ›์•„๋„ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ›์•„์˜จ ๊ฑธ beanName์— ์ €์žฅํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

Q.ac.getBean์—์„œ ac๋Š” ๊ผญ ๋ถ™์—ฌํ•˜๋Š”๊ฑธ๊นŒ? 

A.
getBean์€ApplicationContext์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ์ด๋‹ค.๊ทธ๋ ‡๊ธฐ์— ๊ด€๋ จ ApplicationContext์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์“ฐ๋ ค๋ฉด ๋‚ด๊ฐ€ ์ง€์ •ํ•œ ๋ณ€์ˆ˜(ac)๋ฅผ ๊ผญ ๋ถ™์—ฌ์จ์•ผ ํ•œ๋‹ค.

 

 

 

 

- getBean ์ถœ์ฒ˜

 

BeanMap (Spring Framework 6.1.11 API)

Limit the properties reflected in the key set of the map to readable properties.

docs.spring.io

 

 

 

- Object ์ถœ์ฒ˜

 

2. Java ์ž๋ฐ” [API] - Object ํด๋ž˜์Šค, Object ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ 1

์ž๋ฐ”์˜ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ extends ํ‚ค์›Œ๋“œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š์œผ๋ฉด ์•”์‹œ์ ์œผ๋กœ java.lang.Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” Object ํด๋ž˜์Šค์˜ ์ž์‹์ด๊ฑฐ๋‚˜ ์ž์† ํด

kephilab.tistory.com

 

 

 

 

 

โ–บ  findApplicationBean

: ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•œ bean ์ถœ๋ ฅํ•˜๊ธฐ.

 

 

for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
๋ชจ๋“  ๋นˆ์„ getBeanDefinitionNames๋กœ ๊ฐ€์ ธ์™”๋‹ค. ๊ทธ๋ฆฌ๊ณ  for์„ ํ†ตํ•ด ๋ชจ๋“  ๋นˆ์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ getBeanDefinition์œผ๋กœ beanDefinition์— ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.

 

getBeanDefinition( );

: ํŠน์ • bean์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

 

 

BeanDefinition

: ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ bean์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

Q. ์œ„์˜ ์ฝ”๋“œ ์ค‘ getBean์—์„œ๋Š” Object๋ผ๋Š” ๊ฐ์ฒด ํƒ€์ž…์„ ์ ์—ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ์™œ BeanDefinition์„ ์ ์„๊ฑธ๊นŒ?
getBean๋„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ์ธ๊ฑฐ ์•„๋‹Œ๊ฐ€? ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ bean์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ. ๊ทธ๋Ÿฐ๋ฐ ์™œ ๋‹ค๋ฅด๊ฒŒ ์“ฐ๋Š”๊ฑธ๊นŒ?

A. getBean()๊ณผ getBeanDefinition( )์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค. getBean()์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋นˆ์˜ ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ (์‰ฝ๊ฒŒ ๋งํ•ด์„œ bean๊ณผ ์—ฐ๊ฒฐ๋œ ํด๋ž˜์Šค) Object ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜๋ฉด์— getBeanDefinition()์€ ํŠน์ • ๋นˆ์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ ธ์˜จ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ์ •์˜ํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ BeanDefinition์ด ๋˜๊ธฐ์— ๋นˆ์˜ ์ด๋ฆ„์ด ํ˜ธ์ถœ๋˜๋ฉด BeanDefinition ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ Object์™€ BeanDefinition์„ ์จ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅด๋ฉฐ BeanDefinition์€ ํ•˜๋‚˜์˜ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์ด ์•„๋‹ˆ๋‹ค.

 

 

Q. getBean( ) ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Object๋กœ ๋ฐ›๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ผ๋ฐ˜์ ์œผ๋กœ Object๋กœ ๋ฐ›๋Š”๊ฐ€?

A. ๋นˆ์˜ ์‹ค์ œ ํƒ€์ž…์ด ๋ฌด์—‡์ด๋“ ์ง€ ์ƒ๊ด€์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด Object๋กœ ๋ฐ›๋Š”๋‹ค. (์œ ์—ฐ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค)

 

 

 

ใ…คใ…ค•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName 
                + "object = " + bean); }

 

 

getRole

: ํ•ด๋‹น ์—ญํ• ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ •์ˆ˜๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

ROLE_APPLICATION

: ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ(๋‚ด๊ฐ€ ๋งŒ๋“ ) ๋นˆ์ด๋‹ค. ์ •์ˆ˜๊ฐ’์€ 2

  • ROLE_SUPPORT : ์Šคํ”„๋ง ๋‚ด๋ถ€์—์„œ ์ง€์›ํ•˜๋Š” ์—ญํ• ์„ ๊ฐ€์ง„ ๋นˆ์ด๋‹ค. ์ •์ˆ˜๊ฐ’์€ 4
  • ROLE_INFRASTRUCTURE : ์Šคํ”„๋ง์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๋นˆ์ด๋‹ค. ์ •์ˆ˜๊ฐ’์€ 8

 

for๋ฌธ์œผ๋กœ ๋ชจ๋“  ๋นˆ์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™”๊ณ (beanDefinition), ๊ทธ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ if๋ฌธ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๋นˆ์ธ์ง€ ์•„๋‹Œ์ง€ ๊ตฌ๋ถ„ํ•  ๊ฒƒ์ด๋‹ค. beanDefinition์— ์žˆ๋Š” ์ •๋ณด๋ฅผ getRole์„ ํ†ตํ•ด ์—ญํ• ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๊ทธ ์—ญํ• ์ด ROLE_APPLICATION์ธ์ง€ ํ™•์ธํ•˜์—ฌ ๋งž์œผ๋ฉด ๊ด„ํ˜ธ ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œBeanDefinition.ROLE_APPLICATION์œผ๋กœ ์“ด ์ด์œ ๋Š” ROLE_APPLICATION์ด BeanDefinition ํด๋ž˜์Šค ์•ˆ์— ์„ ์–ธ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ ์–ด์•ผ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค.

beanDefinitionName(๋ชจ๋“  ๋นˆ์„ ๋ฐ˜ํ™˜๋˜์–ด ์ €์žฅํ•œ ๋ณ€์ˆ˜)์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ๋นˆ์„ ๊บผ๋‚ด Object ํƒ€์ž…์ธ bean์— ์ €์žฅํ•œ๋‹ค.

 

 

Q. ๋ฌด์กฐ๊ฑด getBean( )๊ณผ Object๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐ›์•„์•ผ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”๊ฐ€?
ใ…ค
A. ๊ทธ๋ ‡๋‹ค. ์‹ค์ œ ๋นˆ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์–ด์™€์•ผ๋งŒ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. getRole( )์€ ํ•ด๋‹น ์—ญํ• ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ ๋ฟ, ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ๋•Œ๋ฌธ์— ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” getBean( )์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. getBean(ํƒ€์ž…) ํ˜น์€ getBean(๋นˆ์ด๋ฆ„, ํƒ€์ž…)์„ ์ ์œผ๋ฉด ์กฐํšŒ๊ฐ€ ๋œ๋‹ค.

 

 

 

 

- getRole ์ถœ์ฒ˜

 

BeanDefinition (Spring Framework 6.1.11 API)

Return the current bean class name of this bean definition. Note that this does not have to be the actual class name used at runtime, in case of a child definition overriding/inheriting the class name from its parent. Also, this may just be the class that

docs.spring.io

 

 

 

- getRole์˜ ์ƒ์ˆ˜ ์ถœ์ฒ˜

 

BeanDefinition (Spring Framework 6.1.11 API)

Return the current bean class name of this bean definition. Note that this does not have to be the actual class name used at runtime, in case of a child definition overriding/inheriting the class name from its parent. Also, this may just be the class that

docs.spring.io

 

 

 

 

 


 

 

 

 

โœ”๏ธ  beanfind_ApplicationContextBasicFindTest

 

โ–บ  findBeanByName

: ๋นˆ ์ด๋ฆ„์œผ๋กœ ์กฐํšŒํ•˜๊ธฐ.

 

 

MemberService memberService = ac.getBean("memberService", MemberService.class);
        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);

 

 

assertThat( ).isInstanceOf( )

: ํ•ด๋‹น ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

bean ์ด๋ฆ„ ์ค‘์—์„œ memberService์ด๋ฉฐ ํ•ด๋‹น ํƒ€์ž…์„ MemberService๋กœ ์ง€์ •ํ•œ ๋นˆ์„ MemberService(์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ)๊ฐ€์ง€๋ฉฐ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ memberService์œผ๋กœ ๋ฐ›๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ MemberServiceimpl(๊ตฌ์ฒดํด๋ž˜์Šค)์ด memberService์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ๋น„๊ตํ•œ๋‹ค.

์ข€ ๋” ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด, AppConfig์— ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฉ”์„œ๋“œ ๋ช…์„ ๊ฐ™์ด ์ ์—ˆ๊ณ  return ๊ฐ’์œผ๋กœ ๊ตฌ์ฒดํด๋ž˜์Šค๋ฅผ ์ ์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ AppConfig์— ์ ์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌ์ฒดํด๋ž˜์Šค๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๊ณ  "memberService"๋ฅผ ์ ์–ด ์ด๋ฆ„์œผ๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

 

 

 

โ–บ  findBeanByNameX

: ๋นˆ ์ด๋ฆ„์œผ๋กœ ์กฐํšŒํ•˜์ง€ ์•Š๊ธฐ.

 

 

 assertThrows(NoSuchBeanDefinitionException.class,
                () -> ac.getBean("XXXX", MemberService.class));

 

 

assertThrows

: JUnit ๋˜๋Š” AssertJ์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฐœ์ƒ๋œ ์˜ˆ์™ธ ํƒ€์ž…๊ณผ ์˜ˆ์ƒ๋˜๋Š” ์˜ˆ์™ธ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋Š” ์„ฑ๊ณตํ•œ๋‹ค.

 

 

NoSuchBeanDefinitionException.class

: ์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” Bean ์ธ์Šคํ„ด์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

() -> ๋žŒ๋‹ค์‹

: (๋งค๊ฐœ๋ณ€์ˆ˜)๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  -> ์‹œ์ž‘๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

 

-> (์‹œ์ž‘๋ถ€๋ถ„)์œผ๋กœ ๊ฐ€์„œ XXXX๊ฐ€ MemberService.class์˜ ํ•ด๋‹น ๋นˆ์œผ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด NoSuchBeanDefinitionException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

 

 

 

 

- assertThrows ์ถœ์ฒ˜

 

[Junit] Junit5 Exception Throw ํ…Œ์ŠคํŠธ

์ด ๊ธ€์€ ํ˜ผ์ž ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. Junit4 Exception ํ…Œ์ŠคํŠธ ๋งŽ์€ ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์ด ์‚ฌ์šฉ

small-stap.tistory.com

 

 

 

- NoSuchBeanDefinitionException ์ถœ์ฒ˜

 

NoSuchBeanDefinitionException (Spring Framework 6.1.11 API)

Return the required type of the missing bean, if it was a lookup by type that failed.

docs.spring.io

 

 

 

- ๋žŒ๋‹ค์‹ ์ถœ์ฒ˜

 

[Java/์ž๋ฐ”] ๋žŒ๋‹ค์‹(Lambda)์ด๋ž€? ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋ฒ•

๋žŒ๋‹ค์‹์ด๋ž€ ? ๋žŒ๋‹ค์‹์ด๋ž€ ์‰ฝ๊ฒŒ ๋งํ•ด ๋ฉ”์„œ๋“œ๋ฅผ "ํ•˜๋‚˜์˜ ์‹"์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ํ›จ์”ฌ ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๊ณผ ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์–ด์ง€๋ฏ€๋กœ "์ต๋ช…ํ•จ์ˆ˜

hstory0208.tistory.com

 

 

 

 

 


 

 

 

 

โœ”๏ธ  beanfind_ApplicationContextSameBeanFindTest

 

    @Configuration
    static class SameBeanConfig {
        @Bean
        public MemberRepository memberRepository1() {
            return new MemoryMemberRepository();
        }
        @Bean
        public MemberRepository memberRepository2() {
            return new MemoryMemberRepository();
        }
  }
AppConfig๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์‹ซ์œผ๋‹ˆ, ์ด๋ ‡๊ฒŒ ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ™์€ ๊ตฌ์ฒดํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‘๊ฐœ์˜ bean์„ ๋งŒ๋“ค์—ˆ๋‹ค.

 

 

 

โ–บ  findAllBeanByType

 

Map<String, MemberRepository> beansOfType =
	ac.getBeansOfType(MemberRepository.class);

 

 

getBeansOfType

: ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค. Bean ์ด๋ฆ„์„ key๋กœ ๊ฐ์ฒด๋ฅผ value๋กœ ํ•˜๋Š” Map์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฃผ๋กœ ํŠน์ • ํƒ€์ž…์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋นˆ์ด ์žˆ์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

MemberRepository ํƒ€์ž…์— ์žˆ๋Š” ๋นˆ์„ getBeansOfType ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด key์™€ value๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด String์— bean์˜ ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ€๊ณ  MemberRepository์— ์‹ค์ œ bean์˜ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ MemberRepository ํƒ€์ž…์— bean์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ BeansOfType ๋ณ€์ˆ˜์— ๋ชจ๋‘ ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

 

ใ…คใ…ค•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

       for (String key : beansOfType.keySet()) {
            System.out.println("key = " + key + " value = " +
beansOfType.get(key));
        }

 

KeySet

: Map์˜ ๋ชจ๋“  key๋ฅผ ๊ฐ€์ ธ์™€ Set๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. for-each ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ณ , ๊ฐ key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ value์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

beansOfType์— ์žˆ๋Š” ๋ชจ๋“  key(๋นˆ์˜ ์ด๋ฆ„)๋ฅผ ๊ฐ€์ ธ์™€ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ณ€์ˆ˜ key์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  get(key)๋ฅผ ํ†ตํ•ด ๊ทธ key(๋นˆ์˜ ์ด๋ฆ„)์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ beansOfType์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค. ์—ฌ๊ธฐ์„œ beansOfType์€ key์™€ MemberRepository๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๋ช…์œผ๋กœ, get(key)๋Š” ๋นˆ์˜ ์ด๋ฆ„์— ๋งž๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

 

 

 

ใ…ค•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

  System.out.println("beansOfType = " + beansOfType);
        assertThat(beansOfType.size()).isEqualTo(2);
beansOfType์€ ๋ชจ๋“  bean์˜ ์ด๋ฆ„๊ณผ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋‹ˆ, ๊ทธ๊ฒƒ์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•œ๋‹ค.  assertThat์„ ์ด์šฉํ•˜์—ฌ beansOfType์— ์žˆ๋Š” bean์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

 

 

 

 

 

- getBeansOfType ์ถœ์ฒ˜

 

getBean์˜ NoSuchBeanDefinitionException ํšŒํ”ผํ•˜๊ธฐ

getBean์˜ NoSuchBeanDefinitionException ํšŒํ”ผํ•˜๊ธฐ

thecodinglog.github.io

 

 

 

- KeySet ์ถœ์ฒ˜

 

[Java] Map ์ „์ฒด ์ถœ๋ ฅ(entrySet, keySet, Iterator, Lambda, Stream)

๋ชฉ์ฐจ Map ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•1. entrySet()entrySet() ๋ฉ”์„œ๋“œ๋Š” Map์—์„œ ๋ชจ๋“  Entry(Key-Value ์Œ)๋ฅผ ๊ฐ€์ ธ์™€ Set ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. foreach ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ Entry์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘

tychejin.tistory.com

 

 

 

 


 

 

 

โœ”๏ธ XML

 

<bean id="memberService" class="hello.core.member.MemberServiceImpl">
         <constructor-arg name="memberRepository" ref="memberRepository" /> ์ฐธ์กฐ
</bean>
     
                                   ์‹ค์ œ ๊ตฌํ˜„ ๊ฐ์ฒด
<bean id="memberRepository" class="hello.core.member.MemoryMemberRepository" />

 

 

GenericXmlApplicatonContext

: ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์„ ์ฝ์–ด์™€ ๋กœ๋”ฉ ์‹œํ‚ค๊ณ , ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

 

- GenericXmlApplicationContext ์ถœ์ฒ˜

 

[SPRING]GenericXmlApplicationContext๋ž€? ์Šคํ”„๋ง ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•

์˜ค๋Š˜์€ ApplicationContext.xml ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , GenericXmlApplicationContextํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดํ•ด๋ฅผ ์‰ฝ๊ฒŒ

junghn.tistory.com

 

 

 

 


 

 

.

ํ˜ผ์ž ์ฒœ์ฒœํžˆ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์ ํ˜€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ฐ์•ˆํ•˜๊ณ  ๋ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ€ ๋ชจ๋‘๋“ค ํ™”์ดํŒ…ํ•˜์„ธ์š” ๐Ÿ€

 

+ Recent posts