Spring MVC 또는 Servlet 기반 웹 애플리케이션에서 HttpServletRequest 객체는 Parameter와 Attribute를 사용하여 데이터를 처리합니다. 두 개념은 역할과 사용 방법에서 차이가 있으므로 정확히 이해하는 것이 중요합니다.
1. 개념
1.1 Parameter
- 클라이언트(브라우저)에서 전송된 요청 데이터를 의미.
- 주로 폼 데이터(POST 요청) 또는 쿼리 스트링(GET 요청)으로 전달된 값.
- request.getParameter() 메서드를 사용하여 읽음.
- 읽기 전용: 값을 변경하거나 추가할 수 없음.
1.2 Attribute
- 서버 내부에서 데이터를 공유하기 위해 저장하는 데이터.
- 컨트롤러, 필터, 인터셉터 등에서 설정하여 이후 요청 흐름에서 사용.
- request.setAttribute()와 request.getAttribute()를 사용.
- 읽기/쓰기 가능: 값을 설정하거나 수정할 수 있음.
2. 주요 차이점
특징 | Parameter | Attribute |
데이터 출처 | 클라이언트가 보낸 데이터 (폼 데이터, 쿼리 스트링). | 서버에서 설정한 데이터. |
읽기/쓰기 여부 | 읽기 전용 (서버에서 값을 변경하거나 추가할 수 없음). | 읽기/쓰기 가능 (서버에서 값을 설정하거나 수정 가능). |
사용 목적 | 사용자 입력 데이터를 컨트롤러에서 읽는 데 사용. | 컨트롤러 간, 또는 서버 내부에서 데이터를 공유하는 데 사용. |
수명 | 요청 수명 동안 유지 (클라이언트가 요청 시 전송한 데이터로 한정). | 요청 수명 동안 유지 (서버에서 설정한 데이터로 제한). |
메서드 | getParameter(String name), getParameterValues() 등. | setAttribute(String name, Object value), getAttribute() 등. |
다중 값 처리 | 같은 이름의 파라미터가 여러 개일 경우 배열로 처리 가능. | 다중 값 처리는 직접 구현해야 함. |
데이터 유형 | 항상 문자열 또는 문자열 배열로 반환. | 모든 Java 객체를 저장 가능. |
3. 주요 메서드 사용법
3.1 Parameter 관련 메서드
String value = request.getParameter("key"); // 단일 값
String[] values = request.getParameterValues("key"); // 다중 값
Enumeration<String> names = request.getParameterNames(); // 모든 파라미터 이름
- 예제 (쿼리 스트링: ?key1=value1&key2=value2):
System.out.println(request.getParameter("key1")); // value1
System.out.println(request.getParameter("key2")); // value2
3.2 Attribute 관련 메서드
request.setAttribute("key", "value"); // 값 설정
Object value = request.getAttribute("key"); // 값 읽기
Enumeration<String> names = request.getAttributeNames(); // 모든 속성 이름
request.removeAttribute("key"); // 값 제거
- 예제:
request.setAttribute("user", new User("홍길동", "admin"));
User user = (User) request.getAttribute("user");
System.out.println(user.getName()); // 홍길동
3.3 프로젝트 설정
- ParameterAttributeController 생성
package com.example.parameterattribute.controller;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ParameterAttributeController {
@GetMapping("/testParameter")
@ResponseBody
public String testParameter(@RequestParam String key1, @RequestParam String key2) {
return "Key1: " + key1 + ", Key2: " + key2;
}
@GetMapping("/testAttribute")
@ResponseBody
public String testAttribute(HttpServletRequest request) {
// 요청 속성 설정
request.setAttribute("user", "홍길동");
String user = (String) request.getAttribute("user");
return "User: " + user;
}
}
3.3.1 테스트 Parameter
- URL : http://localhost:8080/testParameter?key1=a&key2=b
- 응답 : Key1: a, Key2: b
⇒ URL에 포함된 쿼리 스트링을 통해 클라이언트가 서버에 데이터를 전송.
⇒ @RequestParam을 사용하여 해당 값을 메서드의 매개변수로 받을 수 있음.
3.3.2 테스트 Attribute
- URL : http://localhost:8080/testAttribute
- 응답 : User: 홍길동
⇒ 서버 측에서 요청 생명 주기 동안 데이터를 저장하는 방식.
⇒ 요청 객체의 setAttribute와 getAttribute 메서드를 사용하여 데이터를 설정하고 읽어옴.
4. 사용 사례
4.1 Parameter
1. 폼 데이터 처리:
- 사용자가 입력한 데이터를 읽어와 처리.
@PostMapping("/submit")
public String handleForm(HttpServletRequest request) {
String username = request.getParameter("username");
System.out.println("Username: " + username);
// JSP에 사용자 이름 전달하기 위해 사용
request.setAttribute("username", username);
return "result";
}
- 데이터 입력을 위해 HTML 폼 작성(/submit 엔드포인트로 POST 요청을 보냄)
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>사용자 이름 제출</title>
</head>
<body>
<h1>사용자 이름 입력</h1>
<form action="/submit" method="post">
<label for="username">사용자 이름:</label>
<input type="text" id="username" name="username" required>
<button type="submit">제출</button>
</form>
</body>
</html>
2. GET 요청 쿼리 스트링 읽기:
- 컨트롤러 메서드
@GetMapping("/search")
public String search(HttpServletRequest request) {
String keyword = request.getParameter("q");
System.out.println("Search Keyword: " + keyword);
// JSP에 검색 키워드 전달
request.setAttribute("keyword", keyword);
return "searchResult"; // searchResult.jsp로 포워딩
}
- HTML 폼 작성 (search.html)
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>검색</title>
</head>
<body>
<h1>검색</h1>
<form action="/search" method="get">
<label for="q">검색어:</label>
<input type="text" id="q" name="q" required>
<button type="submit">검색</button>
</form>
</body>
</html>
- JSP 파일 자성 (searchResult.jsp)
4.2 Attribute
1. 컨트롤러 간 데이터 전달:
- 데이터를 컨트롤러에서 설정하고, 다른 뷰나 리소스로 전달.
@RequestMapping("/forwardExample")
public String forwardExample(HttpServletRequest request) {
request.setAttribute("message", "Hello from Controller");
return "forward:/nextPage";
}
- 포워딩 받을 페이지 설정
@RequestMapping("/nextPage")
public String nextPage(HttpServletRequest request) {
// request에서 message 속성을 JSP에서 사용할 수 있도록 설정
return "nextPage"; // nextPage.jsp로 포워딩
}
- nextPage.jsp 파일 작성
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>다음 페이지</title>
</head>
<body>
<h1>포워딩된 페이지</h1>
<p>${message}</p> <!-- message를 JSP에서 사용 -->
</body>
</html>
2. 뷰에 데이터 전달:
- JSP나 Thymeleaf 같은 템플릿 엔진에 데이터 전달.
request.setAttribute("username", "홍길동");
return "userProfile"; // JSP 또는 HTML에서 username 사용 가능
3. 필터 또는 인터셉터에서 데이터 설정:
- 인증 정보를 설정하여 이후 컨트롤러에서 사용.
@Component
public class AuthFilter implements Filter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
request.setAttribute("user", new User("홍길동", "admin"));
chain.doFilter(request, response);
}
}
'Spring' 카테고리의 다른 글
Spring Web MVC - 파일 업로드와 MultipartFile (0) | 2024.12.23 |
---|---|
Spring Web MVC - WebMvcConfigurer (0) | 2024.12.23 |
Spring Web MVC - HandlerInterceptor (0) | 2024.12.23 |
리다이렉트(Redirect)와 포워드(Forward) (0) | 2024.12.23 |
Spring Web MVC - 모델(Model) 폼 데이터 처리 (0) | 2024.12.20 |