JSR 250 / 330 어노테이션들의 사용법

2018. 8. 12. 13:17Web/Spring

@Inject / @Named 어노테이션


JSR 330(자바 의존성 주입)은 자바 플랫폼을 위한 의존성 주입 어노테이션을 표준화해서 스프링의 @Autowired 및 @Qualifier 어노테이션과 비슷한 @Inject@Named 어노테이션을 정의하고 있다.




@Service("abc")

public class A{

@Autowired

@Qualifier("bb")

private B b;

}


이러한 클래스와 대비해서 @Inject & @Named 어노테이션을 적용해보면


@Named("abc")

public class A{

@Inject

@Named("bb")

private B b;

}


이와 같이 동일하게 적용할 수 있다.


즉, @Named 같은 경우 클래스 레벨에 적용되면 @Component,@Service 등등과 같은 어노테이션과 동일하게 적용되며, 인스턴스 및 메소드,생성자 레벨에 적용된다면 @Qualifier 어노테이션과 동일하게 이름 기준으로 의존성을 주입하는 기능을 하게된다. @Inject 같은 경우는 @Autowired 와 거의 동일한 기능을 하며 변수의 형식을 기준으로 자동으로 빈주입을 하는 역할을 담당한다.



@Resource / @PostConstruct / @PreDestroy 어노테이션


@Service("abc")

public class A{

@Autowired

@Qualifier("bb")

private B b;

}


이러한 정의를 @Resource 어노테이션을 이용한다면


@Service("abc")

public class A{

@Resource(name="bb")

private B b;

}


이렇게 적용할 수 있다. 즉, @Resource 어노테이션은 이름을 기준으로 의존성을 주입할 때 사용 할 수 있는 어노테이션이다. 만약 이름을 기준으로 의존성을 주입할 경우에는 @Autowired & @Qualifier 를 이용하는 방법과 @Resource 를 이용하는 두가지 방법이 있지만, @Resource 어노테이션을 이용하는 것이 좋다. 전자와 같은 경우는 우선 형식이 동일한 빈을 찾는 과정이 선행된 후에 이름과 같은 빈을 찾지만, 후자 같은 경우는 바로 해당이름과 동일한 빈을 찾는 과정을 들어가기 때문이다.



@PostConstruct & @PreDestroy 어노테이션은 xml 설정에서 빈의 속성 중에 init-method와 destroy-method 와 비슷한 역할을 하는 어노테이션이다. 즉, 사용자 빈정의에서 초기화과정에서 어떠한 행위를 원한다면 행위를 정의한 메소드에 @PostConstruct를, 빈의 생명주기가 다해서 GC되기 전에 어떠한 행위를 원한다면 행위를 정의한 메소드에 @PreDestroy 어노테이션을 붙여주면 빈 초기화과정과 삭제과정에서 어떠한 행위를 정의 할 수 있다.