DS's『 행복합시다 』

Carpe Programming/jsp & spring & jstl

[Spring] 어노테이션

nolite 2011. 7. 28. 14:21

스테레오타입 어노테이션

클래스에 붙여서 해당 클래스가 컴포넌트 스캐닝의 대상이고, 스프링에 의해서 관리될 것임을 표시한다. 즉, <beans> XML 설정 파일에서 <bean>으로 선언한 것과 같은 효과를 낸다.

@Component
메타 어노테이션. 다른 모든 스프링 스테레오타입 어노테이션 및 커스텀 Qualifer 어노테이션의 부모 어노테이션.

@Service
상태없는 서비스 컴포넌트.

@Repository

저장소 컴포넌트(DAO 등).

@Aspect
@AspectJ의 어스펙트.

@Controller
Spring MVC 컨트롤러.

스테레오타입은 스테레오타입일 뿐!! 너무 심각한 의미를 부여하지 말자! 대부분의 경우엔 @Service으로 충분하다. @Controller에 대해서는 다음 기회에 좀 더 자세히 알아보기로 하고...

위의 어노테이션이 붙은 클래스를 찾기 위해서 모든 클래스 패스를 뒤지는 것은 곤란하므로.. 아래와 같은 방식으로 스캔할 범위를 지정한다:

예) 가장 단순한 사용 예: 특정 패키지 이하의 모든 클래스에 대해서 스테레오타입 어노테이션이 붙은 클래스를 찾아서 스프링 관리 대상에 포함 시킴.(빈 선언)

<beans>
  <context:component-scan base-package="com.mycompany.myblog" />
   ...
</beans>


의존성 주입(DI; Dependency Injection) 어노테이션

@Autowired
생성자, 메소드, 필드에 붙여서 스프링을 통해 인젝션될 것임을 표시한다.

@Qualifier
@Autowired이 붙은 필드 또는 메소드의 인자에 붙여서 인젝션할 빈을 검색하기 위한 더 정확한 조건을 지정한다.


예) 필드에 지정
@Autowired
@Qualifier("myDataSource“)
private DataSource orderDataSource


예) 메소드에 지정
@Autowired
public void createTemplates(DataSource ds, ConnectionFactory cf) {
   this.jdbcTemplate = new JdbcTemplate(ds);
   this.jmsTemplate = new JmsTemplate(cf);
}


예) @Qualifer와 함께 지정
public class JdbcOrderRepositoryImpl implements OrderRepository {
   @Autowired
   public void init(
      @Qualifier("myDataSource“) DataSource orderDataSource,
      @Qualifier("otherDataSource") DataSource inventoryDataSource,
      MyHelper autowiredByType) {
         // ...
  }
  ...
}


JSR-250 어노테이션

JSR-250은 BEA WebLogic에서 제공되던 것을 JSR을 통해 표준화한 것인데, @Resource어노테이션은 JNDI 리소스 인젝션을 위해 꽤 많이 쓰이고 있는 것 같다.

@Resource
JSR-250에서는 JNDI 리소스만 인젝션할 수 있었지만, 스프링 2.5에서는 스프링을 통해 관리되는 모든 빈을 인젝션할 수 있다.

@PostConstruct
2.0에서는 InitializingBean 인터페이스를 구현하고 afterPropertiesSet()에서 수행하거나, bean설정에서 init-method 속성으로 지정했다.

@PreDestory
2.0에서는 DisposableBean 인터페이스를 구현하고 destroy()를 정의하거나, bean설정에서 destroy-method 속성으로 지정했다.

개인적으로 스프링 전용인 @Autowired보다는 @Resource를 선호하는 편인데, @Qualifer를 쓸 수 없다는 단점이 있지만, @Resource(name="dataSource")처럼 빈 이름을 지정할 수 있으므로 대부분의 경우엔 충분하다.

백문불여일견, 백견불여일타, 백타불여일런!

예) 스프링 2.0.x (스프링에 대한 컴파일 타임 의존성이 없음)
public class JdbcBlogdao implement BlogDao {
   private DataSource dataSource;
   public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }
   public void init() throws Exception { ... }
   public void destroy() throws Exception { ... }
   ...
}

<beans>
   <bean id="blogDao" class="mypackage.JdbcBlogDao" init-method="init" destroy-method="destroy">
      <property name="dataSource" ref="dataSource />
      ...
   </bean>
   ...
</beans>

예) 스프링 2.0.x(스프링에 대한 컴파일 타임 의존성을 가짐)
public class JdbcBlogdao implement BlogDao, InitializingBean, DisposableBean {
   private DataSource dataSource;
   public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }
   public void afterPropertiesSet() throws Exception { ... }
   public void destroy() throws Exception { ... }
   ...
}

<beans>
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">...</bean>
   <bean id="blogDao" class="mypackage.JdbcBlogDao">
      <property name="dataSource" ref="dataSource />
      ...
   </bean>
   ...
</beans>

예) 스프링 2.5(어노테이션과 컴포넌트 스캔을 사용)
@Repository("blogDao")
public class JdbcBlogDao implements BlogDao {
   @Resource
   private DataSource dataSource;
   @PreConstruct
   public void init() throws Exception { ... }
   @PostDestroy
   public void destroy() throws Exception { ... }
   ...
}

<beans>
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">...</bean>
   <context:component-scan base-package="com.mycompany.myblog" />
   ...
</beans>


728x90

'Carpe Programming > jsp & spring & jstl' 카테고리의 다른 글

jstl indexOf 적용  (0) 2011.08.16
[vo] 넘어오는 value 확인  (0) 2011.08.08
[Spring] @Autowired 와 @Resource 차이  (0) 2011.07.28
jsp txt파일 생성  (0) 2011.07.15
JSP 파일경로 파일명만 자르기  (0) 2009.11.04