어노테이션 (Annotation)
어노테이션은 Java5부터 새롭게 추가된 문법요소
사전적으로는 "주석"이라는 의미를 가진다.
자바의 어노테이션은 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종
메타 데이터란 애플리케이션이 처리해야 할 데이터가 아니라 컴파일 과정과 실행 과정에서 코드를 어떻게 처리해야 하는지를 알려주기 위한 추가 정보
프로그램에게 추가적인 정보를 제공해주는, 데이터를 위한 데이터
애플리케이션
애플리케이션 프로그램, 즉 응용프로그램의 줄임 말이다. 응용프로그램은 사용자 또는 어떤 경우에는 다른 응용프로그램에게, 특정한 기능을 직접 수행하도록 설계된 프로그램
@를 이용한 주석, 자바코드에 주석을 달아 특별한 의미를 부여한 것
클래스, 메서드, 변수 등 모든 요소에 선언 가능
컴파일 타임 또는 런타임에 해석되며 자바와 Spring에서 제공해주는 경우와 사용자가 직접 만드는 2가지 경우의 어노테이션이 존재
어노테이션은 왜 쓰일까?
어노테이션의 탄생
프로그래머에게 그들의 코드에 대한 메타데이터를 자신의 코드에 직접적으로 기술할 수 있는 것을 제공하기 위해 탄생되었다.
어노테이션이 만들어지기전 XML을 주로 사용하였지만, 규모가 커질수록 유지보수가 어려워졌다.
(결합도를 낮추고 유지보수성을 높이기 위해 xml로 설정하였으나 xml이 너무 많아지면 오히려 유지보수성이 낮아지는 아이러니한 상황 발생 위와 같은 문제를 해결하기 위해 어노테이션이 탄생하였다. )
어노테이션을 사용할 경우의 장점
데이터에 대한 유효성 검사 조건을 어노테이션을 사용하여 Model 클래스에 직접 명시함으로써
해당 데이터들에 대한 유효 조건을 쉽게 파악할 수 있게 되며, 코드의 양도 줄어든다.
(코드가 깔끔해지고, 어노테이션의 재사용도 가능해진다)
자주 사용되는
자바에서 제공하는 기본 어노테이션
1. @Override
메서드를 오버라이드 하겠다는 의미로 메서드의 선언 앞에 붙여준다.
만약 상속받은 부모 클래스 또는 구현해야 할 인터페이스에서 해당 메서드가 없다면 컴파일 오류가 발생한다.
public class HomeInterceptor extends HandlerInterceptorAdapter { @Override //해당 메소드가 부모 클래스에 있는 메소드를 재정의했다는 것을 명시적으로 선언 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // System.out.println("preHandler 호출"); int startTime = 0; request.setAttribute("startTime", startTime); return true; }
2. @Deprecated
이 메서드를 사용하는 애플리케이션을 컴파일할 경우 컴파일 경고가 발생한다.
하위 호환을 위해서 메서드 자체를 없애지는 못하지만 사용하지 말 것을 사용자에게 알리고 싶을 때 붙여준다.
3. @SuppressWarnings
컴파일러 경고를 출력하지 않도록 설정한다.
SuppressWarnings 어노테이션은 인자를 받는데 인자에 따른 의미가 달라진다.
@SuppressWarnings("all") // 모든 경고를 억제
@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//System.out.println("postHandler 호출");
int startTime = (int) request.getAttribute("startTime");
request.removeAttribute("startTime");
int endTime = 3;
modelAndView.addObject("handlingTime", endTime - startTime);
}
인자 : 메서드 "정의"에 사용되는 변수
인수 : 메서드 "호출"에 사용되는 변수
스프링에서 제공하는 어노테이션
1. Java Configuration
@Configuration
xml 설정을 대체할 수 있는 Java Config
Java Config란 말 그대로 자바 클래스 파일을 설정 파일로 사용을 하겠다는 것
스프링에서는 Java Config로 사용하는 클래스에는 @Configuration이라는 어노테이션을 붙여서 표시
@ComponentScan
빈으로 등록될 준비를 마친 클래스들을 스캔하여, 빈으로 등록해주는 것
@Component
컴포넌트 스캔의 대상이 되는 어노테이션 중 하나로써 주로 유틸, 기타 지원 클래스에 붙이는 어노테이션
@Controller, @Service, @Repository,
@Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록
@EnableWebMvc
어노테이션 기반의 SpringMvc를 구성할 때 필요한 Bean설정들을 자동으로 해주는 어노테이션
기본적으로 등록해주는 Bean들 이외에 추가적으로 개발자가 필요로 하는 Bean들을 등록을 손쉽게 할 수 있도록 도와줌
@Configuration //@Configuration 어노테이션을 명시하여 해당 클래스에서 1개 이상의 Bean을 생성하고 있음을 명시
@EnableWebMvc //설정 클래스에 @EnableWebMvc 어노테이션을 추가해주면 해당 빈을 자동으로 추가해준다.
@ComponentScan(basePackages = "com.carroti.BoardTest") //스캔 위치를 설정하고, 어떤 Annotation을 스캔할지 또는 하지 않을지 결정하는 Filter 기능
public class ServletConfiguration extends WebMvcConfigurerAdapter{
@Bean
bean을 정의하는 어노테이션
@Configuration
/* 스프링 설정 클래스라는 의미 ApplicationContext중에서 AnnotationConfigApplicationContext는 JavaConfig클래스를 읽어들여 IoC와 DI를 적용하게 됩니다. */
public class BeanConfiguration { @Bean
/* @Bean이 붙어 있는 메소드들을 AnnotationConfigApplicationContext는 자동으로 실행하여 그 결과로 리턴하는 객체들을 기본적으로 싱글턴으로 관리 */
public HomeService homeService() { return new HomeService(homeMapper()); }
private HomeMapper homeMapper() { // TODO Auto-generated method stub return null; } }
@Autowired
주입 대상이 되는 bean을 컨테이너에 찾아 주입하는 어노테이션
사용할 시, 스프링이 자동적으로 값을 할당
사용 위치 : 필드, 생성자, setter 메서드 (기본 생성자 정의 필수)
@Service public class HomeService { @Autowired private HomeMapper homeMapper;//homeMapper의 타입으로 참조할 bean을 찾아 주입한다
public HomeService(HomeMapper homeMapper) {}
2. @Controller, @Service, @Repository
@Controller
스프링에서 Controller를 의미
Spring MVC에서 Controller Class에서 쓰임
해당 어노테이션이 붙은 Class는 Bean으로 등록되며 해당 클래스가 Controller로 사용됨을 Spring Framework에 알림
@RequestMapping
@RequestMapping(value="경로", method=RequestMethod.GET) @RequestMapping(value="경로", method=RequestMethod.POST) @RequestMapping("경로")
// @GetMapping, @PostMapping을 사용하는 이유는 간결, URL중복 가능, 코드에 의미가 명시되어있음
@RestController //Spring에서 Controller 중 View로 응답하지 않는, Controller를 의미
@RequestMapping(value = "/hello") //공통적인 url은 class에 @RequestMapping으로 설정 public class HelloController { @GetMapping("/hi") public String helloGetHi(...) { ... } } /* @RequestMapping은 Class와 Method에 붙일 수 있고 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping들은 Method에만 붙일 수 있다 */
@GetMapping
- URL에 변수(데이터)를 포함시켜 요청
- 데이터를 Header(헤더)에 포함하여 전송
- URL에 데이터가 노출되어 보안에 취약
@PostMapping
- URL에 변수(데이터)를 노출하지 않고 요청
- 데이터를 Body(바디)에 포함
- URL에 데이터가 노출되지 않아 GET 방식보다 보안이 높음
@GetMapping("경로") @PostMapping("경로") //숨겨서 보낼 데이터는 Post 방식
@RestController
스프링 프레임워크 4.x 버전 이상부터 사용 가능한 어노테이션
@Controller에 @ResponseBody가 결합된 어노테이션
컨트롤러 클래스에 @RestController를 붙이면, 컨트롤러 클래스 하위 메서드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON 등을 전송할 수 있다.
@ResponseBody
Java 객체를 HTTP 요청의 body 내용으로 매핑하는 역할.
VO 객체를 JSON으로 바꿔서 HTTP body에 담는 스프링 어노테이션
메서드의 return 값을 HTTP Response의 body에 담는 역할
REST란, “웹에 존재하는 모든 자원(이미지, 동영상, DB 자원)에 고유한 URI를 부여해 활용” 하는 것
자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미한다
다시 말해서 @RestController는 json 형태로 객체 데이터를 반환한다
JSON
JavaScript Object Notation라는 의미의 축약어
데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식
@RestController public class RestControllerEX { @GetMapping("/testpage") public String root(){ return "HELLO_WORLD"; /* @Controller는 페이지를 return 하지만 @RestController는 데이터를 return 한다 */ } }
@Service , @Repository
스프링에서 Service, Repository를 의미
Spring MVC에서 Service Class에서 쓰임 / Repository interface에서 쓰임
해당 어노테이션이 붙은 Class는 Bean으로 등록되며 해당 클래스가 Service, Repository로 사용됨을 Spring Framework에 알림
요약
어노테이션은 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종이며
메타 데이터는 데이터를 위한 데이터(추가적인 정보 제공)
결합도를 낮추고 유지보수성을 높이기 위해 xml로 설정하였으나 xml이 너무 많아지면 오히려 유지보수성이 낮아지는 아이러니한 상황 발생 위와 같은 문제를 해결하기 위해 어노테이션이 탄생
어노테이션은 자바에서 기본으로 제공하는 것 과 스프링에서의 어노테이션, 사용자가 정의하는 어노테이션으로 나뉜다.
대표적으로 자주 쓰이는 어노테이션들을 우선적으로 정리
스프링에서 프로젝트를 설정할 때 Java Configuration 또한 스프링의 어노테이션을 통해 설정, 설명
'스프링' 카테고리의 다른 글
[Spring Boot -1] 스프링 부트 장점과 그 이유 (2) | 2024.03.26 |
---|---|
스프링 컨테이너의 종류 (0) | 2022.04.20 |
스프링의 특징 4 [PSA] (0) | 2021.09.09 |
스프링의 특징 3 [AOP] (0) | 2021.09.08 |
스프링의 특징 2 [DI, IoC] Spring Bean (0) | 2021.09.08 |