서블릿이 생성되고 요청이 처리되는 전체 흐름
·
Backend/Servlet
서블릿은 언제 만들어지고, 요청은 어떻게 처리될까?톰캣을 기준으로 서버 기동 시점 → 요청 처리 시점 → 종료 시점까지서블릿이 어떻게 동작하는지를 전체 흐름으로 정리한다. 서버(톰캣) 기동 시점에 일어나는 일1) 웹 애플리케이션 로딩톰캣 서버를 기동하면, 배포된 웹 애플리케이션을 로딩한다.이 단계는 흔히 “웹앱을 올린다”라고 표현한다.이때 톰캣은 단순히 파일을 읽는 것이 아니라,해당 웹앱을 어떻게 실행할지에 대한 내부 준비 작업을 수행한다.2) 서블릿 매핑 정보 생성 (URL ↔ 서블릿)웹앱이 로딩되면 톰캣은“어떤 URL 요청이 어떤 서블릿으로 가야 하는지”에 대한매핑 테이블을 만든다.이 매핑 정보는 다음 두 가지 방식 중 하나에서 생성된다.① web.xml 방식 (전통 방식)을 읽어서 URL과 서블릿 ..
forward와 JSP 실행 흐름
·
Backend/Servlet
브라우저가 할 수 있는 일은 딱 하나브라우저의 역할은 매우 단순하다.서버에 요청을 보내고, 서버가 보내준 응답(문자들)을 화면에 그리는 것브라우저는 서버 컴퓨터 내부에 있는 파일을 직접 열 수 없다./user/updateForm.jsp 파일을 “읽어서” 여는 능력이 없다서버의 파일 시스템에 접근할 수 없다JSP, Java, DB 같은 것은 전혀 모른다브라우저가 이해할 수 있는 것은 오직 HTML, CSS, JavaScript로 이루어진 문자열뿐이다. JSP는 “파일”이지만 목적은 “프로그램”이다JSP는 파일 형태로 존재하지만, 단순한 정적 HTML 파일이 아니다.JSP 안에는 다음과 같은 것들이 들어간다.${user.name} 같은 EL 표현식 같은 JSTL 태그 같은 자바 코드(있을 수도 있다)이것들..
멀티스레드 환경에서 Servlet 사용
·
Backend/Servlet
Tomcat은 멀티스레드 서버다Tomcat은 멀티스레드 기반 서버다.즉, 여러 사용자가 동시에 요청을 보내면 Tomcat은 다음과 같이 동작한다.요청 하나당 스레드 하나를 할당한다여러 스레드가 동시에 실행된다같은 Servlet 인스턴스를 공유한다이 구조를 정확히 이해하지 못하면Servlet에서 의도하지 않은 버그가 발생한다. Servlet 인스턴스는 몇 개가 생성되는가Servlet은 요청마다 새로 생성되지 않는다.Tomcat이 시작될 때Servlet 클래스당 인스턴스 1개를 생성한다이후 모든 요청은 이 인스턴스를 재사용한다즉 구조는 다음과 같다.Servlet 인스턴스: 1개요청 처리 스레드: 여러 개여러 스레드가 같은 객체를 동시에 사용한다이 점이 멀티스레드 문제의 출발점이다. 요청이 들어왔을 때 내..
Servlet Container와 Servlet의 관계
·
Backend/Servlet
정적인 웹 페이지의 한계HTML만으로 웹 페이지를 만들면 기본적으로 정적인 페이지만 만들 수 있다.정적인 페이지란, 한 번 만들어진 내용이 사용자, 시간, 상태에 따라 바뀌지 않는 페이지를 의미한다.하지만 실제 웹 서비스에서는 다음과 같은 요구가 존재한다.사용자마다 다른 화면을 보여줘야 한다로그인 상태에 따라 다른 결과를 반환해야 한다게시판, 상품 목록처럼 데이터가 계속 바뀌어야 한다이러한 요구는 HTML만으로는 해결할 수 없다.이 한계를 극복하기 위해 등장한 것이 동적인 웹 페이지이고,자바 진영에서 동적인 웹 페이지를 만들기 위한 기술 중 하나가 Servlet이다. Servlet이란 무엇인가Servlet은 자바로 작성된 서버 쪽 프로그램이다.역할은 다음과 같다.클라이언트의 요청을 받아서요청에 포함된 ..
RequestMapping static Map은 괜찮은 이유
·
Backend/Servlet
공유해도 되는 데이터(불변/읽기 위주)냐, 공유하면 안 되는 데이터(요청마다 달라짐)냐이 차이가 안전/위험을 갈라버린다. 실습의 RequestMapping은 이런 성격이다대부분의 간단한 웹서버 실습에서 RequestMapping은 이런 구조다(예시). public class RequestMapping { private static final Map map = new HashMap(); static { map.put("/user/create", new UserCreateController()); map.put("/user/login", new LoginController()); } public static Controller getController(Str..
서블릿에서의 static
·
Backend/Servlet
서블릿은 동시에 여러 요청을 처리하는데, 그때 같은 변수(메모리)를 여러 스레드가 동시에 만지면 값이 섞인다. 그게 사고다.아래는 “서블릿 맥락”에서 감이 오게끔 정리한 설명이다. 서블릿은 요청마다 새로 만들어지지 않는다많이 착각하는게 “요청 1개 오면 서블릿 객체 1개 생성해서 처리하고 버리겠지?”대부분의 서블릿 컨테이너(톰캣)는 서블릿 인스턴스를 보통 1개만 만들어 놓고 재사용한다./hello → HelloServlet 객체 1개요청이 1만 번 와도 그 객체 1개를 계속 쓴다. 2) 동시에 요청이 오면 “스레드”가 여러 개가 된다톰캣은 동시에 여러 클라이언트 요청을 처리해야 하니까 보통 이렇게 한다.요청 A → 스레드 T1이 처리요청 B → 스레드 T2가 처리요청 C → 스레드 T3가 처리문제는 여..
서블릿 요청 흐름 : Request가 채워지는 시점과 service() 호출 위치
·
Backend/Servlet
오늘 헷갈린 지점은내 HelloServlet#doGet() 안에서는 resp만 쓰고 req는 안 썼다.그런데도 GET 요청이 잘 처리된다.그럼 req는 대체 어디서 쓰인 건가“톰캣이 만든다/전달한다” 같은 추상 얘기 말고, 코드 레벨로 어디서 쓰였는지가 궁금하다.결론부터 박는다.req는 드에서 안 써도, 이미 Tomcat/Servlet API 내부에서 최소 1번은 무조건 쓰인다.그 지점이 바로 HttpServlet#service(req, resp) 안의 req.getMethod()다.그래서 GET이면 doGet()으로 들어올 수 있고, 그 안에서 네가 req를 안 읽어도 “Hello World”만 쓰면 되니 잘 돌아간다. “req 없이도” 동작하는 이유public class HelloServlet e..