[web] Request의 Parameter와 Attribute

Minyoung kim·2024년 11월 27일

WEB

목록 보기
3/6

Spring MVC 또는 Servlet 기반 웹 애플리케이션에서 HttpServletRequest 객체는 ParameterAttribute를 사용하여 데이터를 처리합니다. 두 개념은 역할과 사용 방법에서 차이가 있으므로 정확히 이해하는 것이 중요합니다.


1. 개념

1.1 Parameter

  • 클라이언트(브라우저)에서 전송된 요청 데이터를 의미.
  • 주로 폼 데이터(POST 요청) 또는 쿼리 스트링(GET 요청)으로 전달된 값.
  • request.getParameter() 메서드를 사용하여 읽음.
  • 읽기 전용: 값을 변경하거나 추가할 수 없음.

1.2 Attribute

  • 서버 내부에서 데이터를 공유하기 위해 저장하는 데이터.
  • 컨트롤러, 필터, 인터셉터 등에서 설정하여 이후 요청 흐름에서 사용.
  • request.setAttribute()request.getAttribute()를 사용.
  • 읽기/쓰기 가능: 값을 설정하거나 수정할 수 있음.

2. 주요 차이점

특징ParameterAttribute
데이터 출처클라이언트가 보낸 데이터 (폼 데이터, 쿼리 스트링).서버에서 설정한 데이터.
읽기/쓰기 여부읽기 전용 (서버에서 값을 변경하거나 추가할 수 없음).읽기/쓰기 가능 (서버에서 값을 설정하거나 수정 가능).
사용 목적사용자 입력 데이터를 컨트롤러에서 읽는 데 사용.컨트롤러 간, 또는 서버 내부에서 데이터를 공유하는 데 사용.
수명요청 수명 동안 유지 (클라이언트가 요청 시 전송한 데이터로 한정).요청 수명 동안 유지 (서버에서 설정한 데이터로 제한).
메서드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()); // 홍길동
    

4. 사용 사례

4.1 Parameter

  1. 폼 데이터 처리:

    • 사용자가 입력한 데이터를 읽어와 처리.
    @PostMapping("/submit")
    public String handleForm(HttpServletRequest request) {
        String username = request.getParameter("username");
        System.out.println("Username: " + username);
        return "result";
    }
    
  2. GET 요청 쿼리 스트링 읽기:
    -> query parameter를 읽어옴.

    ```java
    @GetMapping("/search")
    public String search(HttpServletRequest request) {
        String keyword = request.getParameter("q");
        System.out.println("Search Keyword: " + keyword);
        return "searchResult";
    }
    
    ```

4.2 Attribute

  1. 컨트롤러 간 데이터 전달:

    • 데이터를 컨트롤러에서 설정하고, 다른 뷰나 리소스로 전달.
    @RequestMapping("/forwardExample")
    public String forwardExample(HttpServletRequest request) {
        request.setAttribute("message", "Hello from Controller");
        return "forward:/nextPage";
    }
    
  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);
        }
    }
    

0개의 댓글