Java Web 개발 살펴보기 (Model 1 부터 Spring Web 까지)

Java Web 개발 살펴보기 (Model 1 부터 Spring Web 까지)

스프링 스터디를 하면서 정리한 Java 웹 개발 변천사를 포스팅 한다. Java Web 개발 과정은 다음과 같으며, 여유가 된다면 곁가지로 파생되는 기술들인 Servlet 3.x, WebSocket, Async I/O, Spring 5 (WebFlux)까지 해보려 한다. 일단 아래 내용들을 따라가기 전에 실습 환경 셋팅을 해야 한다.


Java Servlet 개발 실습 환경 셋팅

실습에 사용할 IDE와 라이브러리, 빌드툴은 다음과 같다.

  • IntelliJ IDEA 2017
  • JDK 1.8
  • Java Servlet 3.1
  • Gradle 4.x

실습 프로젝트 생성 과정은 다음과 같다.

  1. IntelliJ IDEA > 메뉴 표시줄 > File > New > Project를 클릭
  2. 왼쪽에서 Gradle 이라는 항목을 클릭 후 Java, Web 체크 박스에 체크 후 Next
  3. 적당한 GroupId와 ArtifactID 입력 후 Next
  4. Create seperate module per source set 체크 박스 해제 후 Next
  5. Project Name 확인 후 Finish 버튼 클릭하면 프로젝트가 생성되며 Gradle wrapper가 다운로드 되며 프로젝트가 로딩 된다.
  6. 프로젝트 루트에 있는 build.gradle 파일을 열어서 dependencies 부분에 아래 내용을 붙여넣는다.

    1
    2
    3
    4
    dependencies {
    compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
    testCompile group: 'junit', name: 'junit', version: '4.12'
    }
  7. 메뉴 표시줄 > View > Tool Windows > Web을 클릭하면 왼쪽 하단에 Web 설정 관련 패널이 표시된다.

  8. 오른쪽 클릭 후 Module Settings 클릭하면 모듈 설정 창이 뜬다. 여기서 아래 스크린샷과 같이 war파일 항목을 클릭하여 포커싱 한다.
  9. 중간에 위치한 Add Application Server specific descriptor… 버튼 바로 위에 있는 + 버튼을 클릭하면 web.xml이라는 항목이 표시되는데 이걸 클릭하자.
  10. 서블릿 버전과 서블릿 설정 파일인 web.xml의 위치를 어디로 할 것인가를 묻는 다이얼로그가 뜨는데 web.xml 파일의 위치는 다음과 같이 입력한다.

    1
    ${PROJECT_ROOT}/web/WEB-INF/web.xml
  11. 아래 Web Resource Directories에 Web Resource Directory 항목을 더블클릭 한다.
  12. JSP가 위치할 폴더를 물어보는 다이얼로그가 뜨는데 이 때 아래 경로를 입력한다.

    1
    ${PROJECT_ROOT}/web
  13. 마지막으로 src/main/webapp 폴더는 삭제한다. (해당 폴더는 더이상 사용하지 않기 때문)

실습 프로젝트 실행을 위한 준비 과정은 다음과 같다.

  1. IntelliJ IDEA > 메뉴 표시줄 > Run > Edit Configurations… 클릭
  2. 왼쪽 상단에 + 버튼 클릭 > Tomcat Server > Local 클릭
  3. 아래와 같은 다이얼로그가 뜨면 다이얼로그 상단에 위치한 Name 항목에 적당한 이름을 입력 후 오른쪽 하단에 Fix 버튼을 클릭한다.
  4. 아래와 같이 ooo.war (exploded) 항목을 클릭한다. (디버깅을 위해 war 파일을 푼 형태로 실행) 그 다음 OK 버튼을 클릭하여 설정을 완료한다.
  5. ${PROJECT_ROOT}/web 폴더 아래에 index.jsp 파일을 생성하고 아래 내용을 입력한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>Hello!</title>
    </head>
    <body>
    Hello, world!
    </body>
    </html>
  6. IntelliJ 상단 툴바에 있는 실행 버튼을 클릭하여 실행 > 브라우저가 자동으로 뜨면서 Hello, world가 보이면 성공

Model 1

  • Only view code (JSP)
  • 옛 PHP 개발 방식과 유사하다.
  • JSP 파일 안에 모든 비지니스 로직과 View 로직(html)을 함께 넣은 형식
  • 예제 실습 (스프링 퀵 스타트 P.241 ~ P.262)
    • P.244 - 로그인 구현 (login.jsp)
    • P.247 - 로그인 인증처리 (login_proc.jsp)
    • P.249 - 글 목록 (getBoardList.jsp)
    • P.252 - 글 상세 보기 (getBoard.jsp)
    • P.255 - 글 등록 (insertBoard.jsp)
    • P.256 - 글 등록 처리 (insertBoard_proc.jsp)
    • P.258 - 글 수정 처리 (updateBoard_proc.jsp)
    • P.260 - 글 삭제 (deleteBoard_proc.jsp)
    • P.261 - 로그아웃 (logout_proc.jsp)

