-
빈 등록과 주입을 아라보자스프링 2024. 5. 15. 23:26
Spring Bean 등록하기
- 컴포넌트 스캔과 자동 의존관계 설정
스프링 부트에서 사용자 클래스를 스프링으로 등록하는 가장 쉬운 방법은 @Component를 사용하는 것이다.
@contorller, @service, @reposiotory는 모두 @Component를 포함하고 있다.
해당 어노테이션으로 등록된 클래스는 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.
- 자바 코드로 직접 등록
수동으로 스프링 빈을 등록하려면 자바 설정 클래스를 만들어 사용해야 한다.
스프링 부트가 아닌 그냥 스프링을 사용하면 XML파일을 이용하여 빈을 등록해야 한다.
설정 클래스를 만들고, @Configuration을 클래스 선언부 위에 추가하면 된다.
이후 특정 타입을 return 하는 메소드를 만든 후, @Bean을 붙이면 자동으로 해당 타이브이 빈 객체가 만들어진다
의존성 주입하기
의존성 주입은 필요한 객체를 직접 생성이 아닌, 외부로 부터 객체를 받아서 사용하는 것이다.
이를 통해 클래스간 결합도를 줄이고 의존성을 줄이며, 재활용성을 높일 수 있다.
또한 테스트가 용이해진다.
- 생성자 주입
@Controllerpublic class CocoController { //final을 붙일 수 있음 private final CocoService cocoService; @Autowired public CocoController(CocoService cocoService) { this.cocoService = cocoService; } }
생성자가 하나이고, 주입받을 객체가 빈으로 등록되어 있다면, 이때는 Autowired 생략이 가능하다.
스프링 레퍼런서를 찾아보면 생성자 주입을 권장하고 있다.
먼저 순환 참조를 방지할 수 있기 때문이다.
A가 B를 참조하고, B가 다시 A를 참조하는 상황을 가정하자.
필드 주입과 setter주입은 빈 생성 이후에 참조를 하기 때문에 어플리케이션이 오류 없이 구동되기 때문에, 호출되기 전까지 오류를 잡을 수없다.
그러나 생성자를 통해 주입을 한다면 BeanCurrentlyInCreationException이 발생하다.
또한 의존관계를 외부로 노출시켜 실행시 오류를 체크할 수 있다.
또한 불변성의 이점이 있다.
의존성으로 주입시 final 선언이 가능하여 변경 가능성을 제거한다.
setter주입과 메소드 주입은 수정의 가능성을 열어두기 때문에 OCP원칙을 위반하게 된다.
- 필드주입
@Controllerpublic class CocoController { @Autowired private CocoService cocoService; }
필드에 @Autowired를 붙여주어, 자동으로 의존성을 주입한다.
그러나 외부에서의 변경이 힘들고, 프레임워크에 의존적임과 동시에 객체지향 적으로 좋지 않다.
- Setter주입
@Controllerpublic class CocoController { private CocoService cocoService; @Autowired public void setCocoService(CocoService cocoService) { this.cocoService = cocoService; } }
Setter 메소드에 @Autowired를 붙인다. 그러나 어디서든 변경이 가능하다는 위험이 있다.
728x90'스프링' 카테고리의 다른 글
성능 개선을 진행해보자 2 (0) 2024.07.07 성능 개선을 진행해보자 1편 (0) 2024.07.03 [Spring] springBoot2.4 이상에서의 application설정 (0) 2023.12.29 [Spring] Error - Parameter 0 of constructor in ~ required a bean of type 'java.lang....' that could not be found. (0) 2023.12.29 [JUnit5] @ParameterizedTest, @ValueSource, @CsvSource (0) 2023.11.01