[Spring] 스프링의 어노테이션/어노테이션 정리
스프링 어노테이션
스프링에서 사용하는 어노테이션을 정리한다.
기본적으로 자바에서 어노테이션은 주석의 기능을 한다. 하지만 자바, 스프링에서 어노테이션은 소스 코드에 추가해서 사용 가능한 메타데이터로서 작동한다.
즉, 어노테이션은 클래스와 메서드 등에 추가하여 기능을 부여하는 역할을 한다.
이 글에서는 그 기능과 역할을 살펴보고자 한다.
스프링 어노테이션과 기능
@Component
클래스를 스프링의 컴포넌트로 등록하여 빈(bean)으로 사용 가능하게 한다.
이후 설명할 @Controller, @Service, @Repository는 각각 Compenent 어노테이션의 특별한 형태이다.
@Component
public class MyComponent {
// 클래스 내용
}
@Autowired
의존성 주입을 수행한다. 해당 어노테이션이 적용된 곳(필드, 생성자, 메서드 등)의 매개변수에 해당하는 빈을 자동으로 주입한다.
@Component
public class MyComponent {
private Another anotherComp;
@Autowired
public MyComponent(Another another){
this.anotherComp = another
}
// 필드에 의존성 주입
}
@Service
비즈니스 로직을 담당하는 서비스 클래스를 정의하는 데 사용한다. Service어노테이션 사용시 해당 클래스는 빈으로 등록된다. 즉, 어디서는 주입되어 사용 가능하게 된다.
@Repository
데이터 액세스를 담당하는 리퍼지토리 클래스를 정의하는 데 사용한다. DB, 파일 등의 관리 및 접근 작업을 Repository에서 수행한다. Repository 사용시 해당 클래스는 스프링 컨테이너에 빈으로 등록된다. 즉, 어디서는 주입되어 사용 가능하게 된다.
@Controller
스프링 MVC의 컨트롤러로 등록한다. 컨트롤러로 등록이 되면 HTTP요청을 처리하고 응답을 반환 할 수 있다.
컨트롤러 클래스에서는 아래의 어노테이션 들을 사용하여 요청을 처리할 수 있다.
아래는 컨트롤러 내에서 주로 사용하는 어노테이션들이다.
@RequestMapping
요청 URL과 매핑되는 메서드를 지정한다. HTTP 메서드(GET, POST)와 URL 패턴을 기반으로 매핀한다.
@Controller
@RequestMapping("/users")
public class UserController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getUser(@PathVariable int id) {
}
}
위의 경우 /users로 들어오는 url을 처리하는 컨트롤러이다. getUser의 경우 /users/{id}형태로 들어온 get요청을 처리한다.
@GetMappring, @PostMappring, @PutMapping, @DeleteMapping
각각 GET, POST, PUT, DELETE 메서드에 대한 매핑을 지정한다.
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUser(@PathVariable int id) {
// 사용자 정보 반환
}
@PostMapping
public String createUser(User user) {
// 사용자 생성
}
}
위의 경우 /users/{id}로 들어오는 get요청을 getUser에서 처리하도록 설정되어있다. 또한 /users로 들어오는 post요청을 createUser에서 처리한다.
@RequestParam
URL 경로에 포함된 쿼리 파라미터 변수를 메서드의 매개변수로 바인딩한다.
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping
public String getUsers(@RequestParam("page") int page, @RequestParam("size") int size) {
// 페이징된 사용자 목록 반환
}
}
/users?page=3&size=15 라는 url를 유저가 호출 할 경우, getUsers의 page에 3이, size에 15가 들어간다. RequestParam 어노테이션은 매개변수의 이름과 쿼리 파라미터의 이름이 일치할 경우 생략해도 바인딩이 된다. 즉.
public String getUsers(int page, int size) {
위처럼 적더라도 /users?page=3&size=15 는 page, size라는 키값이 매개변수와 일치하므로 정상 작동한다.
@PathVariable
url의 경로를 변수로 추출한다. 즉, url의 일부를 변수로 받을 수 있도록 한다.
예를 들어 **/users/{id}**라는 url에서 {id}를 받을 수 있다.
@GetMapping("/users/{id}")
public String getUser(@PathVariable("id") int userId) {
// userId를 사용하여 사용자 정보 조회
}
위의 경우 /users/{id}로 들어오는 get요청을 처리하는 메서드이다. userId에 {id}가 들어간다.
@RequestBody
요청 본문(body)의 데이터를 메서드 매개변수로 바인딩합니다.
@Controller
@RequestMapping("/users")
public class UserController {
@PostMapping
public String createUser(@RequestBody User user) {
// 사용자 생성
}
}
요청 본문(이를 테면 폼 제출 등으로 인한 input값들의 제출)의 데이터가 적절하게 바인딩된다.
아래의 html태그가 있다고 하자.
<form action="/users" method="post">
<input type="text" name="username" />
<input type="text" name="email" />
<input type="submit" value="Create User" />
</form>
또한 User클래스의 값은 아래와 같다.
public class User {
private String username;
private String email;
}
이렇게 RequestBody 어노테이션을 사용하면 일치하는 필드 값으로 바인딩 된다. 이때, 일치하지 않아 바인딩 되지 않은 필드값들은 null로(혹은 기본값으로) 처리된다.
@ResponseBody
메서드의 반환값을 HTTP응답 본문으로 사용한다. 즉 return의 값을 응답으로 보낼 수 있게 해준다.
@GetMapping("/{id}")
@ResponseBody
public User getUser(@PathVariable int id) {
// 사용자 정보 조회 로직
User user = userService.getUserById(id);
return user;
}
위 코드의 경우 id를 기준으로 유저 정보를 받아온 객체를 리턴한다. 반환되는 객체는 json이나 xml형태로 반환된다.
예를 들어 Ajax, Axios등으로 /{id}를 get요청을 보내면 user의 데이터를 반환받을 수 있는 형태이다.