Model 2

  • Model 1의 view 코드에서 진짜 view를 담당하는 코드(html, jsp)과 view에 바인딩할 데이터를 로딩하는 로직(controller)으로 나눠진 형태
  • 이제 view에서는 비지니스 로직과 DB 액세스 로직이 없어지게 된다.
  • Model 2는 MVC (Model, View, Controller)라고도 불린다.
  • 예제 실습 (스프링 퀵 스타트 P.265 ~ P.284)
    • P.267 - 서블릿 클래스 등록 & Controller 서블릿 구현
    • P.270 - 로그인 기능 구현 (DispatcherServlet.java, login.jsp)
    • P.272 - 글 목록 (DispatcherServlet.java, getBoardList.jsp)
    • P.275 - 글 상세보기 (DispatcherServlet.java, getBoardList.jsp, getBoard.jsp)
    • P.277 - 글 등록 (DispatcherServlet.java, insertBoard.jsp)
    • P.279 - 글 수정 (DispatcherServlet.java, getBoard.jsp)
    • P.280 - 글 삭제 (DispatcherServlet.java, getBoard.jsp)
    • P.280 - 로그아웃 (DispatcherServlet.java, getBoard.jsp)

Advanced Model 2

  • 앞에서 소개한 Model 2의 방식으로 코딩하다보면 중복되는 코드가 생겨남
  • 이런 중복되는 로직을 좀 더 객체지향적으로 리팩토링한 방식
  • Spring WebMVC가 탄생하기 전 MVC 프레임워크를 직접 개발해 보는 것으로 책은 소개하고 있다.
  • 예제 실습 (스프링 퀵 스타트 P.285 ~ P.311)
    • P.288 - Controller 인터페이스 작성 (Controller.java)
    • P.289 - LoginController 구현 (LoginController.java)
    • P.290 - HandlerMapping 구현 (HandlerMapping.java)
    • P.291 - ViewResolver 구현 (ViewResolver.java)
    • P.292 - DispatcherServlet 수정, hadnlerMapping과 viewResolver를 dispatcherServlet에 추가 (DispatcherServlet.java)
    • P.295 - 글 목록 검색 구현 (GetBoardListController.java, HandlerMapping.java)
    • P.296 - 글 상세보기 구현 (GetBoardController.java, HandlerMapping.java)
    • P.297 - 글 등록 구현 (InsertBoardController.java, HandlerMapping.java)
    • P.300 - 글 수정 구현 (UpdateBoardController.java, HandlerMapping.java)
    • P.302 - 글 삭제 구현 (DeleteBoardController.java, HandlerMapping.java)
    • P.303 - 로그아웃 구현 (LogoutController.java, HandlerMapping.java)
    • P.308 - 상세화면 페이지에 EL/JSTL 적용하기 (getBoard.jsp)
    • P.310 - 글 목록 페이지에 EL/JSTL 적용하기 (getBoardList.jsp)

Spring WebMVC (with XML Configuration)

  • Model 2를 처음 개발하는 사람도 일관성 있게 코딩하기 위해 나온 웹 프레임워크
  • 이 웹 프레임워크를 사용하기 위해 web infrastructure 관련 bean들이 필요한데 이러한 bean을 사용하기 위한 설정을 xml로 한 형태를 말한다.
    • 스프링 웹MVC를 쓰면 처음 개발하는 사람도 이전의 개발 이슈들을 극복한 일관성 있는 코딩을 할 수 있게 될거라 기대하지만..
    • 막상 해보면 스프링 웹MVC를 쓰기 위한 Web infrastructure Bean들을 대충 뭐가 있는지 정도는 알아야 뭘 어떻게 설정하고 컨트롤러는 어떻게 써야되는 것인지 감이 잡힌다. (이게 초기 학습 장벽)
  • 참고로 Servlet 클래스는 DispatcherServlet 하나만 사용한다. (오해하면 안되는게 서블릿 객체를 하나만 사용한다는 말이 아님)
  • 예제 실습 (스프링 퀵 스타트 P.313 ~ 346)
    • P.315 - Spring DispatcherServlet 등록 (web.xml)
    • P.320 - WEB-INF/config 폴더에 스프링 설정 파일 등록 (presentation-layer.xml)
    • P.322 - 인코딩 설정 (web.xml)
    • P.326 - 로그인 기능 구현 (LoginController.java)
    • P.328 - 핸들러 맵핑 등록 (presentation-layer.xml)
    • P.329 - 글 목록 기능 구현 (GetBoardListController.java)
    • P.331 - 핸들러 맵핑 등록 (presentation-layer.xml)
    • P.333 - 글 상세조회 기능 구현 (GetBoardController.java)
    • P.334 - 핸들러 맵핑 등록 (presentation-layer.xml)
    • P.335 - 글 등록 기능 구현 (InsertBoardController.java)
    • P.336 - 핸들러 맵핑 등록 (presentation-layer.xml)
    • P.337 - 글 수정 기능 구현 (UpdateBoardController.java)
    • P.339 - 글 삭제 기능 구현 (DeleteBoardController.java)
    • P.340 - 로그아웃 기능 구현 (LogoutController.java)
    • P.342 ~ 345 - ViewResolver 적용 (presentation-layer.xml)

