mojo's Blog

자바 웹 개발 개요 본문

JSP

자바 웹 개발 개요

_mojo_ 2021. 12. 28. 15:37

서블릿과 JSP

 

서블릿이란?

자바 기반의 웹 프로그램 개발을 위해 만들어진 기술이다.

따라서 자바로 작성된 프로그램을 실행할 수 있는 서버 소프트웨어(ex : 톰캣)를 통해 관리된다.

즉 서블릿을 실행하기 위해서는 톰캣과 같은 서블릿 컨테이너가 필요하며 이러한 서버 소프트웨어는 일반적으로 WAS(Web Application Server)로 불리기도 한다.

 

기본적인 웹 요청과 응답 과정은 다음과 같다.

 

1. 클라이언트(웹 브라우저)가 서버에 페이지(html)를 요청한다.

2. 서버는 클라이언트에 요청받은 파일(html)을 응답한다.

3. 클라이언트는 수신받은 파일(html)의 내용(CSS, 자바스크립트 포함)을 해석하여 화면에 표시한다.

 

HTML은 정적인 파일이므로 실시간으로 변하는 정보를 가져올 수 없다.

따라서 사용자의 웹 요청을 받으면 별도의 프로그램을 통해 데이터베이스에서 가지고 온 정보를 HTML로 재구성하여 클라이언트에 다시 전달해야 한다.

서블릿은 바로 이러한 기능을 수행할 수 있도록 설계된 특수한 목적의 자바 프로그램이다.

 

1. 클라이언트(웹 브라우저)가 서버에 페이지(url)을 요청한다.

2. 서버는 요청 url에 매핑되는 서블릿을 호출하면서 파라미터를 전달한다.

3. 서블릿이 실행되고 파라미터로 전달된 값을 처리하거나 데이터베이스와 연동한다.

4. HTML과 데이터를 조합하여 재구성한 다음 클라이언트에 전달한다.

5. 웹 브라우저는 수신받은 HTML 내용(CSS, 자바스크립트 포함)을 해석해서 화면에 표시한다.

 

그러나 서블릿은 HTML과 데이터를 조합하는 방식에 어려움이 있다. 다음 코드를 보자

out.println("<h2>" + username + "</h2>);

out은 서블릿에서 클라이언트에 데이터를 전송하기 위한 출력 스트림이다.

HTML 코드와 자바 코드를 문자열 결합으로 처리한다.

 

이러한 비효율적인 방법을 해결하기 위해 JSP 가 등장하게 되었다.

 

JSP란?

서블릿에서 HTML과 데이터 결합을 손쉽게 처리하기 위해 만들어졌다.

JSP는 HTML을 중심으로 데이터를 처리하는 특징을 가지고 있는데, 쉽게 말해서 HTML에서 java 코드를 사용할 수 있는 구조이다.

따라서 JSP는 HTML에 자바 코드를 더한 형태로 구성되며, 컨테이너에 의해 서블릿 형태의 자바 코드로 변환 후 컴파일되어 컨테이너에 적재되는 구조가 된다.

 

앞에서의 서블릿 코드는 JSP를 사용하면 다음과 같이 작성 가능하다.

<html>
   ...
   <h2> <%= username %> </h2>
   ...
</html>

<%= %> 란 JSP 출력문으로 사칙연산, 간단한 변수의 출력 등에 사용된다.

 

그러나 JSP를 이용한 개발에도 몇 가지 문제가 있다.

예를 들어서 게시판이나 상품 목록과 같은 데이터를 반복해서 출력하거나 조건을 체크해야 하는 경우 단순한 HTML 문법만으로는 처리할 수 없기 때문에 자바 코드를 중간중간 사용해야 한다.

<table>
   <% for(Membero m : mlist) { %>
      <tr>
         <td> <%= m.name %> </td>
         <td> <%= m.email %> </td>
      </tr>
   <% } %>
</table>

for문 안에서 HTML과 데이터를 조합하려면 서블릿과 마찬가지로 'out.println()' 구문을 사용해야 한다.

이러한 문제를 피하려면 중간에 스크립트를 닫고 HTML에서 출력문을 사용하는 형태가 되기 때문에 코드가 복잡하고 가독성이 떨어진다. 

따라서 이를 해결하기 위해 JSTL(JSP Standard Tag Library) 및 EL(Expression Language)이 도입되었다.

 

다음과 같이 개선될 수 있다.

<table>
   <c:forEach var = "m" items = "${mlist}">
      <tr>
         <td> ${m.name} </td>
         <td> ${m.email} </td>
      </tr>
   </c:forEach>
</table>

<c:forEach>는 반복문을 제공하는 JSTL 커스텀 태그다.

${m.name}의 형태는 표현 언어로 자바 객체의 멤버 출력이 가능하다.

JSTL의 단점으로는 화면 구조를 서버에서 빌드(SSR)하는 구조이기 때문에 모든 실행이 톰캣과 같은 서블릿 컨테이너를 통해야 한다는 점이다.

위에서 <c:forEach> 태그나 ${m.name} 와 같은 JSP 구문은 클라이언트(웹 브라우저)에서 해석할 수 없다.즉 사소한 디자인 변경도 서버를 통해 실행해야 하며, 이는 개발 생산성과 디자이너와의 협업 등에서 큰 문제가 된다.

 

커스텀 태그란?

표준 HTML 태그 이외에 사용자 정의 태그를 자바 프로그램 형태로 구현하고 JSP를 서블릿 형태로 변환할 때 함께 처리될 수 있도록 하는 서블릿 규격 중 하나를 의미한다.

 

JSP의 주된 대체 솔루션인 스프링 프레임워크Vue.js에서 사용하는 형식을 보자.

스프링 프레임워크의 기본 템플릿 엔진인 타임리프를 사용하는 경우에는 다음과 같다.

JSP와 EL 부분은 동일하지만 JSTL 대신 HTML 태크에 data -*- 속성을 사용하는 형태라 서버 실행 없이도 디자인 확인이 가능한 구조이다.

<table>
      <tr data-th-each="m : ${mlist}">
         <td data-th-text="${m.name}"> Hong </td>
         <td data-th-text="${m.email}"> test@test.com </td>
      </tr>
</table>

JSTL 대신에 data-th-each와 같은 속성의 형태로 로직을 구현한다.

변수로 출력되는 데이터 이외 기본값 출력이 가능하다.

 

Vue.js 를 이용해 프런트엔드 개발 방식으로 클라이언트 사이드 렌더링을 사용한다면 다음과 같다.

<table>
      <tr v-for="m in mlist">
         <td> {{m.name}} </td>
         <td> {{m.email}} </td>
      </tr>
</table>

 

 

REST API와 JAX-RS

 

REST API란?

REST는 REpresentational State Transfer의 약어로 네트워크 상에서 클라이언트와 서버 사이의 통신을 구현하는 방법 중 하나이며, 대부분의 Open API는 REST 아키텍처를 기반으로 만들어져 있다.

클라이언트가 서버로 요청을 보냈을 때 서버가 이에 대한 응답을 보내주는 Resource의 상태를 Representation 이라고 할 수 있으며, 하나의 Resource는 여러 형태의 Representation(ex : json, xml, text, rss 등)으로 전달할 수 있는 것을 말한다.

 

원래 REST의 의미는 서버 응답을 앞에서 언급한 다양한 형태로 전달하는 개념으로 웹, 즉 HTTP의 기본 응답이 HTML인데 이를 JSON 등 다른 규격을 사용하는 것으로 접근한 것이다.

이전의 REST 방식은 원격으로 데이터를 주고받는 서비스를 구현하기 위해서는 별도의 프로토콜을 가지는 클라이언트-서버 통신 프로그램을 개발해야 했다.

이 과정에서 인증이나 보안, 서버 프로그램의 성능과 안정성과 같은 여러 문제를 개발자에 의존해 해결해야 했다.

이러한 서버 프로그램에 기존 웹 기술을 사용하는 발상은 획기적이었고, 프런트엔드 중심 개발의 발전과 함께 REST 혹은 RESTful API 형태로 정착하게 되었다.

 

RESTful이란?

일반적으로 REST 원칙을 따르는 시스템이며 웹 기반으로 구현된 서비스이므로 RESTful 웹 서비스라고도 한다.

REST 자체는 특정 언어나 컨테이너를 요구하지 않기 때문에 다양한 언어와 서버 소프트웨어를 통해 구현할 수 있다.

 

REST API의 동작구조는 다음과 같다.

 

이러한 구조를 통해 날씨 정보를 제공하는 REST API 서비스를 활용하면 웹 화면은 물론이고 스마트폰 앱, 냉장고 모니터 등에서도 날씨 정보를 보여주는 것이 가능하다.

 

JAX-RS란?

자바에서 REST API 개발을 위한 서버 프로그램의 표준 규격이다.

현재 자바 웹 개발에서 REST API를 구현하는 방법은 JAX-RS 또는 스프링 프레임워크의 RestController를 사용하는 방법이 있다.

호환성을 위해서라면 JAX-RS를 사용하는 것이 좋고 스프링만 사용한다면 스프링의 RestController를 사용하는 것이 편리하다.

 

// JAX-RS 를 사용한 경우
@Path(" / addrbook")

public class RestApiService {
   Logger logger = Logger.getLogger("RestApiService");
   AddrBookDAO dao = new AddrBookH2DAO();

   @GET
   @PATH("list")
   @Produces(MediaType.APPLICATION_JSON)
   public List<AddrBook> getList() {
      List<AddrBook> datas = dao.getAll();
      logger.info("API call: /list ");
      return datas;
   }
}

 

@PATH("/addrbook") : 현재 클래스에서 처리할 URL의 진입점을 의미한다. 예를 들어 전체 경로는 context root/api/addrbook 이 된다.

@GET : 지정된 URL 요청을 GET 방식으로 호출했을 때 동작하도록 한다.

@Path("list") : 메서드가 실행될 URI를 요청한다. 전체 경로는 context root/api/addrbook/list 다.

@Produces(MediaType.APPLICATION_JSON) : 리턴되는 데이터를 JSON 형식으로 지정한다.

 

@로 시작하는 Java Annotation 을 사용해 클래스와 메서드에 필요한 정보를 제공하는 것만으로 별도의 데이터 변환 과정 없이 손쉽게 API 서버 프로그램 개발이 가능하다.

 

참고로 앞의 코드를 그대로 사용하고 REST API만 스프링 프레임워크를 사용하는 경우 다음과 같이 작성할 수 있다.

 

// Spring framework 를 사용한 경우
@RestController
@RequestMapping(" /addrbook")
public class RestApiService {
   Logger logger = Logger.getLogger("RestApiService");
   AddrBookDAO dao = new AddrBookH2DAO();

   @GetMapping("list")
   public List<AddrBook> getList() {
      List<AddrBook> datas = dao.getAll();
      logger.info("API call: /list ");
      return datas;
   }
}

 

 

스프링 프레임워크와 자바 웹 개발    

 

스프링 프레임워크란?

자바 웹 개발에서 빼놓을 수 없는 것이 바로 스프링 프레임워크이다.

자바 웹 개발의 핵심은 자바와 서블릿이라 볼 수 있지만 학습용이 아닌 실제 기업에서 개발하는 서비스의 경우 성능과 안정성, 보안, 다른 서비스와의 연계 등 단순한 기능 외에 고려할 사항이 많다.

스프링 프레임워크는 자바 기반의 오픈소스 프레임워크로 Java EE에서 요구하는 수준의 복잡한 기능을 Java EE를 사용하지 않고 구현하고자 시작한 것이다.

 

스프링 프레임워크에서 사용되는 주요 특징은 다음과 같다.

  • 경량 컨테이너 : 객체 생성, 소멸과 같은 생명 주기를 관리하며 스프링 컨테이너로부터 필요한 객체를 얻어 올 수 있다.
  • 제어의 역행 지원 : 메서드나 객체의 호출 제어권이 사용자가 아닌 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출한다.
  • 의존성 주입 지원 : 각 계층이나 서비스 간에 의존성이 존재할 경우 프레임워크가 서로 연결해준다. 
  • 관점 지향 프로그래밍 지원 : 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

 

스프링 부트란?

스프링 프레임워크 프로젝트를 손쉽게 시작할 수 있도록 하며 개발과 관련한 스프링 구성요소를 편하게 관리할 수 있도록 한다.

주요 특징으로는 리액티브 스택(Reactive Stack)과 서블릿 스택(Servlet Stack)을 구분하고 있다.

  • 서블릿 스택 :  서블릿 API에 기반한 동기 방식의 블로킹 I/O 구조를 사용하며 하나의 요청은 하나의 스레드로 처리한다.
  • 리액티브 스택 : 새로운 비동기 논블로킹 I/O 구조를 사용하며 멀티코어 시스템의 장점을 살리고 대규모 사용자 접속을 처리하는 데 유용한 구조로 설계되었다.

 

리액티브 스택은 다음과 같은 구현에 적합하다.

  • 비동기 논블로킹 리액티브 개발
  • 효율적으로 동작하는 고성능 웹 애플리케이션
  • 서비스 간 호출이 많은 마이크로 서비스 아키텍처 구현

 

동기(블로킹) 방식이란?

요청 후 응답을 받기까지 대기하는 방식을 말한다.

대기하는 동한 다른 일을 처리할 수 없는 상태가 되어 요청에 시간이 걸리는 경우 비효율적인 방법이다.

 

비동기(논블로킹) 방식이란?

즉각적인 응답 결과가 필요 없는 경우 요청 후 응답을 기다리지 않고 다른 일을 하다가 응답이 오면 그때 해당 응답을 처리하는 방식으로 대기시간 없이 다른 일을 할 수 있다는 장점이 있다.

 

예를 들어 고객센터에서 전화해서 질문을 하고 센터 직원이 잠시 알아보겠다고 하고 대기하라고 하면 계속 전화기를 들고 기다려야 하는 것이 동기 방식이고, 센터 직원이 알아본 후 전화하겠다며 전화를 끊고 나중에 다시 전화해 알려주는 형식이 비동기 방식이다.

 

'JSP' 카테고리의 다른 글

JSP의 기초  (0) 2021.12.29
서블릿 프로그래밍  (0) 2021.12.28
서블릿의 이해  (0) 2021.12.28
ToDo 리스트 앱 만들어보기  (0) 2021.09.05
회원 가입 폼 만들어보기  (0) 2021.09.05
Comments