๐ก Spring ํต์ฌ ๊ฐ๋ ์ธํฐ๋ทฐ Q&A
@RequestBody, @RequestParam, @ModelAttribute์ Spring MVC์์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ Controller ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ธ๋ฉํ ๋ ์ฌ์ฉ๋๋ ์ด๋
ธํ
์ด์
์
๋๋ค
์์
POST /login
Content-Type: application/json
{
"email": "[test@example.com](mailto:test@example.com)",
"password": "1234"
}
@Data
public class LoginRequestDto {
private String email;
private String password;
}
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequestDto request) {
String email = request.getEmail();
String password = request.getPassword();
// ์ธ์ฆ ๋ก์ง ์ํ
return ResponseEntity.ok("๋ก๊ทธ์ธ ์ฑ๊ณต");
}
๋ด๋ถ์ฒ๋ฆฌ
๋จ์
@RequestParam ์ฌ์ฉ - URL ํ๋ผ๋ฏธํฐ / Form ํ๋ 1:1 ๋์
์์
POST /login?email=test@example.com&password=1234
@PostMapping("/login")
public ResponseEntity<?> login(
@RequestParam String email, @RequestParam String password) {
// ๊ฐ๊ฐ์ ํ๋ผ๋ฏธํฐ๊ฐ ๊ฐ๋ณ ๋ฐ์ธ๋ฉ๋จ
return ResponseEntity.ok("๋ก๊ทธ์ธ ์ฑ๊ณต");
}
๋ด๋ถ ์ฒ๋ฆฌ
๋จ์
์์
<form action="/login" method="post">
<input type="text" name="email">
<input type="password" name="password">
<button type="submit">๋ก๊ทธ์ธ</button>
</form>
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
public class LoginController {
@PostMapping("/login")
public ResponseEntity<?> login(
@Valid @ModelAttribute LoginForm form,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
// ์ ํจ์ฑ ์คํจ ์ ์ค๋ฅ ๋ฉ์์ง ๋ฐํ
return ResponseEntity.badRequest().body(bindingResult.getAllErrors());
}
// ์ ํจ์ฑ ํต๊ณผ โ ๋ก๊ทธ์ธ ๋ก์ง
return ResponseEntity.ok("๋ก๊ทธ์ธ ์ฑ๊ณต");
}
}
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Data
public class LoginForm {
@NotBlank(message = "์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์.")
@Email(message = "์ด๋ฉ์ผ ํ์์ด ์๋๋๋ค.")
private String email;
@NotBlank(message = "๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.")
@Size(min = 4, message = "๋น๋ฐ๋ฒํธ๋ ์ต์ 4์ ์ด์์ด์ด์ผ ํฉ๋๋ค.")
private String password;
}
๋ด๋ถ์ฒ๋ฆฌ
true๊ฐ ๋๊ณ ์ค๋ฅ ๋ฆฌ์คํธ๊ฐ ์ฑ์์ง๋จ์
@ModelAttribute + @Valid
@RequestBody + @Valid + BindingResult
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Data
public class LoginRequestDto {
@NotBlank(message = "์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์.")
@Email(message = "์ ํจํ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.")
private String email;
@NotBlank(message = "๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.")
@Size(min = 4, message = "๋น๋ฐ๋ฒํธ๋ ์ต์ 4์ ์ด์์ด์ด์ผ ํฉ๋๋ค.")
private String password;
}
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
@RestController
public class LoginApiController {
@PostMapping("/api/login")
public ResponseEntity<?> login(@Valid @RequestBody LoginRequestDto request,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return ResponseEntity.badRequest().body(bindingResult.getAllErrors());
}
// ๋ก๊ทธ์ธ ์ธ์ฆ ๋ก์ง ์ฒ๋ฆฌ
return ResponseEntity.ok("๋ก๊ทธ์ธ ์ฑ๊ณต");
}
}
POST /api/login
Content-Type: application/json
{
"email": "",
"password": "12"
}
๋์ ๊ตฌ์กฐ
์ฃผ์ ์ฌํญ
@ModelAttribute | @RequestBody | |
|---|---|---|
| ๋์ ์์ฒญ | x-www-form-urlencoded, query string | JSON |
| ํ๋ผ๋ฏธํฐ ๋งคํ | form-data โ JavaBean | JSON โ JavaBean |
| ์ ํจ์ฑ ๊ฒ์ฌ | @Valid + BindingResult ์ง์ | @Valid + BindingResult ์ง์ |
| ์ฃผ ์ฌ์ฉ ํ๊ฒฝ | ์๋ฒ ๋ ๋๋ง, HTML form | REST API, JS ํ๋ก ํธ์๋ |
| ์ฌ์ฉ ์ | ๋ก๊ทธ์ธ ํ์ด์ง | SPA ๋ก๊ทธ์ธ API |