본문 바로가기

자바 웹 애플리케이션

 

웹 애플리케이션?

 

  인터넷을 통해 웹 브라우저에서 이용할 수 있는 서비스이다. URL를 기반으로 보고 싶은 컨텐츠를 HTTP요 요청을하고 서버는 요청을 처리한 후 응답을  한다. (SNS,웹 메일, e-commerce등의 다양한 서비스)

 

  웹 브라우저는 사용자가 원하는 컨텐츠를 HTTP 요청으로 작성해서 웹 애플리케이션 서버에게 전송하고 돌려받은 HTTP 응답을 브라우저 화면에 출력한다. 웹 애플리케이션 서버는 브라우저가 전송한 HTTP요청을 분석후 사용자가 원하는 컨텐츠를 HTTP 응답으로 작성해서 브라우저에게 전송하는 기능을 제공한다.

 

  브라우저와 서버간에는 HTTP 프로토콜을 이용한다. 클라이언트가 요청을 보내면 서버가 응답하는 단순한 구조로 만들어졌다. HTTP 요청에는 컨텐츠주소(URL), HTTP 메서드(GET,POST), 요청헤더, 요청 데이터(쿼리스트링, 폼 데이터, payload)로 구성되어있다. HTTP응답에는 요청에 대한 응답결과를 알려주는 상태코드, HTTP 응답헤더, 컨텐츠가 포함되어 있다.

 

HTTP

 

1. 메서드

 

HTTP주요 메서드는 아래와 같다.

 

1. GET : 요청 URL에 해당하는 컨텐츠를 가져온다.

 

2. POST : 요청 URL에 새로운 데이터를 보낸다.

 

3. PUT : 요청 URL에 변경할 데이터를 보낸다.

 

4. DELETE : 요청 URL의 자원 삭제

 

 

2. HTTP Request

 

HTTP Request 메시지는 Request Line, Header, Body 으로 구성되어 있다.

GET /blog/post/7&page=1&size=10 HTTP/1.1
Host:spring.io
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:36.0) Gecko/
20100101 Firefox/36.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0

 

 

Request Line 

  • `HTTP 메서드 / Request target ? 쿼리스트링 / HTTP version` 으로 구성된다
  • `GET/users HTTP/1.1`
  • 쿼리스트트링은 전송 길이 제한이 있다.(브라우저의 기준에 따라 제한 있음, 익스플로러가 대략 2천자까지 가능하고 다른 브라우저는 더 길게 가능하다)
  • HTTP 메서드 : 요청의 의도를 담고 있다. (GET/ POST)
  • Request target : HTTP 요청이 전송되는 목표 주소
  • HTTP version :  버전에 따라 요청 메시지 구조나 데이터가 다를 수 있어서 ,version 을 명시한다.

 

Header

  • HTTP 요청 그 자체에 대한 정보를 담고 있다. 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송 할 수 있도록 해준다.
  • Key : Value 로 구성
  • Host : 요청이 전송되는 target의 호스트 URL 주소
  • User-Agent : 요청을 보내는 클라이언트의 정보 (브라우저 정보)
  • Accept
    • MIME 타입을 전송하는 헤더로 서버에게 원하는 컨텐츠 형태를 요구할 때 사용한다. 
    • 해당 요청이 받을 수 있는 응답 body 데이터 타입의 정보
    • 모든 타입을 허용하는 경우 `*/*`
    • MIME type : Multipurpost Internet Mail Extensions (application/json)
      • 서버 또는 클라이언트에게 전송된 리소스의 유형을 알려주기 위한 메커니즘
      • 브라우저는 리소스를 받았을 때 해야 할 기본 동작을 결정하기 위해 대게 MIME타입을 사용 
      • text/html : HTMK
      • application/ocet-stream : Binary data
      • application/json : JSON
      • application/xml : XML
      • application/pdf : PDF
  • Connection
    • 요청이 끝난 후에 클라이언트와 서버 간의 연결을 계속 유지할 것인지 끊을 것인지 알려주는 헤더
    • HTTP 요청마다 새로운 연결은 만드는게 번거롭기 때문에 요청이 계속되는 한 처음 연결을 재사용하는것이 바람직
    • keep-alive : 네트워크 연결 유지
    • close : 요청 없으니 연결 close
  • Content-Type
    • HTTP 요청이 보내는 메시지 body 타입을 알려준다
    • MIME Type
  • Content-Length : 요청이 보내는 메시지 body의 총 사이즈

 

Body

  • 요청이 전송하는 데이터를 담고 있는 부분
  • 전송하는 데이터가 없으면 body부분은 비어있다.
  • 전송길이에 제한이 없고, 보안상 감추어야 한다면 POST를 사용한다.

 

3. Status Code (상태코드)

 

  클라이언트의 요청을 받은 서버는 요청을 처리하고 요청의 상태를 클라이언트에게 응답해야 한다. 클라이언트는 응답받은 상태코드에 맞게 동작방식을 결정한다. HTTP에서는  5가지 유형의 58개 상태코드를 제공하고 있다.

 

유형 상태코드 예시
1xx / 조건부 응답

100(계속) : 요청자는 요청을 계속해야 한다.

