티스토리 뷰
What is Servlet and JSP ?
스프링 MVC패턴을 공부하기 위해서 서블릿과 JSP의 이해는 필수적이다. 스프링이 탄생한 배경의 이유 중 하나로 서블릿과 JSP가 관련되어있다. HTTP 통신 기반의 클래스를 살펴보면 어노테이션 기반으로든, 파라미터로든 서블릿 클래스가 활용된다는 것을 알 수 잇다. 서블릿은 클래스 내부에 직접 HTML 코드를 작성하여 요청에 대한 응답한다.
HTML을 코딩하기 너무 어렵고 불편해서 HTML 내부에 Java코드를 삽입하는 형식이 JSP이다. 다시 말해 서블릿의 단점을 보완하고자 만든 서블릿 기반의 스크립트 기술이다. 서블릿을 이용하게 되면 웹프로그래밍을 할 수 있지만 자바에 대한 지식이 필요하며 화면 인터페이스 구현에 너무 많은 코드를 필요로 하는 등 비효율적인 측면들이 있다. 때문에 서블릿을 작성하지 않고도 간편하게 웹프로그래밍을 구현하게 만든 기술이 JSP(Java Server Pages)이다.
서블릿은 JSP와 비슷한 점이 있지만, 서블릿은 자바 코드 안에 HTML을 포함하고 있는 반면, JSP는 HTML 문서 안에 Java 코드를 포함하고 있다는 차이점이 있다.
서블릿
서블릿은 웹 프로그래밍에서 클라이언트 요청을 처리하고 처리 결과를 클라이언트에 전송하는 기술이다.
즉, 자바를 이용해서 웹을 만들기 위해 필요한 기술이다.
서블릿의 특징은 다음과 같다
- 클라이언트 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
- html을 사용해서 요청에 응답
- HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpSevlet 클래스를 상속받는다
- HTML 변경 시 서블릿을 재 컴파일 해야한다
간단하게 서블릿을 사용하여 회원 객체를 저장하는 코드를 살펴보자.
@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
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);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
"</head>\n" +
"<body>\n" +
"성공\n" +
"<ul>\n" +
" <li>id="+member.getId()+"</li>\n" +
" <li>username="+member.getUsername()+"</li>\n" +
" <li>age="+member.getAge()+"</li>\n" +
"</ul>\n" +
"<a href=\"/index.html\">메인</a>\n" +
"</body>\n" +
"</html>");
}
}
기본적으로 HttpServlet 클래스를 상속받고 있으면서 클래스 내부에 직접 HTML 코드를 작성하여 요청에 대한 응답을 보내준다. 굉장히 간단한 서비스의 로직이라 HTML 코드가 몇 줄 되지 않지만 서비스의 규모가 커진다면 클래스 내부에 HTML 코드를 작성하는 것은 바람직하지 않을 것이다.
자바 코드 안에 HTML 코드를 작성하게 되면 오타가 발생할 가능성이 높고 유지 보수하기에도 어렵다.
이것이 바로 템플릿 엔진이 나온 이유이다. 템플릿 엔진을 사용하면 HTML 문서에서 필요한 곳만 코드를 적용해서 동적으로 변경할 수 있다. 템플릿 엔진에는 JSP, Thymleaf, Freemarker, Velocity등이 있다.
JSP
서블릿의 단점을 보완하기 위해 나온 기술이 바로 JSP다. JSP는 자바 코드 안에 HTML을 작성하는 것이 아니라 HTML 안에 자바 코드를 작성하는 방식으로 동적인 웹 페이지를 제공한다.
- <%@ page import="package you want" %>: 자바 import문과 같다.
- <% ~~ %>: 자바 코드를 입력하는 부분
- <%= ~~ %>: 자바 코드를 출력하는 부분
서블릿을 사용한 회원 객체 저장 코드를 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</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>
서블릿 방식과 동일하게 '<%@' 로 필요한 패키지를 import 할 수 있고 '<%' 태그 안에는 회원 객체를 저장하는데 필요한 로직이 들어간다. '<%=' 태그를 이용해 필요한 정보를 출력할 수 있다. 쉽게 말해서 상단에는 비즈니스 로직이 들어있고, 하단에는 HTML 코드가 있다. 서블릿에서 클래스 내부에 write()로 HTML을 작성하는 것 보다는 나아보이지만 JSP 코드를 보면 JAVA코드, 데이터를 조회하는 데이터베이스등 다양한 코드가 JSP에 노출되어있다는 단점이 있다.
즉 JSP가 너무 많은 역할을 한다. 이렇게 작은 비즈니스 로직을 구현하는데도 수 많은 HTML 코드가 들어가는데 규모가 큰 비즈니스 로직을 짜게 된다면 어마어마한 양의 HTML코드와 자바코드를 작성해야 할 것이다.
소프트웨어를 엔지니어링 하는 입장에서 유지보수가 어렵다는 점은 엄청난 리스크를 가지게 되는 것이다.
이러한 서블릿과 JSP의 단점들을 보완하기 위해 MVC 패턴이 등장하게 된다.
MVC 패턴에 대해서는 다음 글에서 알아보자 !
참고한 글
'Spring' 카테고리의 다른 글
[Spring] FrontController를 활용한 MVC 패턴 전개 - (1) (0) | 2022.02.05 |
---|---|
[Spring] 스프링 MVC 패턴 (Model-View-Controller) (0) | 2022.02.02 |
[Spring] Spring 의존관계 자동 주입 (생성자 주입, @Autowired, 롬복) (0) | 2022.01.23 |
[Spring] 스프링 컴포넌트 스캔(Component Scan) (0) | 2022.01.19 |
[Spring] Spring Singleton(싱글톤) (0) | 2022.01.17 |
- Total
- Today
- Yesterday
- 우테코
- CI/CD
- 프로젝트
- 3차 데모데이
- 백준
- 피움 6주차 회고
- 2차 데모데이
- ZNS
- 알림개선기
- java
- 스프링MVC
- 스프링 Logback
- Spring
- 우테코 회고
- 파이썬
- 5주차 회고
- jpa
- 알림기능개선기
- 8주차 회고
- 네트워크
- 환경 별 로깅 전략 분리
- 스프링 프레임워크
- dm-zoned
- 런칭 페스티벌
- ZNS SSD
- 회고
- 피움
- dm-zoned 코드분석
- 팀프로젝트
- 스프링 부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |