[Spring] @Controller, @RestController ์ฐจ์ด์
- -
Spring์ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ MVC ํ๋ ์ ์ํฌ๋ RESTful ์น ์๋น์ค ์์ฑ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํฉ๋๋ค. ์ ํต์ ์ธ Spring MVC ์ปจํธ๋กค๋ฌ์ RESTful ์น ์๋น์ค ์ปจํธ๋กค๋ฌ์ ์ฃผ์ ์ฐจ์ด์ ์ HTTP Response Body๊ฐ ์์ฑ๋๋ ๋ฐฉ์์ ๋๋ค. ๊ธฐ์กด MVC ์ปจํธ๋กค๋ฌ๋ View ๊ธฐ์ ์ ์์กดํ์ง๋ง RESTful ์น ์๋น์ค ์ปจํธ๋กค๋ฌ๋ ๋จ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ JSON / XML๋ก HTTP ์๋ต์ ์ง์ ๊ธฐ๋ก๋ฉ๋๋ค.
@Controller(Spring MVC Controller)
1. Controller - View
์๋์ ๊ฐ์ ๊ณผ์ ์ ํตํด Spring MVC Container๋ Client์ ์์ฒญ์ผ๋ก๋ถํฐ View๋ฅผ ๋ฐํํฉ๋๋ค.
- Client๋ URI ํ์์ผ๋ก ์น ์๋น์ค์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- Mapping ๋๋ Handler์ ๊ทธ Type์ ์ฐพ๋ DispatcherServlet์ด ์์ฒญ์ ์ธํฐ์ ํธํฉ๋๋ค.
- Controller๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ํ์ ์๋ต์ DispatcherServlet์ผ๋ก ๋ฐํํ๊ณ , DispatcherServlet์ View๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ฐํํฉ๋๋ค.
@Controller๊ฐ View๋ฅผ ๋ฐํํ๊ธฐ ์ํด์๋ ViewResolver๊ฐ ์ฌ์ฉ๋๋ฉฐ, ViewResolver ์ค์ ์ ๋ง๊ฒ View๋ฅผ ์ฐพ์ ๋ ๋๋ง ํฉ๋๋ค. ๋๋ application.properties ๋ฑ์ ํตํด ๋ ๋๋ง์ ํ ์๋ ์์ต๋๋ค.
spring.mvc.view.prefix=/WEB-INF/templates/
spring.mvc.view.suffix=.jsp
2. Controller - @ResponseBody
ํ์ง๋ง Spring MVC์ ์ปจํธ๋กค๋ฌ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. Spring MVC์ ์ปจํธ๋กค๋ฌ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ธฐ ์ํด ๋ฉ์๋์์ @ResponseBody๋ฅผ ์ฌ์ฉํ๋ฉด Spring์ ๋ฐํ ๊ฐ์ ๋ณํํ์ฌ Json ํํ์ ๊ฐ์ ๋ฐ์ดํฐ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
- Client๋ URI ํ์์ผ๋ก ์น ์๋น์ค์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- Mapping ๋๋ Handler์ ๊ทธ Type์ ์ฐพ๋ DispatcherServlet์ด ์์ฒญ์ ์ธํฐ์ ํธํฉ๋๋ค.
- @ResponseBody๋ฅผ ์ฌ์ฉํ์ฌ Client์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
3. ์์
Employee๋ผ๋ ๋ค์ Java ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด ํด๋์ค๋ POJO์ ๋๋ค.
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Employee")
public class Employee {
String name;
String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Employee() {
}
}
๋ค์ @Controller ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.example.spring.model.Employee;
@Controller
@RequestMapping("employees")
public class EmployeeController {
Employee employee = new Employee();
@RequestMapping("employee")
public String employee() {
return "employee/index";
}
@RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody Employee getEmployeeInJSON(@PathVariable String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec.com");
return employee;
}
@RequestMapping(value = "/{name}.xml", method = RequestMethod.GET, produces = "application/xml")
public @ResponseBody Employee getEmployeeInXML(@PathVariable String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec.com");
return employee;
}
}
employee ๋ฉ์๋๋ ์์ฒญ์ด ๋ค์ด์ค๋ฉด "employee/index" ๋ผ๋ ๊ฒฝ๋ก์ view ํ์ผ์ ์ด๊ฒ ๋ค๊ณ ์ ์ธํ ์ ํต @Controller๋ฐฉ์์ ๋๋ค. ๋๋จธ์ง ๋ฉ์๋๋ @ResponseBody๋ฅผ ์ด์ฉํ์ฌ ์์ฑ๋ ์์ ์ ๋๋ค.
@RestController(Spring Restful Controller)
1. RestController
Spring 4.0์ @Controller ๋ฐ @ResponseBody๋ฅผ ์ถ๊ฐํ์ง ์์๋ ๋๋ ์ปจํธ๋กค๋ฌ์ ํน์ ๋ฒ์ ์ผ๋ก @RestController๋ฅผ ๋์ ํ์ต๋๋ค. @RestController ์ด๋ ธํ ์ด์ ์ผ๋ก ์ปจํธ๋กค๋ฌ ํด๋์ค์ ์ด๋ ธํ ์ด์ ์ ์์ฑํ๋ฉด ๋ ์ด์ ๋ชจ๋ ์์ฒญ ๋งตํ ๋ฉ์๋์ @ResponseBody๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. @ResponseBody๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- Client๋ URI ํ์์ผ๋ก ์น ์๋น์ค์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- Mapping ๋๋ Handler์ ๊ทธ Type์ ์ฐพ๋ DispatcherServlet์ด ์์ฒญ์ ์ธํฐ์ ํธํฉ๋๋ค.
- RestController๋ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
2. ์์
์์ ์์ @RestController๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด @Controller๋ฅผ @RestController๋ก ์์ ํ๊ณ ๊ฐ ๋ฉ์๋์์ @ResponseBody๋ฅผ ์ ๊ฑฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ฒฐ๊ณผ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.example.spring.model.Employee;
@RestController
@RequestMapping("employees")
public class EmployeeController {
Employee employee = new Employee();
@RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
public Employee getEmployeeInJSON(@PathVariable String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec.com");
return employee;
}
@RequestMapping(value = "/{name}.xml", method = RequestMethod.GET, produces = "application/xml")
public Employee getEmployeeInXML(@PathVariable String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec.com");
return employee;
}
}
๋ ์ด์ @ResponseBody๋ฅผ ์์ฒญ ๋งคํ ๋ฉ์๋์ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ๋ณ๊ฒฝ ํ ํ ์๋ฒ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์คํํ๋ฉด ์ด์ ๊ณผ ๋์ผํ ์ถ๋ ฅ์ด ์์ฑ๋ฉ๋๋ค.
์์ ๊ฐ์ด @RestController๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ๋ฉฐ Spring v4.0๋ถํฐ MVC RESTful ์น ์๋น์ค๋ฅผ ๋ง๋๋ ๋ฐ ์ ํธ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
'Back-End > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] ์คํ ๋ฐฐ๋ ๋ณ๊ฒฝ ๋ฐฉ๋ฒ (0) | 2023.02.06 |
---|---|
[Spring] ์ค์จ๊ฑฐ(Swagger) ์ค์ (0) | 2023.02.06 |
[SpringBoot] ์๋ฐ ํ์ผ์ด ์ธ์๋์ง ์์ ๋ (0) | 2023.02.04 |
[SpringBoot] IntelliJ์์ Springboot + gradle ์คํํ๊ธฐ (0) | 2023.02.04 |
[Spring] ์คํ๋ง์ด๋ ? (0) | 2023.02.04 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค. ๐