1. Controller의 종류
Controller 어노테이션은 @Component를 구체화하여 만든 어노테이션으로 해당 클래스를 IoC컨테이너에 Bean으로 등록해주며 Controller로 사용된다는 것을 알려준다.
그 종류에는 View를 리턴하는 @Controller 와 Json 데이터를 리턴하는 @RestController 가 있다.
사용 예시는 아래와 같다.
- @Controller
@Controller
public class MyController {
....
}
- @RestController
@RestController
public class MyController {
....
}
2. 컨트롤러와 함께 사용되는 Mapping 어노테이션(HTTP 요청)
- @RequestMapping
특정 URI로 요청이 올 때 어떤 메소드로 처리할지 매핑해주는 어노테이션이다. 옵션에 따라 주소를 정하거나 매핑의 방식을 정할 수 있다.
옵션 | 설명 |
value | 연결할 URL을 설정 다른 옵션이 없다면 생략 가능 |
method | enum으로 정의되어있는 RequestMethod를 통해 사용 주로 GET, POST, PUT, DELETE를 많이 사용함. |
params | 쿼리문으로 파라미터를 전달받기 위해 사용 |
(옵션에 대한 자세한 설명이 아래 블로그에 잘 설명되어 있습니다!
Tecoble 블로그: https://tecoble.techcourse.co.kr/post/2021-06-18-spring-request-mapping/ )
@RestController
@RequestMaping("/api")
public class MyController {
@RequestMapping(value="/user", method=RequestMethod.GET, params={"username"})
public User showUser(@RequestParam("username") String username){ // username을 가진 user 조회
....
}
}
- @GetMapping
데이터를 가져올 때 사용하는 어노테이션으로 @RequestMapping 중에서도 GET방식으로 구체화된 어노테이션이라고 생각하면 된다.
@RestController
@RequestMaping("/api")
public class MyController {
@GetMapping("/users")
public User showUser(){
....
}
}
- @PostMapping
데이터를 입력할 때 사용하는 어노테이션으로 @RequestMapping 중에서도 POST방식으로 구체화된 어노테이션이다.
@RestController
@RequestMaping("/api")
public class MyController {
@PostMapping("/join")
public User joinUser(@RequestBody User user){ // 회원가입할 때 정보입력
....
}
}
- @PutMapping
데이터를 수정할 때 사용하는 어노테이션으로 @RequestMapping 중에서도 PUT방식으로 구체화된 어노테이션이다.
@RestController
@RequestMaping("/api")
public class MyController {
@PutMapping("/user/{id}")
public User changeInfo(@PathVariable int id, String password, String email){ // 회원정보 수정
....
}
}
- @DeleteMapping
데이터를 삭제할 때 사용하는 어노테이션으로 @RequestMapping 중에서도 DELETE방식으로 구체화된 어노테이션이다.
@RestController
@RequestMaping("/api")
public class MyController {
@GetMapping("/delete/{id}")
public User deleteUser(@PathVariable int id){ // id값을 통한 회원탈퇴
....
}
}
3. 컨트롤러에서 Parameter 받기
- @RequestParam
@RequestParam은 클라이언트가 요청한 URL이 파라미터 값과 이름이 함께 전달할 때 쿼리스트링에서 파라미터 값을 가져오는 어노테이션이다. 대부분 Get방식의 통신에서 사용되지만 때때로 다른 방식으로 사용하기도 한다.
예를 들어 "localhost:8080/api/user?username=hello&password=1234" 로 URL요청이 들어올 때 파라미터를 받고 싶다면, 아래와 같이 작성할 수 있다.
쿼리문에 적힌 파라미터 이름과 메소드에 적힌 이름이 같게 하면 굳이 어노테이션을 적어주지 않아도 작동된다.
@RestController
@RequestMaping("/api")
public class MyController {
@GetMapping("/user")
public User showUser(@RequestParam String username, @RequestParam String password){
....
}
}
username에 "hello"가 담기고 password에는 "1234"가 들어가게 된다.
- @RequestBody
포스트맨이나 프로그램에서 Post 방식과 Put 방식으로 객체를 전송할 때 그것을 받아오기 위해 사용할 수 있는 어노테이션이다. MessageConverter를 통해 Json데이터를 자바 객체로 변환하여 전달받는다.
text/plain 이나 application/json 타입의 데이터를 받을 때 사용한다.
(cf. x-www-form-urlencoded 는 @ReqeustBody없이 값을 받는다.)
@RestController
@RequestMaping("/api")
public class MyController {
@PostMapping("/join")
public User joinUser(@RequestBody User user){ // 회원가입할 때 정보입력
....
}
}
- @PathVariable
URL 경로에 들어간 값을 변수로 활용하고 싶을 때 사용하는 어노테이션이다. 경로에 들어간 {변수이름} 과 메소드의 매개변수이름이 똑같아야 한다. 만약 다르다면 @PathVariable("변수이름") 과 같이 지정해줄 수도 있다.
@RestController
@RequestMaping("/api")
public class MyController {
@GetMapping("/delete/{id}")
public User deleteUser(@PathVariable int id){ // id값을 통한 회원탈퇴
....
}
}
- @ModelAttribute
Parameter 형식으로 데이터를 전달받을 때 사용한다. 클라이언트가 전달한 파라미터를 Setter 함수또는 생성자를 통해 객체에 데이터를 1대1로 바인딩하는 어노테이션이다. 그러므로 Setter 메소드와 생성자가 필수이다!!
@RequestParam와 굉장히 유사하지만 약간 다른데, @RequestParam가 값을 하나씩 받아온다면, @ModelAttribute는 데이터를 여러 개 가지고 있는 Model 객체로 받아올 수 있다.
- 모델(User)
@AllArgsConstructor
@Data
public class User {
private int id;
private String username;
private String password;
}
- 컨트롤러
@RestController
@RequestMaping("/api")
public class MyController {
@GetMapping("/user")
public User user(@ModelAttribute User user){
....
}
}
"localhost:8080/api/user?id=1&username=hello&password=1234"로 요청하면
User(id=1, username="hello", password="1234")로 정보를 받았을 것이다.
4. 리다이렉션하기(redirection)
다른 메소드를 재사용하고 싶을 때 사용하는 방법으로 return할 때 "redirect:/주소지" 형식으로 하면, 그 주소지를 재사용할 수 있게 해준다.
아래 코드는 로그인 폼에서 로그인 정보를 입력하고 로그인 버튼을 클릭하면 "/login" 주소지로 이동해 폼에 입력된 내용을 토대로 로그인을 진행하는 코드이다. 작업이 완료되면 "/home"으로 리다이렉션된다.
(참고: 리다이렉션될 때 HTTP 상태코드는 302이다.)
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HttpRedirectionController {
@GetMapping("/home")
public String home() {
.....
return "home";
}
@GetMapping("/loginForm")
public String loginForm() {
.....
return "loginForm"; // 폼에서 로그인 버튼을 누르면 /login 주소로 이동됨.
}
@GetMapping("/login")
public String login() { // 로그인 과정을 적은 코드
.....
return "redirect:/home"; // 로그인이 완료되면 home주소로 리다이렉트됨
}
}