본문 바로가기
개발/Spring

[Spring] Java - @RequestParam , @PathVariable , @ModelAttribute 차이 및 사용

by 코딩하는 흰둥이 2023. 4. 22.
@RequestParam 

일반적으로 @RequestMapping 에서 Get 메서드 또는 @GetMapping 에서 사용하며

@PostMapping 에서도 @RequestParam을 사용할 때는 Form 태그 메서드가 Post 면 가능하다

 

// html
<td><a th:text="${vo.b_title}" th:href="@{/board/read(num=${vo.b_num})}"></a></td>


// Controller
@GetMapping("/board/read")
public String boardRead(@RequestParam("num") Integer num , Model model) throws Exception{


// http://localhost:9090/board/read?num=143

board/read(num=${vo.b_num}) 으로 했을때  ?num=143 가 붙어서 주소로 이동하였다

예 ) http://localhost:9090/board/read?num=143

 

예시와 같이 주소 경로 뒤에 ? 가 붙는 쿼리스트링이면 @RequestParam 으로 넘어오는 변수만큼 선언하여 값을 받을 수 있다

 

예) 

// html
<td><a th:text="${vo.b_title}" th:href="@{/board/read(num=${vo.b_num},num=${vo.b_num})}"></a></td>


// Controller
@GetMapping("/board/read")
public String boardRead(@RequestParam("num") Integer num , @RequestParam("test1") String test1,
						 Model model) throws Exception{
                        
                        
// http://localhost:9090/board/read?num=143&num=143

 

 

 

@PathVariable
// html
<td><a th:text="${vo.b_title}" th:href="@{/board/read/{num}(num=${vo.b_num})}"></a></td>


// Controller
@GetMapping("/board/read/{num}")
public String boardRead(@PathVariable("num") Integer num , Model model) throws Exception{


// http://localhost:9090/board/read/143

/board/read/{num}(num=${vo.b_num}) 으로 했을 때  /143 이 붙어서 주소로 이동하였다

{num} 자리에 num=${vo.b_num} 변수 값이 들어간다

예) http://localhost:9090/board/read/143

 

예시와 같이 주소 경로 뒤에 /변수/변수..... 를 붙이면 @PathVariable 로 넘어오는 변수만큼 선언하여 값을 받을 수 있다

 

예)

// html
<td><a th:text="${vo.b_title}" th:href="@{/board/read/{num}/{num2}(num=${vo.b_num}, num2=${vo.b_num})}"></a></td>


// Controller
@GetMapping("/board/read/{num}/{num2}")
public String boardRead(@PathVariable("num") Integer num , @PathVariable("num2") Integer num2, 
						Model model) throws Exception{
                        
                        
// http://localhost:9090/board/read/143/143

 

 

@ModelAttribute

파라미터를 여러 개 받아야 하는 경우에 매번 이런 식으로 받아 줄 수는 없다

// Controller
@GetMapping("/board/create")
public String boardRead(@RequestParam("b_name") String b_name , 
			@RequestParam("b_title") String b_title,
                        @RequestParam("b_content") String b_content,
						Model model) throws Exception{

 

 

 

예)

 

파라미터를 받아 줄 수 있는 vo 생성

// html

글 작성 페이지
<div>
    <form name="form" method="post" action="/board/create">
        이름 : <input name="b_name"></p>
        제목 : <input name="b_title"></p>
        내용 : <textarea name="b_content" rows="30" cols="50"></textarea>
        <div>
            <button type="submit">버튼</button>
        </div>
    </form>
</div>




@PostMapping("/board/create")
public String boardCreate(@ModelAttribute BoardVo vo) throws Exception{
    boardService.boardCreate(vo);

    return "redirect:/";
}

@ModelAttribute 로 받아준다

 

 

또는

@RequestParam 에 Map을 이용하여 받을 수 있다

@PostMapping("/board/create")
public String boardCreate(@RequestParam Map<String, Object> paramMap) throws Exception{
    boardService.boardCreate(paramMap);

    return "redirect:/";
}

따로 vo를 만들지 않고 form 또는 파라미터로 넘어오는 데이터를 key , value 형식으로 받아준다

물론 이렇게 하려면 service와 mapper에서도 map 으로 받아줘야 한다

 

댓글