JSP로 회원 관리 웹 어플리케이션을 만들어 보자
JSP 라이브러리 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
//JSP 추가 시작
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:'
implementation 'javax.servlet:jstl:1.2'
//JSP 추가 끝
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
build.gradle 파일에 위와 같이 JSP 추가 시작~끝 주석줄의 코드를 추가하고, 코끼리 모양 아이콘이나 reload all gradle projects 를 실행하여 라이브러리가 추가되도록 한다.
회원 등록 폼 JSP
main/webapp/jsp/members/new-form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<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>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %> 는 jsp 문서라는 뜻으로 꼭 추가해야 한다.
- 회원 등록 폼 JSP를 보면 첫 줄을 제외하고는 완전히 HTML와 똑같다. JSP는 서버 내부에서 서블릿으로 변환되는데, 우리가 만들었던 MemberFormServlet과 거의 비슷한 모습으로 변환된다.
http://localhost:8080/jsp/members/new-form.jsp 실행 결과
회원 저장 JSP
main/webapp/jsp/members/save.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%
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</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>
- request, response는 기본적으로 사용이 가능하다. 왜냐, jsp도 결국 servlet으로 자동변환 되어 서비스로직이 그대로 호출이 되기때문에 문법상 지원한다.
- <%@ page import="hello.servlet.domain.member.MemberRepository" %> 는 자바의 import문과 같다.
- <% ~ %> 에는 자바 코드를 입력할 수 있다.
- <%= ~ %>에는 자바 코드를 출력할 수 있다.
-
회원 저장 JSP를 보면, 회원 저장 서블릿 코드와 같다. 다른 점이 있다면, HTML을 중심으로 하고, 자바 코드를 부분부분 입력해주었다. <% ~ %> 를 사용해서 HTML 중간에 자바 코드를 출력하고 있다.
http://localhost:8080/jsp/members/new-form.jsp 실행하고 정보 입력 후 전송하면 save.jsp로 넘어감!
회원 목록 JSP
main/webapp/jsp/members.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="java.util.List" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%
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>
- 회원 저장 JSP와 같이 <% ~ %> 태글 통하여 동적 정보 출력에 필요한 memberRepository를 먼저 조회하고, List에 담긴 정보를 통하여 html에 정보를 출력한다.
http://localhost:8080/jsp/members.jsp 실행 결과
서블릿과 JSP의 한계와 MVC 패턴의 등장
서블릿으로 개발할 때는 뷰(view) 화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여 지저분하고 복잡했다
JSP를 사용하면 뷰를 생성하는 HTML 작업을 깔끔히 가져오고, 동적 생성이 필요한 부분에만 자바 코드를 적용했다.
그러나 여전히 비지니스로직과 html 코드가 한 jsp파일에 혼재되어 있다는 한계점이 분명히 있다.
여기서 바로 MVC패턴이 등장하게 된다. 그래서 비지니스 로직은 서블릿 처럼 다른데서 처리하고, JSP는 목적에 맞게 HTML로 화면(view)을 그리는 일에 집중할 수 있게 되었다.
또 한편의 역사강의를 본 느낌..! mvc, mvc2 패턴에 익숙해져버린 나는 이것도 신세계같은 경험이었다. 이미 역사가 지나간 시점에서 바라보는 나로서는 위의 코드들은 무한한 역사의 투쟁같이 느껴진다. 문제를 봉착하고, 시도하고 새로운 문제를 맞이하고 거기서 또 나아가고의 반복. 어느 한계점을 극복하면 끝! 이 아니라 계속해서 나아가려는 인간의 특성상 또 다른 세계를 구축해 나가는게 위대하고 신기하게 느껴졌다. 이 정도면 개발사가 아니라 역사/인문/인지/자연과학 아닐까? 인간은 정말 대단한 존재같다. 그 와중에 나는 한없이 작게 느껴지고. 그래도 이 역사의 투쟁과 산물처럼 나도 문제를 맞이하고, 해결하고, 과도기를 맞이하고, 다시 나아가고, 새로운 세계를 끊임없이 찾아가야겠다.
@ 스프링 MVC 1편 - 백엔드 웹개발 by 김영한을 참조하고 있습니다.
'Spring > mvc' 카테고리의 다른 글
[Spring MVC 1] - MVC 프레임워크 - 프론트 컨트롤러 도입 (0) | 2022.08.16 |
---|---|
[Spring MVC 1] - MVC 패턴 (0) | 2022.08.12 |
[Spring MVC 1] - 회원 관리 웹 어플리케이션 Servlet으로 구현 (0) | 2022.08.11 |
[Spring MVC 1] - HTTP 응답 데이터 (0) | 2022.08.09 |
[Spring MVC 1] - HttpServletResponse (0) | 2022.08.09 |