본문 바로가기
[IT]/SpringBoot

[Data JPA & Query DSL] Repository의 구현클래스 선정 규칙

by dop 2021. 4. 3.

@Autowired 의존성 주입

프로젝트 리팩토링을 하던 중, 한 가지 의문이 생겼다. 

    @Autowired
    UserRepository userRepository;

Controller나 Test 클래스에서 위와 같이 @Autowired 어노테이션으로 의존성을 주입받는다. 따라서 정확히 어떤 구현 클래스가 주입되는지 알 수 없다.

 

그렇다면, 인터페이스인 UserRepository가 Custom 인터페이스를 상속받고, Custom 인터페이스를 구현하는 클래스를 여러 개 생성하면, 어떤 클래스로 주입될까?

Example 

UserRepositoryImpl클래스는 Custom인터페이스의 진짜 구현클래스고, ExampleImpl 클래스 역시 Custom인테페이스를 구현하지만 내부 구현 내용이 비어있는 깡통 클래스이다. 

이 상황에서 UserRepository는 어떤 클래스로 의존성을 주입받는지 실험해보았다.

 

 

결과가 잘 나온다!

Postman으로 요청결과 RepositoryImpl 클래스의 메소드가 호출되어 정상적으로 결과가 반환되었다. 왜 Example 클래스가 아닌 Impl 클래스의 메소드가 호출되었을까? 선택하는 규칙이 있을 것 같았고, ExampleImpl 클래스를 UserRepositoryCustomImpl로 변경한 후에 요청해보니 다음과 같이 텅빈 결과를 반환받았다.

결과가 텅 비었다!

정확하진 않지만 인터페이스와 클래스명 사이의 유사도(?)를 기반으로 설정해 주는 것 같다. 물론 Custom인터페이스를 서로 다른 두 클래스에서 구현하는 일이 발생할지는 모르겠지만, 이런 방식으로 매핑되는걸 보니 클래스나 인터페이스를 생성할 때, 번거롭더라도 정확한 명칭으로 할 필요성을 느꼈고, 정확히 어떤 과정으로 의존성이 주입되는지 알아볼 필요성을 느꼈다.

 

 

ps. 그리고, Example클래스는 삭제하고 다음과 같이 변경했다.

 

728x90