์คํ๋ง(Spring)์์ ์์ฃผ ์ฌ์ฉํ๋ Annotation ๊ฐ๋ ๋ฐ ์์ ์ ๋ฆฌ
1. Annotation์ด๋?
Spring์์๋ Annotation์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. Annotation์ ์ญํ ์ ์๋์ ๊ฐ์ต๋๋ค. ๊ด๋ จ ์ค๋ช ์ ์คํ๋ง ๋น(Spring Bean)์ด๋? ๊ฐ๋ ์ ๋ฆฌ ๋งํฌ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
JAVA์์ Annotation ์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ฌ์ ์์ผ๋ก๋ ์ฃผ์์ ์๋ฏธ์ด์ง๋ง Java ์์๋ ์ฃผ์ ์ด์์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. Annotation์ ์๋ฐ ์์ค ์ฝ๋์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ์ ์๋ ๋ฉํ๋ฐ์ดํฐ์ ์ผ์ข ์ ๋๋ค. ์์ค์ฝ๋์ ์ถ๊ฐํ๋ฉด ๋จ์ ์ฃผ์์ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ด ์๋๋ผ ํน๋ณํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Annotation์ ํด๋์ค์ ๋ฉ์๋์ ์ถ๊ฐํ์ฌ ๋ค์ํ ๊ธฐ๋ฅ์ ๋ถ์ฌํ๋ ์ญํ ์ ํฉ๋๋ค. Annotation์ ํ์ฉํ์ฌ Spring Framework๋ ํด๋น ํด๋์ค๊ฐ ์ด๋ค ์ญํ ์ธ์ง ์ ํ๊ธฐ๋ ํ๊ณ , Bean์ ์ฃผ์ ํ๊ธฐ๋ ํ๋ฉฐ, ์๋์ผ๋ก getter๋ setter๋ฅผ ์์ฑํ๊ธฐ๋ ํฉ๋๋ค. ํน๋ณํ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ๋ถ์ฌํ๋ ๋ฑ ๋ค์ํ ์ญํ ์ ์ํํ ์ ์์ต๋๋ค.
์ด๋ฌํ Annotation์ ํตํ์ฌ ์ฝ๋๋์ด ๊ฐ์ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ์์ฐ์ฑ์ด ์ฆ๊ฐ๋ฉ๋๋ค. **์ด๋ฒ ํฌ์คํ ์์๋ **Spring์์ ์ฌ์ฉํ๋ ๋ง์ Annotation์ ๋ํ์ฌ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
2. Spring์ ๋ํ์ ์ธ Annotation๊ณผ ์ญํ
@Component
๊ฐ๋ฐ์๊ฐ ์์ฑํ Class๋ฅผ Spring์ Bean์ผ๋ก ๋ฑ๋กํ ๋ ์ฌ์ฉํ๋ Annotation์ ๋๋ค. Spring์ ํด๋น Annotation์ ๋ณด๊ณ Spring์ Bean์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
@Component(value="myman")
public class Man {
public Man() {
System.out.println("hi");
}
}
@ComponentScan
Spring Framework๋ @Component, @Service, @Repository, @Controller, @Configuration ์ค 1๊ฐ๋ผ๋ ๋ฑ๋ก๋ ํด๋์ค๋ฅผ ์ฐพ์ผ๋ฉด, Context์ bean์ผ๋ก ๋ฑ๋กํฉ๋๋ค. @ComponentScan Annotation์ด ์๋ ํด๋์ค์ ํ์ Bean์ ๋ฑ๋ก ๋ ํด๋์ค๋ค์ ์ค์บํ์ฌ Bean์ผ๋ก ๋ฑ๋กํด์ค๋๋ค.
@Bean
@Bean Annotation์ ๊ฐ๋ฐ์๊ฐ ์ ์ด๊ฐ ๋ถ๊ฐ๋ฅํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ๊ฒ๋ค์ Bean์ผ๋ก ๋ง๋ค ๋ ์ฌ์ฉํฉ๋๋ค.
@Controller
Spring์๊ฒ ํด๋น Class๊ฐ Controller์ ์ญํ ์ ํ๋ค๊ณ ๋ช ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ Annotation์ ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@RequestHeader
Request์ header๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ, ํด๋น Annotation์ ์ด ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ์ ์ฌ์ฉํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(@RequestHeader(value="Accept-Language") String acceptLanguage) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@RequestMapping
@RequestMapping(value=”“)์ ๊ฐ์ ํํ๋ก ์์ฑํ๋ฉฐ, ์์ฒญ ๋ค์ด์จ URI์ ์์ฒญ๊ณผ Annotation value ๊ฐ์ด ์ผ์นํ๋ฉด ํด๋น ํด๋์ค๋ ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค. Controller ๊ฐ์ฒด ์์ ๋ฉ์๋์ ํด๋์ค์ ์ ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
- Class ๋จ์์ ์ฌ์ฉํ๋ฉด ํ์ ๋ฉ์๋์ ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค.
- ๋ฉ์๋์ ์ ์ฉ๋๋ฉด ํด๋น ๋ฉ์๋์์ ์ง์ ํ ๋ฐฉ์์ผ๋ก URI๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
@RequestMapping(method = RequestMethod.POST)
public String addUser(Model model) {
// POST method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
@RequestMapping(value = "/info", method = RequestMethod.GET)
public String addUser(Model model) {
// GET method, /user/info ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@RequestParam
URL์ ์ ๋ฌ๋๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฉ์๋์ ์ธ์์ ๋งค์นญ์์ผ, ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ ์ ์๋ Annotation์ผ๋ก ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค. Json ํ์์ Body๋ฅผ MessageConverter๋ฅผ ํตํด Java ๊ฐ์ฒด๋ก ๋ณํ์ํต๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
// https://naver.com?nickname=dog&old=10
String sub = nickname + "_" + age;
...
}
}
@RequestBody
Body์ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ์๋์ ์ธ์์ ๋งค์นญ์์ผ, ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ ์ ์๋ Annotation์ผ๋ก ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ด๋ HTTP ์์ฒญ ๋ณธ๋ฌธ(JSON ๋ฐ XML ๋ฑ)์ Java ์ค๋ธ์ ํธ๋ก ๋ณํํฉ๋๋ค. ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ body์ json or xml ๊ณผ ๊ฐ์ ํํ๋ก ํํ๋ก ๊ฐ(์ฃผ๋ก ๊ฐ์ฒด)๋ฅผ ์ ์กํ๋ฉด, ํด๋น ๋ด์ฉ์ Java Object๋ก ๋ณํํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public String addUser(@RequestBody User user) {
// POST method, /user ์์ฒญ์ ์ฒ๋ฆฌ
String sub_name = user.name;
String sub_old = user.old;
}
}
@ModelAttribute
ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํ๋ HTTP parameter, Body ๋ด์ฉ์ Setter ํจ์๋ฅผ ํตํด 1:1๋ก ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐ(๋ฐ์ธ๋ฉ)ํฉ๋๋ค. RequestBody์ ๋ค๋ฅด๊ฒ HTTP Body ๋ด์ฉ์ multipart/form-data ํํ๋ฅผ ์๊ตฌํฉ๋๋ค. @RequestBody๊ฐ json์ ๋ฐ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ @ModenAttribute ์ ๊ฒฝ์ฐ์๋ json์ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
@ResponseBody
@ResponseBody์ ๋ฉ์๋์์ ๋ฆฌํด๋๋ ๊ฐ์ด View ๋ก ์ถ๋ ฅ๋์ง ์๊ณ HTTP Response Body์ ์ง์ ์ฐ์ฌ์ง๊ฒ ๋ฉ๋๋ค. return ์์ json, xml๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ return ํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
// https://naver.com?nickname=dog&old=10
User user = new User();
user.setName(nickname);
user.setAge(age);
return user;
}
}
@Autowired
Spring Framework์์ Bean ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ์๋์ 3๊ฐ์ง๊ฐ ์์ต๋๋ค. Bean์ ์ฃผ์ ๋ฐ๊ธฐ ์ํ์ฌ @Autowired ๋ฅผ ์ฌ์ฉํฉ๋๋ค. Spring Framework๊ฐ Class๋ฅผ ๋ณด๊ณ Type์ ๋ง๊ฒ(Type์ ๋จผ์ ํ์ธ ํ, ์์ผ๋ฉด Name ํ์ธ) Bean์ ์ฃผ์ ํฉ๋๋ค.
- @Autowired
- ์์ฑ์ (@AllArgsConstructor ์ฌ์ฉ)
- setter
@GetMapping
RequestMapping(Method=RequestMethod.GET)๊ณผ ๋๊ฐ์ ์ญํ ์ ํ๋ฉฐ, ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@GetMapping("/")
public String getUser(Model model) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
////////////////////////////////////
// ์์ ์๋ ๋ฉ์๋๋ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. //
////////////////////////////////////
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@PostMapping
RequestMapping(Method=RequestMethod.POST)๊ณผ ๋๊ฐ์ ์ญํ ์ ํ๋ฉฐ, ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public String addUser(Model model) {
// POST method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
////////////////////////////////////
// ์์ ์๋ ๋ฉ์๋๋ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. //
////////////////////////////////////
@PostMapping('/')
public String addUser(Model model) {
// POST method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@SpringBootTest
Spring Boot Test์ ํ์ํ ์์กด์ฑ์ ์ ๊ณตํด์ค๋๋ค.
// DemoApplicationTests.java
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}
@Test
JUnit์์ ํ ์คํธ ํ ๋์์ ํ์ํฉ๋๋ค.
3. Lombok์ ๋ํ์ ์ธ Annotation๊ณผ ์ญํ
Lombok์ ์ฝ๋๋ฅผ ํฌ๊ฒ ์ค์ฌ์ฃผ์ด ๊ฐ๋ ์ฑ์ ํฌ๊ฒ ๋ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ํ์ ์ธ Annotation์ ์๋์ ๊ฐ์ต๋๋ค.
@Setter
Class ๋ชจ๋ ํ๋์ Setter method๋ฅผ ์์ฑํด์ค๋๋ค.
@Getter
Class ๋ชจ๋ ํ๋์ Getter method๋ฅผ ์์ฑํด์ค๋๋ค.
@AllArgsConstructor
Class ๋ชจ๋ ํ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์์ฑ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
@NoArgsConstructor
Class ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํด์ค๋๋ค.
@ToString
Class ๋ชจ๋ ํ๋์ toString method๋ฅผ ์์ฑํ๋ค.
ng)์์ ์์ฃผ ์ฌ์ฉํ๋ Annotation ๊ฐ๋ ๋ฐ ์์ ์ ๋ฆฌ
- melonicedlatte
- Jul 18, 2021
1. Annotation์ด๋?
Spring์์๋ Annotation์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. Annotation์ ์ญํ ์ ์๋์ ๊ฐ์ต๋๋ค. ๊ด๋ จ ์ค๋ช ์ ์คํ๋ง ๋น(Spring Bean)์ด๋? ๊ฐ๋ ์ ๋ฆฌ ๋งํฌ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
JAVA์์ Annotation ์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ฌ์ ์์ผ๋ก๋ ์ฃผ์์ ์๋ฏธ์ด์ง๋ง Java ์์๋ ์ฃผ์ ์ด์์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. Annotation์ ์๋ฐ ์์ค ์ฝ๋์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ์ ์๋ ๋ฉํ๋ฐ์ดํฐ์ ์ผ์ข ์ ๋๋ค. ์์ค์ฝ๋์ ์ถ๊ฐํ๋ฉด ๋จ์ ์ฃผ์์ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ด ์๋๋ผ ํน๋ณํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Annotation์ ํด๋์ค์ ๋ฉ์๋์ ์ถ๊ฐํ์ฌ ๋ค์ํ ๊ธฐ๋ฅ์ ๋ถ์ฌํ๋ ์ญํ ์ ํฉ๋๋ค. Annotation์ ํ์ฉํ์ฌ Spring Framework๋ ํด๋น ํด๋์ค๊ฐ ์ด๋ค ์ญํ ์ธ์ง ์ ํ๊ธฐ๋ ํ๊ณ , Bean์ ์ฃผ์ ํ๊ธฐ๋ ํ๋ฉฐ, ์๋์ผ๋ก getter๋ setter๋ฅผ ์์ฑํ๊ธฐ๋ ํฉ๋๋ค. ํน๋ณํ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ๋ถ์ฌํ๋ ๋ฑ ๋ค์ํ ์ญํ ์ ์ํํ ์ ์์ต๋๋ค.
์ด๋ฌํ Annotation์ ํตํ์ฌ ์ฝ๋๋์ด ๊ฐ์ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ์์ฐ์ฑ์ด ์ฆ๊ฐ๋ฉ๋๋ค. **์ด๋ฒ ํฌ์คํ ์์๋ **Spring์์ ์ฌ์ฉํ๋ ๋ง์ Annotation์ ๋ํ์ฌ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
2. Spring์ ๋ํ์ ์ธ Annotation๊ณผ ์ญํ
@Component
๊ฐ๋ฐ์๊ฐ ์์ฑํ Class๋ฅผ Spring์ Bean์ผ๋ก ๋ฑ๋กํ ๋ ์ฌ์ฉํ๋ Annotation์ ๋๋ค. Spring์ ํด๋น Annotation์ ๋ณด๊ณ Spring์ Bean์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
@Component(value="myman")
public class Man {
public Man() {
System.out.println("hi");
}
}
@ComponentScan
Spring Framework๋ @Component, @Service, @Repository, @Controller, @Configuration ์ค 1๊ฐ๋ผ๋ ๋ฑ๋ก๋ ํด๋์ค๋ฅผ ์ฐพ์ผ๋ฉด, Context์ bean์ผ๋ก ๋ฑ๋กํฉ๋๋ค. @ComponentScan Annotation์ด ์๋ ํด๋์ค์ ํ์ Bean์ ๋ฑ๋ก ๋ ํด๋์ค๋ค์ ์ค์บํ์ฌ Bean์ผ๋ก ๋ฑ๋กํด์ค๋๋ค.
@Bean
@Bean Annotation์ ๊ฐ๋ฐ์๊ฐ ์ ์ด๊ฐ ๋ถ๊ฐ๋ฅํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ๊ฒ๋ค์ Bean์ผ๋ก ๋ง๋ค ๋ ์ฌ์ฉํฉ๋๋ค.
@Controller
Spring์๊ฒ ํด๋น Class๊ฐ Controller์ ์ญํ ์ ํ๋ค๊ณ ๋ช ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ Annotation์ ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@RequestHeader
Request์ header๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ, ํด๋น Annotation์ ์ด ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ์ ์ฌ์ฉํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(@RequestHeader(value="Accept-Language") String acceptLanguage) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@RequestMapping
@RequestMapping(value=”“)์ ๊ฐ์ ํํ๋ก ์์ฑํ๋ฉฐ, ์์ฒญ ๋ค์ด์จ URI์ ์์ฒญ๊ณผ Annotation value ๊ฐ์ด ์ผ์นํ๋ฉด ํด๋น ํด๋์ค๋ ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค. Controller ๊ฐ์ฒด ์์ ๋ฉ์๋์ ํด๋์ค์ ์ ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
- Class ๋จ์์ ์ฌ์ฉํ๋ฉด ํ์ ๋ฉ์๋์ ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค.
- ๋ฉ์๋์ ์ ์ฉ๋๋ฉด ํด๋น ๋ฉ์๋์์ ์ง์ ํ ๋ฐฉ์์ผ๋ก URI๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
@RequestMapping(method = RequestMethod.POST)
public String addUser(Model model) {
// POST method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
@RequestMapping(value = "/info", method = RequestMethod.GET)
public String addUser(Model model) {
// GET method, /user/info ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@RequestParam
URL์ ์ ๋ฌ๋๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฉ์๋์ ์ธ์์ ๋งค์นญ์์ผ, ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ ์ ์๋ Annotation์ผ๋ก ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค. Json ํ์์ Body๋ฅผ MessageConverter๋ฅผ ํตํด Java ๊ฐ์ฒด๋ก ๋ณํ์ํต๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
// https://naver.com?nickname=dog&old=10
String sub = nickname + "_" + age;
...
}
}
@RequestBody
Body์ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ์๋์ ์ธ์์ ๋งค์นญ์์ผ, ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ ์ ์๋ Annotation์ผ๋ก ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ด๋ HTTP ์์ฒญ ๋ณธ๋ฌธ(JSON ๋ฐ XML ๋ฑ)์ Java ์ค๋ธ์ ํธ๋ก ๋ณํํฉ๋๋ค. ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ body์ json or xml ๊ณผ ๊ฐ์ ํํ๋ก ํํ๋ก ๊ฐ(์ฃผ๋ก ๊ฐ์ฒด)๋ฅผ ์ ์กํ๋ฉด, ํด๋น ๋ด์ฉ์ Java Object๋ก ๋ณํํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public String addUser(@RequestBody User user) {
// POST method, /user ์์ฒญ์ ์ฒ๋ฆฌ
String sub_name = user.name;
String sub_old = user.old;
}
}
@ModelAttribute
ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํ๋ HTTP parameter, Body ๋ด์ฉ์ Setter ํจ์๋ฅผ ํตํด 1:1๋ก ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐ(๋ฐ์ธ๋ฉ)ํฉ๋๋ค. RequestBody์ ๋ค๋ฅด๊ฒ HTTP Body ๋ด์ฉ์ multipart/form-data ํํ๋ฅผ ์๊ตฌํฉ๋๋ค. @RequestBody๊ฐ json์ ๋ฐ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ @ModenAttribute ์ ๊ฒฝ์ฐ์๋ json์ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
@ResponseBody
@ResponseBody์ ๋ฉ์๋์์ ๋ฆฌํด๋๋ ๊ฐ์ด View ๋ก ์ถ๋ ฅ๋์ง ์๊ณ HTTP Response Body์ ์ง์ ์ฐ์ฌ์ง๊ฒ ๋ฉ๋๋ค. return ์์ json, xml๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ return ํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
// https://naver.com?nickname=dog&old=10
User user = new User();
user.setName(nickname);
user.setAge(age);
return user;
}
}
@Autowired
Spring Framework์์ Bean ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ์๋์ 3๊ฐ์ง๊ฐ ์์ต๋๋ค. Bean์ ์ฃผ์ ๋ฐ๊ธฐ ์ํ์ฌ @Autowired ๋ฅผ ์ฌ์ฉํฉ๋๋ค. Spring Framework๊ฐ Class๋ฅผ ๋ณด๊ณ Type์ ๋ง๊ฒ(Type์ ๋จผ์ ํ์ธ ํ, ์์ผ๋ฉด Name ํ์ธ) Bean์ ์ฃผ์ ํฉ๋๋ค.
- @Autowired
- ์์ฑ์ (@AllArgsConstructor ์ฌ์ฉ)
- setter
@GetMapping
RequestMapping(Method=RequestMethod.GET)๊ณผ ๋๊ฐ์ ์ญํ ์ ํ๋ฉฐ, ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@GetMapping("/")
public String getUser(Model model) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
////////////////////////////////////
// ์์ ์๋ ๋ฉ์๋๋ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. //
////////////////////////////////////
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@PostMapping
RequestMapping(Method=RequestMethod.POST)๊ณผ ๋๊ฐ์ ์ญํ ์ ํ๋ฉฐ, ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
@Controller // ์ด Class๋ Controller ์ญํ ์ ํฉ๋๋ค
@RequestMapping("/user") // ์ด Class๋ /user๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public String addUser(Model model) {
// POST method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
////////////////////////////////////
// ์์ ์๋ ๋ฉ์๋๋ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. //
////////////////////////////////////
@PostMapping('/')
public String addUser(Model model) {
// POST method, /user ์์ฒญ์ ์ฒ๋ฆฌ
}
}
@SpringBootTest
Spring Boot Test์ ํ์ํ ์์กด์ฑ์ ์ ๊ณตํด์ค๋๋ค.
// DemoApplicationTests.java
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}
@Test
JUnit์์ ํ ์คํธ ํ ๋์์ ํ์ํฉ๋๋ค.
3. Lombok์ ๋ํ์ ์ธ Annotation๊ณผ ์ญํ
Lombok์ ์ฝ๋๋ฅผ ํฌ๊ฒ ์ค์ฌ์ฃผ์ด ๊ฐ๋ ์ฑ์ ํฌ๊ฒ ๋ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ํ์ ์ธ Annotation์ ์๋์ ๊ฐ์ต๋๋ค.
@Setter
Class ๋ชจ๋ ํ๋์ Setter method๋ฅผ ์์ฑํด์ค๋๋ค.
@Getter
Class ๋ชจ๋ ํ๋์ Getter method๋ฅผ ์์ฑํด์ค๋๋ค.
@AllArgsConstructor
Class ๋ชจ๋ ํ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์์ฑ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
@NoArgsConstructor
Class ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํด์ค๋๋ค.
@ToString
Class ๋ชจ๋ ํ๋์ toString method๋ฅผ ์์ฑํ๋ค.