빡코

[스프링]스프링 컨테이너를 다루는 방법 본문

Java/Spring-boot

[스프링]스프링 컨테이너를 다루는 방법

chris.djang 2023. 12. 27. 14:30

@Configuration : 클래스에 붙이는 어노테이션으로, @Bean을 사용할 때 함께 사용해
주어야 한다.
@Bean : 메소드에 붙이는 어노테이션으로, 메소드에서 반환되는 객체를 스프링 빈에
등록한다

 

@Repository 어노테이션 대신 @Configuration과 @Bean 어노테이션을 활용하여 빈등록하기 

package com.group.libraryapp.config;

import com.group.libraryapp.repository.user.UserRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

@Configuration
public class UserConfiguration {

    @Bean
    public UserRepository userRepository(JdbcTemplate jdbcTemplate) {
        return new UserRepository(jdbcTemplate);
    }
}

 

의존성을 주입 받는 UserService 클래스에서 에러 발생하지 않는다. 

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

 

@Service @Repository 언제 사용? 개발자가 직접 만든 클래스를 스프링 빈으로 등록할 경우 사용한다.  

@Configuration + @Bean 조합은 외부 라이브러리나 프레임워크에 만들어져 있는 클래스를 스프링 빈으로 등록할 때 사용

@Component 어노테이션이 주어진 클래스를 '컴포넌트'라고 간주하고, 이 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다. 

언제 사용? 컨트롤러, 서비스, 리포지토리가 모두 아닌 추가적인 클래스를 스프링 빈으로 등록할 때 종종 사용

 

스프링 빈을 주입 받는 방법? 

1. 생성자를 통해서 주입 받는 방법이 권장 됨. 

@RestController
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }
}

 

2. setter와 @Autowired를 사용하는 방법 

-누군가 임으로 주입이 오작동 가능성 있음 

@RestController
public class UserController {

    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

 

3. 필드에 직접 @Autowired 사용 

@RestController
public class UserController {
    @Autowired
    private UserService userService;
}

 

 

@Qualifier ? 

@Primary 어노테이션이 없는 상황에서 주입받는 쪽에서 특정 스프링 빈을 선택할 수 있게 해준다.

*@Qualifer > @Primary 어노테이션이 우선 순위가 더 높다. 

@RestController
public class UserController {

    private final UserService userService;
    private final FruitService fruitService;

    public UserController(UserService userService, @Qualifier("appleService") FruitService fruitService) {
        this.userService = userService;
        this.fruitService = fruitService;

    }
  }
public interface FruitService {
}
@Service
public class AppleService implements FruitService{
}

 

@Qualifier 어노테이션은 스프링 빈을 사용하는 쪽과 스프링 빈을 등록하는 쪽 모두 사용할 수 있다

@RestController
public class UserController {

    private final UserService userService;
    private final FruitService fruitService;

    public UserController(UserService userService, @Qualifier("main") FruitService fruitService) {
        this.userService = userService;
        this.fruitService = fruitService;

    }
}
@Service
@Qualifier("main")
public class BananaService implements FruitService{
}