스프링 빈과 의존관계

naeganugu·2022년 7월 5일
0

스프링 마스터🌱

목록 보기
3/19
post-thumbnail

1. 스프링 빈

Spring container에서 Spring bean이 관리된다.
ex. 스프링이 뜰 때 @Controller 어노테이션을 보고 컨트롤러 객체를 만들어서 스프링 컨테이너에 넣는다.(스프링이 관리) 즉, 스프링 빈으로 등록된다.

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

1) @Autowired

@Controller
public class MemberController {
    
    private final MemberService memberService;
    
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

@Autowired가 memberService를 스프링이 스프링 컨테이너에 있는 memberService와 연결해준다. 즉, 관련 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI라고 한다.

DI(Dependency Injection): 객체 의존관계를 외부에서 넣어주는 것.

@Autowired는 스프링이 관리를 해야지 의미가 있는 어노테이션이다. 즉, MemberService를 스프링이 스프링빈으로 관리를 하고 있어야 @Autowired가 작동이 되면서 의존성 주입이 가능하다.

2) 컴포넌트 스캔과 자동 의존관계 설정

@Service
public class MemberService {
	...

이런 식으로 서비스에도 @Service 어노테이션을 달아줘야, 스프링이 올라올 때 '이게 서비스네'하고 알고 스프링이 스프링 컨테이너에 memberService를 등록해준다.

@Repository
public class MemoryMemberRepository implements MemberRepository{
	...

@Repository도 마찬가지다. 어노테이션 있어야 스프링빈으로 관리가 되고, DI할 수 있다.

기억해야할 어노테이션

  • @Controller: 외부 요청 받고
  • @Service: 비지니스 로직 만들고,
  • @Repository: 데이터 저장.

위 같은 패턴이 정형화된 패턴이다. 이렇게 어노테이션을 달아줘야 스프링이 뜰 때 스프링이 알 수가 있고, 스프링 컨테이너에 등록이 되어 스프링빈으로 관리가 된다.

@Component 어노테이션 있으면, 이런 애들은 다 스프링 객체 생성해서 스프링 컨테이너에 등록이 된다. @Controller, @Service, @Repository 같은 애들도 안에 살펴보면 @Component 어노테이션을 포함하고 있다.

@Autowired는 이런 스프링빈들을 연결해주는, 연관관계를 다룬다.

package hello.hellospring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloSpringApplication {

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

}

이때 컴포넌트 스캔은 hello.hellospring 하위 패키지만 스캔한다. 따라서 hello.hellospring과 동일하거나 상위 패키지에서 빈을 등록하려 해도 등록이 되지 않는다.

  • 스프링은 스프링 컨테이너에 스프링 빈을 등록한다.
  • @Component 있으면 스프링 빈으로 자동 등록된다.
  • 스프링은 스프링 빈 등록할 때 싱글톤으로 등록한다. 즉, 하나만 등록해서 공유한다. 같은 스프링 빈이면 모두 같은 인스턴스다.

3) 자바 코드로 직접 스프링 빈 등록하기

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

직접 스프링 빈을 등록하려면 위처럼 config 파일을 하나 만들어서 @Configuration 어노테이션을 사용한다.

4) DI

DI에는 3가지 방법이 있다. 필드 주입, setter 주입, 생성자 주입.
하지만 생성자 주입을 권장한다.



[출처]

스프링-입문-스프링부트

profile
seungseung-zanggu

0개의 댓글