Servlet/JSP를 공부하면서 가장 헷갈렸던 부분은 request와 response였다.
처음에는 단순히 이렇게만 이해했다.
request
→ 브라우저가 서버로 보내는 메시지
response
→ 서버가 브라우저로 보내는 메시지
큰 방향에서는 맞는 설명이다.
하지만 Servlet/JSP를 실제로 사용하다 보면 request가 단순히 브라우저가 보낸 정보만 담는 객체가 아니라는 것을 알게 된다.
request는 요청 처리용 객체다
브라우저가 서버에 요청을 보내면 Tomcat이 request와 response 객체를 만든다.
브라우저 요청
→ Tomcat
→ request 생성
→ response 생성
그리고 이 둘을 Servlet에게 넘긴다.
doGet(request, response)
여기서 HttpServletRequest는 단순한 요청 메시지 원본이 아니다.
조금 더 정확히는 다음처럼 볼 수 있다.
이번 요청을 처리하기 위한 컨텍스트 객체
즉 request 안에는 브라우저가 보낸 정보뿐 아니라, 이번 요청을 처리하는 동안 필요한 여러 정보가 함께 들어 있다.
요청 주소
요청 방식
파라미터
헤더
쿠키
세션 접근 정보
서버 내부에서 담아둔 attribute
이 점이 처음에는 헷갈렸다.
request에서 입력값 꺼내기
사용자가 form으로 보낸 값이나 URL query string 값은 getParameter()로 꺼낸다.
예를 들어 URL이 다음과 같다면,
/memos?title=hello&content=study
Servlet에서는 이렇게 꺼낼 수 있다.
String title = request.getParameter("title");
String content = request.getParameter("content");
HTML form에서도 마찬가지다.
<input name="title">
<textarea name="content"></textarea>
서버에서는 name 값을 기준으로 꺼낸다.
request.getParameter("title");
request.getParameter("content");
즉 getParameter()는 브라우저가 요청으로 보낸 파라미터 값을 꺼낼 때 사용한다.
request에는 주소도 들어 있다
request에는 입력값만 있는 것이 아니다.
요청 주소도 들어 있다.
하지만 주소는 getParameter()로 꺼내는 것이 아니다.
request.getRequestURI();
요청 방식은 다음으로 확인할 수 있다.
request.getMethod();
헤더는 다음처럼 확인할 수 있다.
request.getHeader("User-Agent");
정리하면 request 안의 정보는 종류에 따라 꺼내는 메서드가 다르다.
입력값
→ getParameter()
요청 주소
→ getRequestURI()
요청 방식
→ getMethod()
헤더
→ getHeader()
처음에는 request 안에 있는 값을 다 같은 방식으로 꺼내는 줄 알았는데, 정보의 종류에 따라 사용하는 메서드가 달랐다.
request는 저장소 역할도 한다
가장 헷갈렸던 부분은 이것이었다.
request는 브라우저가 보낸 요청인데,
왜 서버에서 request에 데이터를 저장할까?
Servlet에서는 다음처럼 데이터를 담을 수 있다.
request.setAttribute("message", "메모 목록입니다.");
이렇게 담은 데이터는 JSP에서 꺼낼 수 있다.
${message}
즉 request는 브라우저가 보낸 정보만 담는 것이 아니라, Servlet에서 JSP로 데이터를 넘기는 임시 저장소 역할도 한다.
getParameter와 setAttribute의 차이
getParameter()와 setAttribute()는 반드시 구분해야 한다.
request.getParameter("title")
이 코드는 브라우저가 보낸 값을 꺼내는 것이다.
form input 값
URL query string 값
반면 다음 코드는 서버가 request 안에 데이터를 담는 것이다.
request.setAttribute("memos", memos);
주로 Servlet에서 JSP로 데이터를 넘길 때 사용한다.
정리하면 다음과 같다.
parameter
→ 브라우저가 서버로 보낸 값
attribute
→ 서버가 request에 추가로 담은 값
이 차이를 이해해야 Servlet에서 입력값을 받는 코드와 JSP로 데이터를 넘기는 코드를 구분할 수 있다.
왜 하필 request에 데이터를 담을까
Servlet과 JSP는 같은 요청을 이어서 처리한다.
브라우저가 /memos 요청
→ Servlet이 먼저 처리
→ JSP가 이어서 화면 처리
이때 Servlet이 JSP에게 데이터를 넘겨야 한다.
예를 들어 메모 목록을 JSP에서 출력하려면, Servlet이 먼저 메모 목록을 준비해야 한다.
request.setAttribute("memos", memoService.getMemos());
그리고 JSP로 넘긴다.
request.getRequestDispatcher("/WEB-INF/views/memos.jsp")
.forward(request, response);
JSP는 같은 request를 이어받기 때문에 memos를 꺼내서 화면에 출력할 수 있다.
${memos}
즉 request는 같은 요청 처리 흐름 안에서 Servlet과 JSP가 공유하는 작업 공간으로 사용할 수 있다.
response는 왜 저장소로 쓰지 않을까
response도 Servlet에서 JSP로 함께 넘어간다.
forward(request, response)
그래서 처음에는 request와 response 둘 다 데이터를 공유하는 저장소처럼 쓰는 줄 알았다.
하지만 둘의 역할은 다르다.
request
→ 요청 정보 + 서버 내부 데이터 전달 공간
response
→ 브라우저로 나갈 응답 작성 통로
response에도 값을 설정하긴 한다.
response.setStatus(200);
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/html;charset=UTF-8");
하지만 이것은 JSP에게 데이터를 넘기기 위한 저장소가 아니다.
브라우저에게 보낼 응답 정보를 설정하는 것이다.
정리하면 다음과 같다.
request attribute
→ Servlet에서 JSP로 데이터 전달
response
→ 브라우저로 나갈 상태 코드, 헤더, 본문 작성
forward에서 request와 response를 둘 다 넘기는 이유
Servlet에서 JSP로 이동할 때 다음 코드를 사용한다.
request.getRequestDispatcher("/WEB-INF/views/memos.jsp")
.forward(request, response);
여기서 request와 response를 둘 다 넘긴다.
하지만 둘의 역할은 다르다.
request
→ JSP가 Servlet이 담아둔 데이터를 꺼내기 위해 사용
response
→ JSP가 최종 HTML을 브라우저로 보내기 위해 사용
즉 둘 다 JSP로 넘어가지만, 둘 다 같은 방식으로 저장소처럼 쓰는 것은 아니다.
Servlet에서 request로 하는 일
Servlet에서는 request를 주로 다음 용도로 사용한다.
1. 브라우저가 보낸 입력값 꺼내기
2. 요청 정보 확인하기
3. JSP에 넘길 데이터 저장하기
예를 들어 메모 작성 요청에서는 브라우저가 보낸 값을 꺼낸다.
String title = request.getParameter("title");
String content = request.getParameter("content");
목록 화면 요청에서는 JSP에 넘길 데이터를 담는다.
request.setAttribute("memos", memoService.getMemos());
즉 Servlet은 request를 읽고, 필요한 데이터를 다시 request에 담는다.
JSP에서 request로 하는 일
JSP에서는 Servlet이 request에 담아둔 데이터를 꺼내서 화면에 출력한다.
Servlet에서는 다음처럼 데이터를 담는다.
request.setAttribute("message", "Servlet에서 준비한 데이터입니다.");
JSP에서는 이렇게 출력한다.
<p>${message}</p>
흐름은 다음과 같다.
Servlet이 request에 message 저장
→ forward
→ JSP가 같은 request에서 message 꺼냄
→ HTML로 출력
즉 JSP는 request를 통해 Servlet이 준비한 데이터를 사용한다.
request의 수명
request에 저장한 데이터는 오래 유지되지 않는다.
request는 하나의 요청이 처리되는 동안만 살아 있다.
/memos 요청
→ request 생성
→ Servlet 처리
→ JSP 처리
→ 응답 완료
→ request 사라짐
새로고침하거나 다른 요청을 보내면 새로운 request가 만들어진다.
따라서 request는 장기 저장소가 아니다.
request
→ 한 요청 동안만 사용하는 임시 저장소
오래 저장해야 하는 데이터는 나중에 DB나 session 등을 사용해야 한다.
Servlet과 JSP에서 request가 사용되는 흐름은 다음과 같다.
브라우저가 /memos 요청
→ Tomcat이 request와 response 생성
→ Servlet 실행
→ Servlet이 request에서 필요한 정보 읽음
→ Servlet이 JSP에 넘길 데이터를 request에 저장
→ forward(request, response)
→ JSP가 같은 request에서 데이터 꺼냄
→ JSP가 HTML 생성
→ response를 통해 브라우저로 응답
이 흐름을 보면 request가 단순히 브라우저에서 서버로 온 메시지만은 아니라는 것을 알 수 있다.
'Project > Memo Evolution' 카테고리의 다른 글
| #23 Servlet에서 JSP로 forward하기 (0) | 2026.06.21 |
|---|---|
| #22 Tomcat으로 Servlet 실행하기 (0) | 2026.06.21 |
| #21 Java 콘솔 메모장: MemoService로 로직 분리하기 (0) | 2026.06.21 |
| #20 Java 콘솔 메모장 : String 배열에서 Memo 클래스로 변경하기 (0) | 2026.06.21 |
| #19 Java 콘솔 메모장: CRUD기능 구현하기 (0) | 2026.06.20 |