<목차>
- 파라미터
- Mapping 애노테이션
- 주요 스프링 애너테이션
웹 개발에서 파라미터는 클라이언트가 서버로 보내는 데이터를 의미한다. 주로 두 가지 방식으로 전달된다.
1. 쿼리 파라미터 (Query Parameter)
- URL에
?key=value형식으로 전달되는 데이터.http://example.com/search?keyword=spring에서 keyword가 파라미터 이름이고, spring이 전달된 값이다.
2. 경로 변수 (Path Parameter)
- URL의 경로에 포함된 변수.
http://example.com/users/10에서 10이 경로 파라미터로, 사용자 ID를 나타낸다.
Controller가 클라이언트로부터 들어온 HTTP 요청을 처리할 때, 요청된 URL과 HTTP 메소드(GET, POST, PUT, DELETE 등)에 따라 호출되는 Spring MVC의 메소드.
Mapping이란 특정 URL과 HTTP 메소드가 Controller 메소드에 연결되는 것을 의미한다.
- @GetMapping
- GET HTTP 요청을 처리.
- 데이터를 조회하는 역할. (예: 사용자의 정보 조회)
@GetMapping("/users/{id}") public User getUser (@PathVariable Long id) { // id로 사용자 조회 return userService.getUserById(id); }
- @PostMapping
- POST HTTP 요청을 처리.
- 서버에 데이터를 추가할 때 사용.
(예: 새로운 사용자 등록, 데이터 생성)@PostMapping("/users") public User createUser (@RequestBody User user) { // 새로운 사용자 생성 return userService.createUser(user); }
- @PutMapping
- PUT HTTP 요청을 처리.
- 서버의 기존 데이터를 수정할 때 사용. (업데이트)
@PutMapping("/users/{id}") public User updateUser (@PathVariable Long id, @RequestBody User user) { // id에 해당하는 사용자 정보 업데이트 return userService.updateUser(id, user); }
- @DeleteMapping
- DELETE 요청을 처리.
- 서버에서 데이터를 삭제할 때 사용.
@DeleteMapping("/users/{id}") public void deleteUser (@PathVariable Long id) { // id에 해당하는 사용자 삭제 userService.deleteUser(id); }
- @RequestMapping
- 모든 HTTP 메소드(GET, POST, PUT, DELETE 등)를 처리할 수 있는 범용적인 애너테이션.
- 사용 시 method 속성을 지정하여, 특정 HTTP 메소드만 처리하도록 설정할 수 있다..
@RequestMapping (value = "/users", method = RequestMethod.GET) public List<User> getUsers() { // 모든 사용자 조회 return userService.getAllUsers(); }
의존성 주입, 빈 관리, AOP, 트랜잭션 관리 등 여러 가지 기능을 제공한다. @Component
@Service
@Repository
@Controller
@Autowired
@Qualifier@Primary @RequestMapping
@GetMapping, @PostMappin, @PutMapping, @DeleteMapping
@PathVariable
<예시>
@RestController public class UserController { @GetMapping("/users/{id}") public String getUserById(@PathVariable("id") Long userId) { return "User ID: " + userId; } }클라이언트가 /users/10으로 요청을 보내면, @PathVariable이 경로에 있는 10을 파라미터 userId로 전달한다. 이때 출력은 User ID: 10이 된다.
@RequestParam<예시1>
@GetMapping("/search") public String search(@RequestParam String keyword) { return "Searching for: " + keyword; }요청이 /search?keyword=spring과 같이 들어오면, keyword라는 쿼리 파라미터의 값(spring)이 메서드의 keyword 변수에 매핑된다. 출력 결과는 Searching for: spring이 된다.
<예시2>
@PostMapping("/submit") public String submitForm(@RequestParam String name, @RequestParam int age) { return "Name: " + name + ", Age: " + age; }POST 요청에서 name과 age가 폼 데이터로 전송되면, 각각 메서드의 파라미터로 매핑된다.
📌 <@PathVariable과 @RequestParam의 차이>
@PathVariable은 URL 경로 자체에서 변수를 추출할 때 사용.
(예: /users/{id} -> /users/10처럼 경로 자체에서 id 추출)@RequestParam은 URL의 쿼리스트링(?key=value) 또는 폼 데이터에서 파라미터를 추출할 때 사용.
(예: /users?name=john&age=25)
@RequestBody
<예시>
@RestController public class UserController { @PostMapping("/users") public String createUser(@RequestBody User user) { return "User created: " + user.getName(); } }
- 이때, 클라이언트가 아래와 같은 JSON 데이터를
POST요청의 본문에 담아 전송한다면:{ "name": "John", "age": 25 }
@RequestBody User user는 요청 본문의 데이터를 User 객체로 매핑한다. 이때 자동 변환 과정에서Jackson 라이브러리 (Object Mapper)가 사용된다.
@ResponseBodyJSON, XML 등의 형식으로 클라이언트에게 전송해야 할 때 사용된다.Jackson 라이브러리(Object Mapper)가 이 변환 작업을 담당한다.<예시>
@RestController public class UserController { @GetMapping("/user") public @ResponseBody User getUser() { return new User("John", 25); } }
- @ResponseBody를 통해 User 객체가 JSON으로 변환되어 클라이언트에게 반환된다. 클라이언트가
GET요청을 보내면, 서버는 아래와 같은 JSON 응답을 전송한다.{ "name": "John", "age": 25 }
📌 <Jackson과 @RequestBody/@ResponseBody>
Jackson은 Java에서 객체를 JSON 형식으로 직렬화(Serialize) 또는 JSON을 객체로 역직렬화(Deserialize) 하는 라이브러리이다. ( Spring Boot에서는 Jackson 라이브러리가 기본적으로 의존성에 포함되어 있다.)
- Java 객체 -> JSON 형식으로 변환.
- JSON 데이터 -> Java 객체로 변환.
<@RequestBody와 @ResponseBody>
@RequestBody: 클라이언트가 보내는 JSON 데이터를 Java 객체로 변환. (Jackson을 통해)@ResponseBody: Java 객체를 JSON으로 변환하여 클라이언트로 반환. (Jackson을 통해)
1. <@RequestBody>예시@PostMapping("/users") public String createUser(@RequestBody UserDto userDto) { // 클라이언트가 보낸 JSON 데이터가 UserDto 객체로 변환. return "User created with name: " + userDto.getName(); }2. <@ResponseBody> 예시
@GetMapping("/users/{id}") public @ResponseBody UserDto getUser(@PathVariable Long id) { UserDto user = new UserDto(id, "John"); // 이 Java 객체는 JSON 형식으로 직렬화되어 클라이언트에게 응답. return user; }
📌 <
@RestController와 @ResponseBody>
- @RestController
@RestController는@Controller와@ResponseBody가 결합된 어노테이션.- @RestController가 붙은 클래스는 모든 메서드에 @ResponseBody가 자동으로 적용되어 모든 메서드의 반환 값이 JSON, XML 등으로 변환된다.
@ModelAttribute
<예시>
@GetMapping("/search") public String searchUser(@ModelAttribute UserDto user) { System.out.println("Search for user: " + user.getName()); return "searchResult"; }
- URL로
/search?name=John&email=john@example.com과 같은 요청이 오면, 쿼리 파라미터 name과 email이 UserDto 객체에 매핑된다.
@Transactional<예시>
@Transactional public void createUser(User user) { userRepository.save(user); }
- 이 메서드가 실행될 때 트랜잭션이 시작되고, 정상적으로 끝나면 트랜잭션이 커밋(commit)되며, 예외가 발생하면 트랜잭션이 롤백(rollback)된다.
📌 @ModelAttribute와 @RequestBody 차이
@ModelAttribute는 주로 폼 데이터나 쿼리 파라미터를 객체로 바인딩하는 데 사용되며, 바인딩한 객체를 Model에 자동으로 추가한다.@RequestBody는 주로 JSON이나 XML 같은 Request Body 데이터를 객체로 변환하는 데 사용되며, 객체를 Model에 추가하지 않는다.