101(프로토콜 전환) : 요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 중이다,

2xx / 성공

200(성공) : 서버가 요청을 제대로 처리했다는 뜻

201(작성됨) : 성공적으로 요청되었으며 서버가 새 리소스를 작성했다.

3xx / 리다이렉션 완료

301(영구 이동) : 요청한 페이지를 새 위치로 영구적으로 이동

302(임시 이동) : 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.

4xx / 요청 오류

400(잘못된 요청) : 서버가 요청의 구문을 인식하지 못했다.

404(찾을 수 없음) : 서버가 요청한 페이지를 찾을 수 없다. 예를 들어 서버에 존재하지 않는 페이지에 대한 요청이 있을 경우 서버는 이 코드를 제공한다.

5xx / 서버 오류

500(내부 서버 오류) : 서버에 오류가 발생하여 요청을 수행할 수 없다.

503(서비스를 사용할 수 없음) : 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없다.

 

 

 

4. HTTP Response

  Status Line, 응답헤더, 응답 본문으로 구성되어 있다. 헤더에는 쿠키가 있을때도 있는데 이는 서버가 브라우저에게 보내는 작은 기록정보이다. HTTP 프로토콜 특성상 서버는 브라우저를 기억하지 못한다. 그래서 쿠키를 통해 재방문한 브라우저를 식별한다.

HTTP/1.1 200 OK
Content-Language: ko-KR
Content-Length: 3432
Content-Type: text/html;charset=UTF-8
Date: Tue, 16 Dec 2014 10:56:19 GMT
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=C854817B9525697A7C48ACA8D1CC13DA; Path=/

Status Line

  • HTTP version / Status Code / Status Text 로 구성되어 있다.

Header

  • HTTP 요청 메시지의 헤더와 동일
  • User-Agent헤더 대신 Server헤더가 사용됨

Body

  • HTTP 요청 메시지의 body와 동일
  • 전송하는 데이터가 없으면 비어 있음

 

 


자바 서블릿과 JSP

 

소개

 

  Java EE에 속한 기술로 자바 웹 애플리케이션의 기반 기술이다. 웹 컨텐츠를 동적으로 생성하는 서버측 자바 프로그램 정도로 생각할 수 있다. 서블릿과 JSP는 Java EE컨테이너 혹은 서블릿 컨테이너 위에서 동작하게 된다. Java EE 전체 명세를 구현했다면 Java EE 컨테이너, 서블릿과 JSP 명세만 구현했다면 서블릿 컨테이너라고 부른다. 일반적으로 서블릿 컨테이너를 WAS라고 부르기도 한다.

 

 

※ Java EE(Java Enterprise Edition)

Java EE 플랫폼은 PC에서 동작하는 표준 플랫폼인 Java SE에 부가하여, 웹 애플리케이션 서버에서 동작하는 장애복구 및 분산 멀티티어 등의 기능을 추가한 플랫폼이다. J2EE라 불렁스나 버전 5.0 이후로 Java EE로 개칭

 

 

 

자바 서블릿의 동작 흐름

 

  서블릿과 URL을 연결하는 방법은 `web.xml` 이라는 배포 서술자를 작성하는 방법과 `애노테이션`을 서블릿 클래스에 선언하는 방법이 있다.

 

 

 

 

@WebServlet(urlPatterns = { "/hello" })
public class HelloServlet extends HttpServlet {

        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response)
               throws ServletException, IOException {

               request.setCharacterEncoding("UTF-8");
               response.setCharacterEncoding("UTF-8");
               String requestName = request.getParameter("name");
               String servletName = getServletConfig().getServletName();

               StringBuilder html = new StringBuilder();
               html.append("<html>");
               html.append(" <head>");
               html.append(" <title>초 간단 서블릿 개발하기</title>");
               html.append(" </head>");
               html.append(" <body>");
               html.append(" <h1>" + requestName + "님 안녕하세요.</h1>");
               html.append(" <h1>저는 " + servletName + "입니다.</h1>");
               html.append(" </body>");
               html.append("</html>");

               response.setStatus(200);
               response.setContentType("text/html; charset=UTF-8");

               PrintWriter writer = response.getWriter();
               writer.write(html.toString());

         }

}

 

 

 

  서블릿으로 들어온 요청을 URL에 맵핑 시킨 후 적절한 서블릿에게 위임을 한다. 위임받은 서블릿은 위와 같은 방식으로 요청을 처리한 후 html을 생성한다. 따라서, HTML와 같은 화면(뷰)를 구성해 줄 템플릿 엔진이 필요한데 이 역할을 `JSP`가 한다. 정확히 말하면 JSP는 템플릿 엔진으로 개발된 기술이 아니지만 템플릿 엔진을 대체하는 용도로 사용할 수 있다. 

 

 

 

JSP를 이용하면서 RequestDispatcher라는 객체에게 처리한 데이터를 주입한 request를 넘겨준다.

