본문 바로가기
Engineering WIKI/Spring Boot

[인프런 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] 1장.웹 애플리케이션 이해

by wonos 2023. 9. 7.
  • 해당 내용은, '인프런 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (유료 - 69,300) 김영한님 강의'를 개인적으로 개념정리를 위해 정리한 내용입니다.

내용

  • 서블릿 컨테이너: 서블릿들의 생성, 실행, 파괴를 담당한다. 서블릿들을 위한 상자(Container)입니다.
  • 서블릿 이란 ? : 클라이언트의 요청을 처리하고 그 결과를 반환하는 기술
  • 서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리한다.
    • 서블릿 클래스를 로딩하여 인스턴스화
    • 초기화 메소드를 호출
    • 요청이 들어오면 적절한 서블릿 메소드를 호출합니다.
    • 서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행
  • 서블릿 컨테이너 의 가장 중요한 기능은 요청을 올바른 서블릿에 전달해서 처리되도록하고, JVM이 해당 요청을 처리 한 후에는 생성된 결과를 올바른 장소에 동적으로 반환 해주는 것이다.

질문 목록

  • 1) WAS, WS 잘 이해가 안갑니다.
    • WS (웹서버) : HTTP SERVER PROJECT 대표적으로 Apache(아파치)가 있다.
      • 브라우저가 서버에 페이지를 요청할 때, 가장 앞에서 HTML, PNG, CSS 같은 정적 내용에 응답.
      • 요즘은 nginx(엔진엑스)라는 다른 웹 서버가 다른 빠른 속도로 아파치에 대항함.
    • WAS (웹애플리케이션 서버) : 동적인 내용을 처리함. WAS는 웹 서버 역할도 이미 가지고 있다.
      • 즉, WAS는 웹 서버 + 웹 컨테이너 결합
      • 웹 컨테이너 안에서 벌어지는 일들
        • 1) 웹 서버의 요청을 컨테이너가 받는다.
        • 2) 컨테이너는 web.xml을 참고해 해당 서블릿의 쓰레드를 생성한다.
        • 3) httpServletRequest와 httpServletResponse 객체를 생성한다.
        • 4) 해당 서블릿을 호출한다.
        • 5) 2번에서 생성한 해당 서블릿의 쓰레드가 doPost(), doGet()을 호출한다.
        • 6) 전달 받은 Response를 HTTP Response로 바꿔 웹 서버에 전달
        • 7) 쓰레드를 종료하고, httpServletRequest와 httpServletResponse 객체를 소멸 시킴.
    • WAS에 '웹 서버' 역할이 있는데 왜 굳이 WS(웹 서버)를 사용 하나요?
      • 어떤 사람들은 목적에 따라 즉, 정적/동적 데이터를 나누느게 효율적이라고 주장하나, TOMCAT5.5 이후 버전에서는 문제될 게 없다. 오히려 정적인 데이터를 처리하기 위해서 TOMCAT 앞에 또 아파치 웹 서버를 두는게 관리 부담과 불필요한 과부하만 생긴다고 생각.
    • 웹 서버를 같이 쓰는 이유
      • 하나의 웹 서버에서 다른 언어의 어플리케이션 함께 사용 할 때
      • 로드밸런싱이 필요한 경우 - 특정 서버에서 에러/과부하가 발생한 경우 다른 서버가 정상 작동
      • 보안을 강화할 경우 - 아파치에서 해킹 당해도 WAS는 정상 작동
  • 2) 서블릿 내장객체, 서블릿 객체
    • Q) : request, response가 서블릿 내장 객체라고 알고 있었는데요, 강의 내용에 따르면 request와 response는 요청마다 새로 생성되고 서블릿 객체는 요청마다 생성되지 않고 싱글톤으로 재사용한다고 알게 되었습니다.
    • 서블릿 객체: 서블릿 객체는 웹 애플리케이션을 구성하는 하나의 구성 요소로, 클라이언트의 요청을 처리하고 응답을 반환하는 역할을 합니다. 서블릿 객체는 보통 싱글톤 패턴으로 구현되어, 웹 애플리케이션에서 단 하나의 인스턴스만 존재하며 요청이 들어올 때마다 재사용됩니다. 이러한 구조로 인해 메모리 효율성과 성능이 향상됩니다.
    • 서블릿 내장 객체: 서블릿 내장 객체는 서블릿이 처리하는 요청과 응답과 관련된 정보와 기능을 제공하는 객체입니다. request와 response 객체는 이러한 내장 객체의 예입니다. 요청이 발생할 때마다 새로 생성되며, 서블릿 내부에서 사용할 수 있습니다. 이 객체들은 요청마다 독립적인 상태를 유지해야 하기 때문에 요청이 발생할 때마다 새로 생성됩니다.
  • 3) 커넥션 풀과 쓰레드 풀의 차이점?
    • 풀(Pool)이란 이미 사용할 준비가 된 자원을 메모리 위에 일정량 미리 생성해둔 자원의 집합으로 커넥션 풀은 DB와 커넥션을 맺기 위한 드라이버를 로드하고 커넥션 객체를 생성하는 등의 과정에서 발생하는 비용을 절약할 수 있고, 쓰레드 풀은 쓰레드를 미리 생성해놓음으로써 쓰레드의 생성 및 수거가 빈번하게 발생하지 않아 메모리 할당에 소모되는 비용을 절약할 수 있습니다.
    • 풀의 개념이 스레드에 적용됐는지, DB커넥션에 적용됐는지의 차이라고 보시면 될 것 같고 자세한 개념은 구글 검색등으로 별도의 학습을 하시면 좋을 것 같아요.
  • 4) 싱글톤 병목현상?
    • Q : 기존 쓰레드가 요청 1을 servlet을 사용하여 처리하고 있는 와중에 새로운 요청 2가 들어와서 새로운 쓰레드가 생성되고 servlet을 사용하려고 하면 이미 요청 1이 servlet을 사용하고 있기 때문에 사용할 수 없지 않은지 질문드립니다.
    • A : 간단하게 말씀드리자면, 스프링 컨테이너가 생성한 빈은 힙 메모리에 저장이 됩니다. 힙메모리는 어플리케이션에서 사용하는 모든 쓰레드들이 공유하는 접근 가능한 메모리인데요, 힙 레벨에서 빈 들에 제한이나 락을 걸어놓지 않기 때문에 모든 쓰레드에서 동시에 접근이 가능하다고 합니다.
    • 부차적으로 지역변수들은 stack memory에 상태가 저장되는데, stack memory들은 쓰레드별로 생기기 때문에 쓰레드 별로 다른 지역변수를 사용한다고 보시면 쉬우실 것 같습니다.