본문 바로가기
Spring/Spring

DI(의존성 주입)

by 불면증김씨 2022. 2. 1.

딱 한번만 메모리에 뜨게 되고, 매번 new하지 않고 같은 객체로 관리할 수 있다.(싱글톤 방식)

클래스의 메소드에서 스프링이 관리하는 같은 오브젝트를 가져와서 사용할 수 있다. 

-> 하나의 오브젝트를 필요한 곳에서 공유하면서 사용할 수 있다. 이를 DI(Dependency Injection)(의존성 주입)라고 한다.

 

 

DI를 하기 위해서는 객체를 Bean등록이 되어 있어야 한다. 객체를 보낼놈, 받을놈 전부다 등록이 되야한다.

 

IoC 컨테이너 설정

  • Bean Factory라고도 한다.
  • IoC컨테이너가 관리하는 객체를 bean이라고 한다. 
  • bean 등록은 xml / 어노테이션을 통해서 가능하다.

1. XML 파일 등록

xml파일을 이용하여 설정하게 된다면 코드와 의존성을 주입하는 부분을 분리할 수 있다.

따라서 유지보수성을 높일 수 있다. 하지만 시스템이 커지다보면 xml파일이 너무 많아 오히려 유지보수가 힘들다.

장점: 각 객체들 간 의존관계를 한 눈에 볼 수 있다.

단점: 규모가 커짐에 따라 xml에 기술할 내용이 많아지면 생산성이 떨어진다.

 

2. 어노테이션 등록

xml로 했을 때, 규모가 커지면서 생기는 문제점 때문에 어노테이션이 등장했다.

장점: 보다 더 직관적인 코드 작성이 가능하다.

 

나의 프로젝트에 대입하여 알아보겠다.

아래 프로젝트는 xml / 어노테이션 방식이 사용되었다.

property - 수정자

constructor-arg - 생성자

ref - 해당 프로퍼티로 주입할 빈의 참조를 의미한다.

DBCP 빈 등록(xml)
MyBatis 빈 등록(xml)
DAO 빈 등록(xml)
Service 빈 등록(xml)
Controller 빈 등록(어노테이션)

(dataSource)DBCP -

(transactionManager - sqlSessionFactoryBean - sqlSessionTemplate)MyBatis -

(requestDao)DAO -

(requestService)Service -

(requestController)Controller로 연결된다 

 

 자 일단 bean등록은 되었다. 그렇다면 우리는 스프링에 등록된 객체를 어떻게 가져와서 주입할 것인가?

주입방법은 3가지가 있다.

 

1. 생성자 주입

  • Null을 주입하지 않는 한 NullPointException이 발생하지 않는다.
  • final 키워드를 사용하여 객체의 불변을 유지할 수 있다.
  • 개발자의 실수로 빈의 주입이 이루어지지 않았을 경우 final 키워드를 사용하면 컴파일 시점에서 오류를 잡아낸다.
  • 순환 참조를 방지할 수 있다.

2. 필드 주입

  • 간단한 코드로 구현이 가능하지만, 추후 변경할 수 있는 방법이 없다.

3. 수정자 주입(Setter 주입)

  • public이 의무화되는 메서드에서 개발자가 임의로 호출할 수 있기 때문에 보안상에 문제가 있다.

@Autowired

 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입하는 어노테이션이다.

생성자, 필드, 수정자에서 사용가능하다.

 

MyBatis와 DBCP는 xml에 bean등록하고, 사용자가 주입하는게 아닌 스프링이 알아서 주입해준다.

 

참고하면 좋은 글: https://cheershennah.tistory.com/227

 

'Spring > Spring' 카테고리의 다른 글

스프링 MVC 흐름  (0) 2022.02.01
스프링의 작동원리(서블릿 컨테이너)  (0) 2022.01.31
Spring의 작동 원리 ( web.xml)  (0) 2022.01.17
Spring의 작동 원리 (http/tomcat)  (0) 2022.01.17
Spring 개념  (0) 2022.01.13

댓글