스프링/0. 입문, 전체방향

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

sdafdq 2023. 7. 8. 15:47

먼저 기존 자동 연결은 한번 지워봄.

public class MemberService {    //Ctrl + Shift + T 테스트 바로 만들기.
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
}
public class MemoryMemberRepository implements MemberRepository{

}

 

컨트롤러는 그대로 둬야 함. 컨트롤러를 통해 최초로 연결되서 그러는 듯.

@Controller
public class MemberController {
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

 

Config 클래스를 하나 만듦.

package hello.hellospring;

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

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

main 실행하는 

@SpringBootApplication
public class HelloSpringApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloSpringApplication.class, args);
	}
}

저거랑 같은 위치에 만드는 듯

 

다시 Config 코드로 돌아와서,

package hello.hellospring;

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

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

@Configuration

이게 아마 여기 안에 Bean이 있어요 이 소리 인듯.

 

@Bean

빈으로 등록할 건 저렇게 하고 return으로 객체 보냄.

return new MemberService(memberRepository());

memberRepository() 함수도 bean으로 등록되어 있어서 실행 가능. 

 

보통 @Service, @Repository, @Controller 같이 정형화 되어 있는 경우는 컴포넌트 스캔 이용, 그 외에 정형화 되지 않은 것과, 혹은 상황에 따라 구현클래스를 변경 해야 할 경우 위 처럼 @Bean으로 등록.

 

이 수업 상에서는, Repository를 우리가 DB선정이 안되었다고 가상 시나리오를 정했기 때문에 Memory 상에서 먼저 했는데, 이렇게 변경할 예정이 있는 건 정형화 되어진 거라도 @Bean으로 등록.

 

근데 난 솔직히 모두 @Bean으로  등록하는 게 좋아 보임. 한 눈에 볼 수 있어서. @Service, @Repository, @Controller 는 최상위에 놓고.

 

여튼, 우리가 결국 나중에 MemberRepository 인터페이스 통해 DbMemberRepository 만들게 되면, 위에서

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService(){
        return new MemberService(dbMemberRepository());
    }

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

    @Bean
    public DBMemberRepository dbMemberRepository(){
        return new DBMemberRepository();
    }
}

이렇게만 MemberService의 인자를 바꾸어 주고, DBMemberRepository만 추가해 주면 된다.