╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Java/Jsp Servlet

[JSP Servlet] JSP Servlet 개념 및 사용 (MVC)

재안안 2022. 6. 25. 05:20

웹을 만들기위해 Jsp와 Servlet을 사용하기 전에 Jsp와 Servlet이 무엇인지 그리고 웹프로그래밍에서 MVC 패턴이 무엇인지에 대해 알아보고자 한다.

 

우선 Jsp와 Servlet의 관계를 먼저 알고 알아보는 것이 좋겠다.

 

Servlet의 단점을 보안하기위해 Jsp를 사용한다는 것이다.

 

Servlet

 

Servlet이란?

a small, server-resident program that typically runs automatically in response to user input.

 

간단하게 말하자면 API이다.

 

Java EE의 Dynamic Web Project로 웹을 만들 때 페이지에 대한 요청과 응답을 간단한 메소드 호출로 해결할 수 있게 해주는 자바 라이브러리이다. 웹페이지에 대한 클라이언트의 요청에 대한 응답을 메소드 호출로 간편하게 해 줄 수 있다. 

 

Servlet은 해당 프로젝트에서 MVC 패턴의 C를 담당한다 (Controller)

 

실제로 Servlet의 구현체는 클래스로  HttpServlet 클래스를 상속하여 구현한다. 

 

Servlet 예제

 

해당 Dynamic Web Project의 Server는 tomcat에 포트는 8000번을 사용중이고 Context root는 "/" 이다.

 

실행 결과

 

이클립스 콘솔에는 아래와 같이 나온다.

 

콘솔

 

해당 예제에서는 IndexServlet이 Servlet을 구현한 클래스이다.

IndexServlet은 HttpServlet을 상속한다. 

 

init 메소드와 destroy 메소드는 해당 클래스가 생성, 소멸 때 실행된다.

 

Servlet은 init 메소드를 통해 초기화되는데 이때 싱글톤패턴으로 만들어진다.

init 메소드는 Servlet 생성에 있어서 constructor를 담당한다.

destroy 메소드는 Servlet이 더 이상 사용되지 않을 때 호출하여 제거하는 메소드이다.

 

해당 예제에서 눈여겨봐야 할 것은 @WebServlet 어노테이션과 service 메소드이다.

 

@WebServlet("/index")는 url에 대한 설정이다.

 

해당 어노테이션은 /index와 IndexServlet을 mapping해준다.

 

 

현재 url창인 localhost:8000/index에서

localhost는 해당 서버의 ip 대용

8000은 해당 서버의 포트번호

index 어노테이션에서 설정한 값이다.

 

그래서 localhost:8000/index로 요청이 왔을 때 IndexServlet이 생성된 것이다.

원래는 web.xml에서 클래스와 url을 직접 mapping 해주어야하지만 어노테이션을 사용하는 것이 훨씬 간편하다.

 

이때 어노테이션만으로는 요청에대한 Servlet을 mapping해 주지만 응답은 해주지 못한다.

 

이때 응답은 service 메소드로 한다. Service 메소드는 아래와 같다.

 

Service 메소드

 

Service 메소드를 보면 out.println("<h1>this is index page</h1>");라는 줄이 있다. (현재 주석은 무시)

 

해당 코드로 인해 클라이언트는 아래와 같은 응답을 받았다.

 

localhost:8000/index

 

해당 코드를 보면 분명 html코드가 보인다. 그리고 실제로 html 코드의 실행결과이다.

왜냐하면 실제로 html 문서를 반환했기 때문이다.

 

PrintWriter는 응답 페이지 문서를 작성하기 위해 사용하는 클래스이고 이때 해당 클래스의 println 메소드를 사용해 응답 페이지의 문서를 작성한다. 

한줄 한줄 이렇게 적으면 결국 html문서가 완성된다.

 

사실 PrintWriter는 화면에 출력하는 용도로만 사용하는 것은 아니다.

PrintWriter의 본래 용도는 요청에 대한 response로 데이터를 전달해주기 위함이다.

 

해당 예제에서는 요청에 대한 reponse로 contentType = text/html 형식의 "<h1>this is index page</h1>" 라는 값이 응답으로 날아와 이를 html코드라고 인식해 화면에 반영하는 것이다.

 

contentType은 text, json등 여러가지 타입이 될 수 있다.

 

다시 요청에 대한 응답으로 돌아가자면,

