티스토리 뷰

Servlet만을 사용해서 회원 관리 구현

  • 요청과 응답을 서블릿을 이용해서 처리할 수 있다. 이를 이용해서 구현해본다.
  • 서블릿으로 요청 메시지, 응답 메시지, 조회 결과 등을 구현한다.
  • 모든 요청/응답 HTTP 메시지의 Header 정보 및 Body 값을 자바 코드로 세팅해줘야 한다.

 

회원 저장 요청 FORM 서블릿

저장한 회원의 정보를 받는 HTML FORM을 만들어야 한다. 이를 위한 서블릿을 생성한다.

  • HTML로 POST 형식의 Form을 만들 것이므로 ContentType은 text/html 로 하고 인코딩은 utf-8로 한다.
  • Form은 HTML 코드를 문자열로 생성한다.
@WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form")
public class MemberFormServlet extends HttpServlet {

    private final MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter w = response.getWriter();
        w.write("<!DOCTYPE html>\n" +
                "<html>\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <title>Title</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "<form action=\"/servlet/members/save\" method=\"post\">\n" +
                "    username: <input type=\"text\" name=\"username\" />\n" +
                "    age:      <input type=\"text\" name=\"age\" />\n" +
                " <button type=\"submit\">전송</button>\n" + "</form>\n" +
                "</body>\n" +
                "</html>\n");
    }
}

HTML 코드가 정상적으로 렌더링 되어서 화면에 나타난 것을 볼 수 있다.

전송을 누르면 form은 HTTP POST 프로토콜로 전송된다. 목적지는 "/servelt/members/save"이고, 작성한 값이 key-value쌍으로 전달된다.

요청 Form 작성

회원 저장 서블릿

  • 저장 요청 Form을 보냈으니 이를 받고 처리할 서블릿을 만든다.
  • 보낸 데이터를 가지고 저장한 회원 객체를 완성하고 이를 레포지토리에 저장한다.
  • 저장 결과에 따라 적절한 응답 메시지를 보낸다.
  • 응답 메시지에 저장한 객체의 정보를 보낸다.
@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) throws ServletException, IOException {
        
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter w = response.getWriter();
        w.write("<html>\n" +
                "<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>");
    }
}

 

요청이 정상적으로 왔고, 해당 요청에서 값을 취해서 멤버 객체를 만들고 이를 저장공간에 저장 한 후 응답을 보낸 것을 확인할 수 있다.

 

전체 회원 조회 서블릿

  • 회원 저장 요청을 보내고, 저장을 했으면 이제 조회를 하는 로직을 구현해보자.
  • 응답을 위한 HTTP 메시지를 생성한다. 이때 HTML 코드를 문자열로 짜주면 된다. Content-Type을 text/html로 하면 브라우저가 알아서 HTML 코드로 인식하고 렌더링해서 보여주게 된다.
@WebServlet(name = "memberListServlet", urlPatterns = "/servlet/members/list")
public class MemberListServlet extends HttpServlet {

    private final MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Member> all = memberRepository.findAll();

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter w = response.getWriter();
        w.write("<html>");
        w.write("<head>");
        w.write("    <meta charset=\"UTF-8\">");
        w.write("    <title>Title</title>");
        w.write("</head>");
        w.write("<body>");
        w.write("<a href=\"/index.html\">메인</a>");
        w.write("<table>");
        w.write("    <thead>");
        w.write("    <th>id</th>");
        w.write("    <th>username</th>");
        w.write("    <th>age</th>");
        w.write("    </thead>");
        w.write("    <tbody>");
        for (Member member : all) {
            w.write("    <tr>");
            w.write("       <td > " + member.getId() + " </td> ");
            w.write("       <td > " + member.getUsername() + " </td> ");
            w.write("       <td > " + member.getAge() + " </td> ");
            w.write("    </tr>");
        }
        w.write("    </tbody>");
        w.write("</table>");
        w.write("</body>");
        w.write("</html>");
    }
}

모든 회원 목록을 조회하고 이를 HTML 코드로 추가해준다.

이렇게 목록이 조회되고 응답 받은 HTML 코드가 렌더링 되어 화면에 나오는 것을 볼 수 있다.

 

정리

서블릿을 이용하면 응답/요청에 대해 처리를 할 수 있다는 것을 알 수 있었지만 HTML 코드 등을 작성함에 있어 오타, 자동완성 미지원 등 불편한 사항이 매우 많다는것을 알 수 있었다. 또한 화면을 보여주기 위한 코드가 로직을 담당하는 서블릿에 함께 존재하므로 잦은 변경이 불가피하다. 

이를 고치기 위해 HTML 코드 작성이 가능하고 HTML 코드에 Java 코드를 작성할 수 있는 JSP, thymeleaf 등 의 기술이 나오게 됐다.

반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday