클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

서블릿과 JSP 개요 3 - 서블릿과 JSP에 대한 기본 개념 잡기 본문

웹 · 앱 개발/JSP & Servlet

서블릿과 JSP 개요 3 - 서블릿과 JSP에 대한 기본 개념 잡기

huenuri 2024. 8. 23. 23:59

어제 저녁부터 공부를 거의 하지 않았다. 오늘 저녁에는 조금이라도 해야 할 것 같아 컴퓨터 앞에 앉았다. 이제 서블릿 1장도 얼마 남지 않았으니 마무리를 해보자!


 

 

 

두 수의 합을 구하여 결과를 출력하는 서블릿 클래스

 

1. 프로젝트를 하나 만들고 서블릿 파일 생성하기

 

패키지를 하나 만들어서 그 안에 프로젝트를 넣어주었다. JSP 프로그램은 이렇게 패키지를 만들어서 넣어주는 것이 좋다고 한다. 수업 파일과 구분하기 위해 책으로 풀어보는 예제는 webstudy라는 이름으로 만들어주었다.


 

 

 

 

2. 기본 코드 작성하기

 


 

 

 

3. 프로그램 실행해보기

 

결과가 출력되는 게 아니라 뭔가 이상한 것이 떴다. 이게 뭘까? 그 이유는 doGet() 메서드에서 기본적으로 response.getWriter().append("Served at: ").append(request.getContextPath());가 호출되기 때문이다. 이 코드가 클라이언트에 "Served at: /[프로젝트 컨텍스트]"라는 메시지를 반환하도록 한다.

서블릿의 doPost() 메서드가 실제로 계산을 수행하고 결과를 출력하는 역할을 하고 있지만, 해당 서블릿이 GET 요청으로 호출될 때는 doGet() 메서드만 실행되므로 결과를 보지 못하는 것이다.

 

문제 상황

지금 서블릿이 기본적으로 GET 요청을 처리하고 있으며, 이 요청에 대해 "Served at: /Servlet" 메시지를 반환하고 있다. 서블릿이 POST 요청으로 호출되면, doPost() 메서드가 호출되어 계산 결과를 출력한 후 doGet() 메서드를 다시 호출하고 있는 것이다.

해결 방법

POST 요청을 통해 직접 doPost() 메서드를 호출하도록 하거나, doGet() 메서드에서 doPost() 메서드를 호출하여 결과를 확인할 수 있다.


 

 

코드 다시 수정하기

 

 

이번에는 값이 제대로 나왔으나 무한 반복되고 있다.


 

 

 

다시 한번 더 수정하기

 

 

이제는 잘 출력되고 있다. 무한 반복이 되는 이유를 알게 되었다. 그건 마지막에 doGet()을 넣었기 때문이었다. 그러니까 계속해서 호출이 되었다.


 

 

 

 

서블릿에 대한 기본 개념

웹 프로그래밍에서 가장 중요한 것은 클라이언트가 어떻게 서버에 요청하는지 알아야 한다. 이것을 이해해야 서블릿의 동작 방식을 이해할 수 있기 때문이다. 수업 예제에서는 언제나 doget과 dopost를 해제하고 프로젝트를 만들기 때문에 이 부분을 잘 몰랐었다.

 

클라이언트는 서버에 get과 post 두 가지 방식 중 하나로 요청한다. 두 방식의 차이점은 다음과 같다.

전송 방식 설명
get 방식 주소 창을 타고 넘어가기 때문에 서버로 보내는 데이터를 사용자가 그대로 볼 수 있기에 보안에 취약하다. 255자 이하의 적은 양의 데이터를 전송한다.
post 방식 html header를 타고 넘어가기 때문에 보안에 강하다. 255자 이상의 대용량 데이터를 전송한다.

 

 

컴퓨터는 2진수 체계이므로 2의 8에 저장할 수 있는 최대값이 255이다보니 255자까지 저장 가능하다록 한 것이다. 서블릿 클래스에는 doGet() 혹은 doPost()가 있는데, 요청 방식에 따라 호출되는 메소드가 달라진다. get 방식으로 요청하면 doGet()이 호출되고 post 방식으로 요청하면 doPost()가 호출된다. 그렇기 때문에 요청 방식에 따라 doGet() 혹은 doPost() 메소드 내부에 호출되었을 때 해야 할 일을 써야 한다.

보통 <form> 태그를 통해 서버에 무엇인가를 전달하거나 요청하게 된다. 이를 위해 action이라는 속성값에 요청할 서블릿 이름을 기술한다. 전송 버튼이 눌리는 순간 action 속성값에 지정된 서블릿이 요청된다. method 속성 값으로 get을 기술하면 doGet() 메소드가, post를 기술하면 doPost() 메소드가 호출된다.

 

 

 

<form> 태그 외에도 HTML의 <a> 태그를 사용하여 링크를 걸어주면 서블릿은 get 방식으로 요청한 것으로 인식한다.

<a href="CallServlet"> get 방식의 요청 </a>

 

요청에 대한 처리를 위한 doGet()과 doPost() 메소드는 어떤 요청이 왔느냐에 따라 둘 중 하나가 호출된다는 것 빼고는 메소드 형태는 완전히 동일하다.


 

 

 

