스프링의 필터를 공부하던 도중, servletRequest.setAttribute("key", "value") 형식의 코드를 볼 수 있었다. 해당 데이터가 HTTP 요청의 Header에 저장되는 코드라고 생각했지만, 뭔가 이상했다. 그 이유는 해당 객체에 setHeader라는 메소드가 따로 존재하기 때문이다.
그렇다면, ServletRequest에서의 Attribute란 무엇일까?
HTTP 환경일 경우, WAS의 서블릿 컨테이너에선 ServletRequest의 하위 객체인 HttpServletRequest가 생성setAttribute와 getAttribute 메소드 형태로 제공됨public void setAttribute(String name, Object o) //데이터 저장시 사용
public Object getAttribute(String name) //데이터 꺼낼 때 사용
생각해 보면, 사용자 데이터를 스프링에서 사용하기 위해선 컨트롤러단으로 데이터를 가져와야 한다. 요청에 대한 모든 데이터는 ServletRequest에 담겨 있으며, 이를 컨트롤러단으로 전파할 필요가 있다. 그렇기에 서블릿에 데이터 및 객체를 담을 수 있는 공간인 attribute가 있는 게 아닐까 싶다.
반면에, ServletResponse에는 attribute가 없다. 단순히 사용자에게 데이터를 보내줄 용도로만 사용되기 때문이라고 생각이 돼서 그런 것 같다.