DB 에 다수의 변수를 전달할 때,
전달되는 변수들에 @Param 을 붙여서 각 변수를 구분할 수 있도록 한다.
(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} 로 이름 지음
변수를 한 개만 전달할 할 때는 무방하나,
다수의 변수를 전달할 때는 myBatis 에서 인식을 못하기 때문에 @param을 반드시 써주는게 좋음
name | type | 설명 |
---|---|---|
value | String | 파라미터 명 |
required | boolean | 파라미터가 필수값인지 여부. 기본값은 true |
HTTP GET 방식으로 전달되는 URL 의 parameter 값을 가져올때
(페이징 처리 시 보여줄 개수 정할 때, 상품 정렬 기준 등...)
URL에서 파라미터 값과 이름을 함께 전달하는 방식으로, 주로 GET 방식의 통신을 할 때 많이 사용
페이지 및 검색 정보를 함께 전달하는 방식을 사용할 때 많이 사용 (게시판 등...)
이러한 URL을 받는다.
http://localhost:8080/student?studentId=1
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";
}
@RequestParam(value = "page", required = false, defaultValue = "1") int page
@RequestParam(value = "listSize", defaultValue = "10") int listSize
@GetMapping("getDriver")
public String viewName( @RequestParam("name",required=false,defaultValue="")String name
@Pathvariable(value="param1" String param1)
파라미터를 URL 경로에 포함시키는 방법
어떤 요청이든지 보낼 수 있는 값은 1개
좀 더 직관적인 코드
@PathVariable 의 파라미터 종류는 3가지이다.
name : 바인딩할 파라미터의 이름
value : name의 별칭
required : 필수 값 사용 여부 설정 (무조건 설정을 해주어야 함)
REST API 에서 값을 호출할 때
주로 uri에서 각 구분자에 들어오는 값을 처리해야 할 때
@PathVaiable("userNum") int userNum
다음과 같은 url로 요청이 들어올때
http://localhost:8080/student/1
@RestController
public class StudentController {
@GetMapping("/student/{studentId}")
public String hello(@PathVariable("studentId") int id) {
return "list";
}
}
@RequestParam 과 @PathVariable 의 공통점
- url파라미터로 전달받은 value를 메서드의 파라미터로 받을 수 있게 해주는 어노테이션
@RequestParam(value="param1", required=true) String param1),
@RequestParam(value="param2", required=true) String param2)
@RequestParam 의 파라미터 종류는 4가지
@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){ .... }
URL을 통해 넘어온 데이터를 @QueryParam ("id") String id 형식으로 변수에 저장할수 있음
경로 뒤에 입력 데이터를 함께 제공
? 이후에 key=value 형태로 입력
다수인 경우 & 로 구분
검색 기능 中 특정 '검색 조건'을 줄 수 있다
// 1개의 데이터
/board?board_num=12
// 다수의 데이터는 & 로 처리
/board?board_num=12&key=value
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();
}
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 : 해당 경로의 리소스가 없는 경우, 빈 리스트를 반환
@RestController
public class StudentController {
@PostMapping("/student")
public String hello(@RequestBody Student student) {
return "list";
}
}
HTTP POST 요청에의해 함께 넘어오는 Student JSON 값을 Student 객체 값으로 받을수 있음
요청으로 넘어온 파라미터를 받아 처리하는 것이 아닌, 모델 정보를 담는데 사용됨
파라미터가 많아질 경우, 일일이 파라미터를 지정하지 않고도 Map 으로 간단하게 받아올 수 있다.
@GetMapping("test")
public void testMethod(@RequestParam HashMap<String,String> paramMap){
String data = paramMap.get("testParam");
}
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";
}
}
<%@ 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)