본문 바로가기

신세계 - Spring 공부

14주차 배운점 - 톰캣, 서블릿, JSP

728x90
반응형

 

 

톰캣 설치, 설정

 

Tomcat 8 -> 64-bit Window zip

 

 

 

 

실행하여 설치

 

 

 

 

8090으로 변경

 

 

서블릿 : 웹에서 동작하는 클래스

 

프로젝트 생성

 

 

Edit Configurations..

 

 

17선택

 

 

explodead


/ 로지우기

 

 

run클릭

 

 

 

업데이트된부분만 반영해서 적용해라, 한글 설정


-Dfile.encoding=UTF-8

 

 

 

 

스프링부트는 서버가 내장되어 있다. 프로젝트 만들때 서버기능이 내장되어 있어서 제한되어 있는 부분이 있다.

 

항상 한글 체크


setting - editor - file encodings : utf-8 변경

 

 

help - edit custom vm options...

 

 

 

 

웹기본 동작

 

-Request(요청) / Response(응답)
브라우저에서 자신이 원하는 정보를 전달하기 위해 두가지 방식을 이용한다.

1) GET 방식 : 주소창에 직접 원하는 데이터를 적거나 링크를 클릭해서 호출

2) POST 방식 : 입력화면에서 필요한 내용을 작성한 후에
'전송(submit)' 같은 버튼을 클릭해서 호출
(데이터와 주소를 따로 보내는 방식)

 

HTTP 라는 약속


프로토콜(protocol) – 데이터 교환 약속
웹은 HTTP(Hyper Text Transfer Protocol)

서버는 브라우저로 응답을 보내는데, 서버에서는 요청내용이 정적데이터인지, 동적데이터인지에 따라 다르게 처리한다.

정적데이터를 처리하는 서버: 웹서버가 담당

동적데이터를 처리하는 서버: 웹 어플리케이션 서버(Web Application Server) was

서버 사이드 프로그래밍: 동적으로 상황에 맞도록 서버에서 데이터를 만들어 보내는 방식

 

Http 메시지의 구성

 

헤더(header)와 몸체(body)로 구성
request header/request body
response header/response body

 

무상태(stateless)

 

웹은 기본적으로 지난번 상태를 기억하지 않는다.
모든 요청은 항상 새로운 요청일뿐
이를 처리하기 위한 쿠키나 세션/ Storage 방식 등이 사용됨

 

서블릿(Servlet) 기술

 

개발자가 서버에서 처리되어야 하는 기능의 일부(조각)만 작성할 수 있도록 만들어진 JavaEE 기술 스펙의 일부

 

 

동시에 여러 요청이 들어온다면 어떻게 처리할까?
서버에서 문제가 생기면 이를 어떻게 처리할까?
어떤 방법으로 데이터 전송을 최적화할 수 있을까?
분산 환경이나 분산처리와 같은 문제점이 무엇이 있고, 이를 해결하기 위한 방법

 

J2EE

Servlet 기술

 

기존 JAVA 프로그래밍과 달라지는 점

 

객체를 생성하거나 호출하는 주체가 사용자가 아닌 서블릿 컨테이너(Tomcat)가 처리 main( )을 이용해서 프로그램을 실행하지 않는다.


• 서블릿 클래스에서 생성하는 객체의 관리 자체가 서블릿 컨테이너에 의해서 관리
객체의 라이프사이클이 아닌 서블릿의 라이프사이클에 대한 이해가 필요


• 서블릿/JSP의 코드 개발은 기본적인 자바 API와 더불어 서블릿 API도 같이 사용
서블릿 API를 활용해야 하므로 서블릿 관련 라이브러리의 필요

 

 

 

JSP 기술

 

 

JSP는 ‘Java Server Pages’의 약자로 서블릿 기술과 동일하게 동적으로 서버에서 데이터를 구성하는 기술
Servlet이나 JSP모두 동적으로 데이터를 생성해서 전송하는 것은 동일하지만 구현 방식은 다르다.
Servlet = ‘Java코드 + HTML’
JSP = ‘HTML + Java코드'

 

실제로 JSP는 별도의 Java 파일로 만들어져서 실행되는 방식으로 동작

 

JSP를 이용해서 GET/POST 방식 처리

 

GET방식은 눈에 보이는 용도. 링크를 통해 다른 사용자들에게 알려줄 수 있는 용도. 주로 입력과 조회 처리

 

 

 

http://localhost:8090/calc/input.jsp

 

 

 

<form>태그와 POST 방식

 

<form>태그는 ‘입력양식’자체를 의미
한번에 여러 개의 데이터를 묶어서 전송(submit)
<form>태그에 action 속성은 데이터를 어디로 전달할 것인지 목적지를 지정
action 속성값이 지정되지 않으면 현재 URL그대로 전송
method 속성값은 데이터를 GET/POST방식으로 전송할 것인지 결정- 기본값은 GET

 

