자바 코드를 이용한 설정 - accidentlywoo/legacyVue GitHub Wiki

자바 코드를 이용한 설정


XML과 자바 코드 설정 중에서 어떤 것이 좋은지에 대한 질문에는 정답이 없다. 많은 경우 XML 설정과 동등한 수준의 자바 코드 설정을 제공하고 있기 때문에, 상황에 따라 알맞은 방식을 사용하면 된다. 필자는 프로젝트에서 사용하는 기술이 자바 설정을 잘 지원하면 자바 설정을 사용하고 그렇지 않고 XML 설정을 사용한다.

자바 코드 설정 기초

자바 코드를 이용해서 스프링을 설정하는 방식은 XML을 이용해서 설정하는 것과 크게 다르지 않다. 단지, XML문법 대신 자바코드를 이용해서 빈 객체를 생성하고 프로퍼티를 설정하며, GenericXmlApplicationContext 클래스 대신 AnnotationConfigApplicationContext 클래스를 이용해서 컨테이너를 생성한다는 점만 다르다.

자바 설정을 사용하고 @Bean 애노테이션을 이용하면 싱글톤일까?

스프링은 @Configuration 설정 클래스를 상속 받아 새로운 클래스를 만들기 위해 CGLIB라는 기술을 사용하는데, CGLIB가 클래스를 상속받아 새로운 클래스를 생성할 수 있으려면 다음의 두 조건을 충족해야 한다.

  1. 클래스가 final 이어서는 안 된다.
  2. 파라미터가 없는 기본 생성자를 제공해야 한다. 따라서, @Configuration 어노테이션을 적용한 자바 설정 클래스도 위 조건을 충족해야 한다.

자바 설정에서 자동 주입의 한계

Set메서드에 @Autowired 어노테이션을 적용해서 자동 주입을 처리했는데, 자바 설정을 사용할 경우 자동 주입은 필드나 메서드에 대해서만 동작한다.생성자 @Autowired 애노테이션을 적용하더라도, 생성자를 통한 자동 주입은 적용되지 않는다. 생성자를 통한 주입이 적용되지 않는 이유는 @Bean 어노테이션을 적용한 메서드에서 객체를 직접 생성하기 때문이다. 예를들어

@Bean
public MemberRegisterService memberRegSvc(){
 // 자바 설정 코드에 생성자를 이용해서 객체를 생성
 return new MemberRegisterService(memberDao());
}

MemberRegisterService 클래스의 생성자를 이용해서 객체를 생성하고 있다. XML 설정을 사용하는 경우와 달리, 자바 설정을 사용할 때에는 스프링 컨테이너가 객체를 생성할 때 사용할 때 사용할 생성자를 결정할 수 없고, 따라서 생성자를 통한 의존 객체 자동 주입을 적용할 수가 없다.

자바 코드 설정과 XML 설정 임포트하기

스프링은 XML 설정과 자바 코드 설정을 동일한 수준으로 지원하고 있다. 하지만 경우에 따라서는 XML 설정이 편할 때가 있고 반대로 자바코드 설정이 편할 때가 있다. 또, 원하는 설정 방식을 한 방식에만 지원하는 경우도 있다. 이럴 때는 일부 설정은 XML로 사용하고 나머지 설정은 자바코드로 작성한 뒤에, 두 가지 방식의 설정을 함께 사용하면 좋을 것이다.