Spring Boot

[Spring Boot] 데이터 바인딩 예제 (@RequestParam, @ModelAttribute, @RequestBody)

공대생안씨 2024. 8. 14. 22:38

1. 데이터 바인딩 (data binding)

  • 클라이언트 요청 데이터 → 자바 객체로 변환하는 과정을 뜻함
  • 사용자 입력을 데이터 모델 (자바 객체)로 쉽게 매핑 (변환)

    ⇒ 효율성, 유지보수성, 유효성 검사에 용이

 

2. Spring MVC 데이터 바인딩

  • @RequstParam : GET 방식 ⇒ 쿼리 스트링
    • URL을 통한 데이터 전달 (ex. localhost:8080/name=홍길동)
  • @ModelAttribute : POST 방식 ⇒ Form 객체
    • message의 body에 쿼리 스트링 형식으로 데이터 전달
  • @RequestBody : REST API 방식
    • 일반적으로 JSON, XML 형식

 

2-1. @RequestParam 예제

  • html
<a th:href="@{/board(boardId=${board.id})}">게시글로 이동</a>
  • Controller
@GetMapping("/board")
public String showBoard(@RequestParam("boardId") Long boardId, Model model) {
		
    Board board = boardService.findBoard(boardId);
    model.addAttribute("board", board);
		
    return "board/show";
}
  • URL의 쿼리 스트링으로 데이터 전달 → 컨트롤러의 @RequestParam 중 동일 이름의 변수에 바인딩됨
    • ex) URL : localhost:8080/board?boardId=1

 

2-2. @ModelAttribute 예제

  • html
<form action="/join" method="post">
    아이디: <input type="text" name="id"><br>
    이름: <input type="text" name="name"><br>
    비밀번호: <input type="password" name="password"><br>
    <input type="submit" value="회원가입">
</form>
  • Controller
@PostMapping("/join")
public void join(@ModelAttribute JoinDto joinDto) {
    User user = new User(joinDto.getId(), joinDto.getName(), joinDto.getPassword());
    userService.join(user);
}

// DTO 정의
@Getter @Setter
public class JoinDto {
    private String id;
    private String name;
    private String password;
}
  • form 태그의 각 필드 중 name이 DTO의 동일 필드명에 자동으로 바인딩 됨

 

2-3. @RequestBody 예제

  • html, js
<form action="/join" method="post" id="joinForm">
    아이디: <input type="text" name="id" required><br>
    이름: <input type="text" name="name" required><br>
    비밀번호: <input type="password" name="password" required><br>
    <input type="submit" value="회원가입">
</form>

<script>
    document.getElementById('joinForm').onsubmit = function(event) {
        event.preventDefault(); // 기본 제출 방지
        
        const formData = new FormData(this);
        const json = {};
        formData.forEach((value, key) => {
            json[key] = value;
        });

        fetch('/join', { // '/join' 엔드포인트로 POST 요청
            method: 'POST',
            headers: {
                'Content-Type': 'application/json', // JSON 형식으로 전송
            },
            body: JSON.stringify(json), // JSON 문자열로 변환
        })
    };
</script>
  • RestController
@RestController

// ... //

    @PostMapping("/join")
    public String join(@RequestBody JoinDto joinDto) {
        User user = new User(joinDto.getId(), joinDto.getName(), joinDto.getPassword());
        userService.join(user);
    }

    // DTO 정의
    @Getter @Setter
    public class JoinDto {
        private String id;
        private String name;
        private String password;
    }