Controller 파라미터 타입

박영준·2023년 1월 3일
0

Spring

목록 보기
1/58

1. @Param

1) 정의

DB 에 다수의 변수를 전달할 때,
전달되는 변수들에 @Param 을 붙여서 각 변수를 구분할 수 있도록 한다.

2) 사용법

(myBatis 기준)

mapper.xml

// email, password 두 가지를 전달해야할 경우
<delete id="deleteUser">
	delete
	from user
	where email = #{userId} and password = #{password}
</delete>

mapper 인터페이스

// 전달하고자 하는 변수명 앞에 @Param 어노테이션을 추가
public void deleteMember(@Param("email") String email, @Param("password") String password);

@Param 을 붙이면, 본인이 원하는 명으로 mapper에서 사용할 수 있다.
여기서는 #{userId} 와 #{password} 로 이름 지음

3) 주의점

변수를 한 개만 전달할 할 때는 무방하나,
다수의 변수를 전달할 때는 myBatis 에서 인식을 못하기 때문에 @param을 반드시 써주는게 좋음

2. @RequestParam

1) 속성값

nametype설명
valueString파라미터 명
requiredboolean파라미터가 필수값인지 여부. 기본값은 true

2) 언제 사용

  1. HTTP GET 방식으로 전달되는 URL 의 parameter 값을 가져올때
    (페이징 처리 시 보여줄 개수 정할 때, 상품 정렬 기준 등...)

  2. URL에서 파라미터 값과 이름을 함께 전달하는 방식으로, 주로 GET 방식의 통신을 할 때 많이 사용

  3. 페이지 및 검색 정보를 함께 전달하는 방식을 사용할 때 많이 사용 (게시판 등...)

3) 사용법

예시 1

  1. 이러한 URL을 받는다.

    http://localhost:8080/student?studentId=1
  2. studentId의 값을 받고싶다면

    @GetMapping("/student")
    //studentId : 전달 인자 이름(실제 값을 표시) -> 해당 메소드에서 studentId의 값은 id라는 변수명으로 사용됨을 의미
    public String getStudentId(@RequestParam("studentId") int id) {
      return "list";
    }
    @GetMapping("/student")
    //required=false로 인해, studentId값이 필수값이 아니게 됨
    //studentId값이 넘어오지 않을 경우, defaultValue에 지정된 값인 0이 id값에 할당됨
    public String getStudentId(@RequestParam(name="studentId", required=false, defaultValue="0") String id) {
      return "list";
    }
    • 파라미터의 value로 null이 들어오는 것을 방지하기 위해, required 설정을 false로 한다. (required 설정의 default 는 true)
      → RequestParam에 key값이 존재하지 않을 경우, "BadRequest 로 4**" error 가 발생
      → key값이 존재하지 않으므로(required=false), BadRequest 가 발생하지 않게 됨
    • String형으로 데이터 타입을 변환한 이유(int id -> String id)?
      id가 ""이 들어올 경우, NumberFormatException이 발생하기 때문

예시 2

@RequestParam(value = "page", required = false, defaultValue = "1") int page
@RequestParam(value = "listSize", defaultValue = "10") int listSize

예시 3

@GetMapping("getDriver")
public String viewName( @RequestParam("name",required=false,defaultValue="")String name

3. @PathVariable

1) 정의

@Pathvariable(value="param1" String param1)
  • 파라미터를 URL 경로에 포함시키는 방법

  • 어떤 요청이든지 보낼 수 있는 값은 1개

  • 좀 더 직관적인 코드

  • @PathVariable 의 파라미터 종류는 3가지이다.

    name : 바인딩할 파라미터의 이름
    value : name의 별칭
    required : 필수 값 사용 여부 설정 (무조건 설정을 해주어야 함)

2) 언제 사용

3) 사용법

예시 1

@PathVaiable("userNum") int userNum

예시 2

  1. 다음과 같은 url로 요청이 들어올때

    http://localhost:8080/student/1
  2. @RestController
    public class StudentController { 
        @GetMapping("/student/{studentId}") 
        public String hello(@PathVariable("studentId") int id) {
            return "list"; 
        } 
    }
    • 주의! URL에 특수문자나 구분기호("" '' , . 등...) 을 사용하면 인식을 못한다.

@RequestParam 과 @PathVariable 의 공통점

  • url파라미터로 전달받은 value를 메서드의 파라미터로 받을 수 있게 해주는 어노테이션

4. @PathParam

1) 정의

@RequestParam(value="param1", required=true) String param1),
@RequestParam(value="param2", required=true) String param2)

@RequestParam 의 파라미터 종류는 4가지

  • defaultValue : 값을 설정하지 않았을 때 설정할 기본값
  • name : 바인딩 할 파라미터의 이름
  • value : name의 별칭
  • required : 필수 값 사용 여부 설정 (무조건 설정 필수!)

@PathVariable 과 @PathParam 의 차이점
@PathVariable 의 파라미터의 종류는 3가지 (default 값이 존재 X)
@PathParam 의 파라미터의 종류는 4가지 (default 값이 존재 O)

따라서,
default 값을 설정할 필요가 없다면, @Pathvariable 을 사용
default 값을 설정할 것이라면, @RequestParam 을 사용

(두 어노테이션을 모두 사용할 수도 있다.)

