Framework/SPRING

[SPRING 이론] [02] 컨테이너

오류나면꽥꽥 2024. 2. 29. 16:36

 

📍 컨테이너

자바 애플리케이션을 실행하고 관리하는 환경을 제공하는 소프트웨어 컴포넌트

 

서블릿 컨테이너 스프링 컨테이너
자바 서블릿을 실행하고 관리하는 환경을 제공 스프링 프레임워크에서 제공하는 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 등

 

 

 

전체적인 흐름

 

 

 

 

서블릿 컨테이너 흐름

 

  1. 클라이언트의 요청을 받으면 HttpServletRequest와 HttpServletResponse 객체를 생성하여 
  2. post, get 여부에 따라 동적인 페이지를 생성하여 응답

 

 

 

 

 

 

📌 서블릿 컨테이너의 역할

 

  1. 웹서버와의 통신 지원
  2. 서블릿 생명주기(Life Cycle) 관리
  3. 멀티쓰레드 지원 및 관리
  4. 선언적인 보안 관리

 

 

 

 

 

 

✋ 서블릿 컨테이너 사용

 

서블릿이 제공하고자 하는 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)

 

  1. 스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)하며, 
  2. 생성된 빈에게 추가적인 기능을 제공

 

 

 

 

 

 

⛔ 스프링 컨테이너 종류

 

 

  1. Beanfactory
    스프링 컨테이너의 최상위 인터페이스
    Bean을 등록, 생성, 조회 등의 Bean을 관리하는 역할
    @Bean 어노테이션 사용하여 빈 등록

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