1-5. 자바 웹 기술 역사

shin·2025년 3월 16일

Spring MVC

목록 보기
7/25

1) 과거 기술


(1) 서블릿 - 1997

HTML 생성이 어려움

  • Java EE (당시 J2EE) 환경에서 동적인 웹 페이지를 만들기 위해 등장한 기술
  • 클라이언트 요청을 받고, 서버에서 로직을 처리한 후 HTML을 생성하여 응답하는 방식

특징

  • Java 코드로 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>");
    }
}
  • PrintWriter로 직접 HTML을 출력해야 해서 개발이 번거롭고 가독성이 떨어짐

(2) JSP - 1999

HTML 생성은 편리하지만, 비즈니스 로직까지 너무 많은 역할 담당

  • 서블릿의 단점을 보완하기 위해 등장한 기술
  • HTML 내에서 Java 코드를 포함할 수 있어 동적인 웹 페이지 생성을 쉽게 함

특징

  • HTML과 Java 코드를 섞어서 작성 가능 (<% %> 문법 사용)
  • 서블릿보다 HTML 작성이 쉬워지면서 UI 개발이 용이함
  • 하지만 Java 코드가 JSP에 포함되면서 가독성이 나빠지고 유지보수가 어려움

예제 코드

<%@ 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>
  • HTML 안에 Java 코드가 포함되면서 가독성이 떨어지고, 역할이 분리되지 않아 유지보수가 어려움

(3) 서블릿, JSP 조합 MVC 패턴 사용

모델, 뷰 컨트롤러로 역할을 나누어 개발

  • 서블릿과 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>
  • Controller (컨트롤러): 클라이언트 요청을 처리하고 적절한 Model과 View를 연결 (서블릿 사용)
@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);
    }
}
  • 서블릿이 Controller 역할을 하면서 View (JSP)와 Model을 분리하여 개발

(4) MVC 프레임워크 춘추 전국 시대 - 2000년 초 ~ 2010년 초

  • MVC 패턴 자동화, 복잡한 웹 기술을 편리하게 사용할 수 있는 다양한 기능 지원
  • 스트럿츠, 웹워크, 스프링 MVC(과거 버전)

특징

  • 서블릿 & JSP 기반 MVC 개발의 복잡성을 줄여줌 (자동화된 컨트롤러, 편리한 라우팅, ORM 연동 지원)
  • 반복적인 작업을 줄이고 생산성을 높임
  • 템플릿 엔진, 데이터 바인딩, 유효성 검사 등 다양한 기능 제공

대표적인 MVC 프레임워크

  1. Struts (2000년대 초)
    • Apache에서 개발한 초창기 MVC 프레임워크
    • XML 기반 설정 파일을 사용하여 컨트롤러를 매핑
    • 액션 기반 아키텍처로 구조가 다소 복잡하고 무겁다는 단점이 있음

  2. WebWork (2000년대 중반)
    • Struts의 단점을 개선한 프레임워크
    • XML 설정을 줄이고 POJO (Plain Old Java Object) 기반 개발 가능
    • 이후 Struts 2로 통합됨

  3. Spring MVC (2000년대 후반 ~ 현재)
    • Spring Framework의 일부로 등장한 MVC 프레임워크
    • DI (Dependency Injection), AOP (Aspect-Oriented Programming) 등의 기능을 제공하여 강력한 확장성 제공
    • 어노테이션 기반 설정 (@Controller, @RequestMapping 등)으로 XML 설정을 최소화
    • 현재 가장 많이 사용되는 웹 프레임워크 중 하나



2) 현재 사용 기술


애노테이션 기반의 스프링 MVC 등장

  • 애노테이션 : 클래스, 메서드, 필드 등에 추가적인 정보(메타데이터)를 제공하는 기능
    - 스프링 MVC에서는 애노테이션을 사용하여 컨트롤러, 요청 매핑, 데이터 바인딩 등 다양한 기능을 간단하게 설정할 수 있음
    - @Controller
  • 과거에는 XML 설정 파일을 사용하여 컨트롤러를 등록하고 설정해야 했지만, 지금은 애노테이션(@)을 사용하여 간편하게 웹 애플리케이션을 개발할 수 있음

  • XML 설정 없이 간결한 코드 작성 가능.
  • 코드만 보면 어떤 역할을 하는지 쉽게 이해 가능.
  • 유지보수와 개발 속도가 향상됨.
  • 결과적으로, 애노테이션 기반의 스프링 MVC 등장으로 과거의 복잡한 XML 기반 설정이 사라지고, 개발 생산성이 향상됨
  • 이와 함께, 여러 MVC 프레임워크들이 경쟁하던 시대(춘추 전국 시대)도 마무리되고, 스프링 MVC가 표준처럼 자리 잡음

