출처: https://typemin.tistory.com/7 [TypeLOG:티스토리]

문제 상황

  • 특정 route의 GatewayFilter를 개별적으로 등록.
  • 보통의 상황에서는 문제가 생기지 않음.
  • 비동기 응답(Streaming Response, Mono, Flux 등)을 받을때는 사전 처리는 잘 되지만 사후 처리는 비동기 응답을 기다리지 않는 상황.

실행시키는 Proxied Service 비동기로 Streaming응답 형식을 하게되고 총 5초가 걸리게 했습니다.
(시간은 이해를 돕기위해 간소화)

0초 API 요청 
0초 GlobalFilter 사전 처리 동작 
0초 GatewayFilter 사전 처리 동작
0초 GatewayFilter 사후 처리 동작
5초 GlobalFilter 사후 처리 동작

즉, StreamResponse의 끝나는 시점에 GatewayFilter가 작동하면 되는 문제였습니다.

왜 그럴까 ?

GlobalFilter의 우선순위는 -1로 설정한 상황이었고.

스프링 공식문서 Combined Global Filter and GatewayFilter Ordering링크로 들어가보면 친절하게 우선순위를 GlobalFilter와 같이 사용하는 것이 있고 GatewayFilter도 똑같이 -1로 주어서 사용해봤더니 실패했습니다.

@Component
public class UserReqeustThrottlingFilter implements GatewayFilter, Ordered {
    private static final String REDIS_UNIQUE_USER = "unique_user::";

    @Autowired
    RedisTemplate<String, Integer> redisTemplate;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
       // ...
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

스프링의 공식문서 내용 중 WebHandlerfilterChain을 통해서 요청이 실행된다고 합니다.

Gateway WebHandler의 구현체 FilteringWebHandler

FilteringWebHandler는 내부의 GatewayFilterAdapter를 통해서 실행이 됩니다. 우선순위를 잘 찾아보면

제가 등록한 UserRequestThrottlingFilter가 우선순위가 정상적으로 된 걸 보았는데NettyWriteResponseFilter 보다는 낮을 걸 확인 할 수 있습니다.

NettyWriteResponseFilter클래스가 비동기 응답을 처리하는 필터였고 해당 필터보다 위쪽에 있어야지 제가 원하는 응답을 얻을 수 있습니다.

해결

이제야 문제는 해결됩니다. 이유를 몰랐던 우선순위에 따른 응답이 달라지는 것은 NettyWriteResponseFilter와의 우선순위 문제였고 커스텀한 글로벌 필터는 항상 NettyWriteReponseFilter보다 위 입니다.

하지만 GatewayFilter는 아니었던 거죠 우선순위를 NettyWriteResponseFilterorder값인 -1로 주는 것이 아닌 확실하게 -2를 주면서 문제는 해결됩니다.

index 2 에 위치하게 됩니다.

ㅜㅜ

새로운 Spring Project인 Cloud Gateway에 대해서 알게된지 3일차지만 많은 공부가 되었습니다.
이 문제 해결법이 도움이 됐으면 좋겠네요.

반응형

'Programming > Spring' 카테고리의 다른 글

Spring MVC(2). 프론트컨트롤러(DispatcherServlet)  (0) 2023.04.19
Spring MVC(1). 서블릿  (0) 2023.04.19

로드밸런서를 알아보기 전에 사용자의 요청이 시스템에서 처리되는 과정과 단말에 대해서 이해할 필요가 있다.
보통의 웹은 사용자 요청을 처리하기 위해서 아래와 같은 처리 결과를 거친다.

단일 서버 아키텍처

설명을 붙이자면
1. 사용자는 도메인 이름www.suby.com을 이용하여 웹사이트에 접속을 하는데 . 이 접속을 위해서 도메인 이름을 DNS에 질의를 하여 IP주소로 변환하는 과정이 필요하다.
2. DNS는 보통 서드 파티가 제공하는 유료서비스를 이용하게 되므로 우리가 만들어야 할 서비스는 아니다.

3. 해당 IP주소로 HTTP 요청을 전달해 웹 서버는 그 요청에 맞는 응답을 보내준다.
4. 애플리케이션 서버는 endpoint를 이용하여 데이터베이스에 데이터를 요청할수 있고 데이터베이스는 데이터를 반환할수 있는데 아래는 그것을 표현한 그림이다.

사용자가 많아지면

사용자가 늘면 서버 하나로는 많은 트래픽을 담당하기에는 충분하지 않아서 방안을 생각해봐야 하는데 2가지를 생각할수 있다.

