오늘은 스프링 빈과 의존관계에 대해서 알아보도록 하겠습니다.
키워드
- 스프링 빈, 스프링 컨테이너, @Controller, @Service, @Repository, @Autowired, DI, 의존관계 주입,
@Controller, @Service, @Repository 어노테이션으로 스프링이 동작할 때 스프링컨테이너에 객체를 생성한다.
@Autowired를 통해 스프링컨테이너에 생성된 @Controller, @Service, @Repository 의 객체를 연결해주는데 사용한다.
@Controller
public class MemberController {
private final MemberService mebmerService;
@Autowired
public MemberController(MemberService mebmerService) {
this.mebmerService = mebmerService;
}
}
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@Repository
public class MemoryMemberRepository implements MemberRepository {
}
스프링 컨테이너 [Controller, Service, repository] 가 있고, 스프링 빈으로 등록한 것이다.
빈을 이어주는 역할이 @Autowired가 해준다.
이 방법은 컴포넌트 스캔, 자동 의존 관계 설정 방법이다.
@Component이 붙은 어노테이션은 스프링이 시작 될 때 객체로 다 생성시킨다. 그것을 이어주는게 @Autowired고 자동 의존 관계를 이어준 것이다.
스프링 컨테이너에 스프링 빈을 등록 할떄 에는 싱글톤으로 등록한다. 유일하게 하나만 등록해서 공유합니다. 스프링 빈이면 같은 인스턴스이다.
자바 코드로 직접 스프링 빈 등록하기
SpringConfig 를 만든다. 이렇게 만들면 스프링 컨테이너에 빈을 생성해주는 거랑 같다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
DI에는 필드 주입, Setter 주입, 생성자 주입 세가지 방법이 있다.
1. 생성자 주입 (생성 될때 한번 되고 변경이 불가하게 만들 수 있다.)
@Autowired
public MemberController(MemberService mebmerService) {
this.mebmerService = mebmerService;
}
2. 필드 주입(별로 안좋음, 스프링 뜰 때만 주입해주고 바꿔치기 할 수가 없다.)
@Autowired private MemberService mebmerService;
3. 세터 주입(public 으로 열려있어야 한다.)
@Autowired
public void setMemberController(MemberService mebmerService) {
this.mebmerService = mebmerService;
}
'Back-End > Spring(Boot)' 카테고리의 다른 글
스프링 GetMapping , PostMapping (0) | 2020.12.26 |
---|---|
포트 사용 중일 때 (0) | 2020.12.26 |
Spring controller, domain, service, repository V1 (0) | 2020.12.18 |
이클립스에서 스프링 mvc 프로젝트 폼 데이터 값 검증 (0) | 2020.10.13 |
이클립스 get, post, @ModelAttribut, redirect 사용법 (0) | 2020.10.12 |