본문 바로가기
Spring Tutorial

[Spring 입문 4] 스프링 빈과 의존관계: 컴포넌트 스캔과 자동 의존관계 설정

by 미소5 2023. 7. 2.
  • 스프링 빈을 등록하는 2가지 방법
    • 컴포넌트 스캔과 자동 의존관계 설정
    • 자바 코드로 직접 스프링 빈 등록하기

[Spring 입문 5] 스프링 빈과 의존관계: 자바 코드로 직접 스프링 빈 등록하기 (tistory.com)

 

[Spring 입문 5] 스프링 빈과 의존관계: 자바 코드로 직접 스프링 빈 등록하기

회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션을 제거하고 진행한다. 자바 코드로 직접 스프링 빈 등록하기 @Configuration public class SpringConfig { @Bean public MemberService memberSer

joly156.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

 


  • 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
반응형