안녕하세요! JSP 개발을 하다 보면 request, response, session 등 다양한 내장 객체들을 만나게 됩니다. 이 객체들이 대체 뭘 하는 녀석들인지 헷갈리셨던 분들을 위해, 이번에는 '식당' 비유를 활용해 각 객체의 역할과 기능을 명확하게 정리해 보았습니다.
이 글을 읽고 나면, JSP 내장 객체들이 어떻게 클라이언트-서버 간의 상호작용을 돕고 웹 애플리케이션의 상태를 관리하는지 명확하게 이해하실 수 있을 겁니다.
request (클라이언트의 주문서)주요 역할: 클라이언트가 서버에게 "이거 해주세요!"라고 보내는 요청에 대한 모든 정보를 담고 있는 객체입니다. 손님이 식당에 들어와서 웨이터에게 전달하는 '주문서'와 같아요. HTTP 요청의 모든 부분이 이 객체를 통해 서블릿(JSP)으로 전달됩니다.
주요 기능:
<input> 태그 등으로 사용자가 입력한 값(예: 폼 데이터)은 request.getParameter("name") 메서드를 통해 얻을 수 있습니다. 주문서에 적힌 메뉴 이름을 확인하는 거죠.request.getHeader("헤더_이름")을 통해 브라우저 정보, 사용자 언어, Referer 등 다양한 HTTP 헤더 정보를 확인할 수 있습니다. 손님이 어떤 옷을 입고 왔는지, 어디서 왔는지 등 기본적인 정보를 파악하는 겁니다.request.setAttribute("키", "값")을 통해 요청 처리 과정 중에 필요한 데이터를 임시로 저장하고 공유할 수 있습니다. 예를 들어, 서블릿에서 데이터베이스를 조회한 결과를 request에 담아 JSP로 포워딩할 때 사용됩니다. 주문서 뒷면에 주방에 필요한 특별 요청사항을 적어두는 것과 비슷하죠. 이 데이터는 하나의 요청이 처리되는 동안만 유효합니다.response (셰프의 요리 접시)주요 역할: 서블릿(JSP)이 클라이언트에게 "여기 주문하신 음식이 나왔습니다!" 하고 보낼 응답을 생성하는 데 사용되는 객체입니다. 주방장이 완성된 요리를 접시에 담아 손님에게 내보내는 것과 같습니다.
주요 기능:
response.setHeader("헤더_이름", "값")을 통해 HTTP 응답 헤더를 직접 설정할 수 있습니다. 예를 들어, 캐시 제어, 인코딩 방식 등을 지정할 수 있습니다. 접시에 음식을 담는 방식(예쁘게 플레이팅)을 결정하는 것과 비슷해요.response.sendRedirect("이동할_URL")을 사용하면 클라이언트를 다른 URL로 강제로 이동시킵니다. 로그인 성공 후 메인 페이지로 보내는 기능 등에 활용됩니다. "손님, 여기 주문하신 메뉴가 다른 식당에 있으니 그쪽으로 가세요!" 하고 안내하는 거죠.response.addCookie(쿠키_객체)를 이용해 클라이언트에게 새로운 쿠키를 보낼 수 있습니다. 마치 계산을 마치고 나가는 손님에게 식당 할인 쿠폰을 쥐여주는 것과 같습니다.session (개인 전용 짐 보관함 / 단골 고객 관리 카드)주요 역할: 클라이언트(특정 손님)가 서버에 접속해 있는 동안 상태 정보를 유지하는 객체입니다. 로그인 정보와 같이 보안이 중요한 데이터나 사용자의 장바구니 정보 등을 저장하는 데 주로 사용됩니다. 식당에 자주 오는 단골 고객을 위해 개인 짐 보관함을 제공하거나, 그 고객의 취향을 기록해둔 '단골 고객 관리 카드'라고 생각하면 됩니다.
주요 기능:
session.getId()를 통해 현재 세션의 고유한 ID를 확인할 수 있습니다. 이 ID가 쿠키에 담겨 클라이언트로 전송되며, 서버는 이 ID를 통해 어떤 클라이언트의 세션인지 구분합니다. 보관함에 붙어있는 고유 번호표죠.session.setMaxInactiveInterval(초)를 통해 일정 시간 동안 활동이 없으면 세션을 자동으로 종료시킬 수 있습니다. 오랫동안 사용하지 않는 짐 보관함을 비우는 것과 같습니다. 보안상 중요해요!session.setAttribute("키", "값"), session.getAttribute("키")로 데이터를 저장하고 가져옵니다. 짐 보관함에 물건을 넣고 빼듯이 데이터를 관리하는 거죠.application (식당의 공용 게시판 / 전체 메뉴판)주요 역할: 웹 애플리케이션 전체(식당 전체)에서 공유되는 정보를 관리합니다. 모든 클라이언트가 접근할 수 있는 공통된 데이터를 저장할 때 사용합니다. 식당 입구에 걸려있는 '공용 게시판'이나 모든 손님이 공유하는 '전체 메뉴판'과 같습니다.
주요 기능:
application.setAttribute("키", "값"), application.getAttribute("키")를 사용합니다. 오늘의 추천 메뉴, 식당 운영 시간 등 모든 손님에게 공지할 정보를 게시판에 붙이거나 확인하는 겁니다. 이 데이터는 웹 애플리케이션이 시작될 때 생성되어 종료될 때까지 유지됩니다.application.getContextPath()를 통해 웹 애플리케이션의 루트 경로를 얻을 수 있습니다. 식당의 정문 주소를 확인하는 것이죠.out (접시에 음식을 담는 행위 / 웨이터의 응대)주요 역할: JSP 페이지의 내용을 클라이언트로 출력합니다. HTML, CSS, JavaScript 코드 또는 동적으로 생성된 데이터를 브라우저 화면에 표시하는 데 사용됩니다. 셰프가 완성된 요리를 접시에 예쁘게 담아내거나, 웨이터가 손님에게 응답하는 직접적인 '행위'에 비유할 수 있습니다.
주요 기능:
out.flush()를 사용해 버퍼에 있는 내용을 즉시 클라이언트로 보낼 수 있습니다. 음식 준비가 덜 됐더라도, 급한 손님을 위해 먼저 나온 반찬을 내어주는 것과 비슷해요.print() / println(): 주로 이 메서드들을 사용하여 HTML 내용을 포함한 텍스트를 클라이언트 브라우저로 전송합니다.이외에도 page, pageContext, config, exception 객체들이 있지만, 위에서 설명드린 5가지 객체가 JSP 개발에서 가장 많이 사용되고 핵심적인 역할을 수행합니다.
이 비유를 통해 JSP 내장 객체들이 더는 어렵게 느껴지지 않으시길 바랍니다! 궁금한 점이 있다면 언제든지 댓글로 물어봐 주세요.