스프링부트 공부 2일차

@Autowired 사용법

1. 생성자에 붙인다.

@Service
public class BookService{
BookRepository bookrepository;

@Autowired
public BookService(BookRepository bookrepository){
	this.bookrepository=bookrepository;
}
}

이때 BookRepository가 빈이 아닐시, BookService는 생성불가다. 생성자에 BookRepository를 할당해야 하는데 해당하는 빈이 없으므로 생성 할수 없다. 오류가 뜬다.

2.setter에 붙인다.

@Service
public class BookService{
BookRepository bookrepository;

@Autowired
public void setBookService(BookRepository bookrepository){
	this.bookrepository=bookrepository;
}
}

이경우에는 setter에 의존성을 추가해서 BookRepository가 빈에 없어도 BookService는 만들수 있을것 같지만, @Autowireda가 붙어있기 때문에 BookRepository를 넣어주려한다. 하지만 그에 해당하는 빈이 없으므로 이 역시도 오류가 뜬다.

 

3.필드에 붙인다.

 

@Service
public class BookService{
@Autowired
BookRepository bookrepository;
}

 

해당하는 빈이 없을때 무시하고 넘어가게 하는 설정

@Autowired(required=false)

을 붙이면 해당하는 빈이 없어도 의존성을 주입받지 않아도 생성된다. 다만 setter과 필드에서만 사용가능하다. 생성자는 빈이 없으면 아예 생성자체가 불가능하기때문이다.

 

넣으려는 빈이 여러개일때

@Repository
public class CatBookRepository extends BookRepository{
{

@Repository
public class DogBookRepository extends BookRepository{
{

//@Autowired @Qualifier("CatBookRepository")
//BookRepository bookrepository

위와 같이 BookRepository를 @Autowired를 사용해 의존성 주입을 할때 만약 같은이름을 가진 빈이 여러개 일시 오류가 뜬다. 어떤 빈은 넣어야 할지 모른다고. 이럴경우 넣기를 원하는 빈에 @Primary를 붙이거나, 의존객체에 @Qualifier("빈 이름")을 붙여서 넣을 빈을 정한다.

혹은 LIst<>를 사용해 모두다 받는다.

@Autowired
List<BookRepository> bookrepositories;

@PostConstruct

@PostConstruct는 의존성 주입이 이루어진 후 초기화를 수행하는 메서드이다. @PostConstruct가 붙은 메서드는 클래스가 service(로직을 탈 때? 로 생각 됨)를 수행하기 전에 발생한다. 이 메서드는 다른 리소스에서 호출되지 않는다해도 수행된다. 

 

사용하는 이유

 생성자(일반)가 호출 되었을 때, 빈(bean)은 아직 초기화 되지 않았다. (예를 들어, 주입된 의존성이 없음)

하지만, @PostConstruct를 사용하면, 빈(bean)이 초기화 됨과 동시에 의존성을 확인할 수 있다. 

+ 개인 의견으로 클래스 내에 @Autowired를 붙여서 객체를 사용할 때, 생성자가 필요하다면 @PostConstruct를 사용하면 될 것 같다. 빈(bean)이 등록되고 사용할 수 있으니까 말이다. 나도 그렇게 사용했고..

 

2) bean lifecycle에서 오직 한 번만 수행된다는 것을 보장할 수 있다. (WAS가 올라가면서 bean이 생성될 때 딱 한 번 초기화함) 그래서 @PostConstruct를 사용하면 bean이 여러번 초기화되는 것을 방지할 수 있다.

 

@SpringBootApplication에는 @ComponentScan이 포함되어있다. ComponentScan은 현재 패키지부터 하위패키지를 스캔해서 빈을 스캔 할 수 있다. 단, 같은위치의 다른 패키지의 빈은 스캔하지 못한다.

빈으로 등록당하는 것들은 @Component라는 어노테이션을 가지고 있다.@Repository, @Contoroller, @Service등이 그 예이다. 이 어노테이션들은 @Component를 포함하고 있다.

 

그외.. 함수를 사용한 빈 등록이 있다. 이 방법은 스캔 범위 밖에 있는 빈도 등록할 수 있으나, 설정하기도 복잡하고, 이 방법을 사용시 설정파일이 매우매우 길어지기에, 아직 내 레벨에서는 이른것 같다.

 

'Web > Spring Boot' 카테고리의 다른 글

ObjectMapper  (0) 2021.05.08
스프링부트 공부 5일차  (0) 2020.12.19
스프링 공부 4일차  (0) 2020.12.19
스프링 공부 3일차  (0) 2020.12.13
스프링부트 공부 1일차  (0) 2020.12.06