베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 코드업
    • java
    • 스레드
    • dfs
    • 알고리즘
    • jpa
    • 자바8
    • BFS
    • 데이터베이스
    • leetcode
    • 함수형인터페이스
    • 이펙티브자바
    • 스프링
    • 운영체제
    • Spring
    • 백준
    • C++
    • 자바
    • 스프링시큐리티
    • 토비스프링

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    Spring/개념

    [Spring] 요청 파라미터

    2022. 4. 29. 15:17

     

    HttpServeltRequest의 request.getParameter()를 사용하면 두 가지 요청 파라미터를 조회할 수 있다. GET 쿼리 파라미터, POST HTML Form 전송 방식이든 둘다 형식이 같으므로 구분없이 조회할 수 있다.

     

    RequestParam

    @ResponseBody
    @RequestMapping("/request-param")
    public String requestParam(
        @RequestParam("username") String memberName,
        @RequestParam("age") int memberAge
        return "ok";
    }

     

    1. RequestParam의 이름와 변수명이 같으면 생략할 수 있다.

    @ResponseBody
    @RequestMapping("/request-param")
    public String requestParam(
        @RequestParam String username,
        @RequestParam int age,
        return "ok";
    }

     

    2. 필수 파라미터 선언

       required 메소드를 이용 -> true가 기본값. 없으면 오류

    @ResponseBody
    @RequestMapping("/request-param")
    public String requestParam(
        @RequestParam(required = false) String memberName,
        @RequestParam int memberAge
        return "ok";
    }

      /request-param?username=이라고 들어오면 빈 문자로 통과된다. 즉, required=true이어도 이를 분리 할 수 없다. 또 한 age에 값이 안들어오는 경우 에러가 발생하는데 이는 int에는 null값이 들어갈 수 없기 때문이다. 따라서 Integer로 바꿔야 한다. 이들을 모두 해결하는 방법으로 defaultValue메소드를 이용할 수도 있다.

     

    ModelAttribute

       실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어준다.

    @RequestParam String username
    @RequestParam int age
    
    HelloData data = new HelloData();
    data.setUsername(username)
    data.setAge(age);

     

    스프링은 이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다.

    1. 먼저 요청 파라미터를 바인딩 받을 객체를 만든다.

    @Data
    public class HelloData {
        private String username;
        private int age;
    }

     

    2. @RequestParam대신 @ModelAttribute와 1번에서 만든 객체를 넣어준다.

    @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttribute(@ModelAttribute HelloData helloData) {}

     

    [동작 과정]

    스프링 mvc는 @ModelAtrribute가 있으면 다음을 실행한다.

    1. HelloData 객체를 생성한다.

    2. 요청 파라미터 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력 (바인딩) 한다. 

    3. 파라미터 이름이 username이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다. 

     

    ModelAttribute와 RequestParam의 생략

       @ModelAttribute와 @RequestParam은 생략할 수 있다. 그러면 이 둘을 스프링은 어떻게 구분할까?

    -> 스프링은 해당 생략시 다음과 같은 규칙을 적용한다.

    1. String, int Integer 같은 단순 타입 = @RequestParam

    2. 나머지 = @ModelAttribute(argument resolver로 지정해둔 타입 외)

     

      'Spring/개념' 카테고리의 다른 글
      • [Spring] JWT토큰 개념
      • [Spring] BindingResult를 이용한 검증
      • [Spring] 쿼리 파라미터 매핑
      • [Spring] RequestMapping과 Controller
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바