@WebServlet(urlPatterns = { "/improved-hello" })
public class ImprovedHelloServlet extends HttpServlet {
       @Override
      protected void service(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
             request.setCharacterEncoding("UTF-8");
             response.setCharacterEncoding("UTF-8");
             String requestName = request.getParameter("name");
             String servletName = getServletConfig().getServletName();
             request.setAttribute("requestName", requestName);
             request.setAttribute("servletName", servletName);
             RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/view/hello.jsp");
             requestDispatcher.forward(request, response);
      }
}

 

 

서블릿 컨테이너(Servlet Container)

 

  웹브라우저와 통신하기 위해 서버는 Socket을 생성 후 연결을 관리하고, HTTP 프로토콜을 분석해 요청과 응답객체를 생성하는 등의 네트워크 통신에 대한 처리가 필요한데 서블릿 컨테이너는 이 모든 기능을 제공한다. 서블릿 컨테이너는 네트워크 통신 제어(Http 요청/응답), 쓰레드(Thread) 기반 병렬처리를 지원한다. 서블릿과 JSP의 생명주기를 관리하고 다수의 웹 애플리케이션을 실행한다.

 

  스레드를 병렬로 처리하는것은 복잡하고 어려운 일이다. 이를 서블릿 컨테이너가 대신 해주므로 개발자는 서블릿 애플리케이션만 잘 작성하면 된다. 서블릿 컨테이너로 요청이 들어오면 새로운 스레드를 만든 후 요청을 처리할 서블릿을 호출한다.  서블릿의 생애주기를 관리하므로 컨테이너 종료시 서블릿을 소멸시킨다. 

 

 

 

 


  스프링 웹 애플리케이션

 

 

  스프링 프레임워크는 자바 플랫폼으로 애플리케이션을 개발하는데 필요한 하부 구조를 제공한다. 스프링이 하부 구조를 처리하므로 개발자는 애플리케이션 개발에 집중할 수 있다. 엔터프라이즈 서비스 기능을 POJO(Plaing Old Java Object) (환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트) 에게 제공하는 것이 핵심이다. (DI,AOP,PSA))

 

  스프링 5 출시된 이후 스프링 기술은 두 가지 스택으로 구성할 수 있다. `리액티브 스택`과 `서블릿 스택`이다. 리액티브 스택은 스프링 WebFlux를 이용하는데 멀티코어,차세대 프로세서를 활용하여 동시에 많은 요청을 처리하기 위해 만들어진 non-blocking I/O 웹프레임워크이다. 반면 서블릿 스택은 스프링 web MVC를 이용해서 서블릿 API를 기반으로 스레드당 하나의요청을 처리하는 모델로 synchronous blocking I/O 아키텍처가 사용된다.

 

 

 

Reactive Stack Servlet Stack
Netty, Servlet 3.1+ containers Servlet Containers
Reactive Streams Adapters Servlet API
Spring Security Reactive Spring Security
Spring WebFlux Spring MVC
Spring Data Reactive Repositiries(Mongo,Cassandra,Redis,Couchbase)

Spring Data Repositories(JDBC,JPA,NoSQL)

 

 

 

스프링 IoC 컨테이너와 빈

 

  스프링 IoC 컨테이너가 비즈니스 오브젝트와 구성 메타데이터를 바탕으로 애플리케이션 구성 및 생애를 관리한다.  이때 컨테이너에 의해 인스턴스화 및 조립 후 관리되는 객체를 빈(Bean)이라고 한다. IoC 컨테이너는 빈 생성/초기화/소멸 등의 생명주기를 관리해준다. 이때, 의존관계는 반드시 DI를 통해서 해야한다. 

 

  애플리케이션 구성 정보(의존 관계), 다양한 메타 데이터 표현, 애노테이션 등의 구성 메타데이터(Configuration MetaData)를 스프링 컨테이너에게 제공하고 IoC 컨테이너가 이 정보를 토대로 조립시킨다.

 

 

스프링 AOP

애플리케이션 전반에 걸쳐 필요로하는 횡단 관심사(트랜잭션,보안,로깅)를 모듈화시켜서,  공통으로 처리되도록 한다. 비즈니스 로직에 집중할 수 있도록 도움을 준다.

 

스프링 PSA

 

   환경과 구현 기술의 변경과 무관하겍 일관된 방식으로 기술을 다룰수 있게 해준다. 엔터프라이즈 애플리케이션에 사용되는 다양한 기술으 서비스 추상화가 제공된다. 대표적으로 트랜잭션,캐시,메일,메시징,OXM(Object/Xml Mapping)등이 추상화 되어있다. 예를들어 캐시를 이용하려면 `CacheManager`라는 캐시 서비스 인터페이스를 구현한 구현체 클래스를 이용해서 기능을 구현하면 된다. 캐시 구현기술을 CacheManager를 이용하므로 구현 기술이 변경되어도 비즈니스 객체는 영향을 주지 않는다.

 

 

'Spring & Spring Boot' 카테고리의 다른 글

Feign Client  (0) 2020.10.08
스프링 - 비동기 처리 @async  (0) 2020.08.16
컨트롤러 테스트 @WebMvcTest vs @SpringBootTest  (0) 2020.07.16
RequestContextHolder  (0) 2020.06.29
스프링 웹 프로그래밍 (2)  (0) 2020.02.22

댓글