Animated Rainbow Nyan Cat

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ

์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์—๋งŒ ์ง‘์ค‘ํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค

 

์Šคํ”„๋ง์˜ ํŠน์ง•๊ณผ ๊ตฌ์กฐ

- ์ œ์–ด์—ญ์ „ (IoC : inversion of control)

์Šคํ”„๋ง์ด ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ œ๊ณตํ•ด์ค€๋‹ค.

 

- ์˜์กด์„ฑ ์ฃผ์ž…(DI: dependency injection)

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

 

@Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž… ๊ฐ€๋Šฅ

 

- ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ๋ณ€๊ฒฝ

@Controller  
public class DIController {       
    MyService myService; 
 
    @Autowired      
    public DIController(MyService myService) {            
        this.myService = myService;       
    }  
}

- ํ•„๋“œ ๊ฐ์ฒด ์„ ์–ธ์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

@Controller  
public class FieldInjectionController {  
    @Autowired       
    private MyService myService;  
}

- setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

@Controller      
public class SetterInjectionController {         
    MyService myService;          
    @Autowired          
    public void setMyService(MyService myService) {               
    	this.myService = myService;          
    }  
}

 

IoC : DL(dependency lookup), DI(dependency injection)๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.

๋Œ€์‹  ๊ฐ์ฒด ์ƒ์„ฑํ•˜๋Š” ๊ฑด ๊ฐ™์€ ๋ฐ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅธ๊ฑฐ.

DL : ๋ฐ›์•„์˜ค๋ฉด ๋จ.

DI : setter injection, constructor injection, method injection ์œผ๋กœ ๋‚˜๋‰˜์–ด์ง. ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ๋„ ๋จ.

 

Spring IoC ์ปจํ…Œ์ด๋„ˆ : ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์™€ ๋น„์Šทํ•จ. 

ApplicationContext context = new ClassPathXmlApplicationContext("๋นˆ์„ค์ •XMLํŒŒ์ผ");  
ApplicationContext context = new AnnotationConfigApplicationContext(๋นˆ์„ค์ •ํด๋ž˜์Šค๊ฐ์ฒด);

spring IoC ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”ํ•ด์คŒ

 

DL : ๋‹ฌ๋ผ๊ณ  ํ• ๋•Œ๋งˆ๋‹ค ์ „๋‹ฌ

DI : ๋ฏธ๋ฆฌ ๋‹ฌ๋ผ๊ณ  ํ•จ.

 

scope="prototype"

๋””ํดํŠธ๋Š” ์‹ฑ๊ธ€ํ†ค์ด๊ณ  prototype์œผ๋กœ ํ•˜๋ฉด ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๋งŒ๋“ค์–ด์ง„๋‹ค.

์š”์ฒญ์‹œ๋งˆ๋‹ค ๊ฐ์ฒด ์ƒ์„ฑ์ด ๋œ๋‹ค.. (ex. ์‹œ๊ฐ„์„ ์š”์ฒญํ• ๋•Œ ์“ฐ์ผ์ˆ˜ ์žˆ์Œ) ์‹ฑ๊ธ€ํ†ค์ผ๋•Œ์™„ ๋‹ฌ๋ฆฌ 

๋ฏธ๋ฆฌ ๊ฐ์ฒด ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ(์‹ฑ๊ธ€ํ†ค์ผ๋•Œ๋Š” ๋ฏธ๋ฆฌ ๊ฐ์ฒด ์ƒ์„ฑ)

 

<bean id="foo2" class="sample2.Foo">
    <constructor-arg  value="ABC"/>
    <constructor-arg  value="100"/>
</bean>

foo์—๋Š” ๋ฌธ์ž์—ดํ•˜๋‚˜, ์ˆซ์žํ˜• ํ•˜๋‚˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

<bean id="foo4" class="sample2.Foo">
    <constructor-arg ref="bar"/>
</bean>
<bean id="bar" class="sample2.Bar"/>

