스프링(부트아님ㅋ)
Spring 애너테이션 몇 가지 정리
클라스하이
2023. 5. 14. 00:33
최근에 스프링으로 프로젝트를 시작 했는데 자꾸 애너테이션을 쓰려고 하니까 그 사용처와 왜 써야할지가 생각이 나질 않는다... 그래서 공부목적으로 내가 배웠던 그리고 알고 있는 애너테이션의 의미와 기능을 짤막하게 정리하려 한다.
- @Controller : 프로그램이 원격호출 가능하도록 등록하는 애너테이션
- @RequestMapping : URL과 클래스, 메서드를 연결
- @RequestMapping은 클래스 위에다가도 쓸 쑤 있고 메서드 위에다가도 쓸 수 있다.
- 클래스 위에다가 쓰면 url 상위 Path를 지정한다.
- @RequestMapping(method = RequestMethod.POST, path = "/postMethod")
- @RequestMapping(method= {RequestMethod.POST, RequestMethod.GET})
- post,get 둘다 넣을 수 있다.
- @RequestMapping은 클래스 위에다가도 쓸 쑤 있고 메서드 위에다가도 쓸 수 있다.
- @GetMapping : get 요청 정의
- @PostMapping : post 요청 정의
- @PutMapping : 수정
- @PatchMapping : 수정
- put, patch의 차이가 뭘까...?
- @DeleteMapping : 삭제
- @RestController : rest api 구현시 클래스 위에 붙인다.
- @RequestMapping + @ResponseBody 두개 합친거와 같다.
- @RequestBody : 요청 파라미터가 Json으로 컨트롤러로 오는 경우 유저가 정의한 자바객체로 바인딩해준다.
- @ResponseBody : @RestController를 사용하면 자동으로 @ResponseBody를 붙여준다. 컨트롤러에서 반환하는 객체를 json format 으로 바꿔준다.
- @PathVariable : Restful API 작성시 URL에 중간에 번호 같은걸 넣을 때 URL path에 있는 값을 가져온다.
- @RequestParam : 요청할 때 넘어온 파라미터를 매개변수에 연결할 때 쓴다.
- 데이터를 GET, POST 둘다 받을 수 있다.
- 요청으로 넘어오는 파라미터을 String, int, boolean, Integer등 원하는 단순한 타입으로 매핑이 가능하다.
- 쿼리스트링으로 url에 key, value를 붙이는데 그것을 컨트롤러 단에서 받아서 처리해야 하는 경우를 위한 애너테이션인데 기존 서블릿에서는 Httpservletrequest 객체로 getAttribute로 이것을 처리했었다.
- 옵션을 넣어줄 수가 있으며 다음과 같은 옵션이 있다.
- name, required, defaultValue
- name : key 이름을 지정
- required : 파라미터를 필수로 입력할 것인가에 대한 여부를 결정
- true면 필수로 입력해야 한다는 것
- 이것을 true라고 지정했다는 것으로 인해 발생될 에러의 경우를 고려
- false는 필수로 입력하지 않아도 좋다.
- 이런경우엔 defaultValue를 지정하거나 예외처리 로직을 고려해야 한다.
- true면 필수로 입력해야 한다는 것
- defaultValue : 기본값이다.
- name, required, defaultValue
- @ModelAttribute : 적용 대상을 Model의 속성으로 자동으로 추가해주는 애너테이션이다.
- 적용 대상이 되는 객체는 setter가 정의되어 있어야 한다.
- 기존에 view 페이지로 보내줄 데이터를 Model에 담아서 m.addAttribute("key", value); 와 같은 방식을 사용하였다. (Model m이라 선언함)
- 그런데 m.addAttribute와 같은 코드를 쓰지 않더라도 @ModelAttribute Myclass mycls 요런식으로 매개변수로 넣어준다면 key, value가 자동으로 지정되어서 m.addAttribute와 같은 동작이 처리된다.
- key는 default로 클래스 첫번째 문자를 소문자로 바꿔서 적용 MyClass ---> myClass
- 키값을 직접 지정 가능
- @ModelAttribute("myModel") Myclass mycls : 이렇게 지정해주면 key값이 myModel로 된다.
- 파라미터를 검증할 수 있는 기능을 제공한다. BindingResult를 같이 붙여서 쓸 수 있음
- Spring MVC에서 @ModelAttribute는 값을 객체로 바인딩할 때 프로퍼티 접근법을 사용한다.
- 해당 객체를 생성(기본생성자)
- 프로퍼티 접근법인 setter를 사용하여 넘어온 값을 객체에 주입
- 하지만 모든 필드를 매개변수로 받는 생성자를 만들어도 setter가 없더라도 정상적으로 바인딩은 된다.
- WebDataBinder가 타입변환, 데이터 검증 작업을 해준다.
- ★ @ModelAttribute 나 @RequestParam이 생략되었더라도 파라미터의 Type이 뭐냐에 따라서 자동으로 붙여준다.
- Type이 참조형일 때 > @ModelAttribute
- Type이 기본형, String 일 때 @RequestParam
- @RequestParam으로 여러개를 받다가 너무 많아지면 객체를 정의해서 @ModelAttribute로 관리한다.
- @ WebServlet은 서블릿에서 쓰는 애너테이션인데 스프링의 @Controller와 @RequestMapping을 합친 개념이다.
- @ExceptionHandler : 예외 처리를 위하 쓰는 애너테이션이다.
- 메서드 위에 @ExceptionHandler(예외클래스.class) 붙이고 에러 페이지 리턴하여 사용
- @ControllerAdvice : 컨트롤러 전역에서 발생하는 예외를 처리할 때 @ExceptionHandler와 같이 쓴다.
- @ResponseStatus : 응답 메세지의 상태코드를 변경할 때 사용할 수 있다.
- @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) : 405 상태코드로 변경(METHOD_NOT_ALLOWED)
- @CookieValue(value="id", required=false) Cookie cookie: 쿠키 중에서 id키로 해당 쿠키를 찾고 맞는 정보를 Cookie 객체에 저장해준다. cookie.getValue()로 값 확인
- @Data : lombok에서 제공해주는 애너테이션인데 @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor를 자동으로 적용해준다.
- @AllArgsConstructor : 모든 필드를 넣는 생성자를 만들어줌
- @NoArgsConstructor : 기본 생성자를 만들어줌
- @InitBinder : 변환 과정에서 바인딩 처리를 위한 애너테이션이다. 해당 컨트롤러 내에서만 가능
- @DataTimeFormat(pattern="yyyy/MM/dd") : 시간 객체를 원하는 형태로 바인딩 가능하다.
- @NumberFormat : format 지정을 위한 애너테이션이다. 숫자 관련 형식 지정이 가능
- @Valid : 검증을 위한 애너테이션인데 이것도 커스텀으로 Validator 클래스를 따로 만들고 @Valid 애너테이션을 붙이면 해당 객체가 컨트롤러로 들어오면 검증을 하고 그 결과를 BindingResult 객체에 담아준다.
- 자바 애너테이션이고 Bean Validation API 검색해서 maven에서 가져다 쓰자.
- @Component : 개발자가 작성한 클래스를 Bean으로 만들겠다라는 의미다. 이것을 사용하면 Bean Configuration 파일에 Bean을 등록하지 않아도 사용이 가능하다.
- <context:component-scan base-package="패키지경로" /> 이걸 xml파일에 지정해주면 해당 패키지 경로안에 있는 @Component붙은 클래스를 찾아서 검색한다.
- @Controller, @Service, @Repository, @ControllerAdvice는 @Component가 내부적으로 들어가 있다.
- @Configuration :스프링 IOC Container에게 해당 클래스를 Bean 구성 Class임을 알려준다.
- @Bean : 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 붙인다.
- @Configuration과 같이 쓰는데 @Configuration을 클래스 위에, 메소드 위에다가 @Bean을 쓴다.
- @Autowired : Bean을 자동으로 주입해준다.
- Controller에 dao객체나 service 객체를 @Autowired로 주입하는 경우가 많음
- xml에 component-scan을 해놓자 쓰기
- 주의할 점은 type으로 해당 bean을 검색한다. 검색시에 중복되는 type이 있으면 에러를 띄워준다.
- 그걸 경우 @Qualifier 애너테이션을 붙여서 내가 어떤 클래스를 빈으로 주입하는지 명시해야 한다.
- @Resource : 마찬가지로 Bean을 주입하는 애너테이션인데 @Autowired와 차이점이 있다면 이건 byName으로만 검색한다.
- @Inject : Autowired와 비슷하고 @Named를 추가적으로 사용해서 이름기준으로 주입할 Bean 지정하능, @Qualifier도 사용가능
- javax 라이브러리 필요
- Bean을 검색하는 기준의 순서가 조금 다름
- Autowired : 타입 > 이름 > @Qualifier
- Inject : 타입 > @Qualifier > 이름
- @Value : 기본형 타입의 값을 주입할 때 써준다.
- @Transactional : 트랜잭션과 관련된 애너테이션 > 트랜잭션 처리 적용
- 어노테이션 기반 AOP를 통해 구현
- 트랜잭션 setup, commit, rollback, close 코드를 알아서 넣어준다.
- rollbackFor 붙여주기
- <tx:annotation-driven/> 필요
- Test시에 @RunWith으로 Junit 명시, @ContextConfiguration로 xml 파일 위치 명시
- 계층에 따른 코드를 다음의 애너테이션으로 구분
- @Controller : 표현 레이어 (표현계층, 컨트롤러)
- @Service : 서비스레이어(business 계층)
- @Repository : 영속계층(persistant 계층)
- @PostConstruct : 이 애너테이션을 메서드 위에 달면 bean 생성 후에 메서드가 실행
- @PreDestory : Spring이 application context에서 bean을 제거하기 직전에 단 한번 실행
- @PostConstruct , @PreDestory 둘다 javax-annotation-api 라이브러리꺼