본문 바로가기

시스템

Spring 어노테이션 정리

어노테이션(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이 아니어야만 테스트가 성공한다는 것을 의미함

- 테스트 작업은 프로젝트 초기에 설정해 두고 사용하는 습관을 가지는 것이 좋음

- 테스트 메서드명 위에 사용함