인프런) 토비의 스프링 부트 - 이해와 원리 학습 Day2
본문 바로가기
Backend/Spring Boot

인프런) 토비의 스프링 부트 - 이해와 원리 학습 Day2

by 코딩하는 핑가 2025. 5. 14.
반응형

* 본 포스팅을 무단 복제하시거나 배포하지 마시기 바랍니다.

( 게시글 최상단에 본 블로그 출처를 밝히시면 포스팅은 가능합니다. )

* 필요한 부분만 학습 후 정리했습니다.


들어가기 전에 웹 개발 시 잊지 말아야할 것

 

Request

- Request Line: Method, Path, HTTP Version

- Headers

- Message Body

Response

- Status Line: HTTP Version, Status Code, Status Text

- Headers

- Message Body

 

* Spring Boot 없이 서블릿 컨테이너를 직접 띄우는 방법 실습함

- 방법1. 스프링 추상화없이, 프론트 컨트롤러 사용없이 저수준으로

- 방법2. 프론트 컨트롤러 사용해서 서블릿 컨테이너 띄우기

- 방법2. 컨트롤러 오브젝트를 생성하여 프론트 컨트롤러 역할을 위임해서 서블릿 컨테이너 띄우기

> https://github.com/sso-jeong/springStudy/tree/feature/manual-servlet

 

* 프론트 컨트롤러가 없다

- URL -> 서블릿 매핑이 직접 이루어짐

 

* 서블릿 코드에 공통적인 작업이 중복으로 들어가고 웹 요청과 응답을 직접적으로 다뤄줘야하기 때문에 늘 개선이 필요했다.

* 이러한 것들을 개선해서 나온게 프론트 컨트롤러임


주제) 스프링 컨테이너 사용, DI기초 개념

키워드) 스크링 컨테이너, 스프링 싱글톤 패턴

 

1. 스프링 컨테이너 = 싱글톤 패턴 = 싱글톤 레지스트리

[Spring Container]
        │
        ├─ HelloController 인스턴스  ──────────────┐
        │                                         │
        ▼                                         ▼
[FrontControllerServlet]                 [AnotherServlet]
        │                                         │
        └────── getBean(HelloController) ────────┘

 

  • Spring 컨테이너는 HelloController를 딱 한 번만 생성
  • 이후 getBean(HelloController.class) 호출 시, 항상 같은 객체 반환
  • 프론트 컨트롤러와 다른 서블릿이 같은 객체를 공유
  • 스프링은 이 패턴을 기본 전략으로 채택하고 있음

2. DI

예를 들어

SimpleHelloService와 ComplexHelloService는 모두 HelloService라는 인터페이스를 구현하고 있고
HelloController는 구체적인 클래스가 아니라 인터페이스(HelloService)에만 의존하도록 설계되어 있다고 가정.

 

코드상에서 HelloService 라는 인터페이스만 사용하지만

실제 런타임에서는 SimpleHelloService 혹은 ComplexHelloService 같은 구현체의 인스턴스 즉, 진짜 객체가 필요함

 

이때

인터페이스와 구현 클래스 사이의 연결을 대신 해주는 제 3의 존재가 필요함

 

그걸 어셈블러(Assembler) 라고 부르며

Spring 에서는 이 어셈블러의 역할을 스프링 컨테이너가 담당함

[HelloController]
      │
      ▼
  [HelloService] (인터페이스)
      ▲
 ┌────┴─────┐
 │          │
▼           ▼
[SimpleHelloService]   [ComplexHelloService]

      ↑
      │   의존성 주입
      │
[Spring Container (Assembler)]

 

3. 결론

Spring 컨테이너의 역할

- 클래스에 대한 메타 정보를 읽고

- 각각의 클래스 인스턴스를 싱글톤으로 생성하고

- 필요한 의존 오브젝트를 찾아서 자동으로 주입(Injection) 해줌

 

반응형

댓글