์ฐธ์กฐ๊ฐ’ ์ „๋‹ฌํ• ๋•Œ๋Š” ref์— ์ „๋‹ฌํ•œ๋‹ค..

 

์ด๋ ‡๊ฒŒ xmlํŒŒ์ผ์— ๊ฐ์ฒด ์ƒ์„ฑ ์จ๋†“์œผ๋ฉด ์ˆ˜์ •ํ•˜๊ธฐ ํŽธํ•จ. ๊ฐ€๋ณ๊ณ .

 

getBean์˜ ๋ฆฌํ„ด ๊ฐ’์€ object์ด๋‹ค.

xmlํŒŒ์ผ์—

<bean id="userService" class="sample3.UserServiceImpl"  scope="prototype"/>
<bean id="obj1" class="sample3.UserVo">
    <constructor-arg value="Dooly"/>	
</bean>

์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ 

UserService u1=(UserService)factory.getBean("userService");
UserVo vo = (UserVo)factory.getBean("obj1");
u1.addUser(vo);

์ด๋Ÿฐ์‹์œผ๋กœ java ํŒŒ์ผ์—์„œ ๋ฐ›์•„์˜จ๋‹ค.

 

UserService u2=factory.getBean("userService", UserService.class);

์ด๋ ‡๊ฒŒ usersevice.class๋ผ๊ณ  ํ•˜๋ฉด ํ˜• ๋ณ€ํ™˜์•ˆํ•ด๋„ ๋œ๋‹ค.

 

 

factory-method="getInstance"

์ด ์†์„ฑ์—†์œผ๋ฉด ๋ฌด์กฐ๊ฑด ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด์ƒ์„ฑํ•œ๋‹ค. ํŒฉํ† ๋ฆฌ๋ฉ”์„œ๋“œ์•ˆ์—์„œ๋งŒ ๊ฐ์ฒด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค..