쿼리 스트링(query string)

 

특정한 주소(URL)에 포함된 추가적인 데이터
GET방식의 경우 ‘?’뒤에 ‘키(key)=값(value)’의 형태로 구성
동일한 키(key)가 여러 번 나올 수 있다.
문자열로만 전송 가능
POST 방식의 경우 동일한 문자열이지만 전송되는 위치가 다르다.
서버사이드 프로그래밍에서는 쿼리 스트링에 있는 키(key)들을 파라미터 라고 한다.

 

브라우저내 개발자 도구를 이용하면 브라우저에서 보내는 데이터들을 확인할 수 있다.
Payload 항목을 통해서 확인 가능

 

GET/POST 방식의 비교

 

JSP의 올바른 사용법

 

JSP는 기본적으로 GET/POST의 구분이 없다
POST 방식으로 호출하는 경우에 대해서 추가적인 코드 필요
JSP파일의 이름이 변경되면 관련된 모든 링크를 수정해야 하는 불편함
JSP를 제한적인 용도로 사용하기 시작
쿼리스트링에 대한 처리는 Serlvet에서 JSP는 입력화면과 조회(결과)화면으로만
링크는 Servlet을 통해서 처리하고 JSP에서는 화면만 처리

 

 

MVC 방식과 Serlvet/JSP

 

Servlet의 장점: Java코드를 자유롭게 사용할 수 있고, 상속이나 조합등 모든 처리가 가능
JSP의 장점: 복잡한 화면 구성을 위한 처리에 유용

 

 

Web MVC

 

기존 어플리케이션에서 사용하던 MVC(model-view-controller)패턴을 웹으로 이식
Request를 처리하는 Controller는 서블릿으로 화면은 JSP로

 

 

Web MVC의 원칙

 

브라우저의 모든 호출은 반드시 컨트롤러를 향한다.
서블릿은 내부적으로 화면을 결정하므로 나중에 URL이 변경될 일이 없다는 장점
JSP는 컨트롤러를 통해서만 호출되며 컨트롤러에서 만들어진 데이터(Model)를 보여주는 용도로만 사용

GET 방식 입력 화면 설계
1. 브라우저는 /input 주소를 호출한다.
2. /input에 서블릿 InputController 호출, GET 방식일때만 동작하도록 작성한다.
3. InputController의 화면처리는 intput.jsp 를 이용하여 처리한다.
4. input.jsp는 HTML 코드를 이용하여 결과를 생성한다.

 

RequestDispatcher

 

컨트롤러(Servlet)에서 요청(Request)에 대한 처리를 배포(dispatch) 하기 위해서 사용
컨트롤러에서는 JSP로 forward( )를 이용

 

 

브라우저는 화면의 결과가 Servlet에서 나온 것인지 JSP에서 나온 것인지 알 수없다– 서버의 내부에서 Servlet ->JSP를 거쳐서 나온 결과라는 점

 

JSP파일은 WEB-INF 폴더 내에 있으므로 브라우저는 반드시 컨트롤러를 통해서만 JSP 결과를 볼 수 있다

컨트롤러 역할을 하는 서블릿 에서는 GET/POST에 따라서 doGet( )/doPost( )를 나누어서 처리할 수 있다

 

sendRedirect( )

 

POST방식 처리후 브라우저의 새로고침 문제
POST방식의 처리후에 브라우저가 다른 경로로 이동하도록 지정
사용자로 하여금 처리후 reset

 

PRG 패턴(POST-Redirect-GET)

 

사용자의 POST방식으로 컨트롤러에 원하는 작업을 처리하기를 요청
POST방식을 컨트롤러에서 처리하고 브라우저는 다른 페이지로 이동(GET)하라는 응답
브라우저의 GET방식 이동

 

 

HttpServlet

 

HttpServlet은 GET/POST 등에 맞게 doGet( ), doPost( )등을 제공하므로, 개발자들은 본인에게 필요한 메서드를 오버라이드 하는 것 만으로 GET/POST 방식 처리를 나누어서 처리할 수있다.

 

HttpServlet을 상속받은 클래스의 객체는 Tomcat과 같은 WAS의 내부에서 자동으로 객체를 생성되고, 관리되기 때문에 개발자가 객체의 관리에 신경 쓸 필요가 없다

 

HttpServlet의 동작 시에는 동시에 여러 쓰레드에 의해서 실행될 수 있도록 처리되기 때문에 개발자는 동시에 많은 사용자들을 어떻게 처리해야 하는지에 대한 고민을 줄일 수 있다

 

 

