어노테이션(Annotation) 이란?
위키백과에서 다음과 같이 설명한다.
자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.
Spring 관련 어노테이션
@Component
- 스프링에서 객체로 만들어서 관리하는 대상임을 명시하는 어노테이션 입니다.
- 스프링이 시작되면 root-context.xml에 설정되어있는 <context:component-scan> 태그의 내용을 통해서 해당 어노테이션
이 존재하는 클래스들을 생성해 빈으로 관리하게 됩니다.
- 클래스 위에 사용
@Autowired
- 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입해주라는 표시입니다.
- 정상적으로 주입이 가능하다면 자동으로 객체를 주입하게 됨
@Controller
- 스프링에서 객체(Bean) 설정에 사용되는 어노테이션 입니다.
- 해당 클래스가 Controller임을 명시합니다.
- servlet-context.xml의 <context:component-scan base-package="패키지 경로" /> 태그로 인해 Bean으로 관리됩니다.
- Bean으로 등록되면 Package Explorer 탭 상에 클래스 옆에 작게 's' 모양의 아이콘이 추가됩니다.
- 클래스 위에 사용
@RequestMapping("URL 패턴", method = {RequestMethod.GET, RequestMethod.POST})
- 현재 클래스의 모든 메서드들의 기본적인 URL 경로를 생성합니다.
- @Controller와 함께 클래스 선언부에서 사용됩니다.
- Method 속성을 가질 수 있습니다. (GET 방식, POST 방식 등 구분해서 사용, 축약형이 존재함)
- 클래스 선언과 메서드 선언에 사용할 수 있습니다.
@GetMapping("URL 패턴"), @PostMapping("URL 패턴")
- RequestMapping의 속성인 method의 Get, Post 축약형 입니다
- 해당 방식만 지원하므로 간편하기는 하지만 기능에 대한 제한이 존재함
- 메소드 위에 사용
@RequestParam("파라미터 명") int age
- 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우 유용하게 사용
- 메소드의 파라미터로 사용
// Controller를 작성할 때 가장 편리한 기능은 파라미터가 자동으로 수집되므로, 매번 request.getParameter()를 이용하는 불편함을 없앨 수 있습니다.
@InitBinder
- 파라미터의 수집을 다른용어로 binding이라고 합니다. 변환이 가능한 데이터는 자동으로 변환되지만,
경우에 따라서는 파라미터를 변환해서 처리할 경우가 존재합니다. (String -> java.util.Date)
파라미터를 바인딩할 때 자동으로 호출되는 어노테이션 입니다.
- Controller에서 작성합니다.
ex )
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(dateFormat, false));
}
@DateTimeFormat
- @InitBinder 대신 파라미터로 사용되는 인스턴스 변수에 @DateTimeFormat을 적용해 변환합니다.
- DTO 멤버변수 선언시 작성합니다.
ex)
@DateTimeFormat(pattern = "yyyy/MM/dd")
private Date dueDate;
@ModelAttribute
- 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 때 필요한 어노테이션
- 해당 노테이션이 사용된 파라미터는 타입에 관계없이 무조건 Model에 담아서 전달
- 파라미터로 전달된 데이터를 다시 화면에서 사용해야 할 경우에 유용함
- 형식: @ModelAttribute("파라미터 명") 타입 변수명
- 메소드내 파라미터 왼쪽에 사용
@RequestBody / @ResponseBody 정리.
클라이언트에서 서버로 필요한 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아서 서버로 보내면, 서버에서는 @RequestBody 어노테이션을 사용하여 HTTP 요청 본문에 담긴 값들을 자바객체로 변환시켜, 객체에 저장한다.
서버에서 클라이언트로 응답 데이터를 전송하기 위해 @ResponseBody 어노테이션을 사용하여 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송한다.
@Service
- 계층 구조상 주로 비즈니스 영역을 담당하는 객체임을 표시하기 위해 사용
- 작성된 어노테이션은 패키지를 읽어 들이는 동안 처리됨
- ServiceImpl 클래스 위에 사용
@WebAppConfiguration
- Servlet의 ServletContext를 이용하기 위해서 사용
- 스프링에서는 WebApplicationContext라는 존재를 이용하기 위해서 사용
- 클래스명 위에 사용
@Before
- 해당 어노테이션이 적용된 메서드에게 매번 실행시킬 수 있도록 (테스트 등) 설정하기 위해 사용
- 메서드명 위에 사용
Lombok 관련 어노테이션
@Data
- setter, getter, 생성자, toStriong() 등을 자동으로 생성 하도록 합니다.
- @EqualsAndHashCode, @Getter/@Setter, @RequiredArgsConstructor를 결합한 형태
- 클래스 위에 사용
@Setter
- 자동으로 setter 메소드를 컴파일 시 생성합니다.
- 3가지의 속성을 부여해 줄 수 있습니다.(value, onMethod, onParam)
- value : 접근 제한 속성을 의미합니다. 기본값은 lombok_AccessLevel.PUBLIC
- onParam: setter 메서드의 파라미터에 어노테이션을 사용하는 경우에 적용합니다.
- onMethod: 아래에서 설명합니다.
- 멤버 변수 위에 사용
@Setter(onMethod_ = @Autowired) [onMethod]
- 생성 시 메서드에 추가할 어노테이션을 지정합니다.
- 특이하게도 '_'표기가 사용되는데 JDK 버전에 따라 차이가 있습니다
- Setter의 onMethod 속성은 생성되는 setter에 @Autowired 어노테이션을 추가하도록 합니다.
(생성자를 통한 의존성 주입과, Setter을 통한 의존성 주입이 존재합니다.)
- 멤버 변수 위에 사용
@Setter(onMethod_ = @Autowired)
- 생성 시 메서드에 추가할 어노테이션을 지정합니다.
- 특이하게도 '_'표기가 사용되는데 JDK 버전에 따라 차이가 있습니다
- Setter의 onMethod 속성은 생성되는 객체에 @Autowired 어노테이션을 추가하도록 합니다.
- 멤버 변수 위에 사용
@Log4j
- Lombok을 이용해서 로그를 기록하는 Logger를 변수로 생성합니다.
- 별도의 Logger 객체의 선언이 없어도 Log4j 라이브러리와 설정이 존재한다면 바로 사용이 가능합니다.
- Legacy Project의 경우 기본적으로 Log4j와 해당 설정이 완료되는 상태이기 때문에 별도의 처리 없이도 사용 가능합니다.
- 로그에 대한 설정은 'src/main/resources' 와 'src/test/resources'에 별도로 존재합니다.
- Log4j가 존재하지 않을 경우에는 @Log를 이용할 수 있습니다.`
- 테스트 클래스 바로 위에 사용
@AllArgsConstructor
- 인스턴스 변수로 선언된 모든 것을 파라미터로 받는 생성자를 작성하게 됩니다.
- @NonNull과 @RequiredArgsConstructor 어노테이션을 이용하면 특정한 변수에 대해서만 생성자를 작성할 수 있습니다.
- 클래스 위에 사용
@RequiredArgsConstructor
- @NonNull이나 final이 붙은 인스턴스 변수에 대한 생성자를 만들어 냅니다.
- 클래스 위에 사용하고, @NonNull는 변수 위에 사용합니다.
@ControllerAdvice
- AOP(Aspect-Oriented-Programming)를 이용하는 방식
※AOP란 핵심적인 로직은 아니지만 프로그램에서 필요한 '공통적인 관심사(cross-concern)는 분리'하자는 개념
- Controller를 작성할 때는 메서드의 모든 예외사항을 전부 핸들링해야 한다면 중복적이고 많은 양의 코드를 작성해야
하지만, AOP 방식을 이용하면 공통적인 예외사항에 대해서는 별도로 @ControllerAdvice를 이용해서 분리
- 예외 처리를 목적으로 생성하는 클래스이므로 별도의 로직을 처리하지는 않습니다.
- 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 용도
- 클래스 위에 사용
@ExceptionHandler(예외종류)
- 해당 메서드가 () 들어가는 예외 타입을 처리한다는 것을 의미합니다.
- 속성으로 Exception 클래스 타입을 지정할 수 있습니다.
- 메소드 위에 사용
Java 설정 관련 어노테이션
@ComponentScan(basePackages= {"org.zerock.sample"})
- Java 설정을 이용하는 경우에 의존성 주입을 설정하는 어노테이션
- root-context.xml을 대신하는 클래스명 위에 사용 (RootConfig)
@EnableWebMvc
- xml 설정 기반의 servlet-context.xml을 대신하기위해 사용
- WebMvcConfigurer 인터페이스도 구현해야함
( 과거에는 WebMvcConfigurerAdpter 추상 클래스 사용, 스프링 5.0버전부터는 Deprecated되었음 )
@Configuration
- xml 설정 기반의 servlet-context.xml을 대신하기위해 사용
- WebMvcConfigurationSupport 클래스를 상속하여 같이 사용
- 일반 @Configuration 우선순위가 구분되지 않는 경우에 사용
테스트 관련 어노테이션
@RunWith(SpringJUnit4ClassRunner.class)
- 테스트 시 필요한 클래스를 지정합니다.
- 현재 테스트 코드가 스프링을 실행하는 역할을 할 것이라고 알려줍니다.
- spring-test 모듈을 이용할때 사용합니다.
- test클래스명 위에 사용합니다.
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
- 스프링이 실행되면서 어떤 설정 정보를 읽어 들여야 하는지를 명시합니다.
- 지정된 클래스나 문자열을 이용해서 필요한 객체들을 스프링 내에 객체로 등록하게 됩니다.
(흔히 스프링의 빈으로 등록된다고 표현하곤 합니다. (스프링에서 관리해야하는 객체를 빈이라고 함) )
- 'classpath:' 나 'file:' 을 이용할 수 있습니다.
- 속성으로는 locations를 이용해서 문자열의 배열로 XML 설정 파일을 명시할 수 있습니다.
- classes 속성으로 @Configuration이 적용된 클래스를 지정해 줄 수도 있습니다.
- xml 기반 설정 스프링의 테스트 시에는 root-context.xml의 경로를 지정할 수 있습니다.
- 테스트 클래스 위에 사용, @RunWith 어노테이션 밑
@Test
- JUnit에서 테스트 대상을 표시하는 어노테이션
- 해당 메서드를 선택하고 JUnit Test 기능을 실행
- assertNotNull(변수명); -> 해당 변수가 null이 아니어야만 테스트가 성공한다는 것을 의미함
- 테스트 작업은 프로젝트 초기에 설정해 두고 사용하는 습관을 가지는 것이 좋음
- 테스트 메서드명 위에 사용함
'시스템' 카테고리의 다른 글
Spring 동작 과정 MVC의 기본구조 (0) | 2023.03.03 |
---|---|
스프링 개발 Maven 및 rootContext 세팅 (xml, java configuration) (0) | 2023.03.02 |
스프링 Java Configuration 세팅 방법 (0) | 2023.03.01 |
스프링 초기세팅 (0) | 2023.02.27 |
Windows 11 | Apach Tomcat(아파치 톰캣) 설치 및 실행 방법 (0) | 2022.11.23 |