CS지식 및 수업 정리/spring

Spring의존성 주입 @Autowired

바이솔 2024. 7. 31. 16:18

필드를 통해 의존성 주입하는 예시를 통한 이해

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public void saveUser(String username) {
        userRepository.save(username);
    }
}

의존성:

의존성은 어떤 클래스가 다른 클래스의 기능을 필요로 할 때 발생한다. 여기서 UserService 클래스는 UserRepository 클래스에 의존한다. 즉, UserService는 UserRepository의 기능을 사용해야 한다.

 

의존성 주입:

  • 의존성 주입은 외부에서 객체의 의존성을 제공하는 설계 패턴이다. 이를 통해 객체 간의 결합도를 낮추고 코드의 유연성과 재사용성을 높임.

코드에서의 의존성 주입

  • UserService 클래스는 UserRepository 클래스에 대한 의존성을 가지고 있다.
  • @Autowired 애너테이션을 사용하여 스프링 프레임워크가 UserRepository의 인스턴스를 UserService에 자동으로 주입.

의존성 주입의 구체적 과정

  1. UserService 클래스의 정의:
    • UserService 클래스는 UserRepository 객체를 필요. 이는 userRepository 필드로 표현됨.
  2. @Autowired 애너테이션:
    • @Autowired 어노테이션은 스프링 컨테이너에게 userRepository 필드에 UserRepository 타입의 빈을 주입하라고 지시.
  3. 스프링 컨테이너 초기화:
    • 애플리케이션이 시작될 때 스프링 컨테이너가 초기화되고, 설정된 빈들을 생성하고 관리.
  4. 빈 생성 및 주입:
    • 스프링 컨테이너는 UserService 빈을 생성할 때, UserRepository 빈을 찾아 userRepository 필드에 주입한다.
    • 이 과정에서 스프링은 UserRepository 타입의 빈을 검색하여 주입. 

필드 의존성 주입 예시 결론

  • 의존성 주입의 주체: 스프링 컨테이너가 @Autowired 애너테이션을 해석하여 UserRepository 빈을 찾아 UserService에 주입하는 것!
  • 주입된 의존성 사용: UserService 클래스는 주입된 UserRepository 객체를 사용하여 saveUser 메서드를 통해 사용자 정보를 저장한다.

따라서, UserService 클래스는 UserRepository 클래스에 의존하고 있으며  이 의존성은 스프링 프레임워크에 의해 자동으로 주입.

 

수정자 주입 방식

@Service
public class UserService {
    private UserRepository userRepository;

    // 수정자 주입 방식
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(String username) {
        userRepository.save(username);
    }
}

setter 함수를 생성하고 그 위에 @Autowired를 적음. 스프링 빈을 모두 등록한 후 @Autowired가 붙은 수정자를 찾아 의존관계를 주입하게 된다.

의존성을 선택적으로 주입 가능해 유연하다.

 

생성자 주입 방식

@Service
public class UserService {
    private final UserRepository userRepository;

    // 생성자 주입 방식
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(String username) {
        userRepository.save(username);
    }
}

생성자 주입 방식에서는 @Autowired 애너테이션을 생성자에 사용할 수 잇으며 생성자가 하나뿐일 경우에는 어노테이션 생략 가능하다.