1. 외장 서버, 내장 서버

    1. 외장 서버
      1. 과거 자바로 웹 애플리케이션을 개발할 때는 먼저 톰캣과 같은 WAS를 설치
      2. 설치한 WAS에서 동작하도록 서블릿 스펙을 맞춘 코드를 작성
      3. War형식으로 빌드해서 xxx.war파일을 만듦
      4. 만들어진 war파일을 WAS에 배포하는 것이 개발 주기
    2. 내장 서버
      1. 최근 스프링부트의 경우 WAS를 라이브러리 형태로 내장
      2. 개발자는 내장 서버를 라이브러리로 가지는 프로젝트를 jar로 빌드
      3. 빌드한 jar파일을 원하는 위치에서 main() 메서드만 실행하면, WAS도 같이 실행됨
  2. Jar, War

    1. 공통적으로는 모두 java의 jar툴을 이용해서 생성된 압축(아카이브) 파일
    2. 어플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일(리소스, 속성파일 등)을 패키징 해주는 것이 주 역할
    3. Jar(Java Archive)
      1. 여러 클래스와 리소스를 묶어Jar라고 하는 압축 파일을 만들 수 있음
      2. JVM위에서 직접 실행되거나 다른 곳에서 라이브러리 형태로 제공
      3. 직접 실행하는 경우 main()메서드가 필요, MANIFAST.MF파일에 실행할 메인 메서드가 있는 클래스를 명시해야함
      4. java -jar <jar파일 이름>.jar 를 통해 실행
    4. War(Web Application Archive)
      1. 외부의 **WAS(Web Application Server)**에 배포할 때 사용하는 파일
      2. HTML, CSS 등의 파일을 포함하기 때문에 Jar에 비해 구조가 복잡한 편
      3. 구조(반드시 지켜져야함)
        1. WEB-INF
          1. classes: 실행 클래스 모음
          2. lib: 라이브러리 모음
          3. web.xml: 웹 서버 배치 설정 파일(생략 가능)
        2. index.html: 정적 리소스**(WEB-INF제외 나머지 영역은 정적 리소스 영역)**
  3. 서블릿 컨테이너 초기화

    Untitled

    1. WAS를 실행하는 시점에서는 서비스에 필요한 필터, 서블릿을 등록하고, 스프링을 사용한다면 스프링 컨테이너를 만들고, 서블릿과 스프링을 연결하는 디스패처 서블릿을 등록

    2. WAS가 제공하는 기능으로 WAS실행 시점에 이런 초기화 수행 가능(ServletContainerInitializer 인터페이스 이용)

    3. ServletContainerInitializer(인터페이스)

      1. 서블릿 컨테이너를 초기화 하는 과정에서 해당 인터페이스를 구현한 클래스의 **onStartup()**메서드를 실행해줌 → 서블릿이 초기화되는 과정에서 필요한 작업 수행

      2. @HandlesTypes

        1. ServletContainerInitializer인터페이스가 이용하는 인터페이스
        2. 스프링 내부에서 서블릿 컨테이너를 초기화하는 코드에서 @HandlesTypes(ServletContainerInitializer.class)를 작성하면 WAS가 실행되면서 어노테이션이 사용된 클래스의 onStartUp() 메서드의 인자로 해당 클래스 또는 서블릿 컨택스트 객체를 넣어줌
        3. ServletContainerInitializer인터페이스를 구현한기만 해서는 가져오지 못하고, META-INF/services/jakarta.servlet.ServletContainerInitializer파일에 (전체 경로 + 파일명)을 작성해야 인식 가능함
        4. 해당 인터페이스를 구현한 모든 클래스를 Set<Class<?>>형태로 가져오고, onStartUp()메서드를 실행시켜 가지고 있는 서블릿 컨테이너 객체를 통해 서블릿으로 등록하는 등의 작업 수행

        Untitled

      3. 서블릿 등록

        1. 서블릿 등록은 크게 어노테이션, 프로그래밍 방식으로 등록 가능
        2. @WebServlet어노테이션을 사용하면 작성한 애트리뷰트 경로로 쉽게 등록
        3. 프로그래밍 방식은 서블릿 컨테이너도 있어야 하고 어노테이션에 비하면 복잡한 방식
        4. 하지만, 코드를 이용하기 때문에 동적으로 등록할 수 있다는 장점이 있음
        5. 조건에 따라 경로, 서블릿 객체를 if문을 통해 변경할 수 있기 때문
    4. WebApplicationInitializer

      1. 스프링이 만들어둔 애플리케이션 초기화 인터페이스
      2. 스프링 컨테이너를 등록하기 위해서는 디스패처 서블릿을 등록해서 매핑에 따라서 빈을 할당해줌
      3. 보통 디스패처 서블릿을 ‘/’경로로 해서 모든 경로가 디스패처 서블릿을 타고, 빈을 사용할 수 있도록함
      4. 스프링에서는 서블릿 컨테이너, 스프링 컨테이너 초기화를 자동으로 수행하도록 함

      Untitled