관리 메뉴

제뉴어리의 모든것

Controller에서 파라미터로 데이터 받는 상황 정리 본문

Spring Boot

Controller에서 파라미터로 데이터 받는 상황 정리

제뉴어리맨 2021. 1. 19. 13:58

Controller로 데이터를 보낼 수 있는 방법은 브라우저 사용자가 주소창에 직접 URL을 쳐서 보내는 방법이 있고,

대부분의 상황에서 사용되는 클릭으로 인해 브라우저에 URL을 호출하면서 데이터를 보내는 방법이 있다.

 

클릭으로 인해 데이터를 보내는 상황이라면 

View에 Button같은 컴포넌트에 Click 액션이 달려 있어야하며

보내는 방법은 보통 아래와 같다.

 

먼저 GET 방식

      <a th:href="@{/guestbook/list(page = ${requestDTO.page})}">
            <button type="button" class="btn btn-info listBtn"> List </button>
            </a>

A태그에 링크를 달아서 GET 방식으로 page값을 전달

EX URL => ROOT주소/guestbook/list?page=1

 

다음 POST 방식

               
         //HTML
         
         <div class="form-group">
         <label>Title</label>
         <input type="text" class="form-control" name="title"
         th:value="${dto.title}" >
        </div>
         
         <button type="button" class="btn btn-primary modifyBtn"> Modify </button> 
              
         
         //javascript
         <script th:inline="javascript"> 

            var actionForm = $("form");

     		$(".modifyBtn").click(function (){
       
                if(!confirm("수정하시겠습니다?"))
                {
                    return;
                }

                actionForm.attr("action", "/guestbook/modify").attr("method", "post");
                actionForm.submit();

            });
        </script>
        

<button> </button> 영역의 버튼을 클릭하면 

javascript 영역에서 정의 되어있듯이 확인창이 한번 뜬 뒤에 "확인"을 누르면 

 

actionForm.attr("action", "/guestbook/modify").attr("method", "post");
actionForm.submit();

위에 코드로 인해 POST로 컨트롤러에 전송이 되는데, 이때 div 영역안에 있는 input 타입의 데이터가 같이 넘어가며 

name에 설정된 명칭이 컨트롤러에 알맞은 데이터형과 같이 정의되어있어야한다.

 

 

그러면 받는 컨트롤러 상황을 보자

 

만약 Controller명.java 파일에 아래와 같은 함수가 있다고 하자.

    @PostMapping("/modify")
    public String modify(GuestbookDTO dto, @ModelAttribute("requestDTO") PageRequestDTO requestDTO, RedirectAttributes redirectAttributes)
    {
        log.info("post modify........");
        log.info("dto : " + dto);
        log.info("requestDTO : " + requestDTO);

        service.modify(dto);

        redirectAttributes.addAttribute("page", requestDTO.getPage());
        redirectAttributes.addAttribute("gno", dto.getGno());

        return "redirect:/guestbook/read";
    }

GuestbookDTO dto 는

 

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class GuestbookDTO {
private Long gno;
private String title;
private String content;
private String writer;
private LocalDateTime regDate, modDate;

}

이렇게 정의가 되어있어서 위에 modify 함수를 호출하는 View에서 해당 변수명들에 매칭된는 name의 Input 태그들의 값들이 Spring 내부적으로 매칭된다.

 

RequestDTO requestDTO는 페이지에서 전송되는 인자값들로 매칭된다.

 

참고로 @ModelAttribute("requestDTO") 라고 쓰여진것은 Model, 즉 View에서는 해당 변수명으로 접근해서 사용하겠다는것이다.

 

 

생각해보면 어떻게든 컨트롤측 함수의 매개변수명(혹은 클래스의 멤버변수)과 보낼때 Input의 name 혹은 파라미터(?이후값들)의 명칭들만 맞춰주면 Spring이 알아서 모든값들을 매칭 시켜준다는것인거 같다..

 

참고 : developer-joe.tistory.com/197