Servlet 예제 ( 회원 저장 / 조회 )

순수 Servlet만으로 회원 등록(form)과 저장(save) 기능을 구현한 예제다. 핵심은 PrintWriter로 자바 코드 안에서 직접 HTML 문자열을 조립해 응답하는 방식이며, 이 방식은 데이터를 다루기는 쉽지만 HTML과 로직이 섞여 코드가 길어지고 가독성·유지보수성이 떨어진다는 한계가 있다. 이 한계가 이후 템플릿 엔진(JSP 등) 도입의 동기가 된다.

실행 환경

@WebServlet 어노테이션 기반 등록 방식이 사용되어 Servlet 3.0 이상을 전제로 하며, Tomcat 등 Servlet 컨테이너 실행 환경이 필요하다. 구체적인 Servlet/Tomcat 버전은 코드상 명시되어 있지 않다.

  1. 구성
  2. 구현
  3. 정리

구성

  • 멤버 객체 구현 
    • 이름 , 나이
  • 멤버 저장
    • 메모리 저장
  • 멤버 조회
    • 전체 조회
    • 특정 id 조회

구현

  • java 클래스내부에 print 객체와 함께 동적 html을 생성한다
  • html 코드로 인해, 코드가 길어지고 가독성이 떨어진다 (유지보수의 어려움)
public class Member{
    private Long id;
    private String username;
    private int age;
    
    
    public Member(){
    }
    
    public Member(String username, int age)
    {
        this.username = username;
        this.age = age;
    }
    
    
    public int getId()
    {
        return this.id;
    }
    
    public void setId(int id)
    {
        this.id = id;
    }
    
    
    public String getUsername()
    {
         return this.username;
    }
    
    public void setUsername(String username)
    {
         this.username = username;
    }
    
    public int getAge()
    {
         return this.age;
    }
    
    public void setAge(int age)
    {
        this.age = age;
    }
    
}
 
class MemberRepository{
 
     private Map<Long, Member> store = new HashMap<>();
     private static long sequence = 0L;
     
     
     private final static MemberRepository instance = new MemberRepository();
     
     private static MemberRepository getInstance()
     {
         return instance;
     }
    
    
    private MemberRepository(){}
    
    public Member save(Member member)
    {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }
    
    public Member findById(Long id)
    {
        return store.get(id);
    }
    
    public List<Member> findAll()
    {
         return ArrayList<>(store.values());
    }
    
}
 
@WebServlet(urlPatterns="/servlet/members/new-form")
public class MemberFormServlet extends HttpServlet{
 
    @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" + "</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>"
        + "</body>"
        + "</html>" );
    }
}
 
@WebServlet(urlPatterns="/servlet/members/save")
public class MemberSaveServlet extends HttpServlet{
 
    private 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>"
        + "<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"
        + "</body>"
        + "</html>" );
    }
}

정리

  • 장점
    • 자바 코드로 되어있어, 객체 값을 가져오기가 수월하다
    • 서블릿을 통해 웹서비스의 동적 html을 만들수 있다
  • 단점
    • html을 직접 자바코드로 만들면서 반복적인 부분들이 존재한다
    • 코드의 길이가 길어지면서 가독성이 떨어진다
    • 분리되어있지 않아 유지보수의 어려움이 존재한다

단점들을 보완하고자, “템플릿 엔진”이 나오게 되었다