🌟Spring Framework
스프링 제공 기능
- 객체 관리(IOC)
- 👉MVC(DI) - 느슨한 결합력과 인터페이스
- 트랜잭션 처리(AOP)
- 인증과 권한(Servlet Filter)
🐽어노테이션을 이용한 DI(with xml)
- 지시서에서 설정하여 DI하는 방식은 의존 객체를 변경할 때마다 설정 파일을 수정해야 한다는 불편함이 있다.
- 이러한 불편함을 줄이기 위해 어노테이션을 이용하여 DI를 수행.
어노테이션을 이용할 때의 장점
- 일일히 설정파일에서 코드를 수정해주지 않아도 의존 주입할 객체 변경이 가능하다.
- 어노테이션과 같은 메타데이터를 이용하여 설정을 코드와 일체화하여 관리해줄 수 있다.
@Autowired를 이용한 DI
- 우선적으로 @Autowired의 기능만 확인하기 위해 빈객체 생성은 xml 파일을 통해서 생성해준다.
<context:annotation-config/>
<bean class="spring.di.entity.NewLecExam" p:kor="10"
p:math="10"/>
<bean id="console" class="spring.di.ui.InlineExamConsole">
~~<property name="exam" ref="exam"></property>~~
</bean>
- 위 코드에서
<property name="exam" ref="exam"></property> 코드를 지워준 다음, @Autowired를 이용하여 코드를 수정해준다.
- IoC 컨테이너는 xml 설정파일 내 빈으로 등록된 객체를 담고, @Autowired 어노테이션 유무를 확인한다.
- @Autowired가 있는 코드에 필요한 의존 객체가 IoC 컨테이너 안에 빈 객체로 저장이 되어 있는지 확인한 뒤 있는 경우 빈 객체를 DI해준다.
xml로 빈을 등록한 경우, @Autowired 사용 시 추가 설정.
- 원래 설정 파일로 빈을 등록하는 경우, IoC 컨테이너가 일일히 모든 빈객체의 내부를 확인하지 않는다.
- namespace → context 추가.
<context:annotation-config/> : xml에 등록한 빈 객체가 어노테이션을 가지고 있다고 알려주는 코드 추가.
IoC 컨테이너에서 어떤 객체가 바인딩되는지 찾는 방법
- IoC 컨테이너에서 빈 객체를 찾는 방법 예상
- 실제 테스트해보면, id(빈 객체명)와는 상관없이 객체를 바인딩해준다.
- 즉, 클래스 형식으로 빈 객체를 찾아서 바인딩 해준다.
동일한 타입의 객체 2개가 등록되어 있는 경우 바인딩은 어떤걸 해줄까?
- 테스트 결과 바인딩할 빈 객체가 모호하다는 오류 발생함.
Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Bean name 'exam1' is already used in this <beans> element
Offending resource: class path resource [spring/di/setting.xml]
- 위 같은 경우, 빈 객체명을 구분해주어야 IoC 컨테이너에서 인식이 가능하며, 해당 객체를 이름에 맞게 바인딩해준다.
- 추가로, @Autowired 어노테이션을 사용한 곳에서 어떠한 빈 객체를 사용할 것인지 IoC 컨테이너에게 알려줘야 하므로, @Qualifier 어노테이션을 사용하여 바인딩할 빈 객체를 명시해준다.
@Autowired와 @Qualifier
- 동일한 타입의 빈 객체를 IoC 컨테이너에서 구분해주기 위해서는 빈객체명(id)으로 구분이 가능하다.
- 그리고 @Autowired 어노테이션을 사용하여 DI를 자동으로 할 때, IoC 컨테이너가 어떤 bean 객체를 DI할 지 명시해주기 위해 @Qualifier를 통해 사용할 빈 객체의 이름을 명시해준다.
@Autowired 위치와 Required 옵션
@Autowired 사용 위치
- 멤버 필드
- 기본 생성자가 호출되면서 injection 된다.
- 생성자
- 오버로딩 된 생성자가 호출되면서 injection 된다.
- 오버로딩 된 생성자에 @Qualifier 사용 시, 파라미터로 입력 받는 의존 객체가 하나 이상일수도 있기 때문에 오류가 발생한다.
- 따라서 파라미터에 직접 @Qualifier를 명시해줘야 한다.
※정상 실행
@Autowired
public InlineExamConsole(@Qualifier("exam2") Exam exam) {
System.out.println("overloaded constructor");
this.exam = exam;
}
※오류 발생
@Autowired
@Qualifier("exam2")
public InlineExamConsole(Exam exam) {
System.out.println("overloaded constructor");
this.exam = exam;
}
- setter
- setter 메서드가 호출되면서 injection 된다.
Required 옵션
- @Autowired(required=false)
- 빈 객체가 없어도 오류가 발생하지 않고 다음 로직을 실행할 수 있도록 해주는 옵션.
🐽객체 생성과 @Component
- 클래스명 위에 @Component 어노테이션을 추가하면, IoC 컨테이너가 해당 클래스를 인식해 빈으로 등록해준다.
- 하지만, xml 설정파일에서는 @Component라는 어노테이션을 인식하지 못한다.
- 이를 인식할 수 있도록 해주기 위해서,
<context:component-scan base-package="spring.di.ui"/>라는 설정을 추가해준다.
- 위 코드 추가 시,
<context:annotation-config/>의 역할을 함께 처리해주기 때문에 코드를 지워도 같은 기능을 수행함.
- 추가적으로, 빈 객체를 getBean(이름)으로 빈 객체를 가져올 경우, 이름을 @Component(이름) 과 같이 지정해줘야 한다. 또는 getBean(클래스 타입)으로 빈을 가져와야 한다.
console 이라는 이름의 빈을 가져오고 싶을 때,
1. Component("console")
2. context.getBean(ExamConsole.calss)
- 마지막으로, 의존 객체인 Exam 객체도 bean으로 등록할 수 있도록 @Component로 설정해준다.
어노테이션으로 등록한 빈 내부 필드값 초기화 방법
기본값 설정을 위한 @Value 어노테이션
- 클래스 내부 필드에 @Value 어노테이션을 사용하여 값을 초기화 해줄 수 있다.
<context:component-scan/>
- 애플리케이션 컨텍스트에 등록된 빈 객체들의 어노테이션들이 적용될 수 있도록 해준다.
- 어노테이션이 설정된 새로운 빈들을 찾는 스캔이 가능하다.
component-scan이 스캔가능한 어노테이션
- @Component
- @Controller
- @Service
- @Repository
- 각 어노테이션들 중 아무거나 설정해도 컴포넌트 스캔이 가능하지만, 스프링 웹 어플리케이션을 구성하는 기본 구성별로 역할을 구분하기 위해 어노테이션을 구분해준다.
스프링 MVC 구성

