조회 빈이 2개 이상 - 문제
@Autowired 는 타입(Type)으로 조회한다.
타입으로 조회하기 때문에, 마치 아래 코드와 유사하게 동작한다. (실제로는 더 많은 기능을 제공한다.) ac.getBean(DiscountPolicy.class)
* 기존 코드
@Component
public class RateDiscountPolicy implements DiscountPolicy {
}
public class FixDiscountPolicy implements DiscountPolicy{
}
스프링 빈 조회에서 학습했듯이 타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 발생한다.
DiscountPolicy 의 하위 타입인
FixDiscountPolicy , RateDiscountPolicy 둘 다 스프링 빈으로 선언해본다.
@Component
public class RateDiscountPolicy implements DiscountPolicy {
}
@Component
public class FixDiscountPolicy implements DiscountPolicy{
}
FixDiscountPolicy에 @Component를 추가한 후 test를 전부 실행시키면
basicScan()에서 오류가 뜬다. (AutoAppConfigTest)
하나의 빈을 기대했는데 fixDiscountPolicy , rateDiscountPolicy 2개가 발견되었다고 알려준다.
이때 하위 타입으로 지정할 수 도 있지만,
하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어진다.
그리고 이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 해결이 안된다.
스프링 빈을 수동 등록해서 문제를 해결해도 되지만, 의존 관계 자동 주입에서 해결하는 여러 방법이 있다.
프로젝트
1.
@Controller
return 으로 "index" 입력 시 index.html 호출 (view 반환)
@RestController (@Controller + @ResponseBody)
사용 후 return으로 "index" 입력 시 index text가 입력 됨(json 형태로 객체 데이터 반환)
➡️ 위와 같은 이유로 현재 html 호출하는 코드와 아닌 코드로 분리하여 파일을 나눔
2. 회원가입할 때 nickname을 세션에 저장해서 다른 페이지에서도 해당 닉네임 받아올 수 있게 함
* 로그아웃하고도 저장이 되는지 test 시도
로그아웃 후 다른 아이디로 회원가입 진행 후 로그인 진행 → 새로운 닉네임으로 저장 되는 것 확인
참고 : [Spring] @Controller와 @RestController 차이