-> 스프링은 속도, 단순성, 안정성, 생산성에 중점을 두고 있는 자바 프레임워크다
모든 스프링 Application은 개발자가 작성한 클래스 객체와 스프링이 제공하는 다양한 클래스 객체가 스프링 컨테이너 안에서 생성되고, 서로의 의존성이 주입되어 연결된다.
의존하는 클래스 객체를 외부에서 생성해 주입하면 그 클래스를 사용하는 클래스를 수정하지 않고도 얼마든지 의존성 클래스를 변경할 수 있다.
클래스들 간의 의존 관계가 많고 복잡하다면 매번 모든 클래스 간의 의존성을 생성하고 주입해 주는 코드를 수정해야 하는데 이럴때 IoC를 사용한다.
IoC는 메인 클래스에서 직접 의존성 생성과 주입을 위한 코드를 작성하는 것이 아니라 설정을 통해 클래스 객체를 만들고 필요한 의존성 객체를 주입 해 줄 수 있는데, 스프링 프레임워크에서는 Annotation을 통해 제어의 역전을 구현 한다.
Annotation 기반 제어의 역전 (실제 스프링에서 많이 사용하는 기법)

@Component
스프링 부트에서 앱을 실행하면 자동으로 @Component Annotation이 사용된 클래스를 찾아 객체로 만들고, 스프링 컨테이너 라는 공간에서 이 객체를 관리하게 된다.
@Autuwired
스프링 부트가 클래스 객체에 직접 주입하므로 의존성을 주입받기 위한 new가 필요없어짐
new를 사용해서 직접 만들지 않아도 생성이 가능한 상태로 만들어 버림
@PostConstruct
Bean이 완전히 생성되고, 의존성 주입이 끝난 직후 딱 한번 실행 (초기설정)
@PostConstruct는 반드시 리턴값이 void이며, 매개변수가 없어야 함
앱 시작 시 한번만 실행되므로, 주기적인 작업에는 @Scheduled를 사용
interface에서 선언된 메서드는 자동으로 public으로 들어간다, 즉 public 생략가능
머시따