Framework/Spring Boot

@RequestParam | @PathVariable | @RequestBody | @ModelAttribute

잔망루피 2022. 2. 8. 18:48

@RequestParam 사용 예시

@PostMapping("/user/phoneCheck")    // 전화번호 중복 검사
@ResponseBody
public boolean phoneCheck(@RequestParam("phone") String phone){
    LOG.info("userPhoneCheck 진입");
    LOG.info("전달받은 번호:"+phone);
    boolean flag=userService.userPhoneCheck(phone);
    LOG.info("확인 결과:"+flag);
    return flag;
}

/user/phoneCheck?phone=01012345678

프런트엔드에서 name과 RequestParam 변수명이 같아야 함

@RequestParam Map<String, String> params

Map<String, String> 타입으로 선언하면 모든 요청 파라미터를 담은 맵으로 받는다.

Map의 key=파라미터 이름, 값=파라미터의 값

@RequestParam(value="id", required=false, defaultValue="0")

required는 파라미터가 선택적으로 제공되도록 한다.

요청 파라미터가 존재하지 않으면 defaultValue로 설정한 값을 사용한다.

 


@GetMapping("/update")
    public String updateForm(@RequestParam(value="id") Long id, Model model){
        PostResponseDto postResponseDto=postService.findById(id);
        model.addAttribute("post", postResponseDto);
        return "/post/updateForm";
    }

두 번째 예시

 

<form th:action="@{/post/update(id=${post.id})}">
            <button type="submit" th:name="id" th:value="${post.id}" class="btn btn-primary float-right mt-3" th:if="${#strings.equals(post.author, username)}">수정</button>
        </form>

Thymeleaf 이용

th:name은 @RequestParam의 value와 같다.

th:value는 value에 넣을 값

/post/update?id=24

 

 

@PathVariable 사용 예시

// 상세 게시판 조회
@GetMapping("/post/detail/{id}")
public String detail(@PathVariable("id") Long id, Model model) {
    if(id == null){
        model.addAttribute("post", new Post());
    }else{
        Post post= postService.findById(id).orElse(null);
        postService.updateView(id);     // 조회수 증가
        model.addAttribute("post", post);
    }
    return "post/detail";
}

{}안의 변수를 받는다.

@PathVariable("id") id 이름의 Path 변수 {id}를 받아서 Long 타입으로 id에 담는다.

 

 

@RequestBody 사용 예시

 // 수정
    @PutMapping("/update/{id}")
    public String update_comment(@PathVariable(value="id") Long comment_id, @RequestBody Map<String, String> map){
        Long post_id=Long.parseLong(map.get("post_id"));        // 게시글 번호
        commentService.update(comment_id, map.get("comment"));
        return "redirect:/post/detail/" + post_id;
    }

XML이나 JSON 기반의 메시지를 사용하는 요청에 유용하다.

form에서 받는 정보가 특정 도메인 오브젝트에 매핑되지 않는 특별한 정보인 경우 권장

 

 

function updateComment(idx) {
            if(!isValid("modalContent")) {
                return false;
            }
            if(!confirm('댓글을 수정하시겠어요?')) {
                return false;
            }

            var content = document.getElementById("modalContent");
            var post_id=document.getElementById("postId");

            var uri = "/comment/update/" + idx;
            var headers = {"Content-Type": "application/json", "X-HTTP-Method-Override" : "PUT"};
            var params = {"id" : idx, "comment" : content.value, "post_id" : post_id.value};
            $.ajax({
                url: uri,
                type: "PUT",
                headers: headers,
                data: JSON.stringify(params),
                success: function(response) {
                    /*
                    if (response.result == false) {
                        alert("댓글 수정에 실패하였습니다.");
                        return false;
                    }*/
                    window.location.reload();
                    $("#commentModal").modal("hide");
                },
                error: function(xhr, status, error) {
                    alert("에러가 발생하였습니다." + error + status);
                    return false;
                }
            });
        }

 

 

@ModelAttribute 사용 예시

컨트롤러가 전달받는 오브젝트 형태의 정보

도메인 오브젝트나 DTO의 프로퍼티에 요청 파라미터를 바인딩해서 한 번에 받음

컨트롤러가 리턴하는 모델에 파라미터로 전달한 오브젝트를 자동으로 추가해줌. 모델의 이름은 기본적으로 파라미터 타입의 이름을 따른다.

@PostMapping("/new")
    public String create(@ModelAttribute("post") @Valid PostRequestDto post, BindingResult bindingResult) {
        if(bindingResult.hasErrors()){
            return "post/createPostForm";
        }
        Object principal= SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        post.setAuthor(((UserDetails)principal).getUsername());     // 작성자=로그인한 유저 id
        postService.create(post);
        return "redirect:/post";
    }

 

 

 

참고 👇

토비의 스프링 3.1 Vol.2 스프링의 기술과 선택

 

https://elfinlas.github.io/2018/02/18/spring-parameter/

 

Spring에서 @RequestParam과 @PathVariable

Spring에서 Controller의 전달인자…Spring을 사용하다 보면 Controller 단에서 클라이언트에서 URL에 파라메터를 같이 전달하는 경우가 있습니다.주로 사용하는 형태는 아래의 두 가지가 대표적인 케이

elfinlas.github.io

 

https://www.baeldung.com/spring-thymeleaf-request-parameters

 

Spring Request Parameters with Thymeleaf | Baeldung

Learn how to use request parameters with Spring and Thymeleaf.

www.baeldung.com

 

반응형