스터디코딩
컴포넌트 스캔과 자동 의존관계 설정(DI) 본문
Dependancy injection(DI, 의존관계 주입)
1. 생성자 주입
2. 필드 주입 - 바뀔 여지가 없다는 단점
3. setter 주입 - public으로 항상 열려있어야한다는 단점
@Controller
멤버 컨트롤러가 멤버 서비스를 통해서 회원가입 등을 한다. 이것을 의존관계가 있다고 한다.
@Controller
public class MemberController {
/* private final MemberService memberService = new MemberService();
* new하면 여러 controller들이 memberService를 가져다 쓰며 여러개를 쓰게됨. 그럴필요없이
* 공유하자!
* */
//1. 생성자 주입(권장)
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
//2. 필드 주입
@Autowired private final MemberService memberService;
//3. setter 주입
private final MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
}
- @Controller : 스프링이 뜰때 스프링 컨테이너란 통이 생긴다. @Controller가 있으면 MemberController 객체를 생성해서 스프링에 넣어두고 관리한다. 이것을 스프링 컨테이너에서 스프링 빈이 관리된다고 한다.
- @Autowired : 스프링 컨테이너에서 멤버 서비스를 가져온다. 스프링 컨테이너 등록된 것들만 사용시 동작한다.
- MemberController가 생성될 때, spring been에 등록된 memberService 객체를 가져다가 넣어준다.
@Service
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
- new를 이용하여 여러개를 쓰지않고 공유한다 -> @Service이용하여 스프링 컨테이너 등록.
- @Service : 스프링이 서비스임을 알고 등록시켜준다.
@Repository
@Repository
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
}
- @Repository : 스프링이 repository임을 알고 등록시켜준다.
결과
컴포넌트 스캔
- @Service, @Controller, @Repository => @Component 사용가능
- 컴포넌트 관련 @가 있으면 객체를 하나씩 생성해서 컨테이너 등록.
- @autowired는 연관관계, 선을 연결해준다.
- HelloSpringApplication을 실행시키는데, 여기 부터 시작해서 package hello.hellospring,포함해서 하위들은 자동으로 스프링이 다 뒤져서 스프링 빈으로 등록. 하위패키지가 아닌 것은 스프링 빈으로 컴포넌트 스캔 안함. 기본적으로 대상이 안됨. @componentScan이 있어야함.
- 싱글톤으로 등록
Controller 통해서 외부 요청 받고 Service에서 비즈니스 로직을 만들고, Repository에서 data를 저장한다.
'SpringBoot > inflearn - 스프링 입문' 카테고리의 다른 글
스프링 웹 개발 기초 - 정적 컨텐츠, MVC와 템플릿 엔진, API (0) | 2021.06.24 |
---|
Comments