나도 스프링 부트를 사용해보자! - 스프링 빈과 의존관계
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
김영한 강사님
컴포넌트 스캔과 자동 의존관계 설정
회원 컨트롤러가 회원 서비스와 회원 리포지토리를 사용 할 수 있게 의존 관계를 만들어 보자!
@Controller
라는 어노테이션을 들고 있는 순간 스프링 컨테이너에서 관리를 하기 시작함.
사실 Controller
에서
private final MemberService memberService = new MemberService();
이렇게 MemberService
를 선언해서 사용 할 수도 있지만 다른 컨트롤러단에서도 new MemberService
를 통해 새롭게 객체를 생성해서 사용 할 수도 있음. 그러면 컨트롤러단 마다 새로운 객체 MemberService
가 나타나게 됨. 이것은 너무 비효율적인 방법이다!
이 문제를 해결하기 위해서 하나만 등록해놓고 공용으로 사용하기 위해서 스프링 컨테이너에 등록을 해놓고 사용 할 수 있다!
@Autowired
어노테이션을 이용해서 의존성 관계를 적용해준다.
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
그 전에! memberSerivce를 스프링 빈에 등록을 해주어야 한다.
@Component
: 스프링 컨테이너가 올라올 때 이 어노테이션을 가지고 있는 애들을 객체로 가지고 있음
@Autowired
: 연관 관계를 설정 해줌
@SpringbootApplication
과 같은 위치에 있는 파일들에 대해서만 컴포넌트 스캔이 가능하다.
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본적으로는 싱글톤으로 등록한다! ..갑자기 생각나는 TestBean1...
자바 코드로 직접 스프링 빈 등록하기
✨중요
컴포넌트 스캔 방식으로 자동으로 하는 것이 아니라 직접 하나 하나 소중하게 스프링 빈에 등록하는 방식이다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Bean
어노테이션을 통해서 스프링 컨테이너에 빈으로 등록해준다.
@Controller
의 경우에는 어쩔 수 없이 컴포넌트 스캔 형식이기 때문에 @Autowired
형식을 이용해줘야 한다.
✨ XML로 설정하는 방식도 있지만 최근에는 잘 사용하지 않는다!!! 이게 내가 쓰던건데!!! (충격 진실)
DI에는 생성자 주입, 필드 주입, setter 주입이 있다.
필드는 사용 거의 하지 않고
setter의 경우에는 public 한 setter를 이용해서 다른 친구들을 set 해버릴 수 있기 때문에 주의한다.
요즘에는 생성자 주입을 많이 이용한다.
주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 사용!
정형화되지 않거나 상황에 따라 변경이 필요한 경우 스프링 빈으로 등록한다.
예를 들어 MemroyMemberRepository
를 MysqlMemberRepository
로 변경해야 하는 경우! 기존 코드에는 아애 손을 대지 않고 설정을 통해서 변경이 필요한 경우! @Configuration
파일을 통해서 내가 직접 관리하는 것이 좋다.
@Autowired
를 통한 DI는 스프링이 관리하는 객체(ex: controller
, @Service
어노테이션을 달고 있는 서비스)에서만 동작을 하고 내가 직접 new를 통하여 생성한 객체와 같은 경우에는 동작하지 않는다.
정리하면서 듣느라 생각보다 속도가 나지는 않지만..
꾸준하게 계속 듣자..
Author And Source
이 문제에 관하여(나도 스프링 부트를 사용해보자! - 스프링 빈과 의존관계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@minchoi/나도-스프링-부트를-사용해보자-스프링-빈과-의존관계저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)