한 클래스에서 다른 클래스나 객체를 참조할 때(parameter나 생성자를 사용하는 경우) 그 참조 데이터가 변화하면서 해당 클래스도 변경되는 관계를 '의존성 관계'라 정의한다.
이 의존성 관계가 커짐에 따라 유지 보수가 어려워질 수 있다. 따라서 그 참조 데이터를 내부에서 관리하지 않고 외부의 제어 및 관리(IOC, Inversion Of Control)를 거친 의존성 관계를 타겟 클래스에 주입하는 것을 의존성 주입이라 한다.
스프링 컨테이너는 개발자를 대신해 Bean객체의 생명주기 및 관리하고 Bean에 의해 만들어진 인스턴스 객체를 DI 해서 IOC를 지원하는 기능을 갖는다.
대표적으로 BeanFactory(Bean을 관리하지만 Bean 호출이 되야만 구체적 인스턴스를 만든다), ApplicationContext(Bean 관리 + 부가적 기능 제공)으로 나뉘며 후자가 더 많이 사용된다.
@Bean
개발자가 만들지 않은 라이브러리를 Bean으로 등록할 때 사용하는 어노테이션
@Autowired
컨테이너에서 특정 Bean에 대한 인스턴스가 생성되고 Autowired가 설정된 메서드가 호출되면 만들어진 인스턴스가 자동으로 DI 된다.
@Controller
Spring 프레임워크의 MVC 패턴에서 API Controll 기능을 담당해서 View를 반환한다.
@RestController
Controller 어노테이션이 API와 View를 모두 담당하지만 RestController는 API만 관리하며 @ResponseBody를 통해 json 형식의 data를 반환한다.
@Service
비즈니스 로직을 담는 Annotation.
@Repository
DB에 접근해서 연산을 수행하는 메서드를 포함한 클래스에 붙이는 Annotation.