의존성 주입이란?
프로그램 디자인이 결합도를 느슨하게 되도록하고 의존관계 역전 원칙과 단일 책임 원칙을 따르도록 클라이언트의 생성에 대한 의존성을 클라이언트의 행위로부터 분리하는 것
- 위키 백과
즉, 다른 클래스의 기능을 사용하기 위해 생성자를 직접 호출하는 대신
컨테이너를 통해 연관 관계를 규정하여 결합을 약하게 하는 것!
클래스들 간의 연관 관계를 갖지 않도록, 서로가 영향을 주지 않도록 하는 것이다.
만약 의존성 주입을 하지 않은 코드의 경우에는
클래스끼리 서로 연관관계가 있어 하나의 클래스를 수정했을 때
그와 연관이 있는 다른 클래스에서도 수정이 일어나야 한다.
이러한 문제를 해결하기 위해서는 인터페이스를 적용하여
각 클래스를 구현하고 객체를 사용할 때 인터페이스로 타입을 선언할 수 있지만
여전히 일부 클래스는 직접 수정을 해야 하는 불편함이 있다.
그래서 의존성 주입이 필요하다!
의존성 주입의 장점
1. 의존 관계 최소화를 통해 코드를 간결하게 작성할 수 있다.
2. 애플리케이션을 유지보수하기 쉽다.
3. 개발자가 객체의 생성과 소멸을 제어하는 대신 컨테이너에서 의존 관계를 제어해준다.
스프링에서의 의존성 주입
스프링에서의 의존성 주입을 위해서는 xml 방식과 annotation 방식이 있다.
우선 xml 방식을 먼저 정리해보겠다.
1. xml 방식
xml 파일을 만들고나서 <bean> 태그를 이용해 클래스 빈을 생성한다.
<bean id="book" class="com.spring.ex"></bean>
이렇게 만들어진 bean에 의존성을 주입하는 방법에도 두 가지가 있다.
첫째, constructor-arg 속성을 통해 생성자를 이용해 값을 주입한다.
둘째, property 속성을 통해 setter를 이용해 값을 주입한다.
//1. 생성자
<bean id="book" class="com.spring.ex">
<constructor-arg value="홍길동전"></property>
</bean>
//2. setter
<bean id="book" class="com.spring.ex">
<property name="title" value="홍길동전"></property>
</bean>
만약 빈의 이름을 넣고 싶다면 value 대신 ref를 통해 해당하는 빈의 id를 넣어주면 된다.
이후 GenericXmlApplicationContext를 사용하여 bean을 읽을 수 있다.
2. Annotation 방식
스프링 3.0부터 어노테이션 기능을 제공해
xml파일 대신 자바 코드처럼 설정을 할 수 있게 되었다.
의존성 주입과 관련된 기본적인 기능만 정리해보겠다.
<context:component-scan>
패키지 이름을 지정하면 애플리케이션 실행 시에 해당 패키지에서
어노테이션으로 지정된 클래스를 모두 빈으로 만들어준다.
@Controller, @Service, @Repository, @Component와 같은 어노테이션이 자동으로 빈이 된다.
<context:component-scan base-package="패키지이름" />
@Autowired
의존성 주입을 위해서는 @Autowired를 이용한다.
별도의 setter나 생성자 없이 속성에 빈을 주입할 수 있다는 장점이 있다.
만약 여러 빈이 주입 가능하다면 @Qualifier 어노테이션을 활용한다.
@Qualifier는 빈을 설정할 때도 의존성 주입에도 활용할 수 있는데
만약 Qualifier를 붙이지 않는다면 빈 이름이 한정자로 정해진다.
의존성 주입은 스프링의 기본이 되므로 잘 알아두자!!
'BackEnd > Spring' 카테고리의 다른 글
[Spring] Spring Security + JWT 구현하기 (0) | 2024.12.21 |
---|