[Spring 3.1] Annotation
Java 5 버전에서 애너테이션이 등장하고 스프링 3.1 버전부터는 애너테이션을 사용해 메타 정보를 작성하는 방식을 사용해 xml을 사용하는 경우가 많이 줄어들었다.
애너테이션은 작성하는 코드에 비해 부가적으로 얻을 수 있는 정보가 많아 애플리케이션의 코드를 간추릴 수 있다.
당장 @Transactional 애너테이션만 생각해도 그렇다. 별도의 트랜잭션 관련 설정 없이 애너테이션 하나로 트랜잭션 관련 설정을 모두 진행할 수 있다.
이렇듯 애너테이션이 사용되는 정책과 관례를 잘 이해하고 있다면 애너테이션을 사용해 코드를 간결하게 작성할 수 있다.
xml을 사용하든 애너테이션을 사용하든 스프링이 동작하는 핵심 원리는 변하지 않는다.
단, 어떤 방법을 사용하든 그 방법이 어떻게 핵심 원리를 구현하는지 이해하고 사용하도록 하자.
@Configuration
public class DataContext {
@Bean
public DataSource dataSource() {
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass(Driver.class);
dataSource.setUrl("jdbc:mysql://localhost/springbook?...");
dataSource.setUsername("spring");
dataSource.setPassword("book");
return dataSource;
}
}
메타 정보를 위한 xml을 애너테이션 기반 자바 코드로 변환해보자.
<bean> 태그는 @Bean 애너테이션이 붙은 public 메서드로 만들고, 이름은 bean 태그의 id로 설정한다.
생성할 클래스는 bean 태그의 class에 명시된 클래스를 그대로 쓰고 변수 타입도 setter를 고려해 구현 클래스 타입으로 설정하자.
<property> 속성에 따라서 setter를 호출해주고 dataSource를 리턴해주자.
이 때 반환 타입은 인터페이스로 설정함에 주의하자.
@Configuration
public class DataContext {
@Bean
public PlatformTransactionManager transactionManager() {
DataSourceTransactionManager tm = new DataSourceTransactionManager();
tm.setDataSource(dataSource());
return tm;
}
}
dataSource 빈을 참조해서 사용하는 빈도 @Bean 애너테이션으로 처리해 주자.
xml에서 자바 코드로 정의된 빈은 <property> 태그를 통해서 참조하고, 자바 코드에서 xml로 정의된 빈은 @Autowired 애너테이션으로 컨테이너에서 주입받는다.
Transaction을 xml로 설정하는 경우처럼 @Configuration 애너테이션으로 메타 정보를 작성하는 경우는 전용 애너테이션인 @EnableTransactionManagement 을 사용하는 등 스프링 3.1버전 이후부터는 자주 사용되는 전용 태그를 @Enable로 시작하는 애너테이션으로 대체할 수 있도록 지원한다.
@Enable... 애너테이션은 @Configuration 애너테이션 위에다 붙여주면 된다.
@Autowired 애너테이션은 xml에서 정의된 빈을 넣어주는 작업 외에도 @Configuration 클래스를 여러 개 사용하는 경우 빈을 참조할 때도 사용하는 등 여러 측면에서 빈을 주입받을 때 사용한다.
public class UserDao {
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
private SqlService SqlService;
}
Setter에 @Autowired 애너테이션을 붙이면 파라미터의 타입을 보고 주입할 수 있는 타입의 빈을 모두 탐색한다.
하나라면 그냥 넣어주고, 두 개 이상이라면 프로퍼티와 같은 이름의 빈이 있는지 찾고 일치하는 빈을 넣어준다.
필드에 @Autowired 애너테이션을 붙이는 방식은 어차피 Setter가 실행되면 필드에 저장되니 Setter를 거치지 않고 바로 필드에 넣는 방식이다. (Setter에 다른 비즈니스 로직이 없는 경우에만 사용하자)
private 접근제한자로 설정해도 리플렉션 API를 사용해 제약을 우회해서 값을 넣을 수 있고, 기본 생성자를 호출하고 DI 작업을 수행한다.
@Autowired 애너테이션은 필드의 타입을 기준으로 빈을 탐색하고, @Resource 애너테이션은 필드의 이름을 기준으로 빈을 검색한 후 주입한다.
@Component 애너테이션을 사용하면 @Configuration 애너테이션 내부에 @Bean 애너테이션을 사용하지 않고 간편하게 스프링 빈으로 등록할 수 있다.
@Component
public class UserDao {
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
private SqlService SqlService;
}
@ComponentScan(basePackages=...)
public class AppContext {
}
@ComponentScan 애너테이션에서 지정된 경로에 해당되는 @Component 애너테이션이 붙은 요소들은 발견될 시 빈으로 추가되고 추가되는 아이디는 기본값으로 클래스명의 첫글자를 소문자로 바꾼 값으로 등록된다.
@Service @Controller 애너테이션처럼 @Component 애너테이션을 메타 애너테이션으로 사용하는 경우도 @Component 애너테이션을 그대로 사용할 수 있다.
@Component 애너테이션을 사용해 xml과 자바 코드를 줄일 수 있어 설정 정보를 간결하게 작성할 수 있다.
'Spring > Spring 3.1' 카테고리의 다른 글
[Spring 3.1] 데이터 엑세스 기술 (0) | 2023.05.11 |
---|---|
[Spring 3.1] IoC 컨테이너와 스프링의 동작 원리 (0) | 2023.05.10 |
[Spring 3.1] Aspect Oriented Programming (0) | 2023.04.28 |
[Spring 3.1] 트랜잭션과 서비스 추상화 (0) | 2023.04.23 |
[Spring 3.1] 스프링과 예외처리 (0) | 2023.04.20 |
댓글
이 글 공유하기
다른 글
-
[Spring 3.1] 데이터 엑세스 기술
[Spring 3.1] 데이터 엑세스 기술
2023.05.11 -
[Spring 3.1] IoC 컨테이너와 스프링의 동작 원리
[Spring 3.1] IoC 컨테이너와 스프링의 동작 원리
2023.05.10 -
[Spring 3.1] Aspect Oriented Programming
[Spring 3.1] Aspect Oriented Programming
2023.04.28 -
[Spring 3.1] 트랜잭션과 서비스 추상화
[Spring 3.1] 트랜잭션과 서비스 추상화
2023.04.23