"Containerless"
이 목표를 달성하기 위해서는 JAR 파일로 아카이빙해야한다. 이유는 구조적인 차이가 있다.
JAR
.class
파일WAR
.class
파일위에 JAR와 WAR에 대한 구조를 간략하게 설명했다. 차이는 "ServletContainer"이다.
ServletContainer가 많이 있지만, 대표적인 것이 "Tomcat" 이다.
Tomcat은 컴파일된 바이트코드를 실행하고 클라이언트의 HTTP 요청을 처리하는 역할을 한다.
그리고 역할을 하나 더한다.
"JSP파일 -> 서블릿" 으로 변환한다. WAR는 이제 ServletContainer에 그때그때 동적으로 컴파일하면 된다. 그에 비해 JAR는 불가능하다.
이유는 다음과 같다.
사실 넣고자 기를 썼으면 넣었을지도 모르겠다만, 애초에 SpringBoot의 철학과 다르기에 추가를 안한 것 같다.
그래도 금융권에서 개발자로 일한다면, 아마 자격요건이나 우대사항에 볼 수 있다.
제발 이제 JSP 놓아줘
JSP를 배우면 그래도 1 가지 언어로 Front / Back 을 모두 할 수 있다는 장점이 있다. 그래서 Backoffice 개발에는 적합한 기술일 수도 있다. 그래도 ㅠㅠ
JSP란, HTML 코드에 Java코드를 넣어 동적인 웹 페이지를 생성하는 도구이다.
Java 코드에 HTML 코드가 있는것보다는 HTML에 Java코드 있는 것이 낫다.
= JSP
Servlet으로 직접 HTML을 구현하면 다음과 같은 코드를 작성해야한다.
// @WebServlet 어노테이션: "/product" URL에 대한 요청을 이 서블릿으로 라우팅한다.
@WebServlet("/product")
public class ProductServlet extends HttpServlet {
// 서블릿 버전관리를 위한 고유 ID
private static final long serialVersionUID = 1L;
// HTTP Request
protected void doGet(
HttpServletRequest request,
HttpServletResponse response
) throws ServletException, IOException {
// Content-Type
response.setContentType("text/html;charset=utf-8");
// Writer 생성
PrintWriter out = response.getWriter();
ProductDAO dao = new ProductDAO();
List list = dao.listProducts();
// HTML 구성
out.print("<html><body>");
out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
out.print("<td>상품명</td><td>가격</td><td>설명</td><td>재고수량</td></tr>");
for (int i = 0; i < list.size(); i++) {
ProductVO productVO = (ProductVO) list.get(i);
String name = productVO.getName();
String price = productVO.getPrice();
String description = productVO.getDescription();
int stock = productVO.getStock();
out.print("<tr><td>" + name + "</td><td>" +
price + "</td><td>" +
description + "</td><td>" +
stock + "</td></tr>");
}
out.print("</table></body></html>");
}
}
@WebServlet
은 URL 패턴 매칭 어노테이션이다.@RequestMapping
에서 맵핑역할을 한다는 점에서는 동일하다. 하지만 @RequestMapping
은 기능이 좀더 있다.serialVersionUID
: 직렬화 역직렬화를 위한 Java식 클래스 변경 버전관리 변수이다.Java 사이사이에 HTML코드가 있다. 이런코드는 변경하기가 까다롭다. HTML만 아는 사람이 와서 코드 수정하려고 봤더니 로직을 다 알아야 하는 상황인 것이다.
JSP는 반대다. HTML 사이에 Java코드가 있다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List" %>
<%@ page import="your.package.ProductDAO" %>
<%@ page import="your.package.ProductVO" %>
<%
ProductDAO dao = new ProductDAO();
List<ProductVO> list = dao.listProducts();
%>
<html>
<body>
<table border="1">
<tr align="center" bgcolor="lightgreen">
<td>상품명</td>
<td>가격</td>
<td>설명</td>
<td>재고수량</td>
</tr>
<%
for (ProductVO productVO : list) {
String name = productVO.getName();
String price = productVO.getPrice();
String description = productVO.getDescription();
int stock = productVO.getStock();
%>
<tr>
<td><%= name %></td>
<td><%= price %></td>
<td><%= description %></td>
<td><%= stock %></td>
</tr>
<% } %>
</table>
</body>
</html>
Spring에서 JSP는 Request가 서블릿에서 HTML로 나간다고 생각하면 된다. 나갈땐 물론 Response로 나갈 것이다.
(출처: 위키백과, jsp)
return "vipList";
ViewResolver
는 해당 이름에 맞는 .jsp
파일을 찾고 렌더링한다.JSP 구현 관련 설정
JSP를 쓰기 위해서 해야하는 설정이다.
web.xml
이다.<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
vipUserList.jsp
@Controller
@RequestMapping("user)
public class HomeController {
@RequestMapping(value = "vipUserList", method = RequestMethod.GET)
public String getHome(Model model) {
return "/user/vipUserList"
}
}
servlet-context.xml
에 View Resolver를 정의한다.servlet-context.xml
에서 반환할 View(대표적인 예시가 JSP)에 대한 설명을 하기 때문이다.<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
/WEB-INF/views/home.jsp
파일이 서블릿으로 반환되어 실행된다.24.01.05 기준으로 스타트업이나 IT기업들은 JSP 사용 거의 안하는 듯 합니다.(채용 공고상 거의 없음)
그에 비해 금융권은 아직도 많이들 구하고 있다.. 그 당시에는 최신기술이고, 유행했던 기술이니까.
오래전에 구축되어 왔기에 JSP를 쓰는 이유도 있었겠지만,
개인적인 추측은 Java를 통한 보안지원이 아닐까 생각된다.