  1. 수직적 규모 확장
  2. 수평적 규모 확장

수직적 규모 확장에는 소위 scale up 이라는 고사양 자원(ram이나 CPU 등)을 추가하는 방식이 있고
수평적 규모 확장에는 scale out 이라고 하는 더 많은 서버를 추가하여 성능을 개선하는 행위를 말한다.
수직적 규모 확장에는 한계가 있는데 ,

  1. 한 대의 서버에 메모리나 CPU등을 무한으로 증설할수 없다.
  2. 장애에 대한 자동복구 방학이나 다중화 방안을 제시하지 않는다. 이로 인해 장애가 발생하면 웹/앱은 완전히 중단이 된다.

위에서 본 설계는 client가 Aplication Server에 바로 연결이 된다.
이러한 설계는 아래와 같은 내용을 야기한다.

  1. 웹 서버가 다운이 된다면 사용자는 웹 사이트에 접속할 수 없다.
  2. 너무 많은 사용자가 접속하여 웹 서버가 한계 상황에 도달하게 되면 응답속도가 느려지거나 서버 접속이 불가능해 질수도 있다.

이러한 문제를 해결하는 데는 부하 분산기 또는 로드 밸런서를 도입하는 것이 최선이다.

위와 같이 Client는 로드밸런서에 접속하고, 로드 밸런서가 서버1/2 와 같이 접속을 처리한다.
따라서 웹 서버는 클라이언트의 접속을 직접 처리하지 않는다.
그리고 더 나은 보안을 위해 서버 간 통신에는 사설 IP주소가 이용된다. 사설 IP주소는 같은 네트워크에 속한 서버사이에 통신에만 쓰일수 있는 IP 주소로, 인터넷을 통해서는 접속할 수 없다. 로드밸런서는 웹 서버와 통신하기 위해 바로 이 사설 주소를 이용한다.

 

반응형

둘다 팩토리 패턴이다. 하지만 둘의 차이가 헷갈릴수있어서 정리를 해본다.

팩토리 메소드 패턴 :
한 객체를 생성하기위한 과정에 집중이 되어있고 한 인터페이스를 정의 구체적인 내용은 서브클래스(팩토리)로 위임하는 패턴이다.

추상 팩토리 패턴 :
팩토리를 사용하는 방법으로, 서로 연관되거나 의존적인 조합을 만드는 여러종류의 객체 집합를 만들기위해 인터페이스를 제공하는 패턴이다.

반응형

'Programming > DesignPattern' 카테고리의 다른 글

Design Pattern- Vistor Parttern  (1) 2023.06.09

알고리즘을 객체 구조에서 분리시키는 디자인패턴으로. 이렇게 분리를 하면 구조를 수정하지 않고도 실질적으로 새로운 동작을 기존의 객체 구조에 추가할수 있게 된다. OCP 원칠을 적용하는 방법의 하나이다.

이번에 프로젝트를 하면서 게시판부분에 대해서 작업을 진행했을때 였다.
게시판은 2가지의 분류

  1. sellBoard
  2. storyBoard

로 나뉘었다. 이때 DTO를 만드는 과정에서 두 종류가 가지고있는 필드가 다르기 때문에 DTO의 내용이 달라진다.
sellBoard에는 price라는 필드가 있었는데 이 부분을 꼭 처리를 해줘야하는 상황이다.

해결한 방법을 간단하게 설명하자면 해당 visitor들이 들릴수있는 공간을 만들고, 그 elements들은 visitor를 방문할수있게끔 만들어 주면 됐다.

우선 첫번째 스탭으로 해당 Board 방문을 하는 Element라고 부르겠다. elements들은 visitor를 허용해야한다. 어떤 visitor가 있을지 모르니 interface로 정의한 visitor를 받아주게 하였다.

    // 추상클래스 
    public abstract class Board {
        public abstract BoardDTO accept(BoardVisitor visitor);
    }
    // 구현체
       public class SellBoard extend Board {
        public BoardDTO accept(BoardVisitor visitor){
            visitor.visit(this);
        }
    }

이부분에서 BoardDTO를 반환하게 작성을 하였는데 좋은 방법이 아니다. BoardDTO를 반환할수있는 Visitor만 허용하게 된다. 글을 작성하면서 문제점이 보이니 나중에 꼭 리팩터링을 해야된다.

그리고 나서 elements에 해당하는 visitor들을 만들어준다.

public interface BoardVisitor {
    BoardDTO visit(SellBoard sellBoard);