public abstract class AbstractTest { 
    public static AbstractTest getInstance(){

 

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

bean ์„ค์ • ํŒŒ์ผ..

 

constructor-arg ์—†์œผ๋ฉด ์•„๊ทœ๋จผํŠธ ์—†๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

 

<bean> ํƒœ๊ทธ:

id: ์ฃผ์ž…๋ฐ›๋Š” ๊ณณ์—์„œ ํ˜ธ์ถœํ•  ์ด๋ฆ„

class: ์ฃผ์ž…ํ•  ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋ช…

factory-method: ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ์‚ฌ์šฉ๋  factory ๋ฉ”์„œ๋“œ

scope: bean ๊ฐ์ฒด์˜ ์œ ํšจ๋ฒ”์œ„ ์„ค์ • (singleton, prototype ๋“ฑ๋“ฑ )

 

<property> ํƒœ๊ทธ:

name ์†์„ฑ: ๊ฐ์ฒด๋˜๋Š” ๊ฐ’์„ ์ฃผ์ž…ํ•  property ์ด๋ฆ„์„ ์„ค์ •

 

@Component ๋ฅผ ์ฃผ๋ฉด ์•Œ์•„์„œ bean ๊ฐ์ฒด๋กœ ๋“ฑ๋กํ•œ๋‹ค.

 

<context:component-scan  base-package="ํ•ด๋‹น ํŒจํ‚ค์ง€ ์ด๋ฆ„" /> 

 

@Component 

@Scope(value="prototype")

์ด๋Ÿฐ์‹์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

@Qualifier ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ํƒ€์ž…์˜ ๋นˆ ์ค‘ ํŠน์ • ์ด๋ฆ„์˜ bean์„ ์ฃผ์ž…ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 @Autowired      
 @Qualifier("mytest")      
 private Test test1; 
 
 @Autowired     
 @Qualifier("mytest")      
 private Test test2;

์ด๋Ÿฐ์‹์œผ๋กœ..

 

@Resource

autowired์™€ qualifier๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด๋†“์€ ๊ฑฐ์™€ ๋น„์Šทํ•˜๋‹ค.

 

@Inject 

์Šคํ”„๋ง3๋ถ€ํ„ฐ ์‚ฌ์šฉ๊ฐ€๋Šฅ. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

@Autowired : ๋ฉค๋ฒ„๋ณ€์ˆ˜, setter ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž, ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์— ์ ์šฉ ๊ฐ€๋Šฅ (์—ฐ๊ฒฐ๋ฐฉ์‹ : ํƒ€์ž…์— ๋งž์ถฐ ์—ฐ๊ฒฐ)

@Resource : ๋ฉค๋ฒ„๋ณ€์ˆ˜, setter ๋ฉ”์„œ๋“œ์— ์ ์šฉ๊ฐ€๋Šฅ (์—ฐ๊ฒฐ๋ฐฉ์‹ : ํƒ€์ž…์— ๋งž์ถฐ ์—ฐ๊ฒฐ)

@Inject : ๋ฉค๋ฒ„๋ณ€์ˆ˜, setter ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž, ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์— ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (์—ฐ๊ฒฐ๋ฐฉ์‹ : ์ด๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐ)

 

@Component("myFood")

ํด๋ž˜์Šค ์œ„์— ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฑด ์ด ํด๋ž˜์Šค๋„ bean์œผ๋กœ ๋งŒ๋“ค์–ด๋‹ฌ๋ผ๋Š” ๋œป. myFood๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค์–ด๋‹ฌ๋ผ. ์•ˆ ์ ์œผ๋ฉด ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ค‘ ์ฒซ๊ธ€์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊พผ bean ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

<bean id="favoriteFood" class="sampleanno1.Food" >
..
</bean>
<bean id="unFavoriteFood" class="sampleanno1.Food">
..
</bean>

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ™์œผ๋ฉด id๋กœ ๊ตฌ๋ถ„ํ•ด์„œ 

@Autowired
private Food favoriteFood;
@Autowired
private Food unFavoriteFood;

autowired๋ฅผ ํ•ด์ค˜์„œ ๋”ฐ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

<context:component-scan base-package="sampleanno1"/>

์ด๋Ÿฐ ์‹์œผ๋กœ component-scan์„ ์ •ํ•ด์ฃผ๋ฉด

package๊ฐ€ sampleanno1์ธ ๊ฒƒ์„ ์Šค์บ”ํ•ด์ค€๋‹ค.. ์ด๋•Œ context๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด bean ์„ค์ •ํŒŒ์ผ์—

xmlns:context="http://www.springframework.org/schema/context"

์ด ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค.

@Component // name = vestTire
public class VestTire implements Tire{

์ด๋Ÿฐ๋‹ค๋ฉด ์ด VestTire๋ฅผ bean์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋Š”๋ฐ,  ๋””ํดํŠธ ์ด๋ฆ„(vestTire)์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค.

@Autowired(required = false)
public Car(Tire tire) {
    System.out.println("Car ๊ฐ์ฒด ์ƒ์„ฑ - "+tire);
}

vestTire ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฃผ์ž…ํ•˜๊ณ  ์—†์œผ๋ฉด ๋ง์•„๋ผ๋ผ๋Š” ๋œป์ด๋‹ค. required๊ฐ€ false์ด๋ฏ€๋กœ..

 

์ž๋ฐ” ๋‚ด์žฅ ๊ฐ์ฒด๋Š” annotation ์“ธ์ˆ˜ ์—†์œผ๋ฏ€๋กœ <bean> ํƒœ๊ทธ๋ฅผ ์จ์•ผํ•œ๋‹ค.

<bean id="userName" class="java.lang.String">
    <constructor-arg value="์˜๊ธฐ"" />
</bean>

'์˜๊ธฐ'๋ผ๋Š” string ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

 

'๐Ÿ’ผ Full-Stack Study โ‘ก (feat. KOSA)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Boot  (1) 2023.10.06
Spring Boot & Thymeleaf  (1) 2023.10.05
AJAX  (1) 2023.10.03
ajax  (1) 2023.10.02
ServletJSP & MVC  (0) 2023.09.27