* 객체의 라이프사이클 관리 : 객체의 생성/유지/폐기를 담당
* 스프링 컨테이너 = 스프링 프레임워크의 기능
* Context : 객체를 담는 객체
Container를 통한 의존성 주입 코드를 작성해보자
// 1. 인터페이스 생성 (확장성을 위해서는 인터페이스 필수)
public interface ProductDao {
void insertProduct();
void getProduct();
void updateProduct();
}
// 2-1. 인터페이스를 구현할 Class 1
public class ProductJdbcDao implements ProductDao {
@Override
public void insertProduct() {
System.out.println("JDBC 기술을 이용해서 상품정보를 저장한다.");
}
@Override
public void getProduct() {
System.out.println("JDBC 기술을 이용해서 상품정보를 조회한다.");
}
@Override
public void updateProduct() {
System.out.println("JDBC 기술을 이용해서 상품정보를 변경한다.");
}
// 2-2. 인터페이스를 구현할 Class 2
public class ProductMybatisDao implements ProductDao {
@Override
public void insertProduct() {
System.out.println("mybatis 기술을 이용해서 상품정보를 저장한다.");
}
@Override
public void getProduct() {
System.out.println("mybatis 기술을 이용해서 상품정보를 조회한다.");
}
@Override
public void updateProduct() {
System.out.println("mybatis 기술을 이용해서 상품정보를 수정한다.");
}
}
}
1) 멤버변수 선언 (변수 타입 : Dao 인터페이스)
= 구멍 뚫기 ex) 노트북의 HDMI 타입의 선, USB 타입의 선 등을 연결할 수 있는 구멍
2) Setter 메소드 생성
public class ProductService {
// 1. Dao 인터페이스 타입으로 멤버변수 선언
private ProductDao dao;
// 2. Setter 메소드 생성
public void setDao(ProductDao dao) {
this.dao = dao;
}
public void 신규상품등록() {
dao.insertProduct();
}
public void 상품상세정보조회() {
dao.getProduct();
}
public void 상품정보수정() {
dao.updateProduct();
}
}
1) 애플리케이션에 실행할 필요한 객체 생성
2) 객체들 간의 의존관계에 맞게 객체 조립
여기서 조립한 객체의 주소값이 Service에 전달되고, App에서 해당 객체의 기능을 사용할 수 있다.
3) 생성, 조립된 객체 제공
public class Container {
public ProductService getProductService() {
// 1. 애플리케이션 실행에 필요한 객체 생성하기
ProductJdbcDao productJdbcDao = new ProductJdbcDao();
ProductMybatisDao productMybatisDao = new ProductMybatisDao();
ProductService productService = new ProductService();
// 2. 객체들 간의 의존관계에 맞게 객체 조립하기 -> 의존성 주입 발생
// - setDao로 주소값을 Service에게 전달
// - SetDao에 JdbcDao/MybatisDao 중 사용할 객체를 지정하기만 하면
// Service는 단 한 줄의 코드도 변경하지 않고 사용할 객체를 변경할 수 있다. 이 작업을 Spring이 해줌
productService.setDao(productMybatisDao);
// 3. 생성, 조립된 객체 제공하기
return productService;
}
}
public class App {
public static void main(String[] args) {
Container container = new Container();
ProductService service = container.getProductService();
service.신규상품등록();
service.상품상세정보조회();
service.상품정보수정();
// 출력 결과 (Container에서 조립되어 있는 객체의 기능을 사용할 수 있음)
// mybatis 기술을 이용해서 상품정보를 저장한다.
// mybatis 기술을 이용해서 상품정보를 조회한다.
// mybatis 기술을 이용해서 상품정보를 수정한다.
}
}