Servlet 상속 구조

 

프로토콜에 관계없이 처리할 수 있는 GenericServlet
HTTP에 특화된 HttpServlet
웹 개발 시에는 주로 HttpServlet을 상속해서 사용

 

HttpServlet의 라이프사이클

 

 

HttpServletRequest

 

HttpServletRequest는 HTTP 메시지의 형태로 들어오는 요청(Request)에 대한 정보를 파악하기 위해서 제공

 

 

HttpServletResponse

 

 

모델과 서비스 계층

 

컨트롤러에서는 화면에 필요한 데이터를 화면쪽으로 전달해주는데 이런 데이터들을 담당하는 객체를 모델(Model)이라고 함


JSP로 전달된 모델은 EL등을 이용해서 처리
JSP에서는 EL과 JSTL을 이용

 

 

표현 계층: 실제 화면 처리를 담당하는 객체들로 이루어진 계층으로 앱의 화면이나 GUI화면의 화면들, 웹 MVC등이 이에 해당

 

서비스(비즈니스) 계층: 고객의 요구사항을 반영하고 각 기능들에 대한 API를 제공하는 계층. 모든 기능에 대한 입력과 출력을 정의한 객체들로 구성

 

영속 계층: 오직 데이터의 관리만을 목적으로 하며 데이터베이스나 네트워크, 파일 처리등의 연결을 담당하는 객체들로 구성

 

 

계층의 데이터 전달을 위한 DTO

 

Data Transfer Object의 약어
여러 개의 데이터를 묶어서 하나의 단위 객체로 구성하기 위해서 주로 사용
서비스나 컨트롤러의 경우 오랜 시간 유지되는데 비해 DTO는 아주 짧은 생명주기
DTO의 구성 규칙 – Java Beans 규칙 준수
최소한의 규칙
생성자가 없거나 반드시 파라미터가 없는 생성자 함수를 가지는 형태
속성(멤버 변수)은 private으로 작성
getter/setter를 제공할 것

 

 

TodoRegisterController

 

@WebServlet(name = "TodoRegisterController", urlPatterns = "/todo/register")
//서블릿을 URL에 매핑
public class TodoRegisterController extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/todo/register.jsp");
        // jsp 파일과 연결
        requestDispatcher.forward(request,response);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException,ServletException{
        resp.sendRedirect("/todo/list");
    }
}

 

@WebServlet(name = "TodoRegisterController", urlPatterns = "/todo/register")
name = "TodoRegisterController"는 서블릿의 이름을 지정
이 서블릿을 "/todo/register" URL에 매핑하는 것을 의미
, 클라이언트가 "/todo/register" URL로 요청을 보내면 이 서블릿이 요청을 처리한다.
TodoRegisterController라는 이름의 서블릿을 "/todo/register" URL에 매핑하여 해당 URL로 요청이 오면 이 서블릿이 처리하도록 설정

 

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/todo/register.jsp");
현재 요청에 대한 처리를 포워드할 JSP 페이지의 경로를 설정하는 부분
WEB-INF 폴더 안에 있는 todo 폴더 안에 있는 register.jsp 파일을 가리킨다.

 

requestDispatcher.forward(request,response);
현재 요청을 다른 서블릿이나 JSP 페이지로 전달하는 역할
"/WEB-INF/todo/register.jsp"로 요청이 포워딩된다.

 

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException,ServletException{
resp.sendRedirect("/todo/list");
doPost 메서드는 클라이언트로부터 POST 요청이 올 때 실행되는 메서드
요청을 처리하고 나서 클라이언트를 다른 페이지로 리다이렉션하는 역할

 

 

register.jsp

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/todo/register" method="post">
  //사용자의 입력을 받아 서버로 전송
    <input type="text"  name="INSERTTITLE">
    <p>
        <input type="datetime-local" name="datetime=local">
      // 제목입력
    <p>
        <button type="submit" name="RESET">RESET</button>
      // submit 버튼
        <button type="submit" name="RGISTER">RGISTER</button>
      // submit 버튼
</form>
</body>
</html>
<form action="/todo/register" method="post">

 

는 HTML 폼 요소에서 사용자의 입력을 받아 서버로 전송할 때 사용

 

"/todo/register"로 설정되어 있으므로, 사용자가 폼을 제출할 때 해당 URL에 POST 요청이 전송된다.

 


 

RESET 또는 REGISTER 버튼을 누르면 RegisterController의 sendRedirect에 따라 /todo/list로 이동한다.

 

 

list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p><h1><%= "read"%></h1><a href="/todo/read">read</a></p>

</body>
</html>

 

 

read 를 누르면 href=/todo/read로 이동한다.

반응형