본문 바로가기

Spring boot

Spring 인터페이스의 구현체가 여러 개일 때

반응형

 

package newCar.event_page.jwt;

import newCar.event_page.model.entity.Team;

public interface JwtTokenProvider {

    public String generateToken(String username, boolean isAdmin);

    public Long getUserId(String token); //토큰에서 유저 Id를 추출

    public Team getTeam(String token); //토큰에서 유저 Team을 추출

    public boolean validateToken(String token); //JWT 토큰 유효성 검증

    public boolean validateAdminToken(String token);//JWT 토큰이 admin의 역할을 담고 있는지 검증
}
@Component
@RequiredArgsConstructor
public class UserTokenInterceptor implements HandlerInterceptor {

    private final JwtTokenProvider jwtTokenProvider;
 }

 

 

이런식으로 JwtTokenProvider라는 인터페이스가 존재할 때 , 구현체가 1개라면 당연히 그 구현체를 주입받겠지만, 구현체가 여러개일 때는 어떨까?


만약 JwtTokenProvider 인터페이스를 구현한 클래스가 여러 개 있다면, Spring은 어떤 구현체를 주입할지 결정하지 못해 **NoUniqueBeanDefinitionException**을 발생시킨다.

 

4.1 @Primary 어노테이션 사용

  • 여러 구현체 중 하나에 @Primary 어노테이션을 붙이면 Spring이 기본적으로 그 구현체를 주입합니다.
@Component
@Primary
public class PrimaryJwtTokenProviderImpl implements JwtTokenProvider {
    // 이 구현체가 기본적으로 주입됩니다.
}

4.2 @Qualifier 어노테이션 사용

  • 주입받을 때 특정 구현체를 지정할 수 있습니다.
 
@Component
@RequiredArgsConstructor
public class UserTokenInterceptor implements HandlerInterceptor {

    private final JwtTokenProvider jwtTokenProvider;

    // 생성자 주입 시 @Qualifier 사용
    public UserTokenInterceptor(@Qualifier("specificJwtTokenProviderImpl") JwtTokenProvider jwtTokenProvider) {
        this.jwtTokenProvider = jwtTokenProvider;
    }
}
 

 

 

또는 필드 주입 시:

@Component
public class UserTokenInterceptor implements HandlerInterceptor {

    @Qualifier("specificJwtTokenProviderImpl")
    @Autowired
    private JwtTokenProvider jwtTokenProvider;
}
반응형

'Spring boot' 카테고리의 다른 글

Jmeter 꿀팁  (0) 2024.08.20
Jmeter 사용법!! (Mac OS brew로 설치)  (0) 2024.08.20
JWT 이란?  (0) 2024.08.10
RedisTemplate.opsForValue().decremet()  (0) 2024.08.06
Spring Redis 분산 락 사용법  (0) 2024.08.05