    BoardDTO visit(StoryBoard storyBoard);
}

이렇게 하면 visitor와 elements에는 준비가 끝났다. 사용하는 곳에서는 내가 만든(앞으로 만들수도 있고) Visitor을 elements.visit()에 인자값으로 넣어주면 된다

    SellBoard sellBoard = new SellBoard(...);
    BoardDTO dto = sellBoard.visit(new ConvertingBoardDTOVisitor());
    // 내가 구현한 convertingclass에 해당 sellboard에 해당하는 메소드가 실행하여 dto반환 

대학교에서 캡스톤디자인 팀플젝을 하면서 우선 시간에 급급하게 프로젝트를 진행했다.
다시 한번 봐보니 이런 부분에서 리팩토링 할 부분에 대해서 생각해보는 시간이 생겼었다.
아직 많기는 하….ㄷ

반응형

'Programming > DesignPattern' 카테고리의 다른 글

추상 팩토리 패턴 VS 팩토리 메소드 패턴  (0) 2023.06.09

전 페이지에서 다루었듯이 운영체제는 자원을 관리하고 자원을 보호한다. 그리고 사용자가 응용프로그램이 컴퓨터 자원을 쉽게사용 할 수 있는 인터페이스를 제공한다.

또 운영체제의 핵심이라고 말할수 있는 커널이 있다고 하였다.

운영체제 구조

위 그림에서 운영체제는 크게 2가지로 나누어 지는데 인터페이스 커널이다.

인터페이스


커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할

우선 인터페이스란 서로다른 두 시스템을 연결해주는 것을 말한다. 인터페이스의 종류를 보면 여러가지가 있는데

명령 인터프리터

명령 인터프리터를 예를 들자면 window에 터미널 , macOS bash를 들수 있겠다. 예전에 친구들과 게임을 하면서 terminal에 ipconfig를 작성해본 기억이 있을것이다.
또 macOs에서 rm -rf (삭제) 와 같은 명령을 실행해본적도 있을것이다.

그래픽 사용자 인터페이스

작업관리자 등이 있다.

커널


운영체제 구성요소 중 항상 메모리(RAM)에 올라가 있는 운영체제의 핵심 부분으로써 하드웨어와 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할

커널이 하는일


  • 프로세스 관리 : 프로세스에 CPU를 배분하고 작업에 필요한 제반 환경을 제공한다.
  • 메모리 관리 : 프로세스에 작업 공간을 배치하고 실제 메모리보다 큰 가상공간을 제공한다.
  • 파일 시스템 관리 : 데이터를 저장하고 접근할 수 있는 인터페이스를 제공한다.
  • 입출력 관리 : 필요한 입력과 출력 서비스를 제공한다.
  • 프로세스 간 통신 관리 : 공동 작업을 위한 각 프로세스 간 통신 환경을 지원한다.

커널의 구성


단일형 구조 커널

초창기의 운영체제 구조였다. 커널의 핵심 기능을 구현하는 모듈들이 구분없이 하나로 구성되어있는 구조이다.

모듈 간의 통신 비용이 줄어들어 효율적인 운영이 가능하지만 , 모듈이 묶여 있어 아래와 같은 문제점들이 생겼다.

  • 모든 모듈이 하나로 묶여 있기 때문에 버그나 오류를 처리하기가 어려움
  • 운영체제의 여러 기능이 서로 연결되어 있어 상호 의존성이 높기 때문에 기능상의 작은 결함이 시스템 전체로 확산될 수 있음
  • 다양한 환경의 시스템에 적용하기 어려움

마이크로 구조 커널