스프링 부트의 등장

  • 스프링 MVC는 강력하지만, 초기 설정이 복잡하고 서버 배포 과정이 번거로웠음
    • 이를 해결하기 위해 등장한 것이 Spring Boot(스프링 부트)

과거 배포 방식 (Spring Boot 이전)

  1. 서버(WAS) 설치: 톰캣(Tomcat) 같은 WAS(Web Application Server)를 직접 설치
  2. War 파일 빌드: 프로젝트 코드를 .war 파일로 패키징
  3. WAS에 배포: War 파일을 WAS 서버에 배포 후 실행

문제점

  • WAS 설치와 관리가 번거로움
  • War 파일을 매번 생성하고, 별도의 서버에 배포해야 하는 과정이 필요함
  • 서버 설정이 개발자마다 다를 수 있어, 환경 차이에 따른 오류가 발생할 가능성이 높음

Spring Boot 이후 (현재 방식)

  • 스프링 부트는 내장된 서버(WAS)를 포함하기 때문에, 별도의 서버 설치 없이 실행 가능
  • Jar 파일을 생성하면 그 안에 서버(Tomcat 등)가 포함됨

java -jar myapp.jar

  • 실행만 하면 자동으로 웹 애플리케이션이 동작함

장점

  • WAS(톰캣 등)가 내장되어 있어 별도로 설치할 필요 없음
  • Jar 파일 하나만 실행하면 앱이 동작하여 배포가 간편함
  • 설정이 자동화되어 초기 설정 부담이 줄어듦

현재는 애노테이션 기반의 스프링 MVC와 스프링 부트를 조합하여 빠르고 효율적인 웹 애플리케이션 개발이 가능함



3) 최신 기술 - 스프링 웹 기술의 분화


  • Web Servlet - Spring MVC
  • Web Reactive - Spring WebFlux
  • 과거에는 웹 개발에 Spring MVC(서블릿 기반)만 사용되었지만, 최근에는 Spring WebFlux(리액티브 기반)도 함께 등장하며 스프링 웹 기술이 두 가지로 분화됨

Web Servlet - Spring MVC (기존 방식)

  • 전통적인 서블릿(Servlet) 기반의 웹 애플리케이션 개발 방식
  • 요청이 들어오면 쓰레드를 하나 할당하여 처리하는 블로킹(Blocking) 방식
  • 대부분의 일반적인 웹 애플리케이션에서는 Spring MVC의 성능이 충분함

특징

  • 쓰레드 하나당 하나의 요청을 처리 (동기 블로킹 모델)
  • 일반적인 웹 애플리케이션 개발에 적합
  • JDBC 기반의 RDBMS (MySQL, PostgreSQL 등)와 잘 어울림
  • 많은 기업에서 이미 사용 중이며, 안정성과 생산성이 검증됨

Spring WebFlux(스프링 웹 플럭스, 비동기 논블로킹 방식)

  • 기존 Spring MVC는 요청이 들어오면 쓰레드를 할당하는 방식이지만, Spring WebFlux는 논블로킹(Non-blocking) 방식으로 동작하여 적은 쓰레드로도 높은 성능을 낼 수 있는 구조를 가짐

특징

  1. 비동기(Asynchronous) 논블로킹(Non-blocking) 방식
    • 요청을 처리할 때 쓰레드를 점유하지 않고 다른 작업을 수행할 수 있음
    • 동시에 많은 요청을 처리할 때 성능이 향상됨

  2. 최소 쓰레드로 최대 성능
    • 쓰레드 컨텍스트 스위칭 비용을 줄여 효율적으로 동작
    • CPU 코어 수에 따라 쓰레드 개수를 조정하여 자원을 효율적으로 사용

  3. 함수형 스타일 코드
    • Mono와 Flux 같은 리액티브 스트림(Reactive Stream) 개념을 사용하여 동시성 처리 코드를 효율적으로 작성

  4. 서블릿 기술을 사용하지 않음
    • Netty 같은 논블로킹 서버를 사용하여 동작
    • 기존 서블릿 기반의 필터나 인터셉터를 사용할 수 없음

