참고:
@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) 를 붙여서 기술한다.