검색해보면 서블릿에 대한 많은 기술적인 정의가 있지만, 나는 여기서 서블릿의 기술적 정의보단, 왜 서블릿이 필요한지에 대한 필요성에 의한 간단한 정의와 설명을 해보고자 한다.
간략히 서블릿의 필요성에 대해 정의 하자면, 서블릿은 java 프로그램이 http프로토콜에 맞춰 http request, http response를 쉽게 처리할 수 있도록 해주는 기술이다.
http 프로토콜은 위와 같이 http request와 response로 구성돼 있다. 그에 맞게 서블릿에서는 request서블릿과 response서블릿 객체를 지원한다.
http 메시지 parsing 및 조립
서블릿의 가장 핵심 기능은 앞서 말한바와 같이, http 프로토콜을 쉽게 사용함에 있다.
우리가 웹을 통해 서버와 네트워크 간에 원하는 데이터를 주고 받으려면, 80 port를 사용하여야 하고 이는 http프로토콜이기 때문에, http 프로토콜의 약속된 규칙을 사용하여 통신해야 한다. 그래서, 위의 form에 맞게 매번 데이터를 주고 받아야 한다. 그것이 몇 바이트 되지 않는 데이터라 하더라도, form에 맞게 데이터를 주고 받아야 하는 것이다.
이는 어떤 프로그래밍 언어를 사용하든지간에 마찬가지의 과제이다. 즉, 매번 위의 request메시지들을 하나씩 잘라서(parsing)해서 원하는 data를 꺼내고, 그 요청 데이터를 적절히 처리후에 요청자가 원하는 데이터를 형식에 맞게 response에 조립해줘야 하는 것이다.
하지만 매번 위의 과정을 수행하는 것에는 많은 비용과 어려움이 있고, parsing과 조립과정에서 에러 발생 가능성 또한 높아진다.
그래서 servlet은 request요청 중 필요한 정보를 request서블릿을 통해 쉽게 꺼낼수 있게 해주고 이 요청 데이터들을 가지고 로직을 수행 한 후에 response서블릿 객체를 통해 쉽게 조립할 수 있게 도와준 후에 이를 client에게 return 해주게 된다.
ex)request.getParameter(), response.getWriter().write()
쿠키, 세션이 담기는 객체로 활용
서버가 세션방식을 채택하고 있다고 한다면, 사용자가 로그인할 경우 서버로부터 세션이 담긴 쿠키를 서블릿response를 통해, response로 받게된다. 이를 가지고 서버에 요청을 할 때마다 request에 session쿠키를 넣어서 요청하게 되고, 서버에서도 request서블릿의 getSession()을 통해 쉽게 세션값을 꺼내 확인할 수 있게 된다.
임시 저장 객체로 활용
request 서블릿 객체는 최종적으로 요청자가 응답을 받기 이전까지는 서버와 프로그램내에서 유효한 객체 일 것이다. 여기에 담겨 있는 값을 서버에서는 요청이 끝나기 전까지 언제든지 원하는 값을 꺼낼 수도 있고, 원한다면 추가적으로 값을 setting할 수도 있게 된다.
그래서, request객체에서 어디서든 값을 get하는 것은 물론이고 개발자의 편의에 맞게 원하는 데이터를 set하는 목적으로도 사용된다. 이는 현업에서 실제로 많이 사용되는 방법이다.
ex)request.setAttribute("name", name)
예를 들어, 쇼핑몰 사용자가 email pw를 가지고 로그인을 했다 치자. 최초 request에는 이름 정보가 담겨있지는 않을 것이다. email pw로 로그인을 하는 인증서버에서 인증이 끝나고 나면, 쇼핑몰 메인서버로 이동을 해야 한다.
그런데, 쇼핑몰 메인 서버에서는 xxx님 환영합니다라는 문구값을 화면에 전달해야 한다고 해보자. 이때 name정보가 필요하게 되는 것이다. 그래서 인증서버에서 메인으로 request정보를 넘겨줄때 로그인과정에서 조회한 DB에서 name정보를 조회해서 name을 request에 추가적으로 set하여 메인으로 넘겨줄수가 있게 된다.
이런식으로 서블릿 객체가 임시저장객체로도 활용되는 이유는 서버에서는 request 정보가 무엇인지 항상 알아야 하기 때문에, 이 request를 여기저기 전달 -> 전달 하면서 최종 response전까지 가지고 다니게 된다. 그래서 별도의 객체를 만들어 전달할 필요없이 request에 값을 추가적으로 set하는 것이 편리하기도 하고 효율적이어서 request서블릿 객체를 저장객체로서 활용하게 되는 것이다.
'프로그래밍 > java, spring' 카테고리의 다른 글
mvc구조의 servlet, jsp와 비mvc구조의 jsp 비교 (0) | 2022.12.27 |
---|---|
서블릿방식과 spring MVC 컨트롤러의 json처리 비교 (0) | 2022.12.26 |
java에서 json파일 parsing (0) | 2022.12.19 |
JPA auto-ddl update는 컬럼 속성을 수정하지 않는다. (0) | 2022.12.14 |
추상클래스와 익명클래스 (0) | 2022.12.03 |