본문 바로가기

백엔드 개발/SpringMVC

서블릿과 JSP (1)

<개요>

1. 서블릿과 컨트롤러의 비교 

2. 서블릿의 생명주기

3.JSP란? 

4. JSP와 서블릿의 비교 

5.JSP 호출 과정

6.JSP와 서블릿으로 변환된 JSP의 비교 

7.JSP의 기본 객체 

 

 

1. 서블릿과 컨트롤러의 비교

: 스프링 프레임워크는 서블릿에서의 불편한 점을 개선한 버전이다. 

둘의 차이점을 말해보겠다. 

비교 서블릿 컨트롤러
Mapping @WebServlet 어노테이션을 사용 

이는 @Controller와 @RequestMapping의 기능이 합쳐진 어노테이션이다.
 
클래스 단위로만 매핑이 가능하다. 
따라서 요청 마다 클래스를 새로 만들어야 해서 사용 코드량이 커질 수 있다.
@Controller로 클래스를 서버에 등록하고, @RequestMapping을 이용하여 Method와 요청 주소를 Mapping 한다. 

매소드 단위로 매핑이 가능해서 하나의 클래스 안에 여러가지 매핑을 연결할 수 있어 효율적이다. 
상속 HttpServlet이라는 부모 클래스를 무조건 상속 해야한다. 상속이 필요 없다.
매개변수 HttpServletRequest와 HttpServletReponse라는 클래스의 객체를 매개변수로 받아야 한다. 

유연하지 못하다.

매소드 이름도 무조건 service여야 한다.
Request 객체 내의 변수나 자기가 필요로 하는 객체만 골라 매개 변수로 받을 수 있다. 

객체안의 변수도 형변환 하여 바로 받을 수 있게 되어있어 편리하다. 

둘의 공통점을 말해보겠다. 

둘 다 하나의 요청에 관해 하나의 인스턴스만 사용한다. 

이것을 singleton이라 그런다. 

그렇게 하는 이유는 다음과 같다. 

클라이언트가 브라우저를 통해 요청을 할 때, 그 클라이언트가 누구든 간에 원하는 서비스는 같기 때문이다. 

따라서 요청 마다 객체를 만들어서 대응하기보단 이미 만들어놓은 객체를 재활용 하는 것이 훨씬 효율적이다. 

 

예를 들어 twodice같은 경우 클라이언트가 누구든 원하는 서비스는 주사위를 돌려서 값을 보여주는 것이다. 

yoilteller 같은 경우도 클라이언트가 누구든 간에 원하는 서비스는 날짜를 입력하면 그에 맞는 요일을 보여주는 것이다. 

2. 서블릿의 생명주기

 

서블릿엔 크게 3가지 매소드가 있다. 

init() - 초기화 매소드 : 서블릿이 생성되거나, 서블릿 내용 중 변경 사항이 생겨 업데이트 해야할 경우에만 호출된다. 

service() - 일처리 하는 부분 

destroy() - 서블릿이 메모리에서 제거되는 경우 (프로그램이 종료되거나, 변경 사항이 생겨 업데이트 해서 다시 써야하는 경우)에 한번만 수행된다. 

 

init()과 destroy()는 servlet container 에서  필요 상황에 자동으로 호출해서 실행시켜 주므로 우리는 그 내용물만 채우면 된다. 

<서블릿의 작동구조>

ㄱ. 요청이 들어온다.

ㄴ. Servlet Context에서 요청을 받아본 뒤 해당 요청을 처리할 서블릿 인스턴스가 존재하는지 찾아본다. 

      (이 때, children 이란 map형 자료를 뒤져본다. childern안에는 서블릿 이름이랑 해당 서블릿이 객체를 가지고 있는지

        key, value의 표로 가지고 있다.)

ㄷ-1. ( 표 뒤져봤는데 해당 서블릿의 객체가 있는 경우)

          이미 객체가 만들어져 있으므로 생성, 초기화 과정 안 거치고, 만들어진 객체의 service() 매소드만 이용한다. 

          service() 매소드에서 요청에 맞는 처리 결과를 만들어 응답한다. 