이때 이미 작성된 html 또는 jsp문서를 요청에 대한 응답을 해줄 수 있다. 그 방법이 바로 아까 주석처리 되었던 코드이다.

Service 메소드 2

 

바로 RequestDispatcher를 사용하는 방법이다. 위의 코드는 아래의 코드를 줄여서 쓴 것이다.

 

 

이렇게하면 해당 url에 대한 모든 요청은 index.jsp 문서을 불러오는 응답을 받게된다.

 

index.jsp 문서는 아래와 같다.

index.jsp

 

그리고 이제 해당 url을 다시 실행하면 아래와 같은 결과가 나온다.

 

실행 결과

 

응답은 Servlet을 거쳐서 가기 때문에 "/WEB-INF/views/index.jsp"와같은 파일경로 및 실제 파일을 클라이언트는 접근하지 못하는 것이다.

 

그리고 WEB-INF 내부의 모든 파일은 클라이언트는 접근하지 못한다. 실제로 접근하면 아래와 같이 404에러가 난다.

이는 Tomcat에서 제공하는 기능이다.

 

404

 

Servlet은 해당 url에 대한 요청을 html 또는 jsp 문서를 이용한 응답으로 mapping 해주기 위한 API라고 이해하면 좋겠다.

 

사실 실제로 Servlet을 사용할 때는 service 메소드 대신

doGet, doPost, doPut, doDelete등 각각의 요청에 대한 메소드를 만들어 사용하지만 이는 나중에 자세하게 설명하겠다.

 

이제 JSP에 대해 알아보겠다.

 

 

JSP

 

JSP란?

Java Server Page를 뜻한다.

 

JSP는 해당 프로젝트에서 MVC의 V를 담당한다. (View)

 

위에서 index.jsp를 한번 봤을 때 html 문서와 큰 차이점이 없다는 것을 알았을 것이다.

 

HTML과 JSP의 차이점은 자바소스코드의 유뮤이다.

 

Jsp는 html문서 내부에 자바 소스코드 작성을 가능하게하는 server side script이다.

 

바로 예제를 통해 설명하겠다.

 

index.jsp

 

진짜로 html문서 안에 자바 소스코드가 보인다. 실제로 실행도 된다.

 

html 문서안에 <% %>와 같은 코드블럭을 통해 자바 소스코드를 삽입하였다.

 

실행 결과

 

html내부에 자바소스코드를 사용함으로서 동적페이지에 한 걸음 더 다가갔다.

 

이때 JSP는 Javascript를 사용하지 않고도 페이지를 동적으로 만들어주는 역할을 한다.

 

이제 저 jsp가 왜 실행되는지 설명하겠다.

 

사실 이런 코드가 실행된 것이다.

 

for(int i=0; i<3; i++) {
	out.println("<h1>메인페이지입니다.</h1>")
}

 

위에서 Servlet을 알아볼 때 잠시 봤었던 out.println 메소드이다.

JSP가 html문서를 사실 일일이 줄단위로 자바소스코드로 바꿔주고 있던 것이다.

(JSP가 server side script 라는 것을 기억하자.)

 

그래서 Html 중간에 "{" 와 "}"가 동떨어져서 존재할 수 있었던 것이다.

 

이제 Servlet의 단점을 보안하기위해 JSP를 사용한다는 말이 이해가 갈 것이다.

 

이때 JSP도 라이브러리가 있는데 라이브러리를 사용하면 HTML 외적인 기능들을 추가적으로 사용할 수 있다.

 

MVC

 

MVC 패턴은 웹 페이지 디자인 패턴중의 하나이다.

웹사이트의 기능들을 Model, View, Controller로 나눠 놓는 것을 뜻한다.

 

Model, View, Controller

 

쉽게말하자면 

 

View는 html이나 jsp와 같이 클라이언트에게 보여주는 문서를 뜻한다.

 

Controller는 Servlet과 같이 클라이언트의 요청과 응답을 이어주는 api를 뜻한다.

 

Model은 요청에 대한 로직을 수행하는 부분이라고 생각하면 이해가 쉽다. (DTO, DAO)

 

어떠한 url로 요청이 오면 Controller가 요청을 받고 Model을 통해 클라이언트가 요구한 로직을 수행한 후 View를 통해 결과를 보여주는 것이다.

 

Model에 대해서는 추후에 더 자세하게 설명하겠다.

'Java > Jsp Servlet' 카테고리의 다른 글

[JSP Servlet] 로그인 및 회원가입 구현  (0) 2022.07.06