의존성 주입 (DI : Dependency Injection)
객체 사이에 필요한 의존 관계에 대해서 스프링 컨테이너가 자동으로 연결해주는 것을 말한다.
스프링 컨테이너는 DI를 이용해 *빈(Bean) 객체를 관리하며,
스프링 컨테이너에 클래스를 등록하면 스프링이 클래스의 인스턴스를 관리한다.
*빈(Bean) : Spring IOC 컨테이너가 관리하는 자바 객체
지금까지 우리가 프로그래밍 할 때는 어떤 한 클래스가 다른 클래스의 기능을 사용하려면
개발자가 직접 코드에서 사용할 클래스의 생성자를 호출해서 사용하였다.
의존성 주입이란 이런 연간 관계를 개발자가 직접 코딩을 통해 컴포넌트(클래스)에 부여하는 것이 아니라
컨테이너가 연간 관계를 직접 규정하는 것이다.
그러면 코드에서 직접적인 연관 관계가 발생하지 않으므로 각 클래스들의 변경이 자유로워진다.(약한 결합)
의존성 주입을 사용하기 전에는 다음과 같이 코드가 작성되었다.
BoardController.java
boardService = new BoardService();
// BoardService 객체를 코드에서 직접 생성해 사용
BoardService.java
boardDAO = new BoardDAO();
// BoardDAO 객체를 코드에서 직접 생성해 데이터베이스와 연동
BoardDAO.java
public class BoardDAO {
// ~~
public BoardDAO() {
// ~~
}
}
그런데 이렇게 코드가 작성될 경우,
만약 이 코드에서 중간에 오라클에서 MySQL로 데이터베이스를 변경한다고 가정할 경우
BoardDAO 클래스의 기능을 일일이 변경해주어야 한다.
그뿐만 아니라 경우에 따라서는 BoardDAO 클래스를 사용하는 BoardService 클래스의 기능도 변경해야 할 수도 있다.
이렇게 클래스들의 의존 관계가 강하게 결합되어 있으면 여러 가지 문제가 발견할 수 있다.
하지만 스프링의 의존성 주입 기능을 이용하면
각 클래스들 사이의 의존관계를 최소화하여 이러한 문제를 해결할 수 있다.
스프링에서 의존성 주입(DI)을 구현하려면 XML이나 애너테이션을 이용해 객체를 주입하여
객체들의 의존관계를 맺어주면 된다.
즉, DI를 사용하여 각 객체들 간의 의존 관계를 최소화하는 것이다.
BoardServiceImpl.java
public class BoardServiceImpl implements BoardService {
private BoardDAO boardDAO;
public BoardServiceImpl(BoardDAO boardDAO) {
this.boardDAO = boardDAO;
}
//...
}
이 코드는 DI를 적용한 예이다.
BoardServiceImpl 클래스는 의존하는 BoardDAOImpl 객체를 전달받기 위해 new 키워드를 사용하지 않고
BoardServiceImpl 생성자를 호출할 때 컨테이너에 의해 주입되는 객체로 boardDAO 변수를 초기화한 것이다.
의존성 주입을 적용했을 때 얻는 장점들
- 클래스들 간의 의존 관계를 최소화해 코드를 단순화할 수 있다.
- 애플리케이션을 더 쉽게 유지 및 관리할 수 있다.
- 개발자가 직접 코드 안에서 객체의 생성과 소멸을 제어하지 않고
객체의 생성,소멸과 객체 간의 의존 관계를 컨테이너가 제어한다.
제어 역전 (IOC : Inversion of control)
프로그램의 생명주기에 대한 제어권이 웹 애플리케이션 컨테이너에 존재한다.
사용자가 new 연산자를 통해 직접 인스턴스를 생성하고 메서드를 호출하는 일련의 생명주기에 대한 작업들을
스프링에 위임할 수 있다.
'자바 스프링 > 스프링 공부' 카테고리의 다른 글
스프링의 작동 원리 - 로그인편 (0) | 2022.05.17 |
---|---|
Controller, Service, DAO, VO에 대해서 (0) | 2022.04.28 |
자바 스프링 공부 - 자바 웹을 다루는 기술 목차 (0) | 2022.03.23 |