Spring/Spring

[Spring] Controller와 어노테이션

gakko 2022. 2. 27. 14:00

 

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주소로 리다이렉트됨
	}
}