초급의 끄적거림

[Spring] 어노테이션 본문

JAVA

[Spring] 어노테이션

codingD 2019. 11. 30. 20:24

1. 어노테이션이란

  • @를 이용한 주석, 자바코드에 주석을 달아 특별한 의미를 부여하는 것
  • 기본적인 종류는 한정적, But 본인의 입맛대로 커스텀 어노테이션을 만들어 낼 수 있음
  • 클래스나 메소드 위에 쓰면 스프링 프레임워크가 그것을 싱글톤 패턴의 빈 컨테이너로 만들고 생명주기 관리
  • 컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터 제공 → 코드에 정보를 추가하는 정형화된 방법

 

2. 어노테이션의 용도

  • @Override 어노테이션처럼 컴파일러를 위한 정보를 제공하기 위한 용도
  • 스프링 프레임워크의 @Controller 어노테이션처럼 런타임에 리플렉션을 이용하여 특수 기능을 추가하기 위함
  • 컴파일 과정에서 어노테이션 정보로부터 코드를 생성하기 위한 용도

 

3. @Autowired

  • 의존 자동 주입 : 자동 주입 기능을 수행. 설정 파일에 의존 객체를 명시하지 않아도 스프링이 필요한 의존 빈 객체를 찾아서 주입

     - 방법 1) 자동 주입 대상에 @Autowired 어노테이션 사용

       : @Autowired 어노테이션이 적용된 의존 대상은 XML 설정에서 의존 주입 관련 설정을 하지 않아도 됨

     - 방법 2) XML 설정에 <context:annotation-config/> 설정 추가

  • @Service 어노테이션과 함께 스프링 기동시 Bean 객체로 등록된 해당 서비스는 @Autowired 어노테이션에 의해 Setter가 생성되며 해당 객체가 자동으로 주입되는 의존성 주입 형태로 변경
  • 사용방법 1) 생성자에 적용  2) 필드에 적용  3) 설정 메서드에 적용
  • Q0) 왜 abstract class 와 함께 적히면 안되는가
  • Q1 )  스프링이 어떻게 알아서 처리하는 건가 

     : @Autowired 어노테이션을 사용하면 스프링은 '타입'을 이용해서 의존 대상 객체를 검색

     : 즉. 해당 타입에 할당할 수 잇는 빈 객체를 찾아서 주입 대상으로 선택

  •  Q2) 만약 동일한 타입을 가진 빈 객체가 두 개라면? 

     : 같은 타입의 빈이 두 개 이상이 존재할 경우에는 스프링이 어떤 빈을 주입해야 할지 알 수가 없어서 스프링 컨테이너를 초기화 하는 과정에서 Exception을 발생시킨다

     : @Autowired의 주입 대상이 한 개여야 하는데 실제로는 두 개이상의 빈이 존재하여 주입할 때 사용할 객체를 선택할 수 없기 때문 → 해결방법 : @Qualifier 어노테이션 사용

 

4. @Qualifier 

  • 같은 타입의 빈이 두 개 이상이 존재하는 경우 스프링이 어떤 빈을 주입해야 할 지 알 수 없어서 스프링 컨테이너를 초기화 하는 과정에서 예외 발생
  • 이 때 @Qualifier을 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있게함

5. @Component

  • component-scan을 선언하여 특정 패키지 안의 클래스들 스캔, @Component Annotation이 있는 클래스에 대하여 bean 인스턴스 생성

6. @Controller, @Service, @Repository

  • @Componente -구체화 → @Controller, @Service, @Repository
  • bean으로 등록
  • 해당 클래스가 Controller/Service/Repository로 사용됨을 스프링 프레임워크에 알림

7. @RequestMapping

  • @RequestMapping에 대한 모든 매핑 정보는 스프링이 제공하는 HandlerMapping Class가 가짐
  • value : 해당 url로 요청이 들어오면 이 메서드가 수행
  • method : 요청 method를 명시, 없으면 모든 http method 형식에 대해 수행

8. @RestController

  • @Controller + @ResponseBody
  • @ResponseBody를 모든 메소드에서 적용

     - 메소드의 변환 결과 (문자열)을 JSON형태로 반환

9. @Required

  • setter method에 사용
  • 영향을 받는 bean property 구성 시, XML설정 파일에 반드시 porperty로 채워야함

+) JAVA 기본 어노테이션 (JDK에서 제공)

  • @Override : 해당 메소드가 부모 클래스에 있는 메소드를 재정의했다는 것을 명시적으로 선언
  • @Deprecated : 더이상 사용되지 않는 클래스나 메소드 앞에 추가
  • @SuppressWarnings : 프로그램에는 문제가 없는데 간혹 컴파일러가 경고를 뿜을 때가 있는데 이를 무시하라고 알려줌
Comments