일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 논뚜렁밭뚜렁
- 아이폰 프로
- 문래동 맛집
- IT 연봉
- 김서방 정육식당
- 문래동맛집
- 셀카봉추천
- RX100M5
- 곤드레이야기
- 야외갈비
- Pho U
- 홍대
- 문래동 이웃집돈까스가게
- 영화
- JAVA IP
- 스시마루
- 태릉갈비
- 월화고기
- 리필연어
- 순대국
- 통신사 와이파이
- 큐큐면관
- 일식
- 이자카야류
- 책추천
- 맛집
- 어도
- 이웃집돈까스
- 와이파이 연결안됨
- 허참갈비
- Today
- Total
Oasis' story
[Spring]Annotation 본문
* Annotation?
- 애플리케이션 규모가 커지고 스프링 빈의 개수가 증가함에 따라 annotation을 이용하게 됨.
- JDK5 버전 이후 부터 사용가능 하고, 메타데이터를 xml 등의 문서에 설정하는 것이 아니라, 소스코드에 @annotation 형태로 표현하고, 클래스, 필드, 메서드의 선언부에 추가한다.
- 데이터를 문서화하거나, 컴파일 타임이나 런타임 시에 원하는 동작을 수행할 수 있도록 하는데 사용하기도 한다.
* 종류
@Override
- 메소드에만 사용
- 상위 클래스의 메소드를 재정의 한다는 것
- 상위 클래스의 메소드를 재정의 하지 못하면 에러가 발생
@Deprecated
- 특정 클래스나 인터페이스, 메소드, 필드 등이 더 이상 사용되지 말아야한다는 것을 경고.
- 컴파일러는 deprecated된 메소드나 클래스 혹은 변수를 사용할 때마다 경고를 발생
@SuppressWarning
- 클래스 또는 메소드 수준에서 컴파일러의 경고 표시를 제거
- Generics 때문에 컴파일러는 컬렉션이 type-safety 하지 않게 사용되었다고 경고를 던지는데, 이러한 경고를 없애고 싶을때 사용
- all, deprecation, unchecked, fallthrough, path, serial, finally 등의 금지 옵션이 있다.
@Required
- 스프링 빈의 프로퍼티에 정의된 빈으로 설정할 때(setter) 사용되며 이 프로퍼티가 필수임을 알려줌. 해당 프로퍼티의 setter 메소드 선언구에 설정,즉 어떤 클래스를 쓰려고 할때 @Required 로 명시하면, xml에 해당 프로퍼티가 정의되어 있는지를 검사해서 없으면 예외 발생시킴.
@Autowired
- 타입을 기준으로 의존관계를 자동으로 설정한다. 자동 와이어링 기능을 제공하며, 필드, 생성자, 메소드(일반,세터) 에 적용할 수 있다. 가장 유연하고 강력한 기능을 가짐.
- xml 문서의 양을 대폭 줄여줄 수 있다.
- 프로퍼티나 생성자 파라미터를 지정하지 않고 미리 정해진 규칙을 이용해 자동으로 DI 설정을 컨테이너에 추가
- 자동으로 의존 관계가 맺어져야 할 빈을 찾아서 연결
@Qualifier
- Autowired 와 같이 사용하여, 타입이외의 정보를 추가해서 자동 연결될 빈 객체의 수식어를 값으로 제공
@Resource
- Autowired 가 타입을 기준으로 의존관계를 자동으로 설정한다면, Resource는 이름과 일치되는 스프링 빈을 자동으로 검색해서 적용
@Configuration
- 자바에서 빈을 생성하고자 할 때, 빈 설정 메타 정보를 담고 있는 자바에 선언하며, ApplicationContext 객체 생성시 생성자의 인자 값으로 xml 파일이 아닌 (해당 클래스명).class 가 적용된다.
@Bean
public Person getPerson(){ return new Person();} // <bean id="getPerson" class="Person"/> 와 같은 선언이 되는거임..
※ 스프링의 스테레오 타입 annotation
Annotation |
설명 |
@Component |
일반적인 스프링 빈으로 등록된다. (클래스이름을 빈의 id로 사용되게 된다. 단 첫글자는 소문자로 전환. 이름을 지정하고 싶으면 @Component("name") 이런 식으로 지정 할 수 있음. @Scope("prototype") 을 밑에 줄에 추가하여, 스코프를 지정할 수 있음. ) 스캐닝해서 빈으로 등록하는 방법은 두 가지로, 자바단에서 ApplicationContext context = new AnnotationConfigApplicationContext("spring.study"); 또는 xml 파일내에서, <context:component-scan base-package="spring.study"/> 로 스캐닝 시킬 수 있음. |
@Controller |
스프링 MVC의 컨트롤러 객체로 등록된다. |
@Repository |
DAO와 같이 데이터 접근을 위한 저장소 객체로 등록된다. |
@Service |
비즈니스 로직을 구현한 서비스 객체로 등록된다. |
※ Advise 종류
@Aspect |
설명 |
xml 기반 테그로 표현 |
@Before |
* 조인 포인트를 실행하기 전에 어떤 처리를 할 수 있음 * 스프링에서 조인포인트는 항상 메소드 호출이기 때문에 해당 메소드를 처리하기 전에 전처리 과정을 수행하는데 사용 * 호출하는 메소드에 넘겨주는 인자들을 비롯한 타겟 객체에도 접근할 수 있지만 메소드 실행 자체를 제어할 수는 없음 |
<aop:before> |
@AfterReturning |
* 조인 포인트의 매소드가 실행을 끝내고 값을 반환했을 때 실행 * 해당 메소드에 넘겨주는 인자와 타겟 객체, 그리고 반환값에 접근 * After Returning 어드바이스를 적용하기 전에 이미 메소드는 실행을 마쳤기 때문에 메소드 호출 자체를 제어할 수는 없음 |
<aop:after-returning> |
@AfterThrowing |
* Exception이 발생하여 조인포인트가 빠져나갈 때 수행 * try-catch 블록의 catch블록과 비슷 * 메소드가 호출된 후에 실행되는데 단 해당 메소드가 예외를 던졌을 경우에만 실행 * 특정 예외만 잡아 메소드에 넘겨준 인자와 타겟 객체에 접근내도록 설정할 수 있으며, 해당 예외를 발생 |
<aop:after-throwing> |
@After |
* 조인포인트를 빠져나가는 (정상적이거나 예외적인 반환) 방법에 상관없이 수행 * try-catch-finally 에서 finally 블록과 비슷 |
<aop:after> |
@Around |
* 조인포인트 전후에 수행 * 메소드 실행 전과 후에 어떤 작업을 수행할 수 있으며, 어느 시점에 메소드를 호출 할지 혹은 실행하지 않을지 제어할 수 있음 * 필요한 경우 해당 메소드 대신 별도의 로직을 제공 |
<aop:around> |
*장단점
- 코드의 가독성 증대.
- 복잡한 xml 스키마를 파악하지 않아 개발 효율성 증대
- 별도의 파서를 적용하지 않고 활용할 수 있어 편리함 증대
- xml 파일 등에 설정하던 것에 비해 지역화
- 리플렉션을 통해 해당 클래스를 분석해야 하는 오버헤드 발생
- 모듈이나애플리케이션에 쓰는 메타데이터를 설정할 수 없음
=> xml 과 annotation 을 함께 사용하는 것이 좋음.
- 디플로이 환경에 따라 바뀔 수 있는 부분과 애플리케이션 전반에 공통적으로 사용하는 정보는 xml에 설정해서 사용하고,
애플리케이션상 설계 시점에 결정되는 부분과 개별적인 설정인 경우는 annotation 을 사용하는게 좋다.