HTML 생성이 어려움
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Hello, Servlet!</h1>");
out.println("</body></html>");
}
}
HTML 생성은 편리하지만, 비즈니스 로직까지 너무 많은 역할 담당
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
<h1>Welcome, JSP!</h1>
<%
String name = request.getParameter("name");
if (name != null) {
out.println("<p>Hello, " + name + "!</p>");
}
%>
</body>
</html>
모델, 뷰 컨트롤러로 역할을 나누어 개발
서블릿과 JSP의 단점을 보완하기 위해 MVC (Model-View-Controller) 패턴을 적용
Model (모델): 데이터 및 비즈니스 로직을 담당 (DB 접근, 서비스 로직 등)
View (뷰): HTML을 담당 (JSP 사용)
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
<h1>Welcome!</h1>
<p>Hello, <%= request.getAttribute("userName") %>!</p>
</body>
</html>
@WebServlet("/greeting")
public class GreetingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
request.setAttribute("userName", name);
RequestDispatcher dispatcher = request.getRequestDispatcher("greeting.jsp");
dispatcher.forward(request, response);
}
}
- MVC 패턴 자동화, 복잡한 웹 기술을 편리하게 사용할 수 있는 다양한 기능 지원
- 스트럿츠, 웹워크, 스프링 MVC(과거 버전)
Struts (2000년대 초)
• Apache에서 개발한 초창기 MVC 프레임워크
• XML 기반 설정 파일을 사용하여 컨트롤러를 매핑
• 액션 기반 아키텍처로 구조가 다소 복잡하고 무겁다는 단점이 있음
WebWork (2000년대 중반)
• Struts의 단점을 개선한 프레임워크
• XML 설정을 줄이고 POJO (Plain Old Java Object) 기반 개발 가능
• 이후 Struts 2로 통합됨
Spring MVC (2000년대 후반 ~ 현재)
• Spring Framework의 일부로 등장한 MVC 프레임워크
• DI (Dependency Injection), AOP (Aspect-Oriented Programming) 등의 기능을 제공하여 강력한 확장성 제공
• 어노테이션 기반 설정 (@Controller, @RequestMapping 등)으로 XML 설정을 최소화
• 현재 가장 많이 사용되는 웹 프레임워크 중 하나
- XML 설정 없이 간결한 코드 작성 가능.
- 코드만 보면 어떤 역할을 하는지 쉽게 이해 가능.
- 유지보수와 개발 속도가 향상됨.
java -jar myapp.jar
현재는 애노테이션 기반의 스프링 MVC와 스프링 부트를 조합하여 빠르고 효율적인 웹 애플리케이션 개발이 가능함
- Web Servlet - Spring MVC
- Web Reactive - Spring WebFlux
비동기(Asynchronous) 논블로킹(Non-blocking) 방식
• 요청을 처리할 때 쓰레드를 점유하지 않고 다른 작업을 수행할 수 있음
• 동시에 많은 요청을 처리할 때 성능이 향상됨
최소 쓰레드로 최대 성능
• 쓰레드 컨텍스트 스위칭 비용을 줄여 효율적으로 동작
• CPU 코어 수에 따라 쓰레드 개수를 조정하여 자원을 효율적으로 사용
함수형 스타일 코드
• Mono와 Flux 같은 리액티브 스트림(Reactive Stream) 개념을 사용하여 동시성 처리 코드를 효율적으로 작성
서블릿 기술을 사용하지 않음
• Netty 같은 논블로킹 서버를 사용하여 동작
• 기존 서블릿 기반의 필터나 인터셉터를 사용할 수 없음
@RestController
public class HelloReactiveController {
@GetMapping("/hello")
public Mono<String> sayHello() {
return Mono.just("Hello, Spring WebFlux!");
}
}
기술적 난이도가 높음
• Mono, Flux, Reactor 같은 개념을 잘 이해해야 함
• 기존 MVC 방식보다 코드가 복잡해질 가능성이 있음
RDBMS 지원 부족
• WebFlux는 논블로킹 데이터베이스 (MongoDB, Cassandra 등)와 잘 어울림
• 하지만, 기존 JDBC 기반의 RDBMS(MySQL, Oracle, PostgreSQL 등)는 블로킹 방식이므로 WebFlux의 장점을 살리기 어려움
일반 MVC도 충분히 빠름
• 대부분의 웹 애플리케이션에서는 Spring MVC의 성능이 충분함
• WebFlux의 성능 향상이 필요한 경우(대규모 트래픽 처리) 아니면 굳이 사용할 필요 없음
실무 적용률 낮음
• 현재 WebFlux를 도입한 프로젝트는 전체의 1% 미만
• 기존 시스템을 WebFlux로 변경하는 데 비용과 학습 곡선이 큼
- Spring 웹 기술은 Spring MVC(전통적인 방식) 와 Spring WebFlux(비동기 방식) 로 분화됨
- WebFlux는 비동기 논블로킹 방식으로 높은 성능을 제공하지만, 기술 난이도가 높고 RDBMS 지원이 부족함
- 현재 실무에서는 대부분 Spring MVC를 사용하며, WebFlux는 특수한 경우(실시간 데이터 처리 등)에만 도입됨
<html>
<body>
<h1>안녕하세요, ${name}님!</h1>
<ul>
<#list users as user>
<li>${user.name} - ${user.age}세</li>
</#list>
</ul>
</body>
</html>
<html>
<body>
<h1>안녕하세요, $name 님!</h1>
<ul>
#foreach($user in $users)
<li>$user.name - $user.age세</li>
#end
</ul>
</body>
</html>
현재는 타임리프(Thymeleaf)가 스프링과 가장 잘 맞기 때문에 최선의 선택으로 평가됨
- 하지만, 성능 면에서는 프리마커(Freemarker)와 벨로시티(Velocity)가 더 빠름