- 스프링 빈을 등록하는 2가지 방법
- 컴포넌트 스캔과 자동 의존관계 설정
- 자바 코드로 직접 스프링 빈 등록하기
[Spring 입문 5] 스프링 빈과 의존관계: 자바 코드로 직접 스프링 빈 등록하기 (tistory.com)
- 컴포넌트 스캔과 자동 의존관계 설정
- 회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비
- 회원 컨트롤러에 의존관계 추가
@Controller
public class MemberController {
private final MemberService memberService;
/**생성자에 @Autowired가 있으면, 스프링이 연관된 객체를 찾아 넣어준다.
이것이 DI(의존성 주입:객체 의존관계를 "외부에서" 넣어주는 것) */
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
- 오류발생!
- Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration. →MemberService를 찾을 수 없다
- @Service를 넣어주면(MemberService를 스프링빈으로 등록해주면) 해결된다!
- 회원 서비스 스프링 빈 등록
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
- 회원 리포지토리 스프링 빈 등록
@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;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore() {
store.clear();
}
}
- memberController, memberService, memberRepository 가 스프링 컨테이너에 스프링 빈으로 등록되었다.
- memberController → memberService → memberRepository
- @Autowired 가 연결(→)해주는 역할
- 컴포넌트 스캔 : @Component 애노테이션이 있으면 자동으로 스프링 빈으로 등록된다.
- 내부에 @Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
- @Controller
- @Service
- @Repository
- 내부에 @Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
- DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다.
@Autowired private MemberService memberService; //필드 주입의 예
@Autowired //setter주입의 예
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired //생성자 주입의 예
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장!
728x90
반응형
'Spring Tutorial' 카테고리의 다른 글
[Spring 입문 10] 스프링 DB 접근 기술: 순수 JDBC (0) | 2023.07.08 |
---|---|
[Spring 입문 9] 스프링 DB 접근 기술: H2 데이터베이스 설치 (0) | 2023.07.08 |
[Spring 입문 6] 웹 MVC 개발: 회원 웹 기능- 홈 (0) | 2023.07.04 |
[Spring 입문 5] 스프링 빈과 의존관계: 자바 코드로 직접 스프링 빈 등록하기 (0) | 2023.07.04 |
[Spring 입문 1] 스프링 프로젝트 생성 (0) | 2023.02.08 |