Backend
home
👜

스프링 어노테이션 정리

생성 일시
2025/01/22 06:16
태그
SpringBoot
게시일
2025/01/22
최종 편집 일시
2025/02/09 13:26
참고:

@Repository

Data Access Layer의 DAO 또는 Repository 클래스에 사용한다.
DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해 사용한다.

@Service

Serivce Layer 클래스에 사용한다.

@Controller

Presentation Layer의 MVC Controller에 사용한다. 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정된다.

@Component

위의 Layer 구분을 적용하기 어려운 일반적인 경우에 설정한다.

@RequestMapping

요청 URL mapping 정보를 설정한다.
클래스 타입과 메소드에 설정 가능하다.
Controller method의 HTTP method를 한정할 수 있다.
같은 URL 요청에 대하여 HTTP method에 따라 서로 다른 메소드로 mapping 할 수 있다.
요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation이다.
Controller나 Controller의 method에 적용한다.
요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 한다.
요청 받는 형식 을 정의하지 않는다면, 자동적으로 GET으로 설정된다.
@RequestMapping("/list"), @RequestMapping("/home, /about"); @RequestMapping("/admin", method=RequestMethod.GET)
Java
복사
@Controller // 1) Class Level //모든 메서드에 적용되는 경우 “/home”로 들어오는 모든 요청에 대한 처리를 해당 클래스에서 한다는 것을 의미 @RequestMapping("/home") public class HomeController { /* an HTTP GET for /home */ @RequestMapping(method = RequestMethod.GET) public String getAllEmployees(Model model) { ... } /* 2) Handler Level 요청 url에 대해 해당 메서드에서 처리해야 되는 경우 “/home/employees” POST 요청에 대한 처리를 addEmployee()에서 한다는 것을 의미한다. value: 해당 url로 요청이 들어오면 이 메서드가 수행된다. method: 요청 method를 명시한다. 없으면 모든 http method 형식에 대해 수행된다. */ /* an HTTP POST for /home/employees */ @RequestMapping(value = "/employees", method = RequestMethod.POST) public String addEmployee(Employee employee) { ... } }
Java
복사

@RequestAttribute

Request에 설정되어 있는 속성 값을 가져올 수 있다.

@PathVariable