어떤 경우에 post 방식을 쓰고 get 방식을 쓸까?

get 방식은 서버로 데이터가 전송될 때 주소 창을 타고 넘어가기 때 문에 보안에 취약하다. 그렇기 때문에 로그인 폼을 만들면서 get 방식을 사용한다면 회원이 입력한 암호가 그대로 노출된다. 그래서 일반적인 폼에서는 post 방식을 사용하는 것이이 일반적이다. 반면 하이퍼링크를 통해서 서버가 요청되는 경우에는 무조건 get 방식으로 요청된다.

 

doGet() 메소드는 throws 절로 메소드에서 발생하는 IOException, Servlet Exception 예외를 외부에서 처리하도록 정의되어 있고 두 개의 매개 변수를 갖는다. HttpServletRequest 형으로 선언된 첫 번째 매개 변수는 클라이언트의 요청을 처리하고 HttpServletResponse 형으로 선언된 두 번째 매개 변수는 예외 처리 결과를 클라이언트에게 되돌리기(응답하기) 위해 사용된다.

서버가 요청에 대한 처리를 마치고 클라이언트에게 결과를 되돌려주기 위해서는 두번째 매개 변수인 HttpServletResponse로부터 PrintWriter 형의 출력 스트림 객체를 얻어 와야 한다.

 

또한 PrintWriter 출력 스트림 객체의 println()을 호출하면 브라우저에 HTML 코드를 보내주어 결과를 얻어 볼 수 있게 된다.

 


 

 

 

JSP

JSP는 Java Server Page의 줄인말로 자바로 서버 페이지를 작성하기 위한 언어이다. HTML과 JSP 태그로 구성되어 화면을 작성하는데 유리한 웹 프로그래밍 기술이다. 서버 페이지는 웹 서버에서 실행되는 페이지를 말하며 요청에 필요한 페이지를 위한 로직이나 데이터베이스와의 연동을 위해 필요한 것들을 포함한다.

이러한 서버 페이지에서 실행되는 로직을 구현하기 위해서는 프로그래밍 언어가 필요한데, JSP에서는 자바를 사용하고 있다. JSP에서는 자바 언어로 로직(프로그램)을 구현한다.

 

두 수에 대한 합을 구하여 결과를 출력하는 JSP

 

서블릿은 자바 코드 내부에 HTML 코드가 들어가는 구조이지만, JSP는 이와 반대로 HTML 문서 내부에 자바 코드가 들어가는 구조이다. HTML 문서 일부분에서 자바를 사용할 수 있도록 하기 위해서 JSP는 다양한 태그를 제공한다. 앞부분에서 <%@ page %> 태그가 사용되었는데, 이 태그는 해당 페이지 내에 사용되는 전반적인 환경을 결정해주는 태그이다.

<% %> 태그를 스크립트릿(scriptlet)이라고 하고 <%= %> 태그를 표현식이라고 한다. JSP 페이지에 기술한 내용은 HTML로 간주되기 때문에 자바 코드를 기술하기 위해서는 <% %> 태그 내부에 기술해야 하며, 변수에 저장된 값이나 함수의 결과값을 출력하기 위해서는 <%= %> 태그를 사용해야 한다.


 

 

 

서블릿이 필요한 이유?

지금까지 살펴본 예제에서는 로직이 복잡하지 않기 때문에 HTML 코드 중심의 구조인 JSP로 페이지를 개발하는 것이 효율적으로 보인다. 하지만 쇼핑몰과 같은 웹 애플리케이션을 개발하다 보면 복잡한 자바 코드가 기술되어야 하는데 이를 JSP 페이지에 기술해두면 디자이너가 실수로 코드를 건드려 문제가 발생하게 된다.

그렇기 때문에 실무에서는 복잡한 로직은 서블릿에 기술해놓고 결과만을 JSP 페이지를 통해 클라이언트에 제공하는 형태로 개발한다.

 

 

두 수에 대한 합을 구하는 서블릿 클래스

 

이제 JSP로 코드를 작성해보자.

 

 

 

두 수의 합을 출력하는 JSP

 

 

AdditionServlet03.java에서 두 수에 대한 합을 구하는 자바 코드를 기술하고 출력할 데이터를 request 각체의 속성값으로 저장한다. 그런 다음 서버 상에서 페이지가 이동되는 포워드 방식으로 addion03.jsp 페이지로 이동하면 이 페이지에서 request 객체에 저장된 속성값을 출력해준다.

이와 같이 로직과 표현을 분리하여 프로그래밍 하는 것을 MVC 패턴이라고 한다. 서블릿이 비즈니스 로직을 구현하는 Model 역할을 하고, JSP가 결과를 출력하는 View 역할을 하고 있다. 

 


 

 

 

 

학습을 마치고

드디어 첫번째 단원 이론 학습을 마쳤다. 오늘 공부하기 싫었지만 그래도 공부를 하니 무척 재미있었다. 뭐든 처음 시작이 힘들다. 공부가 재미없을 때는 좋아하는 방송을 틀어놓고 하면 잘할 수 있게 된다. 집중력은 조금 떨어지지만 말이다. 난 그냥 영상을 끊지 않기로 했다. 내가 가장 좋아하는 분야이기도 하고 앞으로 이 방면으로 취업을 하게 될지도 모르니까.