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