Spring boot - 스프링 빈과 의존 관계

범수·2024년 2월 19일

목차

  1. 프로젝트 생성하기
  2. View 환경설정
  3. 스프링 웹 개발 기초
  4. 회원 관리 예제
  5. 스프링 빈과 의존 관계
  6. 웹 MVC 제작
  7. DB 제작(1)
  8. DB 제작(2)
  9. AOP

1. 컴포넌트 스캔과 자동 의존 관계

member 컨트롤러 생성

@Controller	//@Component 대체 가능
public class MemberController {
    private final MemberService memberService;

    @Autowired //컨트롤러 서비스 연결     //에러 발생 - 서비스, 리포지토리 등록x
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
  • 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.
    • 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다.
  • 실행 시 에러 발생
    • 서비스, 리포지토리 등록X
  • helloController는 스프링이 제공하는 컨트롤러여서 스프링 빈으로 자동 등록
  • @Component 스프링에서 사용되는 가장 기본적인 annotation
    • scan-auto-detection과 DI을 사용하기 위해서 스프링 컨테이너에 등록하는 기본 annotation
    • Spring에서는 컨트롤러, 서비스, 리포지토리 annotation 추천

서비스, 리포지토리 객체 생성

@Service    //서비스 객체 등록
public class MemberService {
	...
} //MemberService.java

@Repository	//리포지토리 객체 등록
public class MemoryMemberRepository implements MemberRepository{
	...
}//MemoryMemberRepository.java
  • 서비스, 리포지토리 객체 등록
    • 객체들 간의 연결을 안해주어 여전히 에러 발생
  • 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록

객체 간 연결(@Autowired)

	...
@Autowired //서비스 객체 연결
public MemberController(MemberService memberService) {
   this.memberService = memberService;
}	
	...	// MemberConcroller.java

	...
@Autowired // 리포지토리 객체 연결
public MemberService(MemberRepository memberRepository) {
    this.memberRepository = memberRepository;
}	
	...	//MemberService.java
  • 동작 시 스프링 애플리케이션이 정상 작동하게 된다.
    • 스프링 컨테이너에 등록 되있을 시 정상 작동(주의)
  • 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장
    • 보안, 편의성 좋음

2. 자바 코드로 직접 스프링 빈 등록

SpringConfig 생성

@Configuration
public class SpringConfig {

    @Bean	// 컨테이너에 등록
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }
}	//SpringConfig.java
  • @Bean 서비스, 리포지토리를 통해 빈에 등록
    • MemberService(memberRepository());을 통해 서비스와 리포지토리 연결

장단점

  • 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용
  • 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록
    • 코드를 수정할 필요 없이 쉽게 변경 가능
profile
범수의 개발 놀이터😋

0개의 댓글