[Spring] 회원관리 웹 애플리케이션 요구 사항 및 Servlet 구현 (A.K.A 타자연습)
이번에는 회원 관리 웹 애플리케이션을 간단하게 구현 해볼 것이다.서블릿, JSP , MVC 패턴으로 차차 리팩토링 할 예정인데, 이번 포스팅에선 먼저 웹 애플리케이션 요구 사항에 대한 코드를 작성
bdisappointed.tistory.com
이전 글에서 작성했던 서블릿 형태를 JSP로 리팩토링 해보겠다.
먼저 JSP 라이브러리를 Gradle에 추가해야한다.
이후 JSP 문서는 항상 시작할 때 다음과 같은 문장을 넣어야 한다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
회원 등록 폼 JSP
//파일명 : new-form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/jsp/members/save.jsp" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
</form>
</body>
</html>
기존에 만들었던 HTML과 거의 똑같다. JSP는 내부에서 서블릿으로 변환 되기 때문에 기존 코드와 유사한 코드를 유지한다.
회원 저장 JSP
//파일명 : save.jsp
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//request, response 는 그냥 쓸 수 있다
MemberRepository memberRepository = MemberRepository.getInstance();
System.out.println("MemberSaveServlet.service");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
%>
<html>
<head>
<title>회원가입완료</title>
</head>
<body>
성공
<ul>
<li>id=<%=member.getId()%></li>
<li>id=<%=member.getUsername()%></li>
<li>id=<%=member.getAge()%></li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
해당 저장 코드부터 JSP의 진가를 확인할 수 있는데, HTML 문법과 자바 코드가 한 파일 안에 공존하고 있다 !
즉 JSP 문법 중 <% ~~ %> 안에는 자바 코드를 입력할 수 있고, <%= ~~ %> 안에는 자바 코드를 출력할 수 있다.
결론적으로 HTML 중심적이면서 중간중간 자바 코드를 추가해 사용할 수 있게 된 것이다 !
회원 목록 JSP
잠깐 API 의 좋은 설계 원칙을 떠올려보자.
리소스를 기준으로 HTTP 메서드를 통해 구분하고, 필요하면 구분 메서드를 통해 API를 설계 했었다.
이번에는 members를 모두 조회하는 JSP 코드를 만들어보자.
//파일명 : members.jsp
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
MemberRepository memberRepository = MemberRepository.getInstance();
List<Member> members = memberRepository.findAll();
%>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/index.html">메인</a>
<table>
<thead>
<th>id</th>
<th>username</th>
<th>age</th>
</thead>
<tbody>
<%
for (Member member : members) {
out.write(" <tr>");
out.write(" <td>" + member.getId() + " </td>");
out.write(" <td>" + member.getUsername() + " </td>");
out.write(" <td>" + member.getAge() + " </td>");
out.write(" </tr>");
}
%>
</tbody>
</table>
</body>
</html>
회원 리포지토리를 조회하고, 결과를 List에 담아 for문까지 코드 내부에서 사용할 수 있게 되었다.
참고로 이전 HTML과 결과는 완전 동일하다.
서블릿과 JSP의 한계
처음 서블릿으로 구현할 때는 코드를 작성하기가 참 까다롭고, 코드의 가독성도 최악이었다.(또한 오타가 하나라도 나면 오류 찾기 힘듦)
그래서 JSP를 도입하여 뷰를 생성하는 HTML 작업을 간소화 하고 중간에 동적으로 변하는 부분을 자바 코드로 처리하여 좀 더 나은 코드를 작성해보았다.
서블릿의 한계를 해결하기 위해 JSP를 도입했지만, 위 save.jsp 처럼 HTML 절반, 자바 코드 절반이 적혀 있는 걸 보면 JSP가 너무 많은 역할을 가지고 있는 것을 볼 수 있다.
또한, 리포지토리, 자바 코드등 다양한 중요 코드가 노출 될 수도 있다는 문제점이 존재한다.
우리는 JSP의 부담을 최대한 줄이기 위해 JSP 는 화면(뷰)를 그리는데만 집중시키도록 하고, 중요한 비즈니스 로직들은 서블릿처럼 다른 곳에서 처리하도록 구분해주는 것이 좋다. (이래서 등장한 MVC 패턴)
다음 포스팅부턴 JSP의 역할과 부담을 차차 줄여보자 !
'Spring > MVC' 카테고리의 다른 글
[Spring] 서블릿과 JSP로 MVC 흉내내기 , 그리고 한계점 (0) | 2025.06.22 |
---|---|
[Spring] MVC 패턴의 개요 - JSP는 만능이지만 만능이 아님 (1) | 2025.06.22 |
[Spring] 회원관리 웹 애플리케이션 요구 사항 및 Servlet 구현 (A.K.A 타자연습) (0) | 2025.06.21 |
[Spring] HTTP Response 데이터 처리하기 (0) | 2025.06.21 |
[Spring] HttpServletResponse와 제공 메서드 (0) | 2025.06.21 |