ㄷ-2 ( 표 뒤져봤는데 해당 서블릿의 객체가 없는 경우 )

        Servlet Context에서 서블릿의 클래스(해당 서블릿의 정보가 담겨 있는 곳)를 로딩하고, 정보를 이용하여 인스턴스를

       생성한다. 그 뒤 init() 초기화를 하고, service() 매소드를 실행하여 요청 처리 후 응답한다. 

3.JSP란? 

JSP는 Java Server Page의 약자이다. 

HTML 안에 Java 코드를 적어놓은 것을 의미한다. 

 

서블릿과 거의 동일어 이다. JSP를 실행하면 서블릿으로 변환되어 서블릿으로서 작동한다. 

 

JSP는 어노테이션 써서 매핑해줄 필요가 없다. 자동으로 매핑이 되기 때문이다. 

그냥 주소 맨 끝에 파일 이름과 확장자를 적어주면 된다. 

4. JSP와 서블릿의 비교 

JSP와 서블릿을 비교해서 설명하겠다. 

JSP에서 HTML에 Java code를 넣을 때는 몇 가지 규칙이 있다. 

 

(1)

먼저 <%~~~%>안에 java 코드를 써야 한다. <%~~%>안에 코드를 쓰면 해당 내용은 서블릿으로 변환될 때, service() 매소드 안에 적힌다.

위를 보면 왼쪽에 <%~~%>안에 쓰인 값이 service 매소드 안에 들어간 것을 볼 수 있다. 

 

(2)

그렇다면, service 매소드 밖에 클래스의 인스턴스 변수, 클래스 변수, 또 다른 매소드를 쓰고 싶을 땐 어떻게 해야할까? 

<%! ~~ %> 안에 적어주면 된다. 이러면 클래스 안, service() 매소드 밖에 적힌다. 

 

(3)

JSP가 서블릿으로 변환될 때 모든 HTML 태그는 out.printin(""); 안에 들어가게 된다. 

 

(4)

위의 예시에서 <%=idx1%>와 같이 이미지 주소를 매소드 내 변수에 따라 바꾸도록 하려는 부분이 나온다. 

<%=변수%>를 적으면 해당 변수의 값이 반환된다.

5.JSP 호출 과정

JSP의 호출과정은 서블릿의 작동구조와 거의 같다. 

해당 요청에 맞는 서블릿 인스턴스가 존재하는지 확인해보고 

없으면 해당 요청에 맞는 jsp를 서블릿으로 변환 후 , 컴파일 한다. 

컴파일 하면서 생긴, 서블릿의 클래스 파일을 이용해 객체를 만든다. (클래스 파일은 해당 클래스의 모든 정보가 담긴 곳)

이제 생성된 서블릿 인스턴스는 위에서 배운 서블릿 작동 구조에 맞게 초기화, service 처리 를 거쳐 클라이언트에게 응답한다.

인스턴스가 있으면 바로 서블릿의 service()를 이용해 처리하고 그 결과를 클라이언트에게 보내 응답한다.

 

**서블릿 작동구조와 차이점** 

작동구조와 거의 같은데 차이점은 서블릿이나 매소드의 이름이 다른 것이다. 

twoDice.jsp를 변환하니 twoDice.java가 아닌 twoDice_jsp.java가 나온다. 매소드 이름도 같은 역할을 하는데 조금씩 틀리다. 알아만 두자. 

6.JSP의 기본 객체 

: JSP에서 생성 없이 사용할 수 있는 객체를 뜻한다.

위 사진을 보면 request 객체를 선언한 선언부가 없다. 

이게 가능한 이유는 해당 JSP 파일이 변환되어 들어가는 서블릿의 service() 매소드 내부에 기본 객체들이 모두 지역 변수로서 선언이 되어있기 때문이다. 

앞에서 살펴봤듯이 <%~~%>의 내용은 service()매소드 안으로 들어간다. 

근데 service() 매소드안에 기본객체들은 전부 미리 선언이 되어있으므로 jsp 파일에서 객체 선언을 안 했더라도 변환되어 들어가면 선언된 내용 밑으로 들어가 에러 없이 작동하게 된다.