IOC란, 프로그램을 구동하는데 필요한 객체에 대한 생성, 변경 등의 관리를
프로그램을 개발하는 사람이 아닌 프로그램을 구동하는 컨테이너에서
직접 관리하는 것을 말한다.
스프링은 IOC를 통해 구동 시 필요한 객체의 생성부터 생명 주기까지
해당 객체에 대한 관리를 직접 수행한다.
개발자가 직접 객체를 생성할 수 있지만 해당 권한을 컨테이너에 맡김으로써
소스 코드 구현의 시간을 단축할 수 있다.
| 어노테이션 | 설명 |
|---|---|
| @Component | 객체(컴포넌트)를 나타내는 일반적인 타입으로 <bean> 태그와 동일한 역할 |
| @Repository | 퍼시스턴스(persistence) 레이어, 영속성을 가지는 속성(파일, 데이터베이스)를 가진 클래스 ex) Data Access Object Class |
| @Service | 서비스 레이어, 비즈니스 로직을 가진 클래스 ex) Service Class |
| @Controller | 프리젠테이션 레이어, 웹 애플리케이션에서 View에서 전달된 웹 요청과 응답을 처리하는 클래스 ex) Controller Class |

DI란, IOC 구현의 핵심 기술로 IOC를 통해 Spring이 생성하고 관리하는
Bean(객체)을 필요한 곳에 주입하는 것 (객체 생성을 개발자가 아닌 Spring에게 의존하고
생성된 객체를 개발자가 필요한 곳에 주입하는 것)
이렇게 의존성을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때
소스 코드의 수정을 최소화 할 수 있음
객체간의 종속 관계 (결합도)를 약화 시킬 수 있음
(결합도 : 한 클래스에서 필드 객체를 생성할 때 발생하는 두 객체 간의 관계를 말하며,
각 객체간의 내용이 수정될 경우 영향을 미치는 정도를 나타냄)
| 어노테이션 | 설명 |
|---|---|
| @Autowired | - 정밀한 의존 관계 주입(DI)이 필요한 경우에 유용하다. - @Autowired는 필드 변수, setter 메소드, 생성자, 일반 메소드에 적용 가능하다. - 의존하는 객체를 주입할 때 주로 Type을 이용하게 된다. - @Autowired 는 <property>, <constructor-arg> 태그와 동일한 역할을 한다. |
| @Qualifier | @Autowired와 함께 쓰이며, 한 프로젝트 내에 @Autowired로 의존성을 주입하고자 하는 객체가 여러 개 있을 경우, @Qualifier(“name”)를 통해 원하는 객체를 지정하여 주입할 수 있다. |