예제 코드

  • Spring WebFlux에서는 @RestController + Mono 또는 Flux 를 사용하여 데이터를 반환함
@RestController
public class HelloReactiveController {

    @GetMapping("/hello")
    public Mono<String> sayHello() {
        return Mono.just("Hello, Spring WebFlux!");
    }
}
  • Mono은 비동기적으로 하나의 데이터를 반환하는 객체
  • 일반적인 String을 반환하는 것이 아니라 비동기 스트림 형태로 데이터를 전달

WebFlux는 강력하지만, 실무에서 많이 사용되지 않는 이유

  1. 기술적 난이도가 높음
    • Mono, Flux, Reactor 같은 개념을 잘 이해해야 함
    • 기존 MVC 방식보다 코드가 복잡해질 가능성이 있음

  2. RDBMS 지원 부족
    • WebFlux는 논블로킹 데이터베이스 (MongoDB, Cassandra 등)와 잘 어울림
    • 하지만, 기존 JDBC 기반의 RDBMS(MySQL, Oracle, PostgreSQL 등)는 블로킹 방식이므로 WebFlux의 장점을 살리기 어려움

  3. 일반 MVC도 충분히 빠름
    • 대부분의 웹 애플리케이션에서는 Spring MVC의 성능이 충분함
    • WebFlux의 성능 향상이 필요한 경우(대규모 트래픽 처리) 아니면 굳이 사용할 필요 없음

  4. 실무 적용률 낮음
    • 현재 WebFlux를 도입한 프로젝트는 전체의 1% 미만
    • 기존 시스템을 WebFlux로 변경하는 데 비용과 학습 곡선이 큼


정리

  • Spring 웹 기술은 Spring MVC(전통적인 방식) 와 Spring WebFlux(비동기 방식) 로 분화됨
  • WebFlux는 비동기 논블로킹 방식으로 높은 성능을 제공하지만, 기술 난이도가 높고 RDBMS 지원이 부족함
  • 현재 실무에서는 대부분 Spring MVC를 사용하며, WebFlux는 특수한 경우(실시간 데이터 처리 등)에만 도입됨


5) 자바 뷰 템플릿 역사


HTMP을 편리하게 생성하는 뷰 기능

JSP

  • 속도 느림, 기능 부족

프리마커(Freemarker), Velocity(벨로시티)

  • 속도 문제 해결, 다양한 기능
  1. 프리마커(Freemarker)
    • Apache에서 개발한 템플릿 엔진으로, 속도가 빠르고 다양한 기능을 지원
    • HTML 파일을 템플릿처럼 사용하면서 변수, 조건문, 반복문을 적용 가능
    • Spring MVC와 쉽게 연동 가능
    • JSP보다 성능이 뛰어나고 유지보수 용이
<html>
<body>
    <h1>안녕하세요, ${name}님!</h1>
    <ul>
        <#list users as user>
            <li>${user.name} - ${user.age}세</li>
        </#list>
    </ul>
</body>
</html>
  • ${name}: 변수 출력
  • <#list users as user>: 리스트 반복문

  1. 벨로시티(Velocity)
    • Apache에서 개발한 또 다른 템플릿 엔진
    • 프리마커와 비슷하지만, 더 간결한 문법을 제공
    • JSP를 대체할 목적으로 만들어졌으며, Spring과 연동 가능
    • 하지만 최근에는 타임리프(Thymeleaf)가 더 많이 사용됨
<html>
<body>
    <h1>안녕하세요, $name 님!</h1>
    <ul>
        #foreach($user in $users)
            <li>$user.name - $user.age세</li>
        #end
    </ul>
</body>
</html>
  • $name: 변수 출력
  • #foreach($user in $users): 리스트 반복문

타임리프(Thymeleaf)

  • 내추럴 템플릿: HTML의 모양을 유지하면서 뷰 템플릿 적용 가능
  • 스프링 MVC와 강력한 기능 통합
  • 최선의 선택, 단 성능은 프리마커, 벨로시티가 더 빠름

현재는 타임리프(Thymeleaf)가 스프링과 가장 잘 맞기 때문에 최선의 선택으로 평가됨

  • 하지만, 성능 면에서는 프리마커(Freemarker)와 벨로시티(Velocity)가 더 빠름
profile
Backend development

0개의 댓글