반응형
# 목적
- 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 기술을 이용해서 상품정보를 수정한다.
}
}
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-Container
'BackEnd > Spring' 카테고리의 다른 글
[Spring] Spring을 통한 자동 의존성 주입(코드 작성 순서) (0) | 2025.01.16 |
---|---|
[Spring] Maven 빌드 도구 (0) | 2025.01.16 |
[Spring] IoC(제어역전, Inversion of Control) (0) | 2025.01.16 |
[Spring] Spring Framework란? (0) | 2025.01.16 |
[Model2] Model2의 주요 API (2) | 2025.01.16 |