IOC์™€ DI (๊ฒฐํ•ฉ๋„) / @(์–ด๋…ธํ…Œ์ด์…˜)

2023. 3. 14. 15:15ใ†Spring

IOC์™€ DI 

์–ด๋– ํ•œ ๋ ˆ์Šคํ† ๋ž‘์—์„œ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์˜ˆ๋กœ ๋“ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

package test;

public class Restaurant {
	
	private Ch chef = new Chef();
	//private Ch chef = new SuperChef(); ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์š”๋ฆฌ์‚ฌ๋งˆ๋‹ค ํ•ด๋‹น๋˜๋Š” ํด๋ž˜์Šค๋งŒ ๋ฐ”๊พธ๋ฉด ๋จ.
	//๊ทธ๋Ÿฌ๋‚˜ ์–ด์ฉ” ์ˆ˜ ์—†์ด ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์“ธ ์ง€๋Š” ๊ฐœ๋ฐœ์ž(๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์ฃผ์ฒด)๊ฐ€ ์ •ํ•จ. >> ๊ฒฐํ•ฉ๋„ ์ƒ๊น€
	//๊ฐ์ฒด ์ƒ์„ฑ์„ ์Šคํ”„๋ง์ด ๋Œ€์‹  ํ•ด์ฃผ๋ฉด ๊ฒฐํ•ฉ๋„ ↓
	//์ด ์ •์˜๋ฅผ IOC(Inversion Of Control) : ์ œ์–ด์˜ ์—ญ์ „ ์ด๋ผ๊ณ  ํ•จ
	//DI(Dependency Injection) ์˜์กด์„ฑ ์ฃผ์ž… : IOC๋ฅผ ์‹คํ–‰ํ•œ ๊ฐœ๋… (Spring์€ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์คŒ)
	
	public void serving() {
		
		//chef์˜ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„๋ฅผ ๋ฐ”๊พธ๋ฉด ๋ ˆ์Šคํ† ๋ž‘์—์„œ ํ˜ธ์ถœํ•œ ๋ฉ”์†Œ๋“œ์ด๋ฆ„๋„ ๋‹น์—ฐํžˆ ๋ฐ”๊ฟ”์•ผํ•จ
		//์š”๋ฆฌ์‚ฌ๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ ์š”๋ฆฌ๋ฐฉ๋ฒ•์ด ๋ฐ”๋€Œ์–ด๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ. >> ๊ฒฐํ•ฉ๋„ ↑ 
		//์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์“ฐ๋ฉด ์š”๋ฆฌ์‚ฌ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์š”๋ฆฌ๋Š” ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐํ•ฉ๋„ ๋‚ด๋ ค๊ฐ
	
		chef.cooking();
		System.out.println("์Œ์‹์„ ์„œ๋น™ํ•ฉ๋‹ˆ๋‹ค.");
	}
}

-

package test;

//๊ณตํ†ต๋œ ์š”๋ฆฌ ๊ธฐ๋Šฅ(์กฐ๊ฑด) ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ
public class Chef implements Ch{
	
	public void cooking() {
		System.out.println("์š”๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.");
	}

}

-

package test;

//๊ณตํ†ต๋œ ์š”๋ฆฌ ๊ธฐ๋Šฅ(์กฐ๊ฑด) ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ
public class SuperChef implements Ch{
	
	public void cooking() {
		System.out.println("๋” ์ข‹์€ ์š”๋ฆฌ");
	}
}

-

package test;

public interface Ch {
	//์š”๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
	//์š”๋ฆฌํ•  ๋•Œ ๊ณตํ†ต์ ์ธ ์กฐ๊ฑด์„ ์คŒ > ์š”๋ฆฌ์‚ฌ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋˜‘๊ฐ™์ด ์š”๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ
	void cooking();
}

 

DI(์˜์กด์„ฑ ์ฃผ์ž…)์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

1.ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์€ ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ๋งŒ๋“ค์–ด์ค€๋‹ค. (๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ์•ˆ์— ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด 1๋ฒˆ์€ ์‹ ๊ฒฝ์“ธ ํ•„์š” ์—†๋‹ค)

 1) ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ›„๋ณด(์ž๊ฒฉ)๊ฐ€ ๋œ๋‹ค.

> ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ์–ด์•ผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์งˆ ์ž๊ฒฉ์ด ๋˜๋Š” ๊ฒƒ

(com.study.test ์•ˆ์— ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒƒ ๋งŽ๋‹ค๊ณ  ํ•œ ๊ฒƒ๊ณผ ์ผ๋งฅ์ƒํ†ต)

 

2) ๊ฐ์ฒด ์ƒ์„ฑ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์•„๋ž˜ ๋„ค๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด๋ผ๋„ ํด๋ž˜์Šค์— ๋ถ™์–ด ์žˆ์œผ๋ฉด ์Šคํ”„๋ง์ด ๊ฐ์ฒด๋ฅผ ์ž๋™ ์ƒ์„ฑ

(ํด๋ž˜์Šค ๋ช… ์•ž๊ธ€์ž๋งŒ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์„œ ์ƒ์„ฑ)

>> TestController testController = new TestController(); ๋ฅผ ์ž๋™์„ ๋งŒ๋“ค์–ด์ค€๋‹ค

 2)-1 @Component > ์Šคํ”„๋ง ์ดˆ์ฐฝ๊ธฐ ๋ฒ„์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ์–ด๋…ธํ…Œ์ด์…˜

-----------------------------------------------

 2)-2 @Controller

 2)-3 Service("๋งŒ๋“ค์–ด์งˆ ๊ฐ์ฒด๋ช… ์ง€์ •")

   ex)   @Service  -  ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ

           class MyserviceImpl{...}

           > MyserviceImpl myServiceImpl = new MyserviceImpl();

          

          @Service("myService")    - ๊ฐ์ฒด ์ด๋ฆ„ ์ง€์ • ๊ฐ€๋Šฅ

           class MyserviceImpl{...}

           > MyserviceImpl myService = new MyserviceImpl();

 2)-4 Repository 

 

 

2.๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด ์ค‘ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…์‹œํ‚จ๋‹ค.

1) ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ

 1)-1 @Autowired() : ์ž๋ฃŒํ˜•์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ฐ์ฒด์˜ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‹œํ‚จ๋‹ค.

    ex1)

         @Component

         class Board{...}  > Board board = new Board(); ์ž๋™ ์ƒ์„ฑ

 

         @Component

         class Member{...}  > Member member = new Member(); ์ž๋™ ์ƒ์„ฑ

 

         @Autowired

         private Member m; > m์—๋Š” ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด ์ค‘์—์„œ ์ž๋ฃŒํ˜• ์ผ์น˜ํ•˜๋Š” ๊ฒƒ ์ฆ‰ member๋ฅผ ๋„ฃ์–ด์คŒ

 

    ex2)

         @Component

         class Avante implements Car{...}  > Avante avante = new Avante(); ์ž๋™ ์ƒ์„ฑ

 

         @Component

         class Sonata implements Car{...}  > Sonata sonata = new Sonata(); ์ž๋™ ์ƒ์„ฑ

 

         @Autowired

         private Avante a; ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด ์ค‘์—์„œ ์ž๋ฃŒํ˜• ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ๋„ฃ์–ด์คŒ >> a๋Š” avante ๋“ค์–ด์˜ด

         private Sonata a; >> a์—๋Š” sonata ๋“ค์–ด์˜ด

         private Car c; >> ์˜ค๋ฅ˜๋‚จ. ์ž๋ฃŒํ˜• ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋‘๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— c์— ๋ฌด์—‡์„ ๋„ฃ์–ด์ค„์ง€ ๋ชจ๋ฆ„ 

 

 1)-2 @Resourse() : ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋ช…์„ ๊ธฐ์ค€์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‹œํ‚จ๋‹ค.

  @Resourse(name = "avante")

   private Car c; >> Resourse name์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋ช…ํ™•ํ•˜๊ฒŒ avnate๊ฐ€ c์— ๋“ค์–ด์˜จ๋‹ค