와 강의 이해가 쏙쏙 됐다 대박
들으면서 뭔가 머리 속의 흩어져있던 것들이 딱딱 맞아가는 기분이었다
자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다.
이렇게 되면 일일이 등록하기도 귀찮고, 설정 정보 파일도 커지고, 누락하는 문제가 발생한다.
스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.
의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다.
컴포넌트 스캔을 사용하려면
먼저 설정 정보에 @ComponentScan을 붙여줘야 한다.
(@Configuration은 기본)
@ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.
이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.
@Service, @Repository, @Controller 등의 어노테이션에는 @Component 어노테이션이 포함되어 있다.
그래서 꼭 붙여주는거였어!!! 드디어 이해함
(참고: 사실 어노테이션에는 상속관계라는 것이 없다. 그래서 이렇게 어노테이션이 특정 어노테이션을 들고 있는 것을 인식할 수 있는 것은 자바 언어가 지원하는 기능은 아니고, 스프링이 지원하는 기능이다.)
생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
타입(클래스)이 같은 빈을 찾아서 주입한다. (따라서 자식 클래스도 적용됨)
프로젝트 메인 설정 정보는 프로젝트를 대표하는 정보이기 때문에 프로젝트 시작 루트 위치에 두는 것이 좋다.
스프링 부트의 대표 시작 정보인 @SpringBootApplication를 프로젝트 시작 루트 위치에 두는 것이 관례이다.
그리고 이 설정 안에 바로 @ComponentScan이 들어있다!
궁금해져서 찾아보니 프로젝트 때 사용했던 템플릿 파일도 이 방식이 적용되어 있었다.
강의에서 AppConfig.java 파일을 다룰 때마다 umc 템플릿에 대체 이 파일이 어디에 있는 건지 궁금했는데 드디어 제대로 알게되었다.
프로젝트 시작 루트에 위치
@SpringBootApplication 적용
의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다. 스프링 빈이 아닌 일반 클래스에서 @Autowired 코드를 적용해도 아무 기능도 동작하지 않는다.
의존관계 주입은 크게 4가지 방법이 있다.
- 생성자 주입 : 불변, 필수 의존관계에 사용
- 수정자 주입 (setter 주입) : 선택, 변경 가능성 존재
- 필드 주입 : 코드가 간결하지만 외부에서 변경 불가능, 테스트하기 힘들다, DI 프레임워크가 없으면 아무것도 할 수 없다. 쓰지 말자!
- 일반 메서드 주입
되도록이면 생성자 주입 방식을 쓰는 것이 바람직하다. 불변하게 설계할 수 있고, 누락이 되는 경우에 컴파일 오류가 발생하기 때문에 IDE에서 바로 어떤 값을 필수로 주입해야 하는지 알 수 있다.
생성자 주입을 사용하면 필드에 final 키워드를 사용할 수 있다.
final이 붙은 필드를 모아서 생성자를 자동으로 만들어주는 lombok 기능
코드가 간결해지고 깔끔해진다!
강의 듣고 플젝에 적용해본 : https://velog.io/@yeezze/의존관계-자동-주입-lombok-활용-6gfd96eh
inflearn spring 핵심 원리 기본편 강의를 참고하여 정리했습니다.