📍 컨테이너
자바 애플리케이션을 실행하고 관리하는 환경을 제공하는 소프트웨어 컴포넌트
서블릿 컨테이너 | 스프링 컨테이너 |
자바 서블릿을 실행하고 관리하는 환경을 제공 | 스프링 프레임워크에서 제공하는 IoC 컨테이너 |
서블릿을 실행하는 웹 애플리케이션 서버의 일종 |
스프링 프레임워크의 의존성 주입과 객체 관리를 담당 |
ex)
이 서블릿은 HTTP GET 요청을 처리하고 "Hello, World!"라는 간단한 HTML 응답을 생성
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorldServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.getWriter().println("<h1>Hello, World!</h1>");
}
}
ex)
스프링 컨테이너가 HelloWorldService의 인스턴스를 생성하고 주입
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
// 스프링 컨테이너 생성
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Bean 가져오기
HelloWorldService service = context.getBean(HelloWorldService.class);
// 메시지 출력
System.out.println(service.getMessage());
}
}
// AppConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public HelloWorldService helloWorldService() {
return new HelloWorldServiceImpl();
}
}
// HelloWorldService.java
public interface HelloWorldService {
String getMessage();
}
// HelloWorldServiceImpl.java
public class HelloWorldServiceImpl implements HelloWorldService {
@Override
public String getMessage() {
return "Hello, World!";
}
}
차이점 | 서블릿 컨테이너는 서블릿을 직접 작성하고 관리 |
스프링 컨테이너는 설정 정보를 통해 객체를 관리하고 의존성 주입을 수행 |
✅ 서블릿 컨테이너 (Servlet Container)
- 서블릿은 동적인 웹 페이지 생성을 위해 사용, 클라이언트의 요청에 따라 서블릿이 실행되고 응답 생성
- 서블릿의 라이프사이클 관리, 스레드 처리, 네트워크 통신 등을 처리
- 대표적인 서블릿 컨테이너로는 Apache Tomcat, Jetty, Undertow 등
- 클라이언트의 요청을 받으면 HttpServletRequest와 HttpServletResponse 객체를 생성하여
- post, get 여부에 따라 동적인 페이지를 생성하여 응답
📌 서블릿 컨테이너의 역할
- 웹서버와의 통신 지원
- 서블릿 생명주기(Life Cycle) 관리
- 멀티쓰레드 지원 및 관리
- 선언적인 보안 관리
✋ 서블릿 컨테이너 사용
서블릿이 제공하고자 하는 HTTP 메서드에 따라 doGet(), doPost()등의 메서드를 오버라이딩해서 필요한 내용을 구현
public class HelloWorldServlet extends HttpServlet {
public doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
}
public doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
...
}
📍 @WebServlet
서블릿을 선언하고 매핑하는데 사용
ex)
"/hello" URL에 매핑된 HelloServlet이라는 서블릿을 정의
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.getWriter().println("Hello, World!");
}
}
✅ 스프링 컨테이너 (Spring Container)
- IoC는 객체의 생성, 조립, 관리를 애플리케이션 코드 대신 컨테이너가 담당하는 디자인 패턴
- 객체의 생명주기와 의존성 관리를 담당, 애플리케이션이 커질수록 유연하고 효율적인 구조를 제공
- XML, JavaConfig, 어노테이션을 통해 객체의 설정을 정의하고, 필요한 객체를 주입하여 사용
- 스프링은 여러 개의 서블릿 컨테이너 위에서 동작할 수 있으며, 서블릿 기반의 애플리케이션도 스프링을 통해 관리
❗ 스프링에서는 자바 객체를 빈(Bean)
- 스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)하며,
- 생성된 빈에게 추가적인 기능을 제공
⛔ 스프링 컨테이너 종류
- Beanfactory
스프링 컨테이너의 최상위 인터페이스
Bean을 등록, 생성, 조회 등의 Bean을 관리하는 역할
@Bean 어노테이션 사용하여 빈 등록 - ApplicationContext
BeanFactory의 기능을 상속받아 제공
빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그 외의 부가 기능을 제공
📌 스프링 컨테이너 사용 이유
객체를 생성하기 위해서는 new 생성자를 사용해야 한다.
그로 인해 애플리케이션에서는 수많은 객체가 존재하고 서로를 참조하게 된다.
▶ 객체 간의 참조가 많으면 많을수록 의존성이 높아지게 된다.
📍 낮은 결합도와 높은 캡슐화를 지향하는 객체지향 프로그래밍의 핵심
🔽
⭐ ⭐ ⭐
스프링 컨테이너을 사용하여,
객체 간의 의존성을 낮추어 결합도는 낮추고 높은 캡슐화
✋ 스프링 컨테이너 사용
1. ApplicationContext 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(클래스명.class);
applicationContext.getBean(”이름”, 타입);
public class MemberApp {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class)
}
}
ApplicationContext > AnnotationConfigApplicationContext:
자바 기반의 설정 클래스(@Configuration 어노테이션이 적용된 클래스)를 사용하여 애플리케이션 컨텍스트를 생성합니다.
2.
@Configuration 어노테이션으로 표시되어 스프링의 구성 클래스임을 나타냄
@Bean 어노테이션을 사용하여 메서드를 정의하고, 해당 메서드가 생성하는 객체를 스프링 빈으로 등록
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
@Bean
public MyRepository myRepository() {
return new MyRepositoryImpl();
}
}
'Framework > SPRING' 카테고리의 다른 글
[SPRING 이론] spring / spring boot 특징 요약 (0) | 2025.01.16 |
---|---|
[SPRING 이론] [04] 인스턴스화 / 어노테이션 (0) | 2024.03.04 |
[SPRING 이론] [03] 의존성(의존관계) / 의존주입 (0) | 2024.03.04 |
[SPRING 이론] [01] 프레임워크 (0) | 2024.02.28 |