티스토리 뷰

Java

[Java] Java Web Programming 원리

Jane Kwon 2021. 2. 10. 13:17
반응형

 

웹 브라우저 웹 서버
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의 동작 원리는 다음과 같다.

  1. 클라이언트에서 특정 URL 을 클릭하면 HTTP request 를 servlet 컨테이너로 전송
  2. HTTP request 를 전달받은 servlet 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성
  3. web.xml 이 클라이언트에서 요청한 URL 을 분석하여 어느 servlet 에 대한 요청인지 탐색
  4. 해당 servlet 에서 service 메소드를 호출한 후 client 의 요청 방식에 따라 GET 방식은 doGet 메소드를,
    POST 방식은 doPost 메소드 등을 호출
  5. doGet 혹은 doPost 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 response 를 전달
  6. 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) 의 역할은 다음과 같다.

  1. 웹 서버와의 통신 지원
    - servlet 과 웹 서버가 쉽게 통신할 수 있도록 해준다.
       소켓기능들을 API 로 제공하여 복잡한 과정을 생략하여,
       개발자가 비즈니스 로직에만 집중할 수 있도록 해준다.
  2. servler lifecycle 관리
    - servlet container 의 탄생과 죽음을 관리한다.
       servlet 클래스를 로딩하여 인스턴스화하고 초기화 메소드를 호출하고,
       요청이 들어오면 적절한 servlet 메소드를 호출한다.
  3. 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)

 

 

 

 

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함