Spring WebMVC (with XML Configuration & Annotation)

  • 앞의 방식에서 Controller와 url 맵핑을 Java Annotation을 사용한 형태
  • 이 방식을 취하면 XML에 웹 관련 설정(url 맵핑 설정)이 사라지게 된다.
    • 스프링은 이렇게 점점 설정을 줄여가는 방식으로 발전됨
    • 왜? 설정을 찾아서 적는 일도 고된 일이고 프로젝트를 할 때마다 설정을 복사 & 붙여넣기를 해야되는 중복 작업을 줄일 수 있기 때문
  • 예제 실습 (스프링 퀵 스타트 P.349 ~ 417)

    • P.350 ~ P.353 - @Controller 적용하기 (InsertBoardController.java)
    • P.354 ~ P.361 - @RequestMapping 적용하기 (InsertBoardController.java, presentation-layer.xml)
    • P.363 - 글 등록 (InsertBoardController.java)
    • P.365 - 글 목록 (GetBoardListController.java)
    • P.366 - 글 상세보기 (GetBoardController.java)
    • P.367 - 글 수정 (UpdateBoardController.java)
    • P.368 - 글 삭제 (DeleteBoardController.java)
    • P.369 - 로그인 (LoginController.java)
    • P.370 - 로그아웃 (LogoutController.java)
    • P.371 - 컨트롤러 통합 (BoardController.java)
    • P.373 - 요청 방식에 따른 처리 구현 (LoginController.java)
    • P.375 - JSP에서 Command 객체 사용 (login.jsp)
    • P.377 - @ModelAttribute 사용 (LoginController.java, login.jsp)
    • P.378 - Controller에서 Servlet API 사용 (LoginController.java, getBoardList.jsp)
    • P.380 - Controller 리턴타입 이해 (BoardController.java)
    • P.382 - @RequestParam 사용 (getBoardList.jsp, BoardController.java)
    • P.385 - @ModelAttribute 사용 (BoardController.java, getBoardList.jsp)
    • P.388 - @SessionAttributes 사용 (BoardController.java)
    • P.397 ~ P.408 - 비지니스 레이어(Service 클래스) 리팩토링 (BoardController.java, BoardServiceImpl.java, presentation-layer.xml)
    • P.409 ~ P.417 - 글 검색 기능 보완
  • 곁다리로 빠지기

    • 파일 업로드: 스프링 퀵 스타트 P.419 ~ 434
    • 다국어 처리: 스프링 퀵 스타트 P.435 ~ 450
    • JSON View: 스프링 퀵 스타트 P.451 ~ 464

Spring WebMVC (with Java Configuration & Annotation)

  • Spring에서 어느 순간 XML을 이용한 Bean 설정 방식 보다 Java 클래스를 이용한 Bean 설정 방식이 대두되기 시작함
  • Java 설정 방식이 점차 늘어가는 이유는 Infrastructure 관련 Bean들을 좀 더 찾기 쉽고 디버깅 및 이해하기 쉽기 때문에 이 방식이 선호됨
  • Spring 뿐만 아니라 Java Servlet도 마찬가지로 web.xml이 사라지고 Java Class와 Annotation으로 서블릿 설정할 수 있게 된다. (servlet 3.0)
  • 예제 실습
    • 준비 중..

Spring WebMVC (with Spring Boot Web Starter)

  • 이젠 스프링 Infrastructure Bean 선언하는 것도 귀찮다! 혹은 스프링 설정하는게 너무 어렵다! 하는 요구가 늘어남에 따라 Spring팀에서는 Spring-boot 라는 것을 내놓게 된다.
  • 사람들이 왜 spring-boot를 열광하게 되냐 하면 Java annotation 선언 하나만으로 스프링 Infrastructure Bean들이 자동으로 선언되고 로딩된다. (즉 사용자가 더 이상 스프링에 대한 설정을 잘 몰라도 사용할 수 있게 된다는 의미)
  • 예제 실습
    • 준비 중..

Spring WebFlux & Reactor (Spring Framework 5.x)

  • Spring WebFlux에서는 Java Servlet이 사라짐
  • 따라서 더 이상 war 파일로 패키징하지 않음
  • 웹 요청을 받는 인프라스트럭쳐가 Reactive, Functional Programming 스타일로 바뀜
  • 예제 실습
    • 준비 중..



참고자료