Interface를 잘 활용하면 서로 다른 구현체가 같은 목적을 위해 동작하도록 만들 수 있다.
사용하고자 하는 객체의 실제 자료형과 무관하게 동작하게 만들 수 있다.
예를 들어 자동차를 통과시키는 프로그램이 있다고 해보자. 만약 이 프로그램이 람보르기니만 취급한다면 같은 자동차임에도 불구하고 현대차는 통과하지 못할 것이다.
따라서 자동차라는 규격을 만들고 그 규격에 맞게 람보르기니와 현대차가 만들어진다면 차 종류와 상관없이 규격에 맞게 제작된 차들은 프로그램에서 통과할 수 있을 것이다. 이 프로그램에서는 자동차라는 규격이 인터페이스 역할을 한다고 볼 수 있다.
IoC : 제어 역전 (Inversion of Control) - 오브젝트 생성, 관계설정, 사용, 제거 등 오브젝트 전반에 걸친 모든 제어권을 애플리케이션(개발자)이 갖는게 아니라 프레임워크의 컨테이너에게 넘기는 개념을 말한다.
스프링 등장 이전 과거에는 개발이라는 행위는 정의되어 있는 라이브러리의 코드를 개발자가 가져다가 사용하는 방식이었다.
스프링 등장이후 스프링의 IoC 컨테이너로 인해 제어 역전이라는 개념이 등장하였다.
웹 애플리케이션(스프링 프레임워크)이 가질 수 있는 기능은 요청을 받고, 응답을 보내는 것이라고 할 수 있는데 이 기능들은 누가 사용하더라도 거의 동일한 방식으로 작동된다.
여기에 관련된 비즈니스 로직을 어떤 식으로 정의하느냐에 따라 통신되는 데이터가 매번 바뀐다.
따라서 개발자는 위와 같은 비즈니스 로직만 작성을 하면 나머지 관련된 일은 스프링 프레임워크가 알아서 작동을 할 수 있도록 해준다.
이와 같이 개발자의 코드를 프레임워크가 사용하는 것이 제어 역전이라고 하고 Spring IoC Container가 이 일을 해준다.
Spring IoC Container는 개발자가 작성한 코드와 설정 정보를 합쳐서 객체를 만든다.
이 때 위에서 만들어진 객체를 Bean 이라고 한다. 따라서 Bean 이라고하면 Spring IoC Container가 관리하는 객체라고 생각하면 된다.
개발자가 비즈니스 로직에 대한 코드를 작성하게 되는데 다른 객체를 사용해야하는 경우에는 Spring IoC Container에서 이미 만들어진 Bean 객체를 넘겨받는다.
이런 식으로 이미 존재하는 Bean을 필요한 시점에 다시 주입해서 사용하는 것을 Dependency Injection (의존성 주입) 이라고 한다.
Spring에서 구현을 요구하는 부분들을 interface로 정의하고 이후 사용자가 정의한 구현체 Bean을 실제 서비스에서 사용한다.
스프링 프레임워크는 XML의 형태로 설정을 만들었다. XML을 작성하는 것은 어렵고 오랜시간이 걸린다.
스프링 부트에서는 설정이 Spring Boot Starter에 정의되어 있기 때문에 스프링 프레임워크에 필요한 XML 파일들이 생략되어도 문제가 없다.
스프링 프레임워크는 기본적으로 자바 명령어를 통해서 자기 자신을 실행시킬 수 없다. 따라서 war파일을 Web Application Server(톰캣 등)를 이용해서 배포하는 과정이 필요했다.
그러나 스프링 부트는 톰캣 서버 기능이 내장되어 있어 jar파일 형태로 만들어지고 자바 명령어를 통해서 실행시킬 수 있게 되었다.