@PathVariable 과 @PathParam 의 공통점

  • HTTP 의 비연결성을 극복하고 데이터를 전달하기 위한 방법
  • URL 을 통해, 전달된 값을 파라미터로 받아오는 역할

@PathVariable 과 @PathParam 의 복합 사용

http://www.test.com/user/user?name=test
@PostMapping("/user/{category}")
public String save(@PathVariable("category") String category, @RequestParam(value = "name", required = false) String name){
    ....
}

5. Query Parameter

1) 정의

  • URL을 통해 넘어온 데이터를 @QueryParam ("id") String id 형식으로 변수에 저장할수 있음

  • 경로 뒤에 입력 데이터를 함께 제공

  • ? 이후에 key=value 형태로 입력

  • 다수인 경우 & 로 구분

  • 검색 기능 中 특정 '검색 조건'을 줄 수 있다

2) 사용법

예시 1

// 1개의 데이터
/board?board_num=12

// 다수의 데이터는 & 로 처리
/board?board_num=12&key=value
 

예시 2

  public String getListLink() {
	  UriComponentsBuilder builder = UriComponentsBuilder.fromPath("")
              // 필요한 패러미터를 쉽게 추가
			  .queryParam("pageNum", this.pageNum)
			  .queryParam("amount", this.getAmount())
			  .queryParam("type", this.getType())
			  .queryParam("keyword", this.getKeyword());
	  
	  return builder.toUriString();
  }
  • UriComponentsBuilder 클래스를 이용하는데,
    해당 util 은 여러 개의 패러미터를 연결해서 URL 의 형태로 만들어 준다.
    (특히, 한글 처리에 신경쓰지 않아도 된다)

예시 3

public class PageMaker {
	private int displayPageCnt = 10; // 화면에 보여질 페이지 번호 수
	private int totalDataCount; // 실제 게시물 수
	private int startPage; // 현재 페이지 기준 시작 페이지 번호 
	private int endPage; // 현재 페이지 기준 끝 페이지 번호
	private boolean prev; // 이전 버튼 활성화 여부
	private boolean next; // 다음 버튼 활성화 여부
	private Criteria cri; //page(현재 페이지), perPageNum(페이지 당 보여질 게시물의 수)
	
    ...
    
	public String makeQuery(int page, boolean needSearch) {
		UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.newInstance()
			.queryParam("page", page)
			.queryParam("perPageNum", this.cri.getPerPageNum());
		// 검색 한 경우		
		if (this.cri.getSearchType() != null) {
			uriComponentsBuilder
				.queryParam("searchType", this.cri.getSearchType())
				.queryParam("keyword", this.cri.getKeyword());
		}
		return uriComponentsBuilder.build().encode().toString();
	}
	
	...
}

Path Variable 과 Query Parameter 의 차이점

  • Path Variable : 리소스를 식별하기 위해 사용
    Query Parameter : 데이터의 정렬, 필터링 등...을 위해 사용
  • Path Variable : 해당 경로의 리소스가 없는 경우, 404 에러가 발생
    Query Parameter : 해당 경로의 리소스가 없는 경우, 빈 리스트를 반환

6. @RequestBody

1) 정의

  • HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매칭
  • RequestData를 바로 Model이나 클래스로 매핑
  • Rest API 컨트롤러에 자주 사용되는 어노테이션
  • 생략 할 수 없음: 모델로 받는 것인지 Message(본문)으로 받는 것인지 알 수가 없어, 모델로 간주해 실제로 ModelAttribute로 변환하려해 빈 모델이 담겨올수 있기 때문

2) 사용법

@RestController
public class StudentController {

  @PostMapping("/student")
  public String hello(@RequestBody Student student) {
    return "list";
  }
}

HTTP POST 요청에의해 함께 넘어오는 Student JSON 값을 Student 객체 값으로 받을수 있음

7. Map, Model, ModelMap

1) 정의

  • 요청으로 넘어온 파라미터를 받아 처리하는 것이 아닌, 모델 정보를 담는데 사용됨

  • 파라미터가 많아질 경우, 일일이 파라미터를 지정하지 않고도 Map 으로 간단하게 받아올 수 있다.

2) 사용법

예시 1

@GetMapping("test")
public void testMethod(@RequestParam HashMap<String,String> paramMap){
	
    String data = paramMap.get("testParam");

}

예시 2

  1. model객체에 "studentId"라는 값을 추가한 후, list view 로 전달하여 사용 가능

    @Controller
    public class StudentController {
    
        @Autowired
        private StudentService studentService;
        
        @GetMapping("/student")
        public String getStudentId(@RequestParam("studentId") String id, ModelMap model) {
            model.addAttribute("studentId", id);
            return "list";
        }
    }
  2. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
        <h1>학생 ID : ${studentId}</h1>
    
    </body>
    </html>

참고: Spring Controller 어노테이션과 파라미터 타입
참고: Java @Pathvariable, @RequestParam, @Param
참고: @Param 어노테이션 언제 쓰는지?
참고: [Spring] @param 사용이유
참고: @RequestParam과 @Pathvariable의 차이점
참고: [Spring] @PathVariable 과 @RequestParam 이란?
참고: @RequestParam과 @PathVariable?
참고: # queryparam , pathparam ,formparam
참고: [Web] Path Variable VS Query Parameter
참고: [Spring] 게시판 만들기(10) - 검색 기능
참고: [Spring] 24.SpringProject-검색 기능(1)

profile
개발자로 거듭나기!

0개의 댓글