Spring 기초 - DI @autowired 및 annotation 모음

Hailey·2025년 3월 2일

SPRING

목록 보기
4/15

ComponentScan + context 한 번에 결합

// Java 설정 파일을 기반으로 ApplicationContext 객체 생성 
ApplicationContext context 
	= new AnnotationConfigApplicationContext(ContextConfiguration.class);

원래는 이정도였지만.., ComponentScan개념을 사용해서

@Autowired - 필드 주입

@를 사용해서 Bean으로 지정되어야
BookDAO 타입의 변수 bookDAO에
BookDAO 인터페이스를 구현한 클래스(BookDAOImpl)가 자동으로 주입된다!

(@Service, @Repository 로 각 계층을 콩 만들어서 그 사이 연결)

BookDAO타입의 빈으로 자동으로 주입되므로 실제로는 private BookDAO bookDAO = new bookDAOImpl();을 의미하게 된다.

서비스 계층에서 DAO계층의 콩을 주입받는 것이
이거 @autowired 하나면 끝난다.

@Autowired - setter 주입

단순히 필드 위에 달았던 @autowired를 생성자 위에 달기만 하면 된다.
아까랑 원리는 똑같다. 인자에 필드가 주입되는 것 처럼 생각하면 된다.

@Autowired
public void setBookDAO(BookDAO bookDAO){
	this.bookDAO = bookDAO;
}

BookDAO타입의 클래스를 찾아서 알아서 인수에 주입시켜 준다.
그러면 해당 this(객체)의 bookDAO변수에 대입되게 된다(setter)

똑같이 @service계층에서 @repository계층(DAO)을 주입시키는 것이 포인트이다!

자세한 service계층 코드

@Service("bookServiceSetter")
public class BookService{

	private BookDAO bookDAO;
    
    public BookService(){
    }
    
    @Autowired
    public void setBookDAO(BookDAO bookDAO){
    	this.bookDAO = bookDAO;
    }
    
    //도서 목록 전체 조회
    public List<BookDTO> findAllBook(){
    	return bookDAO.findAllBook();
    }
    
    //도서 번호로 도서 조회
    public BookDTO findBookBySequence(int sequence){
    	return bookDAO.findBookBySequence(sequence);
    }

}

@Autowired - 생성자 주입

@Qualifier

@Autowired 자동으로 타입에 맞는 빈을 주입 (단, 같은 타입이 여러 개 있으면 오류 발생)
@Qualifier 동일한 타입의 여러 빈 중 특정 빈(이름)을 선택해서 주입
@Primary 기본적으로 선택될 빈을 지정 (우선순위 지정)

primary는 해당 빈 위에 붙여주지만
Autowired나 Qualifier는 보통 같이 그 위에 써준다.

@Service("pokemonServiceQualifier")
public class PokemonService{

	//설명. bean에 @Primary가 설정되어 있더라도 주입을 받는 시점에 원하는 bean을 고를 수 있다.
    @Autowired
    @Qualifier("squirtle")
    private Pokemon pokemon;
    
    //생성자 주입은 Autowired 생략 가능
    pubic PokemonService(@Qualifier("pikachu") Pokemon pokemon){
    	this.pokemon = pokemon;
    }
    
	
}

같은 타입의 빈이 2개 이상일 경우 컬렉션 형태로 주입받기.

컬렉션 형태가 아니었어도 같은 타입이 여러개면 알아서 컬렉션으로 만들어진다.

1. 같은 타입의 빈을 List 형태로 주입 받기

private final List<Pokemon> pokemonList;

@Autowired
public PokemonService(List<Pokemon> pokemonList){
	this.pokemonList = pokemonList;
}

public void pokemonAttack(){
	pokemonList.forEach(pokemon-> pokemon.attack());
}
//설명 2. 같은 타입의 빈들을 map 형태로도 주입 받을 수 있다.
privat final Map<String,Pokemon> pokemonMap;

public PokemonService(Map<String,Pokemon> pokemonMap){
	this.pokemonMap = pokemonMap;
}

그 외 어노테이션

@Resource (이름 기준)

@Resource는 @primary보다 웃너순위 높게 빈 설정가

타입이 하나만 있을 때 : @Autowired
같은 타입의 빈이 여러 개 있을 때 : @Autowired + @Qualifier("빈이름")
특정한 빈 이름으로 주입하고 싶을 때 : @Resource(name="빈이름")
기본적으로 선택할 빈을 지정하고 싶을 때 : @Primary

@Resource의 주입 우선순위
빈 이름과 일치하는 경우 → 해당 빈을 주입
이름이 없으면 → 타입을 기준으로 주입
이름과 타입 모두 일치하는 것이 없으면 오류 발생

@Inject(타입 기준), @Named (이름 기준)

@Inject

Spring 전용이 아닌, Java의 표준 라이브러리입니다.
Spring의 @Autowired와 거의 동일한 기능을 합니다.
타입(Type) 기준으로 의존성을 주입.
@Qualifier(@Named)와 함께 사용할 수 있다.

@Named

Qualifier와 비슷한 역할
하지만 Qualifier처럼 spring에 종속되지는 않는다.

//설명. 1. Inject라이브러리 활용한 필드 주입
@Inject
@Named("squirtle")
private Pokemon pokemon;

//설명.2. 생성자 주입
private Pokemon pokemon
@Inject
public void pokemonAttack(@Named("pikachu") Pokemon pokemon){
	this.pokemon= pokemon;
}

//설명3.setter주입
private Pokemon pokemon;
@Inject
public void setPokemon(@Named("squirtle")Pokemon pokemon){
	this.pokemon = pokemon;
}

public void pokemonAttack(){
	pokemon.attack();
}

@Scope ( Singleton / Prototype )

Spring의 기본 스코프는 singleton이므로,

같은 @Bean을 여러 번 가져와도 동일한 객체가 반환됩니다.

새로운 객체를 매번 생성하려면 @Scope("prototype")을 추가하면 됩니다. 🚀
(디폴트는 @Scope("prototype"))

싱글톤(Singleton)이란?

싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하고, 이를 전역적으로 공유하는 디자인 패턴입니다. 즉, 프로그램 실행 동안 해당 클래스의 객체는 오직 하나만 존재합니다.

profile
럭키헤일리

0개의 댓글