🐽어노테이션을 이용한 DI(with Java Configuration)
-
xml 파일을 자바 클래스로 대체하여 설정 파일을 작성할 수 있다.

-
자바 클래스 파일로 설정할 클래스에 @Configuration 이라는 어노테이션을 설정해준다.
-
@ComponentScan 어노테이션으로 @Component 설정된 클래스를 빈으로 자동 등록 및 DI해준다.
- @Component() 괄호 안에 스캔할 범위를 패키지명으로 범위 지정을 해주며, 2개 이상의 범위 지정 시 배열을 사용하여
{"패키지명1","패키지명2",..} 지정.
-
@Bean 어노테이션은 IoC 컨테이너에 직접 빈 객체를 담기 위해 사용하는 어노테이션이다.
- 일반적으로, 외부 라이브러리 내부의 클래스 타입 객체를 사용해야 하는 경우 별도의 @Component 설정이 불가능하기 때문에, 이처럼 설정 클래스에서 별도로 @Bean으로 등록해줘야 IoC 컨테이너에서 관리가 가능하다.
- @Bean으로 등록 시 정의한 메서드명은 빈 이름으로 지정되며, web 설정 파일에서
<bean> 태그의 id 속성과 동일한 역할을 한다.

-
xml을 설정 파일로 사용할 때, ClassPathXmlApplicationContext를 생성하였지만, 자바 클래스를 설정 파일로 지정할 경우 AnnotationConfigApplicationContext로 생성 후 설정 클래스를 지정해주면, 자바 설정 클래스를 기준으로 빈을 관리할 수 있다.
-
ApplicationContext ctx = new AnnotationConfigApplication(clazz.class);
-
ctx를 사용하여 getBean() 메서드로 빈 객체를 불러올 수 있다.