JSP, Java의 프론트엔드 진출

Uno·2024년 1월 5일
1

java

목록 보기
1/2
post-thumbnail

SpringBoot은 왜 JSP를 지원하지 않는 것인가.

"Containerless"
이 목표를 달성하기 위해서는 JAR 파일로 아카이빙해야한다. 이유는 구조적인 차이가 있다.

JAR

  • ServletContainer
  • .class 파일
  • Resource
  • 메타데이터

WAR

  • .class 파일
  • Resource
  • 메타데이터

위에 JAR와 WAR에 대한 구조를 간략하게 설명했다. 차이는 "ServletContainer"이다.
ServletContainer가 많이 있지만, 대표적인 것이 "Tomcat" 이다.
Tomcat은 컴파일된 바이트코드를 실행하고 클라이언트의 HTTP 요청을 처리하는 역할을 한다.

그리고 역할을 하나 더한다.
"JSP파일 -> 서블릿" 으로 변환한다. WAR는 이제 ServletContainer에 그때그때 동적으로 컴파일하면 된다. 그에 비해 JAR는 불가능하다.

이유는 다음과 같다.

  • 동적 리소스 처리 기능이 없음: JAR파일 자체에 동적 리소스 처리할 수 있는 기능자체가 없다.
  • 리소스 접근의 복잡성: JAR는 리소스 접근이 기존 파일 시스템과 다르다. 그래서 어렵다.
  • 성능 및 개발 효율성: JSP을 처리할라고 뭔짓을 하다보면, JSP 파일만 변경되어도 JAR파일 전체를 재빌드 해야한다. 그러니까 JSP쓰지 말자고 SpringBoot가 뺏다.

사실 넣고자 기를 썼으면 넣었을지도 모르겠다만, 애초에 SpringBoot의 철학과 다르기에 추가를 안한 것 같다.

  • 기본설정으로 잘써먹고 싶은데, JSP쓸라면 설정할 것들이 많아짐. 런타임에 갑자기 처리해야할 양이 늘어나버리니까
  • 마이크로 서비스나 독립적인 서비스를 하고 싶은데, 자꾸 View를 추가하려고하니까 너무 거대해짐

그래도 금융권에서 개발자로 일한다면, 아마 자격요건이나 우대사항에 볼 수 있다.
제발 이제 JSP 놓아줘

JSP를 배우면 그래도 1 가지 언어로 Front / Back 을 모두 할 수 있다는 장점이 있다. 그래서 Backoffice 개발에는 적합한 기술일 수도 있다. 그래도 ㅠㅠ

JSP(Java Server Page)

JSP란, HTML 코드에 Java코드를 넣어 동적인 웹 페이지를 생성하는 도구이다.

Java 코드에 HTML 코드가 있는것보다는 HTML에 Java코드 있는 것이 낫다.
= JSP

과거 Servlet 시대에서 View 구현하기

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>");
	}
}
  • Java EE의 서블릿 API인 @WebServlet 은 URL 패턴 매칭 어노테이션이다.
    = 라우팅
  • Spring에서 @RequestMapping 에서 맵핑역할을 한다는 점에서는 동일하다. 하지만 @RequestMapping은 기능이 좀더 있다.
  • serialVersionUID: 직렬화 역직렬화를 위한 Java식 클래스 변경 버전관리 변수이다.
    - 자세한 설명은 좋은 블로그글에게...  [완벽해설] serialVersionUID에 대한 정확한 설명

Java 사이사이에 HTML코드가 있다. 이런코드는 변경하기가 까다롭다. HTML만 아는 사람이 와서 코드 수정하려고 봤더니 로직을 다 알아야 하는 상황인 것이다.

JSP: HTML 에 Java 곁들이기

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>
  • HTML과 Java가 완벽히 분리된 것은 아니지만, 그래도 명확히 코드가 정리되긴 했다.(이전보다)
  • 지금 코드는 비즈니스 로직이 없어서 다행이지만,GUI 코딩을 하다보면 적더라도 로직이 포함되기 마련이다. 그래서 View를 FrontFramework로 분리해서 구현하는 것이 권장되는 것이다.

Spring MVC에서 JSP 동작 방식

Spring에서 JSP는 Request가 서블릿에서 HTML로 나간다고 생각하면 된다. 나갈땐 물론 Response로 나갈 것이다.

(출처: 위키백과, jsp)

  1. 클라이언트의 HTTP 요청이 들어온다.
  2. 그 요청은 DispatchServlet에 전달된다.
  3. DispatchServlet은 맵핑되어 있어서 해당 요청에 맞는 Controller로 전달한다(bean)
  4. Controller에서 맵핑된 메서드에 전달되고 그 메서드에서 View의 이름을 리턴한다.
    • ex) return "vipList";
  5. ViewResolver 는 해당 이름에 맞는 .jsp 파일을 찾고 렌더링한다.

JSP 구현 관련 설정

JSP를 쓰기 위해서 해야하는 설정이다.

  1. DispatcherServlet에 URL을 매핑한다
  • Request에 맞게 설정이 되어 있는 파일이 web.xml이다.
  • dispatcher라는 곳에서 frontController역할을 하고 있기에 모든 요청을 처리해준다.
  • 이 때, 아래와 같이 작성해주면 된다.
    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>
  1. 요청에 맞는 Controller와 JSP를 맵핑한다.
  • 요청에 맞게 세부 경로가 설정된다. 이는 Spring에게 맡기기에 어노테이션 문법이 있다.
    (@RequestMapping)
    • 그리고 "String" 을 리턴하고 있는데, 이것이 jsp파일의 이름이 된다. 그 파일과 맵핑되는 것이다.
      - jsp파일명: vipUserList.jsp
@Controller
@RequestMapping("user)
public class HomeController {
	@RequestMapping(value = "vipUserList", method = RequestMethod.GET)
	public String getHome(Model model) {
		return "/user/vipUserList"
	}
}
  1. 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를 통한 보안지원이 아닐까 생각된다.

profile
iOS & Flutter

0개의 댓글