  • 프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 가장 기본적인 기능만 제공
  • 커널의 각 모듈은 세분화되어 존재하고 모듈 간의 정보 교환은 프로세스 간 통신을 이용하여 이루어짐

시스템 호출


커널이 자신을 보호하기 위해 만든 인터페이스다. 커널은 사용자나 응용 프로그램으로 부터 컴퓨터 자원을 보호하기위해 자원에 직접 접근하는 것을 차단한다.

만약 직접 접근 을 하게 된다면 ? 응용 프로그램이 원하는 위치에 데이터 저장(충돌)이 있을것이고, 하나의 응용프로그램이 다른 응용프로그램이 사용중인 데이터를 삭제가 가능할것 이다.

그래서 시스템 호출은 커널이 제공하는 시스템 자원의 사용과 연관된 함수이다. 이러한 인터페이스(규칙)이 있기 때문에 응용프로그램이 하드웨어 자원에 접근하거나 서비스를 이용할때는 시스템 호출을 사용해야된다.

❓ 그러면 커널에 시스템호출을 하지않고 접근해서 자원을 건드릴수있다면 어떻게 될까 ?

이러한 이유때문에 운영체제는 커널이 제공하는 서비스를 시스템 호출로 제한하고 다른 방법으로 커널에 접근하는것을 막음으로써 보호한다.

드라이버


커널과 하드웨어의 인터페이스다.

  • 디바이스 드라이버라고도 불림
    • 마우스, 키보드 드라이버
    • 그래픽 카드 드라이버 등..

 

보안해야될 내용이거나 틀린내용이 있다면 지적해주시면 공부하는데 많은 도움이 될거같습니다. 지적은 항상 감사합니다

 

 

반응형

'Programming > CS' 카테고리의 다른 글

운영체제란 ?  (0) 2023.04.19

프론트 컨트롤러 패턴은 중앙 집중형 컨트롤러를 프레젠테이션 계층의 제일 앞에 둬서 서버로 들어오는 모든 요청을먼저 받아서 처리하게 만든다

사실 프론트 컨트롤러가 받기전에 Filter가 먼저 받긴하는거 같다.

예전 방식의 서블릿들은 클라이언트가 요청을 보내면 서블릿컨테이너가 서블릿을 찾아 매핑해줘 결과를 리턴해준다.

하지만 이 방식은 단점이 아래와 같다.

  • 서블릿이 많아지고 web.xml에 작성해야되는 매핑코드가 많아지면서 유지보수가 어려워진다.
  • 서블릿들은 웹 기술의 종속적이게 되면서 안좋아진다.
  • 서블릿들은 각각의 진입점을 갖기때문에 중복되는 코드를 막을수가 없다.

그래서 해당 일들을 해주는 프론트 컨트롤러 패턴을 고안해냈다(선배 개발자들이) 프론트 컨트롤러 패턴을 하면 좋은점은 웹환경에 종속적이지 않고 순수한 JAVA POJO코드로 컨트롤러를 만들수 있다 . (이는 곧 서블릿이 아니여도 된다는 소리와 같다.)

DispatcherServlet


스프링은 프론트 컨트롤러가 있는데 이것은 DispatcherServlet이라고 한다.

해당 프론트 컨트롤러가 하는 일은 아래와 같다.

