의존성 주입 (Dependency Injection)

Yejun Jang·2022년 11월 3일
0

한 클래스에서 다른 클래스의 기능을 사용하기 위해, 사용할 클래스의 생성자를 호출해서 사용하는 것이 아닌,
연관관계를 컨테이너가 연관관계를 규정하는 것. 이렇게 하여, 코드에서 각 클래스 간의 직접적인 연관관계가 발생하지 않아, 각 클래스의 변경이 자유로워진다.(약한 결합[loosely coupled]) -> 유지 보수, 코드 변경에도 유리해짐.

ex> 의존성 주입 이전

@WebServlet("/board/*")
public class BoardController extends HttpServlet
{
BoardService boardService;

public void init() throws ServletException{
	boardService = new BoardService();
    // 객체를 직접 생성하여 연관관계를 맺어줌.
}

}

public class BoardService{
BoardDAO boardDAO;
public BoardService(){
boardDAO=new BoardDAO();
// 객체를 직접 생성하여 연관관계를 맺어줌.
}
}

ex> 인터페이스를 이용한 위의 문제 해결
BoardController(Interface) - BoardControllerImpl(Class)
BoardService(Interface) - BoardServiceImpl(Class)
BoardDAO(Interface) - BoardOracleDAOImpl(Class)

public class BoardServiceImpl implements BoardService{
BoardDAO boardDAO;
public BoardService(){
boardDAO = new BoardOracleDAOImpl();
// 다른 종류의 DB로 변경할 경우,
// BoardOracleDAOImpl클래스를 변경할 필요가 없어짐.
// boardDAO = new BoardMySqlDAOImpl(); 형태로 변경.
}
}

ex> 의존성 주입(Dependency Injection)적용

  • 클래스 간의 의존 관계를 최소화하여 코드를 단순화할 수 있다.
  • 애플리케이션의 유지 관리가 좀더 쉬워진다.
  • 기존의 방법으론 개발자가 직접 코드 안에서 객체의 생성, 소멸을 제어했지만, 의존성 주입은 컨테이너(스프링 프레임워크는 경량 컨테이너의 한 종류
    )가 객체의 생성, 소멸, 객체 간의 의존 관계를 제어.
  • 스프링이 객체의 제어를 직접 담당하므로 제어의 역전(IoC, Inversion of Control)이라고 한다.

public class BoardServiceImpl implements BoardService{
private BoardDAO boardDAO;
public BoardServiceImpl(BoardDAO boardDAO){
// 생성자 생성할 때, 외부에서 객체를 주입
this.boardDAO = boardDAO;
}
}

public class BoardServiceImpl implements BoardService{
private BoardDAO boardDAO;
public void setBoardDAO(BoardDAO boardDAO){
// setter 이용하여 컨테이너에서 생성된
// BoardDAOImpl 객체를 주입
this.boardDAO = boardDAO;
}
}

profile
자바 개발자

0개의 댓글