[데브코스] Servlet 기초

Updated: Categories:

W5D1 - 웹 기본지식과 Servlet 기초 사용법에 대해 알아보자

  • 알고있던 지식도 다시 한번 정리!

URI

[URI스키마]://[호스트명]:[포트번호]/[path]?[쿼리]
  • 쿼리 파라미터 : ?key=value 형식으로 값 전달하기
  • 웬만하면 상대경로 쓰기
  • URI엔 ASCII 문자만 사용하기


HTTP

  • URI를 통해 Resource를 가져와 데이터를 사용하기
  • 클라이언트 요청 -> 브라우저 -> OS자원을 사용 -> 네트워크를 타고 -> 호스트 서버로 전달
  • 정확한 정보는 MDN 공홈을 참고하자 !

특징

  • TCP/IP 기반
  • 요청/응답 + 동기형 프로토콜이다
  • Stateless - 상태를 가지지 않음

구조

image

image

image

Method

image


Web Architecture

image

  • 출처는 이곳!
  • 4 : OLTP
  • 5 : Redis 같은 메모리 기반 DB를 캐싱용으로 사용
  • 6 : 시간이 오래 걸리는 작업(압축)을 미리 저장하고 수행해주는 서버
  • 7 : 검색 전용 서버
  • 8 : 기존 서버의 서비스 로직을 MSA 구조로 나눌수도 있음
  • 9a : (firehose임) kafka 같은 데이터 전달하는 메시징 시스템
  • 9c : OLAP
  • 10 : 이미지 저장소
  • 11 : 지리적 한계를 극복하기 위한 분산 서버


Web Server & Web Application Server

Web Server

  • 정적 리소스를 제공하는 서버
  • Apache나 nginx 등이 이에 해당됨
  • 프론트엔드만을 서빙하는 서버라고 생각하면 될듯

Web Application Server(WAS)

  • 동적 컨텐츠를 제공하는 서버
  • WAS 내부에 정적 페이지 제공하는 Web Server도 포함하고, DB연동하는 Web Container도 포함
  • Web Container는 war로 빌드되어 물리적 서버인 Tomcat 등을 통해 실행됨

image


Servlet

  • 브라우저에서의 요청(http)을 받고 응답해주는 계층에서 사용
  • Web Container 안에서 동작하는 것
  • 요즘엔 Jakarta Servlet 이라고 부름

image

MVC

  • MVC 패턴이 드디어 등장 (설명은 생략)

image

Life Cycle

image

  • init : 컨테이너가 처음 실행될 때 servlet 객체는 단 한번만 만들어짐
  • service : 클라이언트에게 요청이 오면 새 스레드를 만들고 서비스 로직을 실행
  • destory : 응답 완료시 해당 스레드를 종료시킴


Spring Servlet

  • 옛날 방식 그대로~ 노가다로 서버를 구동해보자!

의존성 설정

  • 우선 pom.xml에 의존성 추가
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

Servlet 작성

  • HttpServlet을 상속받아 여러 메소드를 사용할 수 있다
public class 클래스명 extends HttpServlet {

    @Override
    public void init() throws ServletException {
        ...
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ...
    }
}
    

xml 설정

  • Servlet을 매핑시키기 위한 xml 파일을 아래처럼 만들어주자

image

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

<!--    test라는 이름의 서블릿 생성 -> TestServlet 클래스-->
    <servlet>
        <servlet-name>서블릿명</servlet-name>
        <servlet-class>매핑시킬 클래스 경로</servlet-class>
    </servlet>

<!--    모든 url에 test 서블릿을 매핑한다 -> 라우터라고 생각하면 될듯-->
    <servlet-mapping>
        <servlet-name>서블릿명</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

Tomcat 설정

  • 톰캣 홈페이지에서 다운로드 (난 9버전)
  • Intellij에서 압축 해제한 폴더 경로를 설정 (아래 참고)

image

image

  • 그리고 Deployment -> FIX 눌러주고

image

  • 아래 그림처럼 선택~

image

  • Facet 가서 xml 참조설정까지 해주면~

image

  • 설정 끝. 서버 구동해보면 잘 돌아감

@WebServlet

  • web.xml에 라우팅 설정을 하지 않고 어노테이션을 사용해 간편하게 사용가능
  • loadOnStartup : default는 -1 / 1인 경우 클라이언트 호출이 없어도 일단 Servlet init.
@WebServlet(value="/url", loadOnStartup = ??)

결론

  • 요즘엔 이런 방식으로 배포하지 않고 Embedded Tomcat을 사용한다
  • 요즘 같은 MSA 환경에선 Embedded Tomcat + Servlet 으로만 함
  • Tomcat에 war 말아서 올리는건 구식… (그래도 근-본이 중요하니 알아두자)