URL 템플릿 변수에 접근할 때 사용.
method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아올 수 있다.
괄호 안에 입력 값을 따로 넣지 않으면, HTTP 요청 path 변수 중에서 method의 파라미터명과 일치하는 값을 가져온다.
URL에서 /some/path/{id}
@RequestMapping(value = "/some/path/{id}", method = RequestMethod.GET) public ResponseEntity<?> someMethod(@PathVariable int id) { }
Java
복사
HTTP 요청에 대해 매핑되는 request parameter 값이 자동으로 Binding 된다. uri에서 각 구분자에 들어오는 값을 처리해야 할 때 사용한다.
REST API에서 값을 호출할 때 많이 사용한다. (http://localhost:8080/index/1)
@PostMapping("/index/{idx}") @ResponseBody public boolean deletePost(@PathVariable("idx") int postNum) { return postService.deletePost(postNum); }
Java
복사
@RequestParam와 @PathVariable 동시 사용 예제
@GetMapping("/user/{userId}/invoices") public List<Invoice> listUsersInvoices(@PathVariable("userId") int user, @RequestParam(value = "date", required = false) Date dateOrNull) { }
Java
복사
위의 경우 GET /user/{userId}/invoices?date=190101 와 같이 uri가 전달될 때 구분자 {userId}는 @PathVariable(”userId”)로, 뒤에 이어붙은 parameter는 @RequestParam(”date”)로 받아온다.

@RequestParam

HTTP 요청 파라미터를 매핑
@PathVariable과 비슷하다. 요청 URL Query Parameter에서 가져와 매핑해주는 것이다. method의 파라미터에 사용된다.
?moviename=thepurge 와 같은 쿼리 파라미터를 파싱해준다.
괄호 안에 입력 값을 따로 넣지 않으면, HTTP 요청 parameter 중에서 method의 파라미터명과 일치하는 값을 가져온다.
HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
url 뒤에 붙는 parameter값을 가져올 때 사용한다.
http://localhost:8080/home?index=1&page=2
@GetMapping("/home") public String show(@RequestParam("page") int pageNum { }
Java
복사
위의 경우 GET /home?index=1&page=2와 같이 uri가 전달될 때 page parameter를 받아온다.
@RequestParam 어노테이션 괄호 안의 문자열은 전달 인자 이름(실제 값 표시)이다. Spring 3 버전 이후부터는 명시를 해줘야 정상적으로 동작한다.
@RequestMapping(value = "/search/movie", method = RequestMethod.GET) public ResponseEntity<?> someMethod(@RequestParam String moviename) { // request URI would be like '/search/movie?moviename=thepurge' try { List<Movie> movies = service.searchByMoviename(moviename); } catch(Exception e) { e.printStackTrace(); } // return some response here }
Java
복사

@RequestPart

Request로 온 MultipartFile을 바인딩해준다.
@RequestPart("file") MultipartFile file
Java
복사

@RequestHeader

HTTP 요청 헤더를 매핑
Request의 header 값을 가져올 수 있으며 메소드의 파라미터에 사용한다.
자동으로 HTTP 요청의 헤더 항목중에서 어노테이션이 명시한 value값에 해당하는 항목을 메소드의 파라미터 변수에 매핑해준다.
//ko-KR,ko;q=0.8,en-US;q=0.6 @RequestHeader(value="Accept-Language")String acceptLanguage 로 사용
Java
복사

@CookieValue

HTTP 쿠키 매핑

@ResponseBody

HttpMessageConverter를 이용하여 JSON 혹은 xml로 요청에 응답할 수 있게 해주는 어노테이션
view가 아닌 JSON 형식의 값을 응답할 때 사용하는 Annotation으로 문자열을 리턴하면 그 값을 http response header가 아닌 response body에 들어간다.
이미 RestController 어노테이션이 붙어 있다면, 쓸 필요가 없지만 그렇지 않은 단순 컨트롤러라면, HttpResponse로 응답할 수 있게 해준다.
만약 객체를 return하는 경우 JACKSON 라이브러리에 의해 문자열로 변환되어 전송된다.
context에 설정된 view Resolver를 무시한다고 보면 된다.

@RequestBody

요청이 온 데이터 Http Body(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation
POST나 PUT, PATCH로 요청을 받을 때 요청에서 넘어온 body값들을 자바 타입으로 파싱
HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매핑
RequestData를 바로 Model이나 클래스로 매핑
예컨대 JSON이나 XML 같은 데이터를 적절한 messageConverter로 읽을 때 사용하거나 POJO 형태의 데이터 전체로 받는 경우에 사용한다.

@RestController

Spring에서 Controller 중 View로 응답하지 않는 Controller를 의미한다.
method의 반환 결과를 JSON 형태로 반환한다.
해당 Annotation이 적혀있는 Controller의 method는 HttpResponse로 바로 응답이 가능하다.
@ResponseBody 역할을 자동적으로 해주는 Annotation이다.
@Controller + @ResponseBody를 사용하면 @ResponseBody가 모든 메소드에 적용된다.
@RequestMapping(value = "/book", method = RequestMethod.POST) public ResponseEntity<?> someMethod(@RequestBody Book book) { // we can use the variable named book which has Book model type. try { service.insertBook(book); } catch(Exception e) { e.printStackTrace(); } // return some response here }
Java
복사

@Controller와 @RestController 의 차이

Controller
API와 view를 동시에 사용하는 경우에 사용한다.
대신 API 서비스로 사용하는 경우 @ResponseBody를 사용하여 객체를 반환한다.
view(화면) return이 주목적이다.
RestController
view가 필요없는 API만 지원하는 서비스에서 사용한다. (Spring 4.0.1 부터 제공)
@RequestMapping 메서드가 기본적으로 @RequestBody 의미를 가정한다. data(json, xml 등) return이 주목적이다.
즉, @RestController = @Controller + @ResponseBody 이다.

@Configuration

@Configuration을 클래스에 적용하고 @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있다.
1개 이상의 bean을 등록할 때 설정한다.

@Qualifier(”id123”)

@Autowired와 같이 쓰이며, 같은 타입의 Bean 객체가 있을 때 해당 아이디를 적어 원하는 Bean이 주입될 수 있도록 하는 Annotation이다. (같은 타입이 존재하는 경우 - ex) 동물 = 원숭이, 닭, 개, 돼지)
같은 타입의 Bean이 두 개 이상이 존재하는 경우에 Spring이 어떤 Bean을 주입해야 할지 알 수 없어서 Spring Container를 초기화하는 과정에서 예외를 발생시킨다.
이 경우 @Qualifier을 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있도록 한다.
xml 설정에서 bean의 한정자 값(qualifier value)을 설정한다.
@Autowired 어노테이션이 적용된 주입 대상에 @Qualifier 어노테이션을 설정한다.

@Resource*

@Autowired와 마찬가지로 Bean 객체를 주입
차이점은 Autowired는 타입으로, Resource는 이름으로 연결해준다.
특정 Framework에 종속적인 어플리케이션을 구성하지 않기 위해서는 @Resource를 사용할 것을 권장한다.

@PostConstruct, @PreConstruct

의존하는 객체를 생성한 이후 초기화 작업을 위해 객체 생성 전/후에(pre/post) 실행해야 할 method 앞에 붙인다.

@PreDestroy

객체를 제거하기 전(pre)에 해야할 작업을 수행하기 위해 사용한다.

@PropertySource

해당 프로퍼티 파일을 Environment로 로딩하게 해준다.
클래스에 @PropertySource(”classpath:/settings.properties”) 라고 적고 클래스 내부에 @Resource를 Environment 타입의 멤버 변수 앞에 적으면 매핑된다.

@ConfigurationProperties

yaml 파일 읽는다.
default로 classpath:application.properties 파일이 조회된다.
속성 클래스를 따로 만들어주고 그 위에 (prefix=”mail”)을 써서 프로퍼티의 접두사를 사용할 수 있다.
mail.host = mailserver@mail.com mail.port = 9000 mail.defaultRecipients[0] = admin@mail.com mail.defaultRecipients[1] = customer@mail.com
YAML
복사

@Lazy

지연로딩을 지원한다.
@Component나 @Bean Annotation과 같이 쓰는데 Class가 로드될 때 스프링에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법이다.

@Value***

properties에서 값을 가져와 적용할 때 사용한다.
SPRING BOOT 사용 시, application.properties에 key/value 값으로 spring 이 prefix로 시작하는 설정들을 사용할 수 있으니, 간단하게 여기서 설정할 수 있는 것들은 properties에 등록한다.
@Value("${value.from.file}")
Java
복사
private String valueFromFile; 이라고 구성되어 있으면 value.from.file의 값을 가져와서 해당 변수에 주입해준다. spEL을 이용해서 조금 더 고급스럽게 사용할 수 있다.
@Value(#{systemProperties['priority'] ?: 'some default'})
Java
복사

@SpringBootApplication

@Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 어노테이션으로 합친 것

@CookieValue

쿠키 값을 parameter로 전달 받을 수 있는 방법이다.
해당 쿠키가 존재하지 않으면 500 에러를 발생시킨다.
속성으로 required가 있는데 default는 true다.
false를 적용하면 해당 쿠키 값이 없을 때 null로 받고 에러를 발생시키지 않는다.
// 쿠키의 key가 auth에 해당하는 값을 가져옴 public String view(@CookieValue(value="auth")String auth){...};
Java
복사

@CrossOrigin

CORS 보안상의 문제로 브라우저에서 리소스를 현재 origin에서 다른 곳으로의 AJAX 요청을 방지하는 것이다.
@RequestMapping이 있는 곳에 사용하면 해당 요청은 타 도메인에서 온 ajax 요청을 처리해준다.
//기본 도메인이 http://jeong-pro.tistory.com 인 곳에서 온 ajax요청만 받아주겠다. @CrossOrigin(origins = "http://jeong-pro.tistory.com", maxAge = 3600)
Java
복사

@ModelAttribute

view에서 전달해주는 parameter를 Class(VO/DTO)의 멤버 변수로 binding 해주는 Annotation 이다.
binding의 기준은 <input name=”id” /> 처럼 어떤 태그의 name값이 해당 Class의 멤버 변수명과 일치해야 하고 setmethod 명도 일치해야 한다
class Person{ String id; public void setId(String id){ this.id = id;} public String getId(){ return this.id } } @Controller @RequestMapping("/person/*") public class PersonController{ @RequestMapping(value = "/info", method=RequestMethod.GET) //view에서 myMEM으로 던져준 데이터에 담긴 id 변수를 Person타입의 person이라는 객체명으로 바인딩. public void show(@ModelAttribute("myMEM") Person person, Model model) { model.addAttribute(service.read(person.getId())); } } 출처: https://sddev.tistory.com/225 [devNote:티스토리]
Java
복사

@GetMapping***

@RequestMapping(Method=RequestMethod.GET)과 같다.

@PostMapping***

@RequestMapping(Method=RequestMethod.POST)과 같다.

@PutMapping***

@PutMapping(Method=RequestMethod.PUT)과 같다.

@PatchMapping***

@RequestMapping(Method=RequestMethod.PATCH)과 같다.

@DeleteMapping***

@RequestMapping(Method=RequestMethod.DELETE)과 같다.

@SessionAttributes

Session에 data를 넣을 때 쓰는 Annotation.
@SessionAttributes(”name”)이라고 하면 Model에 key값이 “name”으로 있는 값은 자동으로 세션에도 저장되도록 한다.

@Valid***

유효성 검증이 필요한 객체임을 지정한다.
POJO Java Class 검증을 수행한다.
주로 Controller에서 @RequestBody와 주로 같이 사용

@InitBinder

@Valid 어노테이션으로 유효성 검증이 필요하다고 한 객체를 가져오기 전에 수행해야 할 method를 지정한다.

@ExceptionHandler(ExceptionClassName.class)

해당하는 예외클래스 형식의 예외가 발생했을 경우, 예외를 캐치하여 처리한다.
각 Service, Controller, Component 등을 작성하다가 throw new [CustomBusinessException](”~”) 등으로 작성해주면, 해당 method가 실행된다.
@ControllerAdvice 어노테이션이 붙은 class 내에서 사용된다.

@ControllerAdvice

Class 위에 ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지를 각 메소드 상단에 @ExceptionHandler(예외클래스명.class) 를 붙여서 기술한다.