JSP를 사용하려면 먼저 다음 라이브러리의 추가가 필요하다
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '2.7.11'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' // -> 요거랑
implementation 'javax.servlet:jstl' // -> 요거
}
tasks.named('test') {
useJUnitPlatform()
}
다음으로 JSP 파일을 작성하도록 하겠다.
<%--
Created by IntelliJ IDEA.
User: yunsik
Date: 2023/05/20
Time: 2:55 PM
To change this template use File | Settings | File Templates.
--%>
<%@ 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임을 명시하는 것이다.
이때 주의할 점은, form의 전송을 눌렀을 때 save.jsp 안에 있는 save 로직이 호출된다는 점이다.
MemberSaveServlet이 동작하는것이 아니다!
JSP폼을 보면 첫줄 빼고 거의 똑같은데, JSP는 사실상 서버 내부에서 서블릿으로 변환되는데 이렇게되면 MemberFormServlet과 거의 비슷하게 동작하게 된다.
<%--
Created by IntelliJ IDEA.
User: yunsik
Date: 2023/05/20
Time: 2:57 PM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// request, response 사용 가능
MemberRepository memberRepository = MemberRepository.getInstance();
System.out.println("save.jsp");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);
%>
<html>
<head>
<meta charset="UTF-8">
<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>
다음은 save.jsp이다
위 new-form.jsp와 동일하게 맨 상단에
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
코드가 들어가있는데 추가로 Member 객체와 MemberRepository 객체에 의존하기 때문에 다음 두줄의 코드가 추가로 들어간다.
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// request, response 사용 가능
MemberRepository memberRepository = MemberRepository.getInstance();
System.out.println("save.jsp");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);
%>
회원 목록.jsp
<%--
Created by IntelliJ IDEA.
User: yunsik
Date: 2023/05/20
Time: 3:09 PM
To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.util.List" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
MemberRepository memberRepository = MemberRepository.getInstance();
List<Member> members = memberRepository.findAll();
%>
<html>
<head>
<meta charset="UTF-8">
<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>
위 코드들을 보면 알겠지만 View화면을 위해 HTML을 만드는 작업에 자바 코드가 섞여있다.
이게 프로젝트가 작아서 지금 이정도지, 프로젝트 규모가 커지면 jsp 하나당 몇만줄도 나올 수 있다(리팩터링이 힘들다!)
JSP는 HTML단, 뷰를 생성하는 부분을 깔끔하게 가져가고 동적 구현이 필요한 부분만 자바 코드를 적용했는데
JSP를 보면 상위 절반은 비즈니스 로직이고 나머지 절반만 뷰에 해당한다.
JSP가 너무 많은 역할을 하고 있다.
-> 수정 중 둘 중 하나를 잘못 건드릴 수 있다
따라서 이런 중복 역할을 분리하기 위해 MVC 패턴이 등장한다.
'스프링 공부 (인프런 김영한 선생님) > 스프링 MVC 1편' 카테고리의 다른 글
[스프링 웹 MVC 1편] 10. MVC 패턴 - 한계 (0) | 2023.05.22 |
---|---|
[스프링 웹 MVC 1편] 9. MVC 패턴 - 개요 (0) | 2023.05.22 |
[스프링 웹 MVC 1편] 7. 서블릿 구현 (0) | 2023.05.21 |
[스프링 웹 MVC 1편] 6. HTTPServletResponse - 기본 사용법 (0) | 2023.05.20 |
[스프링 웹 MVC 1편] 6. HTTP 요청 데이터 (0) | 2023.05.20 |