Servlet & jsp 연동 { el & jstl 의 등장 배경, forwarding 활용 }
Ben의 프로그램2023. 7. 17. 16:58
728x90
수업목표
서블릿과 JSP는 서로 상호 보완적인 관계를 가지고 있습니다. 서블릿은 로직을 구현하기에 알맞지만, HTML을 출력하기엔 불편합니다. JSP는 로직을 구현하는 것은 불편하지만 HTML을 출력하기엔 편리합니다. 이러한 서블릿과 JSP를 좀 더 잘 사용하기 위해서 forward가 사용되는 경우가 많습니다. 이번 시간엔 서블릿과 JSP의 연동에 대해 알아보도록 하겠습니다.
Servlet과 JSP 연동 ?
기본적으로 Servlet은 자바이기 때문에 프로그램 로직이 수행되기에 유리하며 IDE의 편의성 지원 등의 이유로 로직을 작성하기에 더 편리합니다. 반면 JSP는 HTML을 바로 작성하면 되기 때문에 out.print 를 해야하는 Servlet 보다 결과를 출력하기에 유리한 면이 있습니다. 이런 Servlet 과 JSP의 장단점을 해결하기 위해서 Servlet에서 프로그램 로직이 수행되고, 결과를 JSP 에게 forwarding 하는 방법이 사용되게 되었습니다. 이를 Servlet과 JSP의 연동이라고 합니다.
Servlet과 JSP 연동 실습
LogicServlet 에서는 1부터 100 사이의 random 한 값 2개와, 그 값의 합을 구한 후 그 결과를 result.jsp 에게 forwarding 하는 방법으로 전송하여 결과를 출력하려고 합니다.
LogicServlet 파일에 service 메서드를 오버라이드 했습니다. 우선 v1 과 v2, result 변수를 설정을 했구요. 이 값들을 별도의 jsp 파일 혹은 servlet 파일에서 forward 하기 위해서는 request 에 setAttribute 해주어야 했습니다.
forward 할 때 사용하는 객체는 RequestDispatcher 였습니다. forward 대상을 인자로 넣은 RequestDispatcher 객체를 생성하였습니다.
여기서 주의할 점이 하나 있습니다. webapp(webcontent) 디렉터리 바로 밑에 jsp 가 있으면 "/result.jsp" 로 인자를 주면 되는데, webapp/jsp/result.jsp 위치에 있다면 "/jsp/result.jsp" 로 인자를 주어야 합니다.
아무튼 생성한 requestDispatcher 의 forward 메서드를 사용하여 포워드를 진행시켜주면 됩니다. 이번에는 포워드를 받아서 사용할 jsp 파일을 생성해보겠습니다.
servlet 에서와 마찬가지로 우선 request 에 setAttribute 로 담겨진 값들을 우선 꺼내왔습니다. 그리고 표현식을 사용하여 결과를 출력해보았는데요. logicServlet 을 실행시키면 다음과 같은 화면을 볼 수 있습니다.
여기서 눈여겨 볼 점은 역시 redirect 가 아니라 forward 가 진행된 것이기 때문에 URL 은 바뀌지 않은 것을 확인할 수 있습니다. 이렇게 작성을 하면 로직은 Servlet 이 수행하게 하고 실제 화면에 표현하는 것은 jsp 에서 수행하게 할 수 있습니다.
그런데, 화면을 표시하려는 목적을 가진 JSP 의 코드를 보니까 어떤가요? java 코드가 HTML 과 함께 있죠. 이런 것은 좋지 않은 현상입니다. 목적에 맞는 코드가 목적에 맞는 파일에 존재해야 가독성과 유지보수가 쉬워지거든요. 예를 들어 디자인을 담당하는 프런트 개발자가 java 코드로 덮여있는 JSP 파일을 본다면 어떨까요. 이런 단점 때문에 el 혹은 jstl 과 같은 것들이 등장하게 되었습니다.
간단하게만 el 코드를 살펴보면 ${ } 로 setAttribute 에 담긴 값을 알아서 찾아오는 아주 간편한 코드로 바뀌게 되었습니다.
코드를 실행시켜보았습니다. 코드를 실행시켜보았더니 이전과 동일하게 동작하고 있는 것을 확인할 수 있습니다. 아주 매력적이죠. 이렇게 사용하는 것이 el 표기법입니다. JSP 코드에서는 되도록이면 Java 코드를 줄이는 것이 좋고, el 표기법과 jstl 도 그러한 목적에서 나온 것이라는 것을 꼭 알아가셨으면 좋겠습니다.
Servlet과 JSP 연동 그림으로 복기하기
클라이언트가 LogicServlet 을 요청을 하면 WAS 는 내부 로직에 따라서 forward 를 진행합니다. forward 받은 result.jsp 가 forward 받은 값들을 활용하여 결과를 만들고 해당 내용을 response 로 클라이언트에게 전달하는 이런 과정을 볼 수 있게 됩니다.