  1. 요청을 분석한다.
  2. 핸들러 매핑에게 위임하여 요청을 처리할 핸들러를 찾는다.
  3. 해당 핸들러(컨트롤러)를 실행할수 있는 핸들러 어댑터를 찾는다.
  4. 찾아낸 핸들러 어댑터를 사용해서 컨트롤러로 요청과 응답을 처리한다.
  5. DispatcherServlet은 ViewResolver를 통해 View를 생성한다.
  6. DispatcherSerlvet은 View를 통해 요청결과를 생성 및 반환한다. 
  7. 부가적으로 컨트롤러 실행중에 예외가 발생했다면, 예외처리 핸들러에게 요청처리를 위임한다.

핸들러 매핑


핸들러 매핑은 HTTP 요청정보를 이용해서 이를 처리할 핸들러 오브젝트, 즉 컨트롤러를 찾아주는 기능을 가진 DispatcherServlet의 전략이다.

핸들러 매핑은 컨트롤러의 타입과는 상관없다. 하나의 핸들러 매핑 전략이 여러가지 타입의 컨트롤러를 선택할 수 있다는 뜻이다. (이와 관련된 내용은 핸들러 어댑터에서 다루겠다)

핸들러 인터셉터


핸들러 매핑의 역할은 기본적으로 URL과 요청정보로부터 컨트롤러 빈을 찾아주는 것이다. 한 가지 더 중요한 기능중 핸들러 인터셉터는 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터 역할인 인터셉터의 실행 체인을 돌려준다.

핸들러 어댑터


dispatcherServlet이 가지는 무한한 확장성의 비결

핸들러 매핑이 끝났다면 DispatcherServlet이 어떤 컨트롤러의 메소드를 실행할지 알고있어야 한다. 그렇다면 dispatcherServlet은 호출 가능한 컨트롤러는 특정 인터페이스를 구현해야 한다는 식의 규약을 따라서 작성해야 할까?

그건 아니다. 핸들러 어댑터를 이용하면 된다. 전형적인 오브젝트 어댑터 패턴을 사용해서, 특정 컨트롤러를 호출해야 할때는 해당 컨트롤러 타입을 지원하는 어댑터를 중간에 껴서 호출하는것이다. 그러면 항상 일정한 방식으로 컨트롤러를 호출하고 결과를 받을수 있다.

뷰 리졸버


컨트롤러가 어떤 식으로든 다시 DispatcherServlet에 돌려줘야할 두가지 정보가 있는데 그중 하나가 모델이고 하나가 뷰다. 컨트롤러가 직접 뷰 오브젝트를 리턴할수 있지만, 보통은 DispatcherServlet의 전략이 viewResolver를 통해 뷰 오브젝트를 리턴해준다.

이렇게 되면 View는 어떤 모델을 받아서 Table로 보여주든 Excel로 보여주든 html로 보여주든 자기 입맛대로 할수있다.

핸들러 예외 리졸버


컨트롤러의 작업 중에 발생한 예외를 어떻게 처리할지 결정하는 전략이다.

web.xml에 를 지정해서 에러 안내페이지를 보여줄 수도 있다. 그런데 핸들러 예외 리졸버가 등록되어 있다면 DispatcherServlet은 먼저 예외 리졸버에게 해당 예외를 처리 할수 있는지 확인한다. 핸들러 예외 리졸버가 있다면 예외는 DispatcherServlet 밖으로 던지지 않고 해당 핸들러 예외 리졸버가 처리한다.

 

작성하면서 정리를 하는데도 아직도 혼란스럽습니다.. 혹시 지적해줄곳이 있으시면 꼭 댓글로 알려주시면 감사하겠습니다.

반응형

🍀 운영체제와 컴퓨터


운영체제 : 컴퓨터의 구성요소, 자원을 관리 및 운영하는 시스템소프트웨어의 구조 및 기능
쉬운말로 정의하자면 사용자나 응용 프로그램이 컴퓨터 자원을 쉽게 사용할 수 있는 인터페이스를 제공하여 컴퓨터 자원을 보호하고 자원을 사용, 결과를 돌려주는 시스템 소프트웨어이다.

운영체제의 정의


  • 자원 관리
    • 사용자는 자원을 직접 접근 불가능하게 만들어서 자원을 보호한다.
    • 인터페이스 환경 제공
  • 컴퓨터의 성능 향상
    • 보안 업데이트 등
  • 운영체제는 관리자(supervisor)
    • 실행중인 프로그램 관리, 메모리 관리, 파일과 디스크 장치 관리, 입출력 장치 관리, 사용자 계정 등
  • 운영체제는 소프트웨어(software)
    • 커널이라고 불리는 핵심 코드와 UI/도구 프로그램들, 장치를 제어하는 디바이스 드라이버들로 구성한다.

그래서 운영체제는 컴퓨터 하드웨어나 응용소프트웨어 등 자원 관리를 목적으로 사용한다.
프로세스, 메모리, 파일 시스템, 입출력 장치 등 자원 관리와 사용자 관리를한다.

컴퓨터 자원이란


CPU 시간, 메모리 공간, 파일 저장 공간, 입출력장치 등

  • 다시 말하면 컴퓨터 하드웨어
    • 하드웨어 자원 – CPU, 캐시나 메모리, 키보드, 마우스, 디스플레이, 하드 디스크, 프린터 등
    • 소프트웨어 자원 - 응용프로그램
    • 데이터 자원 - 파일, 데이터베이스 등

🍀 운영체제의 역할


위에 정의에서 간단하게 설명했듯 운영체제는 컴퓨터 자원을 관리하고, 또 사용자로부터 컴퓨터 자원을 직접 접근하는것을 보호해준다.

자원관리


