GiantStepDEV
article thumbnail

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

์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ๊ฐœ๋ฐœ์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„ ์–ธ(new)ํ•˜๊ณ , ์ œ์–ดํ•˜๋Š” ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ! ์ œ์–ด ์—ญ์ „์„ ํŠน์ง•์œผ๋กœ ํ•˜๋Š” ์Šคํ”„๋ง์€ ๊ฐ์ฒด์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ์™ธ๋ถ€(Spring Container, IoC Container)์— ์œ„์ž„ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด์˜ ๊ด€๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋งก๊ฒจ ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ„ ๊ฒƒ์„ ์ œ์–ด ์—ญ์ „์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

IoC ์ปจํ…Œ์ด๋„ˆ ์—ญํ• 

  • ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์˜์กด์„ฑ ๊ด€๋ฆฌ
  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™” ๋ฐ ์†Œ๋ฉธ ๋‹ด๋‹น
  • ์†Œ์Šค ๊ตฌํ˜„ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ค๊ณ , ์˜์กด ๊ด€๊ณ„ ๋‚ฎ์ถค

์˜์กด์„ฑ ์ฃผ์ž…(DI)

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

  1. ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
  2. ํ•„๋“œ ๊ฐ์ฒด ์„ ์–ธ์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
  3. setter ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
์Šคํ”„๋ง ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋„๋ก ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์™œ? ์ƒ์„œ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹์€ ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด ์—†์ด๋Š” ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

๋Œ€ํ‘œ์ ์œผ๋กœ @Autowired๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RestController
public class DIController {
	MyService myService;
	@Autowired
	public DIController(MyService myService) {
		this.myService = myService;
	}
	@GetMapping("/di/hello")
	public String getHello() {
		return myService.getHello();
	}
}

Spring Annotation ๊ธฐ๋ณธ ์„ค์ •

Bean ๋“ฑ๋ก ์‹œ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

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

@Component

  • JDBC์˜ VO์™€ ๋งคํ•‘
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ํด๋ž˜์Šค๋ฅผ Bean์— ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉ

@Repository

  • JDBC์˜ DAO์™€ ๋งคํ•‘
  • ์˜์†์„ฑ(์ข…๋ฃŒํ•ด๋„ ์•ˆ ์‚ฌ๋ผ์ง)์„ ๊ฐ€์ง„ ํด๋ž˜์Šค(DB์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ ˆ์ด์–ด)

@Service

  • ์„œ๋น„์Šค ๋ ˆ์ด์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง„ ํด๋ž˜์Šค
  • ์˜ˆ) ํŠธ๋žœ์žญ์…˜

@Controller

  • ์š”์ฒญ๊ณผ ์‘๋‹ต๋งŒ ์ฒ˜๋ฆฌ

์˜์กด์„ฑ ์ฃผ์ž…์‹œ ์‚ฌ์šฉ

@Autowired

  • ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ํ•„๋“œ ๋ณ€์ˆ˜, setter ๋ฉ”์†Œ๋“œ, ์ƒ์„ฑ์ž, ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ์— ์ ์šฉ ๊ฐ€๋Šฅ

@Qualifier

  • ํ•œ ํ”„๋กœ์ ํŠธ ๋‚ด์— @Autowired๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ

@Resource

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์ž์›์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•  ๋•Œ

@Value

  • ๋‹จ์ˆœ ๊ฐ’์„ ์ฃผ์ž…ํ•  ๋•Œ

 

profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!