[Spring] 같은 인터페이스를 구현한 빈을 구분하여 의존성 주입하는 방법: @Qualifier, @Primary, @Resource

2023. 4. 23. 11:30· Spring
목차
  1. 💋 문제 상황
  2. 💋 문제 해결
  3. ✔ @Qualifier 어노테이션 이용해서 구분할 수 있다
  4. ✔ @Primary 어노테이션을 이용해 우선적으로 사용할 빈을 지정할 수 있다.
  5. ✔ @Resource 어노테이션을 이용하여 빈의 이름으로 주입할 수 있다.
반응형
 

💋 문제 상황

 

 

요약: 같은 인터페이스를 구현한 스프링 Bean이 두 개 이상일 때, 어떻게 구분해서 의존성을 주입할 수 있을까?

인터페이스 구현한 두 가지 클래스를 빈으로 등록해서 사용하고 있는 상황...!

 

 

 

내가 사용하고 싶은 @Service 어노테이션이 붙은 클래스에서 자동으로 GameDao를 주입해주고 싶다.
그런데!

 

 

@Service
public final class GameService {
    private final GameDao gameDao;

    public GameService(final GameDao gameDao) {
        this.gameDao = gameDao;
    }
}

 

 

나는 지금 DbGameDao가 스프링 DI 프레임워크를 통해서 주입되었으면 좋겠는데, 스프링은 DbGameDao와 ConsoleGameDao 둘 중 어떤 것을 주입해야 할지 모르겠다고 한다...!

 

 

💋 문제 해결

 

✔ @Qualifier 어노테이션 이용해서 구분할 수 있다

 

 

@Qualifier 어노테이션을 붙여서 구분할 수 있다!

 

@Repository("dbGameDao")
public class DbGameDao implements GameDao {
    // ...
}

@Repository("consoleGameDao")
public class ConsoleGameDao implements GameDao {
    // ...
}

 

이렇게 @Repository에 이름을 설정해주고, 동일한 이름으로 GameService에서 구분할 수 있도록 @Qualifier를 넣어준다.

 

또 의존성 주입 시에 Bean의 이름을 같이 지정해서 어떤 빈을 주입할 지 명시할 수 있다.

 

@Service
public class GameService {

    private final GameDao dbGameDao;
    private final GameDao consoleGameDao;

    public GameService(@Qualifier("dbGameDao") GameDao dbGameDao, 
                       @Qualifier("consoleGameDao") GameDao consoleGameDao) {
        this.dbGameDao = dbGameDao;
        this.consoleGameDao = consoleGameDao;
    }

    // ...
}

 

 

✔ @Primary 어노테이션을 이용해 우선적으로 사용할 빈을 지정할 수 있다.

 

@Repository
@Primary // 우선적으로 사용할 빈 지정!
public class DbGameDao implements GameDao {
    // ...
}

@Repository
public class ConsoleGameDao implements GameDao {
    // ...
}

@Service
public class GameService {
    private GameDao gameDao;

    public GameService(GameDao gameDao) {
        this.gameDao = gameDao;
    }

    // ...
}

 

GameService 클래스에서 GameDao 타입의 의존성 주입 시, 자동으로 @Primary 어노테이션이 붙은 DbGameDao 객체가 주입된다.

 

 

✔ @Resource 어노테이션을 이용하여 빈의 이름으로 주입할 수 있다.

 

 

@Repository
public class DbGameDao implements GameDao {
    // ...
}

@Repository
public class ConsoleGameDao implements GameDao {
    // ...
}

@Service
public class GameService {
    private GameDao gameDao;

    public void setGameDao(@Resource(name="dbGameDao") GameDao gameDao) { // 이름 지정!
        this.gameDao = gameDao;
    }

    // ...
}

 

 

@Resource 어노테이션을 사용해서 빈의 이름을 딱 찝어서 지정해줄 수 있다.
스프링은 dbGameDao라는 이름을 가진 빈을 찾게 된다.

 

 

[개인적 궁금증] @Resource 어노테이션의 name 속성은 어떻게 정해지는걸까?

 

기본적으로 스프링 빈 이름은 클래스 이름의 첫 글자를 소문자로 바꾼 이름이다. 예) DbGameDao 클래스 -> dbGameDao 이름

 

