스프링은 장점이 많은 개발 도구이지만, 설정이 매우 복잡하다는 단점이 있다.
그래서 단점을 보완하고자 나온 게 스프링 부트이다.
스프링 부트는 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들었다.
”의존성 세트” 라고 불리는 스타터를 사용해 간편하게 의존성을 사용하고, 관리한다.
스프링은 모든 기능의 기반을 제어의 역전(IoC)과 의존성 주입(DI)에 두고 있다.
제어의 역전은 사용할 객체를 직접 생성하지 않고, 객체의 생명주기 관리를 외부(스프링 컨테이너)에 위임하는 것이다.
- 아래 그림을 보면, 객체를 생성할 때는 객체가 필요한 곳에서 직접 생성한다.
의존성 주입은 제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고, 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식이다.
- 아래 그림에서 @Autowired 애너테이션은 스프링 컨테이너에 있는 빈을 주입하는 역할이다.
Bean을 등록할 때는 @Component를 통해 등록하고, ( ← 이건 아래에서 얘기 )
다른 곳에서 Bean을 주입 받을 때는 @Autowired를 사용해 의존성을 주입받는다.
[ 3가지 방법 ]
1. 생성자를 통한 의존성 주입
2. 필드 객체 선언을 통한 의존성 주입
3. setter를 통한 의존성 주입
@Autowired
public DIController(MyService myService) {
this.myService = myService;
}
@Autowired
private MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
스프링 컨테이너는 스프링에서 제공하는 것으로, 빈을 생성하고 관리하는 역할이다.
즉, 빈의 생명주기를 스프링 컨테이너에서 관리하는 것이다.
또한 애너테이션(@Autowired)를 사용해 빈을 주입받을 수 있도록 DI를 지원한다.
빈은 스프링 컨테이너가 생성하고 관리하는 객체를 말한다.
앞서 본 코드에서 B가 바로 빈이다.
빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등
여러 방법을 제공한다.
- 아래와 같이 @Component 애너테이션을 붙여서 Class MyBean을 스프링 컨테이너에 빈으로 등록하고 있다. 이 때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔서 관리한다.
- 클래스 이름: MyBean 빈 이름: myBean
스프링 컨테이너가 생성될 때 객체(Bean)을 생성하고, 의존성을 주입한다.
의존관계 주입 후 Bean을 초기화하고, 스프링 컨테이너를 종료하기 전에 객체를 소멸시킨다.스프링 컨테이너 생성 → Bean 생성 → 의존성 주입 → 초기화 콜백 → Bean 사용
→ 소멸 전 콜백 → 스프링 종료
객체를 초기화 하는 것은 생성 이외에 외부 커넥션 연결, 초기값 등록 등 여러 작업을 의미한다. 따라서 초기화는 객체 생성을 포함하여 비교적 무거운 일을 수행한다.
관점을 기준으로 핵심 관점과 부가 관점으로 나눠 모듈화하는 것이다.
스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스
- 대표적인 예) 애너테이션, 매핑, JPA, MyBatis, JDBC…
- 어떤 기술을 사용하든 일관된 방식으로 DB에 접근하도록 인터페이스를 지원하는 것
- WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용하는 것
IoC : 객체의 생성과 관리를 개발자가 아닌 스프링 프레임워크에세 대신하는 것
DI : 외부에서 객체를 주입받아 사용하는 것
AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점을 나눠 모듈화하는 것
PSA : 어느 기술을 사용하던 일관된 방식으로 처리해 코드 변경 없이 사용하는 것
자바의 main() 메서드와 같은 역할로, 여기서 스프링 부트가 시작된다.
- 해당 애너테이션은 여러 애너테이션으로 구성된다.
- @SpringBootApplication을 구성하는 세 가지 애너테이션을 봐야한다.
- @SpringBootConfiguration
- @ComponentScan
- @EnableAutoConfiguration
@Configuration을 상속해서 만든 애너테이션
@Component라는 애너테이션을 가진 클래스들을 찾아 빈으로 등록하는 역할
- 개발자가 등록한 빈을 읽고 빈을 등록하는 애너테이션이다.
- 모든 빈을 @Component만 사용하는 것은 아니다. 용도에 따라 다른 애너테이션을 사용한다.
- @Configuration : 설정 파일 등록
- @Repository : ORM 매핑
- @Controller & @RestController : 라우터
- @Service : 비즈니스 로직
번외. @RestController
스프링 부트에서 자동 구성을 활성화하는 애너테이션
서버가 실행될 때 스프링 부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할을 수행