  • 응용 프로그램 및 사용자에게 컴퓨터 자원(하드웨
    어)을 할당하여 작업 할 수 있도록 함
  • 자원을 요청한 프로그램이 여러 개라면 적당한 순서로 자원을 배분하고 적절한 시점에 자원을 회수
    하여 다른 응용 프로그램에 할당
  • 운영체제는 자원에 대한 독점(exclusive) 권한 소유
  • 자원에 대한 모든 관리 권한은 운영체제에게 있음
  • 자원 할당, 자원 공유, 자원 액세스, 자원 입출력 등

자원보호


비정상적인 작업으로부터 컴퓨터 자원을 보호한다.

운영체제는 사용자가 실행하는 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. 만약 자원을 운영체제가 보호하지 않는다면 프로그램들이 CPU,메모리,하드 디스크 등 자원에 마음대로 접근하고 조작한다면 자원의 질서가 무질서하게 관리가 될것이고 이는 큰 버그가 될것이다.

그래서 운영체제는 자원에 대한 접근을 오직 자신을 통해서만 접근하도록 자원을 보호한다. 이러한 과정을 운영체제의 핵심인 커널에서 실행하는데 이는 다음 포스트에서 다루겠다.

하드웨어 인터페이스 제공


  • CPU, 메모리, 키보드, 마우스와 같은 하드웨어를
    사용자가 일관된 방법으로 사용할 수 있도록 하드웨어 인터페이스 제공
  • 사용자 인터페이스 제공
    • 사용자가 운영체제를 편리하게 사용하도록 지원
      • EX) 윈도우의 그래픽 사용자 인터페이스(GUI))

🍀 운영체제의 기능


  • CPU/프로세스 관리(process management)
  • 메모리 관리(memory management)
  • 파일 시스템 관리(file system management)
  • 장치 관리(device management)
  • 네트워크 관리
  • 보안 관리
  • 기타 관리
    • 사용자 관리 - 사용자 계정 관리
    • 통계 - CPU, 메모리, 네트워크 사용 시간이나 사용자의 접속 시간 등
    • 오류 발견 및 대응
    • 부팅(booting)
반응형

'Programming > CS' 카테고리의 다른 글

운영 체제의 구성 - 커널  (0) 2023.04.20

서블릿이란 동적 웹페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다. 서블릿은 웹 요청과 응답 흐름을 간단한 메소드 호출만으로 체계적으로 다룰수 있게 해준다.

동작과정


위에 그림을 조금만 설명하자면 아래와 같다.

  1. 클라이언트가 요청을 한다.
  2. Http요청을 하면 request, response객체가 생성이된다.
  3. 그리고 비즈니스 로직을 전문으로 처리하는 서버인 WAS(Tomcat) 에 요청을한다.
  4. 서블릿 컨테이너는 요청에 대한 기능을 수행하기 위해 서블릿에게 위임을 하고
  5. 결과를 반환해 클라이언트에게 전달해준다.

서블릿 컨테이너


서블릿 컨테이너는 웹서버와 서블릿이 쉽게 통신할수 있는 환경을 제공 해준다.

웹 애플리케이션 서버는 서블릿컨테이너라는 서브 시스템을 포함하고 있다. 서블릿 컨테이너는 서블릿 라이프 사이클을 관리하고 , 요청에 따라 서블릿을 분기,실행하며, HTTP응답을 생성해내는 역할을 한다. 또한 서블릿 컨테이너는 여러개의 서블릿 인스턴스를 생성하고, 이를 효율적으로 관리하기 위해 스레드 풀과 같은 기능을 제공한다.

 

❓그래도 나는 서블릿 컨테이너가 서블릿을 관리하는것이 이해가 안간다…. WebApplicatoinServer가 바로 관리할수있지 않을까? 알고 계시는 분께선 댓글 남겨주시면 감사합니다..

생명주기


서블릿도 자바 클래스 이므로 실행하면 초기화 ,서비스, 소멸 의 과정을 거친다.

우선 클라이언트에게 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 로드가되어있는지 확인을 한다. 그런데 없다면 init()메소드를 실행한다.

그리고 service()메소드를 통해 요청에 대한 처리를 위해서 HTTP요청을 분석해 GET,POST 적절한 것으로 분기한다.

그리고 컨테이너가 종료요청을 하면 destroy()메소드가 호출되는데 이것이 서블릿의 생명주기이다.

 

 

반응형

+ Recent posts