@Component, @Service, @Repository와 같은 스프링 어노테이션을 사용하여 빈을 등록할 때는, 해당 어노테이션의 value 속성을 이용하여 빈의 이름을 지정할 수 있다.

 

예를 들어, @Repository("myGameDao")와 같이 어노테이션을 사용하면 빈의 이름을 myGameDao로 지정할 수 있다.

반응형
저작자표시 비영리 변경금지

'Spring' 카테고리의 다른 글

[Spring/DB] 데이터베이스에 더미 데이터 추가하는 4가지 방법: data.sql, @PostConstruct, @EventListener(ApplicationReadyEvent.class), @ApplicationRunner  (4) 2023.04.28
[Spring] Spring MVC(5): Configuration (View Controller, View Resolver)  (2) 2023.04.24
[Spring] Spring JDBC(4): SimpleJdbcInsert로 DB에 데이터를 추가해보자!  (0) 2023.04.22
[Spring] 레이어드 아키텍처(Layered Architecture): 독립적으로 계층을 설계해보자!  (0) 2023.04.21
[Spring] Spring JDBC(3): NamedParameterJdbcTemplate를 사용해보자! SqlParameterSource, MapSqlParameterSource, BeanPropertySqlParameterSource  (0) 2023.04.21
  1. 💋 문제 상황
  2. 💋 문제 해결
  3. ✔ @Qualifier 어노테이션 이용해서 구분할 수 있다
  4. ✔ @Primary 어노테이션을 이용해 우선적으로 사용할 빈을 지정할 수 있다.
  5. ✔ @Resource 어노테이션을 이용하여 빈의 이름으로 주입할 수 있다.
'Spring' 카테고리의 다른 글
  • [Spring/DB] 데이터베이스에 더미 데이터 추가하는 4가지 방법: data.sql, @PostConstruct, @EventListener(ApplicationReadyEvent.class), @ApplicationRunner
  • [Spring] Spring MVC(5): Configuration (View Controller, View Resolver)
  • [Spring] Spring JDBC(4): SimpleJdbcInsert로 DB에 데이터를 추가해보자!
  • [Spring] 레이어드 아키텍처(Layered Architecture): 독립적으로 계층을 설계해보자!
깃짱
깃짱
연새데학교 컴퓨터과학과 & 우아한테크코스 5기 백엔드 스타라이토 깃짱
깃짱코딩연새데학교 컴퓨터과학과 & 우아한테크코스 5기 백엔드 스타라이토 깃짱
반응형
깃짱
깃짱코딩
깃짱
전체
오늘
어제
  • 분류 전체보기
    • About. 깃짱
    • Weekly Momentum
      • 2024
    • PROJECT
      • AIGOYA LABS
      • Stamp Crush
      • Sunny Braille
    • 우아한테크코스5기
    • 회고+후기
    • Computer Science
      • Operating System
      • Computer Architecture
      • Network
      • Data Structure
      • Database
      • Algorithm
      • Automata
      • Data Privacy
      • ETC
    • WEB
      • HTTP
      • Application
    • C, C++
    • JAVA
    • Spring
      • JPA
      • MVC
    • AI
    • MySQL
    • PostgreSQL
    • DevOps
      • AWS
      • 대규모 시스템 설계
    • frontend
      • HTML+CSS
    • NextJS
    • TEST
    • Industrial Engineering
    • Soft Skill
    • TIL
      • 2023
      • 2024
    • Linux
    • Git
    • IntelliJ
    • ETC
      • 日本語

블로그 메뉴

  • 홈
  • 깃허브

인기 글

최근 글

태그

  • 람다와스트림
  • 레벨로그
  • 예외
  • 스트림
  • 상속
  • Composition
  • 상속과조합
  • Java
  • OOP
  • 우아한테크코스
  • 우아한테크코스5기
  • 조합
  • 람다
  • Stream
  • 함수형프로그래밍
  • 우테코
  • 우테코5기
  • lamda
  • 컴포지션
  • TDD
hELLO · Designed By 정상우.v4.2.0
깃짱
[Spring] 같은 인터페이스를 구현한 빈을 구분하여 의존성 주입하는 방법: @Qualifier, @Primary, @Resource
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.