[Spring] 서블릿의 구조

2024. 7. 12. 23:42WebBack/Spring

기존의 코드를 서블릿 형식으로 바꾸기

 

기존의 TwoDice 코드이다. 이를 서블릿으로 바꾸려면 어떻게 해야할까?

@Controller
public class TwoDice{
	@RequestMapping("/rollDice")
	public static void main(HttpServletResponse response) throws IOException {
		int idx1 = (int)(Math.random()*6)+1;
		int idx2 = (int)(Math.random()*6)+1;
		
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("</head>");
		out.println("<body>");
		out.println("<img src='resources/img/dice" + idx1 + ".jpg'>");
		out.println("<img src='resources/img/dice" + idx2 + ".jpg'>");
		out.println("</body>");
		out.println("</html>");	
}
}

 

1. @Controller와 @RequestMapping을 @WebServlet으로 바꾼다. 

2. 서블릿은 클래스 상속을 받아야 한다. extends HttpServlet을 추가하자. (자바에서는 상속을 하나만 받을 수 있다는 점에서 Controller가 더 유용하다. 특히 매핑을 클래스 단위로 해서 URL마다 클래스를 여러개 만들어야 한다.)

3. service 메서드에는 HttpServletRequest request와 HttpServletResponse response가 항상 들어가야 한다. 그리고 service는 오버라이딩을 이용한 것이라 @Override를 써주는 것이 좋다. 

@WebServlet("/rollDice2")
public class TwoDiceServlet extends HttpServlet{
	@Override
	public void service (HttpServletRequest request, HttpServletResponse response) throws IOException {
		int idx1 = (int)(Math.random()*6)+1;
		int idx2 = (int)(Math.random()*6)+1;
		
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("</head>");
		out.println("<body>");
		out.println("<img src='resources/img/dice" + idx1 + ".jpg'>");
		out.println("<img src='resources/img/dice" + idx2 + ".jpg'>");
		out.println("</body>");
		out.println("</html>");	
}
}

 

제대로 실행되는 것을 확인할 수 있다. 그런데 왜 메서드 이름을 service로 해야할까? 이를 이해하기 위해서는 서블릿의 기본적인 메서드를 확인할 필요가 있다. 

 

 

서블릿의 구조

서블릿은 기본적으로 3가지 메서드를 가지고 있다. 

 

1. init : 서블릿을 초기화 - 서블릿을 생성 또는 리로딩할 때, 한 번만 실행됨

2. service : 호출될 때마다 반복적으로 실행됨

3. destroy : 뒷정리 작업. 서블릿이 제거될 때, 한 번만 실행

 

아래가 이를 기반으로 만든 기본 구조이다. 참고로 서블릿 콘테이너가 객체를 생성해주므로 따로 만들 필요가 없다. 서블릿은 싱글톤이기 때문에 객체를 여러개 만들어 메모리를 낭비하지 않는다. 그래서 init이 한 번만 실행된다. 

@WebServlet("/hello2")
public class HelloServlet extends HttpServlet {
	@Override
	public void init() throws ServletException {
		System.out.println("init() is called");
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("service() is called");
	}

	@Override
	public void destroy() {
		System.out.println("destroy() is called");
	}


}

 

클래스 이름을 지정하고 [source] -> [override/implement methods] -> init, service, destroy 선택으로 간단히 만들 수 있다. 

 

 

'WebBack > Spring' 카테고리의 다른 글

[Spring] JSTL를 써보자  (0) 2024.07.13
[Spring] JSP 알아보기  (0) 2024.07.13
[Spring] 자바 버전을 바꿔보자  (0) 2024.07.09
[Spring] 어떻게 view로 전달이 될까?  (0) 2024.07.09
[Spring] MVC 패턴  (0) 2024.07.09