[Spring] 스프링 빈과 의존관계

이준영·2022년 9월 22일
0

스프링-입문

목록 보기
8/15

스프링 빈 등록 & 의존관계 설정하기

Class에 @Controller 애노테이션이 있으면 스프링은 알아서 spring container에 객체를 생성해서 넣어두고 관리한다.



HelloController, MemberController는 Spring Container에 들어가있을 것이란 얘기이다.

이것을 Spring Container에서 스프링 빈이 관리된다고 표현한다

MemberConroller에서는 MemberService 클래스를 이용해서 작업을 할건데 이때 new를 줘서 새로운 객체를 생성해버리면 안된다고 한다. Why? -> 다른 Controller들이 접근 가능해져


Member 같은 경우 딱 하나의 객체만 만들어져 있으면 된다.
그래서 MemberService를 선언만 하고 생성자를 만들건데 이때 @Autowired 를 해줘야해한다

생성자에 @Autowired가 있으면 스프링이 생성자의 파라미터(MemberService)를 스프링이 컨테이너에 연결해준다

나는 지금 Controller에서 서비스를 이용해먹을라고 하고있잖아.
Controller는 스프링이 알고있는 애들인데 서비스는 그냥 코드 나부랭이라 스프링이 인지를 못해.
그래서 멤버 컨트롤러에서 생성자의 parameter로 서비스 객체를 넣으면 오류가 발생해. Why?
스프링 컨테이너에 연결시키려는건데 서비스를 스프링이 인지를 못하니까.
그러면 어떻게해야하나..
서비스 클래스위에 에노테이션 @Service를 달아주면 스프링이 얘를 서비스로 인지할 수 있어.
마찬가지로 리포지토리도 @Repository를 달아주면 스프링이 리포지토리A
@Autowired : 스프링에서 인식하고 넣어줌(연결해줌) —> wired


스프링 빈을 등록하는 2가지 방법

1. 컴포넌트 스캔과 자동 의존관계 설정 : @Controller, @Service, @Repository 쓰는 방법

@Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다
@Controller가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문
@Controller, @Service, @Repository 자세히 들여다보면 @Component 기능이 들어가있다
@Autowired는 쟤네들의 연관 관계를 만들어줌


  • main/java/hello.hellospring/repository/MemoryMemberRepository 클래스 파일
@Repository
public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

	...
}
  • main/java/hello.hellospring/repository/MemberService 클래스 파일
@Service
public class MemberService {

    //private final MemberRepository memberRepository = new MemoryMemberRepository();
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
	...
}

@Controller & @Service & @Repository 모두 스프링 빈에 등록했으니까 wired 가능


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

SpringConfig 파일을 생성(hello.hellospring : controller, domain, repository, service랑 같은 위치)
@Configuration 등록해주고 public class SpringConfig 안에
@Bean 애노테이션을 써서 등록하면 된다.

 @Configuration
	public class SpringConfig {

 	@Bean
	    pubxic MemberService memberService() {
 	    return new MemberService(memberRepository());
	    }

     @Bean
     public MemberRepository memberRepository(){
         return new MemoryMemberRepository();
     }

}

웬만하면 스프링 빈에 등록해서 쓰는게 좋다

참고
• DI의 세가지 방법
생성자 주입 —> 실습에 쓴거. 이게 좋대
필드 주입 —> 안좋음
Setter 주입 —> 뭐가 문제가 있대

실무에서는…
정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용하고
정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정 통해 스프링 빈으로 등록한다
—> 나중에 MemoryMemberRepository를 바꿔치기 할거임
—> SpringConfig에서 MemoryMemberRepository를 DbMemberRepository로 바꾸면 끝

Autowired는 스프링 빈에 등록된 것만 적용 가능

profile
화이팅!

0개의 댓글