사용 목적
- 모듈간 결합도를 낮추기 위해 사용(종속성 제거)
- 협업, 유지보수 용이
(설명)
A class와 B class가 있습니다. B class의 구현을 위해 A객체가 필요하다면 B class는 A class에 대한 Dependency(의존성)을 가진다고 말합니다.따라서 B class의 구현을 위해서는 A Bean이 필요한데 필요하다고 해서 직접 A Bean생성(new A() 방식)을 하지 않고 다른 방법을 통해 A Bean를 주입시켜 주는 것을 DI(의존성 주입)이라고 말합니다.
의존성 주입 3가지 패턴
(3 Patterns of Dependency Injection by Martin Fowler)
1) 생성자를 통한 주입(Injection by Constructor) : 비추
- A class의 생성자를 만들어 B class에 의존성을 주입
2) 셋터 메서드를 통한 주입(Injection by Setter method)
- A class의 (멤버)필드에 대한 setter()를 만들어 의존성 주입
3) 인터페이스를 통한 주입(Injection by Interface)
- 인터페이스에 의존성을 주입하는 추상메서드를 만들고 실행시 이 인터페이스를
구현함으로써 의존성을 주입
<의존성 주입 예시>
BoardDAO 인터페이스
package dao;
import java.util.List;
import vo.Board;
//확장성을 휘해 BoardDAO를 인터페이스 생성
public interface BoardDAO {
public List<Board> selectBoardList();
}//BoardDAO interface end
BoardDAO 인터페이스 구현 클래스
package dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import vo.Board;
//인터페이스 BoardDAO의 구현을 위한 BoardDAOImpl class
public class BoardDAOImpl implements BoardDAO {
// BoardDAO class는 SqlSession Class에 의존성을 가짐
// 1) SqlSession property 선언
// 2) SqlSession class의 setter()를 통해 의존성 주입
private SqlSession session;
public void setSession(SqlSession session) {
this.session = session;
}
//구현객체는 반드시 추상메서드를 구현해야합니다.
public List<Board> selectBoardList(){
//의존성 주입을 했기 때문에 session객체를 바로 쓸 수 있습니다.
return session.selectList("board.selectBoardList");
}; // selectBoardList()
}//BoardDAOImpl class end
BoardService 인터페이스
package service;
import java.util.List;
import vo.Board;
//BoardService interface는Transaction 관리를 위해 만듭니다.
public interface BoardService {
public List<Board> getList();
}//BoardService interface end
BoardService 인터페이스 구현 클래스
package service;
import java.util.List;
import vo.Board;
import dao.BoardDAO;
//BoardService interface구현을 위한 BoardServiceImpl class
public class BoardServiceImpl implements BoardService {
//BoardService는 BoardDAO에 대한 의존성을 가짐
//따라서 BoardDAO Property를 선언해주고
//setter를 통해 의존성 주입
private BoardDAO dao;
public void setDao(BoardDAO dao){
this.dao = dao;
}
//구현객체는 반드시 추상메서드를 구현해야합니다.
public List<Board> getList(){
//의존성 주입을 했기 때문에 dao객체를 바로 쓸 수 있습니다.
return dao.selectBoardList();
}
}//BoardServiceImpl class end
Tip) method명 짓는 노하우
- DAO는 SQL구문과 직접 관련되므로 메서드명에 select, update,delete,insert를 쓰면 편리함 (예)selectList, selectOne 등
- Service는 DAO를 호출하기 때문에 굳이 SQL를 몰라도 됩니다.메서드명 규칙는 의미에 맞게 해줍니다. (예)getList,getBoard,getUserInfo 등
'프로그래밍 > Spring Framework' 카테고리의 다른 글
applicationContext.xml 기본설정(WEB-INF/) (0) | 2014.10.15 |
---|---|
web.xml 기본설정(WEB-INF/) (0) | 2014.10.15 |
Apache Maven project configuration - 메이븐 설정 (0) | 2014.10.14 |
Spring IDE plug-in install in Eclipse Java EE keppler - 스프링 IDE플러그인 (0) | 2014.10.14 |
Spring MVC Flow (0) | 2014.10.14 |