티스토리 뷰
웹 브라우저 | 웹 서버 |
http 프로토콜로 request 하는 클라이언트용 애플리케이션 | http 프로토콜로 request 된 답을 html 로 response 해주는 서버용 app |
client 에서 특정 URL 로 request 를 보내면 server 에서 해당 request 에 적절한 html 로 response 해주며,
그렇게 response 받은 html 을 client 브라우저에서 파싱 후 UI 로 디스플레이 해준다.
여기서 URL 이란 IP, Protocol, Port 로 구성되어 있는데 예를 들어 아래와 같은 URL 이 있다고 했을 때
- http:// : 웹의 디폴트 프로토콜
- www.daum.net : 아이피 주소
- :80 : 포트
- /index.html : URI
포트까지가 디폴트이며, 그 뒤에 붙은 나머지가 URI 이다.
(참고 : prideparrot.com/blog/archive/2012/3/creating_a_rest_service_using_asp_net_web_api)
자바 웹 애플리케이션의 폴더 구조
- src 폴더 (개발자가 작성한 java 코드 저장) - WebContent 폴더 (deploy 할 때 해당 디렉터리 전체가 .war 로 묶여서 전송됨) - WEB-INF 폴더 (반드시 모든 웹 애플리케이션이 공통을 가져야 하는 디렉터리) - web.xml 파일 (application 에 대한 정보 파일로 servlet 3.0 을 기준으로 어노테이션 사용이 가능) - lib 폴더 (jar 로 압축된 각종 라이브러리 파일 저장) - classes 폴더 (작성한 java 파일들이 컴파일되어 .class 로 저장) - 각종 폴더 및 이미지 등 |
Servlet
controller 와 같이 http 통신을 기반으로 하는 클래스를 살펴보면
어노테이션 기반으로든 혹은 매개변수로든 servlet 클래스가 활용된다.
servlet 은 자바 웹 애플리케이션의 동적인 처리를 담당하는데,
client 의 request 를 처리하고 처리 결과를 response 해주는 역할을 한다.
servlet의 동작 원리는 다음과 같다.
- 클라이언트에서 특정 URL 을 클릭하면 HTTP request 를 servlet 컨테이너로 전송
- HTTP request 를 전달받은 servlet 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성
- web.xml 이 클라이언트에서 요청한 URL 을 분석하여 어느 servlet 에 대한 요청인지 탐색
- 해당 servlet 에서 service 메소드를 호출한 후 client 의 요청 방식에 따라 GET 방식은 doGet 메소드를,
POST 방식은 doPost 메소드 등을 호출 - doGet 혹은 doPost 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 response 를 전달
- response 가 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸
그럼 servlet container 란? servlet을 관리해주는 컨테이너로
client 의 request 를 받아서 응답할 수 있도록 웹 서버와 소켓을 만들어 통신한다.
servlet container 에는 예를 들어 Apache Tomcat 이 있다.
여기서 Apache Tomcat 은 Apache Server 와는 다르게 페이지를 동적으로 만들어주는 역할을 수행한다.
Web Server 는 client 에서 URI 를 받아 경로와 일치하는 file contents 를 반환해준다.
이 때 항상 동일한 페이지를 반환해주며 예를 들어 html, css, javascript, image 파일 등과 같이
파일시스템에 저장되어 있는 정적인 콘텐츠들을 말한다.
WAS 는 client 에서 받은 파라미터 값에 따라 다른 동적인 contents 를 반환해준다.
즉, WAS 위에서 돌아가는 servlet 에 의해 만들어진 결과물을 response 해준다.
결론적으로 WAS 에는 Web Server 와 Web Container 두 가지 역할이 있는데
Web Server 가 정적인 콘텐츠를 제공하고 동적인 콘텐츠 제공을 위해 요청을 전달하면
Web Container 에서 실행되는 servlet 에서 해당 request 에 따른 response 를 반환해주고,
Web Server 는 그 결과를 client 에게 전달한다.
다시 servlet 으로 돌아와, servlet container(web container) 의 역할은 다음과 같다.
- 웹 서버와의 통신 지원
- servlet 과 웹 서버가 쉽게 통신할 수 있도록 해준다.
소켓기능들을 API 로 제공하여 복잡한 과정을 생략하여,
개발자가 비즈니스 로직에만 집중할 수 있도록 해준다. - servler lifecycle 관리
- servlet container 의 탄생과 죽음을 관리한다.
servlet 클래스를 로딩하여 인스턴스화하고 초기화 메소드를 호출하고,
요청이 들어오면 적절한 servlet 메소드를 호출한다. - multi thread 지원 및 관리
- servlet container 는 요청이 들어올 때마다 새로운 자바 스레드를 하나 생성하는데
HTTP 서비스 메소드를 실행한 후 스레드는 자동으로 사망한다.
servlet 은 웹 서버에 request 하고 response 받는 추상 클래스 HttpServlet 에서 상속받은 특정 메소드를 재정의하여 사용한다.
public class ServletLifecycle extends HttpServlet {
public void init(){
System.out.println("init()");
}
public void service(HttpServletRequest request, HttpServletResponse response)
throw ServletException, IOException{
System.out.println("service()");
}
public void destroy(){
System.out.println("destroy()");
}
}
- init()
- client 최초 request 시 한 번 호출되는 메소드로 servlet 이 메모리에 로드될 때 실행 - service()
- client request 시마다 호출되는 메소드로 client request 를 처리
(브라우저를 새로고침 하거나 새로운 브라우저에서 접속하면 계속 호출됨) - destroy()
- web application 이 shutdown 시 호출되는 메소드 (리소스가 수정되면 호출됨)
필요에 따라 필요한 메소드만 오버라이딩하여 사용 가능하다.
public class DoGetAndDoPost extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throw ServletException, IOException{
System.out.println("doGet()");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throw ServletException, IOException{
System.out.println("doPost()");
}
}
- HttpServletRequest 주요 메소드
- request.getCookies() : 쿠키 정보
- request.getSession() : 세션 정보
- request.getAttribute("속성명") : request 속성 값 get
- request.setAttribute("속성명", "속성값") : request 속성 값 set
- request.getParameter("파라미터명") : HTTP request 이 파라미터 값
- HttpServletResponse 주요 메소드
- response.addCookies("쿠키값") : 쿠키 추가 및 수정
- response.getStatus() : 상태 값
- response.SendRedirect("페이지 파일명") : 페이지 이동
- response.getWriter() : write 하기 위한 메소드
web container 의 역할 중 web.xml 은 클라이언트에서 요청한 URL 을 분석하여
어느 servlet 에 대한 요청인지 탐색한다고 했다.
아래와 같이 web.xml 에서는 설정과 매핑이 이루어진다.
<web-app>
<!-- aliases 설정 -->
<servlet>
<servlet-name>ServletLifecycle</servlet-name>
<servlet-class>servletPackage.ServletLifecycle</servlet-class>
</servlet>
<!-- 매핑 -->
<servlet-mapping>
<servlet-name>ServletLifecycle</servlet-name>
<url-pattern>/ServletLifecycle</url-pattern>
</servlet-mapping>
<!-- aliases 설정 -->
<servlet>
<servlet-name>DoGetAndDoPost</servlet-name>
<servlet-class>servletPackage.DoGetAndDoPost</servlet-class>
</servlet>
<!-- 매핑 -->
<servlet-mapping>
<servlet-name>DoGetAndDoPost</servlet-name>
<url-pattern>/DoGetAndDoPost</url-pattern>
</servlet-mapping>
</web-app>
(참고 : medium.com/@wminikuma/java-servlet-dc81ab09139c)
'Java' 카테고리의 다른 글
[Java] 정규표현식 Pattern, Matcher (0) | 2021.02.10 |
---|---|
[Java] Object의 Field 값 얻는 방법 (0) | 2021.02.10 |
[Java] URI 한글 인코딩 이슈 (0) | 2021.02.10 |
[Java] Redirecting HTTP to HTTPS in Spring Boot (0) | 2021.02.10 |
[Java] Model 2 Web Architecture (0) | 2021.02.10 |