[Spring] 다양한 Annotation 정리

최서영·2024년 10월 25일

<목차>

  • 파라미터
  • Mapping 애노테이션
  • 주요 스프링 애너테이션

1. 파라미터

웹 개발에서 파라미터는 클라이언트가 서버로 보내는 데이터를 의미한다. 주로 두 가지 방식으로 전달된다.

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를 나타낸다.

2. Mapping 애노테이션

  • 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();
}

3. 주요 Spring 애너테이션

  • 애너테이션들은 의존성 주입, 빈 관리, AOP, 트랜잭션 관리 등 여러 가지 기능을 제공한다.

1. 의존성 주입과 빈 관리

  • @Component

    • @Component가 붙은 클래스는 자동으로 빈으로 등록된다.
  • @Service

    • 클래스를 서비스 빈으로 자동 변환한다.
    • @Component와 기능적으로 동일하지만, 서비스 역할을 명확히 하기 위해 사용된다.
  • @Repository

    • 클래스를 DAO 빈으로 자동 변환한다.
    • 데이터 액세스 예외를 스프링의 예외로 변환해주는 역할을 한다.
  • @Controller

    • 클래스를 controller 빈으로 자동 변환한다.
    • 프레젠테이션 계층의 컨트롤러 클래스에 사용된다.
  • @Autowired

    • 스프링이 자동으로 의존성 주입을 해주는 애너테이션이다. 생성자, 필드, 메서드에 붙여서 의존성을 주입할 수 있다.
  • @Qualifier
    • 동일한 타입의 빈이 여러 개일 경우, 특정한 빈을 주입하기 위해 사용된다.
  • @Primary
    • 동일한 타입의 빈이 여러 개 있을 때, 기본적으로 주입될 빈을 지정할 때 사용한다.

2. 컨트롤러 관련 애너테이션 (Spring MVC)

  • @RequestMapping

  • @GetMapping, @PostMappin, @PutMapping, @DeleteMapping

  • @PathVariable

    • URL 경로에 포함된 값을 가져와서 메서드의 파라미터로 전달하는 역할을 한다.

<예시>

@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
    • URL의 쿼리 파라미터(?key=value)나 폼 데이터로 전달된 값(POST)을 메서드의 변수에 매핑할 때 사용.

<예시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

    • 클라이언트가 서버로 JSON 형식의 데이터를 POST할 때, 이 데이터를 Java 객체로 매핑하기 위해 사용된다.

<예시>

@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)가 사용된다.
  • @ResponseBody
    • 메서드의 반환 값을 JSON, XML 등의 형식으로 클라이언트에게 전송해야 할 때 사용된다.
    • Spring은 메서드가 반환하는 객체를 HTTP 응답 본문에 담아 전송하는데, 이 과정에서 객체를 JSON이나 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이란?
    • Jackson은 Java에서 객체를 JSON 형식으로 직렬화(Serialize) 또는 JSON을 객체로 역직렬화(Deserialize) 하는 라이브러리이다. ( Spring Boot에서는 Jackson 라이브러리가 기본적으로 의존성에 포함되어 있다.)
      1. Java 객체 -> JSON 형식으로 변환.
      2. 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 객체에 매핑된다.

3. 트랜잭션 관련 어노테이션

  • @Transactional
    • 트랜잭션을 관리하기 위한 핵심 어노테이션. 해당 메서드 또는 클래스 내 모든 메서드가 트랜잭션 범위 내에서 실행되도록 한다.

<예시>

@Transactional
public void createUser(User user) {
 userRepository.save(user);
}
  • 이 메서드가 실행될 때 트랜잭션이 시작되고, 정상적으로 끝나면 트랜잭션이 커밋(commit)되며, 예외가 발생하면 트랜잭션이 롤백(rollback)된다.

📌 @ModelAttribute와 @RequestBody 차이

  • @ModelAttribute는 주로 폼 데이터나 쿼리 파라미터를 객체로 바인딩하는 데 사용되며, 바인딩한 객체를 Model에 자동으로 추가한다.
  • @RequestBody는 주로 JSON이나 XML 같은 Request Body 데이터를 객체로 변환하는 데 사용되며, 객체를 Model에 추가하지 않는다.

0개의 댓글