Spring

[스프링 #4] 의존관계 주입 (DI) - 2

zamezzz 2018. 2. 24. 21:28

 스프링 #4. 의존관계 주입 (DI) - 2



 의존관계 주입(DI) ?


의존관계 주입(DI)은 오브젝트 레퍼런스를 외부로부터 주입받고, 이를 통해 다른 오브젝트와 동적으로 의존관계가 맺어집니다. 

오브젝트는 다른 오브젝트에 직접 주입할 수 있는게 아니라, 레퍼런스가 전달될뿐입니다.

즉, 오브젝트 외부에서 의존하는 오브젝트를 주입시키는 것이 DI입니다.


● 의존관계 (2)


이번 포스팅에서는 어노테이션으로 의존관계를 주입하는 방법을 정리해보겠습니다.


@Autowired@Component 어노테이션을 이용하여 주입할 수 있습니다.


DI컨테이너는 @Autowired가 붙은 인스턴스 변수의 형에 대입할 수 있는 클래스를


@Component가 붙은 클래수 중에 찾아내 그 인스턴스를 인젝션 해주는데요.


type에 따라 인젝션 하는 예제 코드를 먼저 한 번 보겠습니다.


● byType Injection


먼저 MyServiceImpl.java 코드입니다. MyService 인터페이스를 구현했습니다.


MyService에는 나이를 출력해주는 findAge(int age) 함수 하나만을 가지고있습니다.


여기에 @Component 어노테이션이 붙어있습니다.


@Component

public class MyServiceImpl implements MyService {

    public int findAge(int age) {


        System.out.println("My Age : "+age);


        return age;

    }

}


다음은 Main.java 입니다. 여기에서 @Autowired 어노테이션을 활용하여


myService를 주입받고자 합니다.


public class OnmyojiVoteController {

    @Autowired

    private MyService myService;


    myService.findAge(20);

}


이렇게 실행한다면, Autowired된 Myservice의 findAge 함수가 실행이 됩니다.


위에 말한대로 @Autowired가 붙은 인스턴스 변수의 형에 @Component가 붙은 클래스 중


가능한 인스턴스가 자동으로 찾아가 인젝션됩니다.


@Component가 붙은 클래스가 여러개 있어도 형이 다르면 @Autowired가 붙은 인스턴스


변수에 인젝션되지 않습니다. 같은 형태인 MyService만 인젝션되는 것이죠.


이처럼 형태(Type)에 따라 인젝션 하는 방법을 byType이라고 합니다.


● byName Injection


위 예제에서 형태에 따른 인젝션에 대해 보았습니다.


위 방법으로는 인젝션 가능한 클래스의 형은 반드시 유니크해야 합니다. 


인젝션 가능한 클래스의 형이 2개 이상일 경우에는 오류가 발생하기 때문이죠.

(Autowired 되지 않습니다)


이를 해결하기 위해서는 같은 형이라도 각각의 이름을 붙여주어서 인젝션 해야 합니다.


이를 위해서는 @Qualifier이라는 어노테이션을 추가로 활용하면 됩니다.


아래 예제코드를 보겠습니다. 바뀐 곳은 한군데라 금방 이해가 갈 것입니다.


@Component("age")

public class MyServiceImpl implements MyService {

    public int findAge(int age) {


        System.out.println("My Age : "+age);


        return age;

    }

}



public class OnmyojiVoteController {

    @Autowired

    @Qualifier("age")

    private MyService myService;


    myService.findAge(20);

}


@Component 어노테이션에 age라는 이름이 생겼습니다.


그리고 Autowired할 때 @Qualifier을 사용하여 age를 명시해주고 있습니다.


이처럼 인젝션할 클래스를 이름으로 명시해주는 방법을 byName이라고 합니다.


● @Component 

@Component는 좀 더 세부적으로 용도에 맞게 사용이 가능합니다.

크게 아래 그림처럼 나뉘어집니다.



컨트롤러에는 @Controller, 서비스는 @Service, DAO에는 @Repository로 보통 사용이


되고있습니다. 위의 우리 예제에서는 @Service로 사용이 되겠죠 ?




DI를 어노테이션 기반으로 사용하는 방법을 정리해보았습니다.


다른 방법에 비해 어노테이션으로 DI를 하면 매우 간단하고 직관적인 것 같습니다.


@Controller, @Service, @Repository에 대해서는 추후에 좀 더 자세히 정리하겠습니다.


그럼 글을 마치겠습니다. 감사합니다.

반응형

'Spring' 카테고리의 다른 글

[스프링 #6] Custom Annotation  (0) 2018.05.30
[스프링 #5] DispatcherServlet  (0) 2018.05.05
[스프링 #3] 의존관계 주입 (DI) - 1  (0) 2018.01.19
[스프링 #2] 제어의 역전(IoC)  (0) 2017.12.30
[스프링 #1] 스프링 개념 및 DAO  (0) 2017.12.27