[Spring] Spring Container(스프링 컨테이너)

류넹·2024년 2월 20일
1

Spring

목록 보기
5/50

# 목적

  • Spring Container(스프링 컨테이너)에 대해 이해하고,
    Spring Container를 활용하기 이전에 Container를 통한 의존성 주입 코드를 작성해보기




❓ Spring Container

Container(컨테이너) 란?

  • 객체의 라이프사이클을 관리하고, 객체를 제공하는 것
    * 객체의 라이프사이클 관리 : 객체의 생성/유지/폐기를 담당


Spring Container(스프링 컨테이너) 란?

  • IoC의 구현체
  • 객체의 생성, 객체의 의존관계를 파악해서 의존성을 주입
    • 설정정보(XML, 어노테이션으로 설정)를 읽어서 객체 생성 및 의존성 주입
  • 객체의 생성/유지/폐기/조립/제공 등의 기능 제공
    * 스프링 컨테이너 = 스프링 프레임워크의 기능




🔎 스프링의 주요 컨테이너

1. BeanFactory

  • 스프링 컨테이너의 가장 핵심적인 기능이 정의된 인터페이스
  • 객체 생성, 객체 조립 기능과 관련된 표준이 정의되어 있다.

2. ApplicationContext

  • BeanFactory 인터페이스를 상속받아서 정의된 인터페이스
  • BeanFactory 인터페이스에 정의된 기능 외에 AOP, 국제화처리, 이벤트 처리와 관련된 표준이 정의되어 있다.
  • 구현 클래스
    • FileSystemXmlApplicationContext
    • ClasspathXmlApplicationContext
    • GenericXmlApplicationContext
    • AnnotationConfigApplicationContext

3. WebApplicationContext

  • ApplicationContext 인터페이스를 상속받아서 정의된 인터페이스
  • 제공하는 기능은 ApplicationContext와 동일
  • 웹 애플리케이션에 적합한 스프링 컨테이너
  • 구현 클래스
    • XmlWebApplicationContext

* Context : 객체를 담는 객체







💡 Container를 통한 코드 작성 순서

Container를 통한 의존성 주입 코드를 작성해보자

1. Dao 생성

  • 1) Service에서 선언할 인터페이스 생성
  • 2) 위의 인터페이스를 구현할 Class들을 생성
	// 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 기술을 이용해서 상품정보를 수정한다.");
	}
}

}

2. Service 생성

  • 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();
	}
}

3. Container 생성

  • 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;
	}
}

4. App에서 사용

  • 1) Container 객체 생성
  • 2) Service에 Container의 생성, 조립된 객체 제공 메소드를 획득해서 담기
  • 3) Service 메소드 실행
public class App {

	public static void main(String[] args) {
		
		Container container = new Container();
		ProductService service = container.getProductService();
		
		service.신규상품등록();
		service.상품상세정보조회();
		service.상품정보수정();
        
        // 출력 결과 (Container에서 조립되어 있는 객체의 기능을 사용할 수 있음)
        // mybatis 기술을 이용해서 상품정보를 저장한다.
		// mybatis 기술을 이용해서 상품정보를 조회한다.
		// mybatis 기술을 이용해서 상품정보를 수정한다.
	}
}
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글