웹서버와 WAS, Servlet과 JSP

Seung jun Cha·2022년 10월 23일
0

1. 웹서버와 WAS

1-1 웹서버

  • 클라이언트로부터 http 요청을 받아 정척 페이지를 제공하는 프로그램
    • WAS를 거치지 않고 정적 페이지를 제공하여 WAS의 부하 감소
    • 동적 페이지 제공을 위한 요청을 WAS에 전달하고 WAS가 처리한 결과를 클라이언트에게 전달
    • 웹서버에는 Apache Server, Nginx, IIS 등이 있다

1-2 WAS(Web Application Server)

  • 동적 처리를 하기 위한 서버로 웹 컨테이너 또는 서블릿 컨테이너라고도불린다. 내부에 JSP와 서블릿이 존재하며 구동 환경을 제공한다. 가장 많이 사용되는 것이 톰캣 이다. 비즈니스 로직실행, 트랜잭션 처리, 데이터베이스 연결, 객체의 생성, 호출, 관리는 모두 서블릿 컨테이너가 담당한다.


1. 기능을 분리하여 서버의 부하를 방지
2. 물리적으로 분리하여 보안 강화 : 암복호화 처리에 웹서버를 사용하여 보안강화
3. 여러 대의 WAS의 연결이 가능하여 특정 서버에서 장애가 발생해도 사용자가 문제를 느끼지 못하고 서비스를 계속 이용할 수 있음
결론적으로 , 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성을 위해 Web Server와 WAS를 분리한다.

2. Servlet와 JSP

  • 서블릿과 JSP는 자바를 이용하여 웹페이지를 동적으로 처리하는 역할을 하며, 기능이 동일하고 내부에서 무슨 역할을 하느냐의 차이만 있다.

  • 서블릿은 자바 코드를 이용해서 HTML 문자열을 만들어내고 JSP는 HTML을 그대로 이용한다. 하지만 JSP의 HTML코드 역시 서블릿 코드로 변환되어 실행되기 때문에 서블릿과 처리방식은 동일하다.

2-1 servlet

  • 서버에서 동적으로 request와 response를 처리할 수 있는 API들을 정의한 것으로 서블릿으로 만들기 위해서는 httpServlet을 무조건 상속 받아야한다.
    httpServlet을 상속받은 클래스는 WAS 내부에서 자동으로 서블릿객체를 생성하고 관리하기 때문에 개발자가 생명주기를 신경 쓰지 않아도 된다.

  • 서블릿은 내부의 init(), service(), detroy() 그리고 doGet(), doPost() 메서드를 통해 클라이언트의 요청에 맞는 데이터를 검색하여 반환한다. 이들은 서블릿 API로 자바코드 안에 HTML 코드를 삽입하여 동적인 처리를 한다.

  1. init() :서블릿 객체가 생성될 때 한번만 호출되는 메소드로 서블릿이 동작하기 전에 수행해야하는 일을 처리할 수 있다. 서블릿은 클라이언트가 브라우저에서 요청을 하면 라이프 사이클(Init())에 따라 서블릿이 생성된다.

  2. service() : 클라이언트가 요청이 있을 때마다 호출되는 메소드

  3. destroy() : 서블릿 서비스의 종료 및 재시작 또는 서블릿 코드가 수정이 될 때 호출되는 메소드

  4. doGet() : 클라이언트 요청시 <form method=”get”> 일 때 호출되는 메소드

  5. doPost() : 클라이언트 요청시 <form method=”post”> 일 때 호출되는 메소드

@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {

    private final MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response{
        final String username = request.getParameter("username");
        final int age = Integer.parseInt(request.getParameter("age"));
        final Member member = new Member(username, age);
        memberRepository.save(member);

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        final PrintWriter printWriter = response.getWriter();
        
        printWriter.write("<html>\n" + // html코드 삽입
            "<head>\n" +
            " <meta charset=\"UTF-8\">\n" +
            "</head>\n" +
            "<body>\n" +
            "성공\n" +
            "<ul>\n" +
            " <li>id=" + member.getId() + "</li>\n" +
            " <li>username=" + member.getUsername() + "</li>\n" +
            " <li>age=" + member.getAge() + "</li>\n" +
            "</ul>\n" +
            "<a href=\"/index.html\">메인</a>\n" +
            "</body>\n" +
            "</html>");
    }
}

2-2 JSP

  • 서블릿에서는 동적인 웹페이지 처리를 위해 프로그래밍 로직과 HTML 마크업을 섞어 작성해야 했기 때문에 가독성이 떨어지고 유지보수가 어려웠습니다. 또한, 비즈니스 로직과 프레젠테이션 로직의 분리가 어려웠습니다.
    JSP에서는 자바 코드와 HTML 코드를 분리하여 동적인 웹 페이지를 더 쉽게 생성하고 관리할 수 있는 방식을 제공한다. JSP도 서블릿으로 컴파일 시 서블릿으로 변환되어 서비스됩니다
  1. request : 사용자 요청에 대한 정보를 처리하기 위한 객체 (key - value 형태로 저장)
    ex) request.getParameter(가져올 파라미터 이름);
    <input type="text" name="id"> 라면 id를 입력

  2. response : 서버의 응답 정보를 처리하기 위한 객체

  3. session : 웹에서 클라이언트의 정보를 보관해 1회성으로 연결, 종료되는 http의 단점을 보완하고 서버와의 연결을 유지시켜 줌
    클라이언트의 정보를 보관

<%@ page import="hello.servlet.basic.domain.member.Member" %>
<%@ page import="hello.servlet.basic.domain.member.MemberRepository" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%  // 자바코드 삽입
    final MemberRepository memberRepository = MemberRepository.getInstance();
    final String username = request.getParameter("username");
    final int age = Integer.parseInt(request.getParameter("age"));
    final Member member = new Member(username, age);
    memberRepository.save(member);
%>
<html>
<head>
    <title>Title</title>
</head>
<body>
성공
<ul>
    <li>id=<%=member.getId()%>
    </li>
    <li>username=<%=member.getUsername()%>
    </li>
    <li>age=<%=member.getAge()%>
    </li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>

3. Java Beans

  • 자바에서 클래스라고 부르는 것을 JSP에서는 자바 빈즈라고 부른다. Model 처럼 데이터를 담아 사용, 전달하는 기능을 하며 HTML코드와 JAVA 코드를 분리하기 위해 사용한다.

  • 많은 파라미터들을 빈즈에 담아 사용/전달할 수 있고, 하나의 jsp가 아닌 여러 jsp에서 재사용될 수 있다

  • 클라이언트의 입력값을 세팅하는 과정

  1. Beans의 선언 : <jsp:useBean id="변수명" class="빈의 경로.빈이름"> 를하면 디폴트 생성자를 호출해서 빈을 생성

  2. 값 세팅 : <jsp:setProperty name=jsp:useBean id의 이름 property=""/> : 빈이 가지고 있는 필드값들을 자동으로 세팅
    (빈 클래스의 변수명과 jsp의 파라미터 명과 동일하면 자동으로 값을 세팅해준다)
    자바빈즈의 타입은 기본적으로 클래스로 지정이 되는데 부모클래스로 지정하려면 타입을 따로 설정해줘야함
    simple.setname(request.getParameter("name)); -> property="
    "
    (자바 빈의 값들을 일괄적으로 초기화)
    과정 : request -> response -> JavaBeans에 값세팅

-참고
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
https://steady-coding.tistory.com/463

0개의 댓글