식별
OAuth나 S3를 도입 후 통합 테스트에서 아래와 같은 NoSuchBeanDefinitionException예외가 발생했습니다.

분석 및 개선방향
테스트 코드에서 S3Uploader와 OAuth를 사용하지 않는데 S3 설정을 하지 않았다고 빈 생성이 불가능했고 이를 해결하기 위해 불필요한 의존성 주입이 필요해 문제가 발생했습니다. 하지만 S3Uploader나 OAuth를 사용하는 테스트는 한정적이었고 다른 테스트 코드에는 의존성 주입이 불필요 하다고 판단되었습니다.
저는 이러한 문제를 해결하기 위해서 환경별로 유연하게 Bean을 등록하거나 등록하지 않을 수 있다면 이 문제를 해결할 수 있을 것이라고 판단했습니다.
해결
첫번째 방법은 @MockBean으로 의존 객체를 모킹하는 방법입니다.
저는 다음과 같이 의존 객체를 모킹해 빈 껍데기를 주입시켰습니다.

단점은 모든 통합 테스트마다 이러한 @MockBean 설정을 해줘야한다는 것 입니다. 이것에 대해서 떠오른 해결책은 별도의 BaseTest Class를 만들고 그곳에 MockBean을 선언해 모든 통합 테스트 코드에서 해당 클래스를 상속받도록 하면 비교적 깔끔해 질 수 있을 것 같습니다.
두번째 방법은 다음은 OAuth를 도입 후 또 다시 발생해 고안해낸 해결책인데요,
@Profile 어노테이션과 Optional을 이용한 방법입니다.
이것 역시 OAuth 관련 설정을 테스트 모듈에서 해주지 않았기 때문에 발생하는 문제인데요. 저는 OAuth Bean을 Profile에 따라 선택적으로 주입받고 싶었습니다.
예를들어, local, dev profile에서는 OAuthBean을 생성 및 주입 받고, test profile에서는 생성하지도, 주입받지도 않게 하고 싶었습니다. 그러면 위 상황처럼 MockBean을 설정할 필요도 없습니다.
이를 위해서는 일단 WebSecurityConfig에서 설정들을 profile별로 옵셔널하게 추가하고자 합니다.
아래 사진을 자세하게 보면 각 설정들이 XXConfigurer로 이루어진 것을 확인할 수 있습니다.
이것을 보고 각각의 설정을 떼어낼수 있으며 별도의 Bean으로 등록할 수 있어보였습니다.

여기서 OAuth 설정만 분리하고 Bean으로 등록해 @Profile 어노테이션을 통해 특정 profile에서만 빈 등록을 할 수 있도록 만들면 됩니다.
OAuth 설정은 위의 그림에 나와있듯이 OAuth2LoginConfigurer로 이루어져 있습니다. 이걸 떼어내어 다음과 같이 별도의 설정파일로 옮길 수 있습니다.

그리고 이 설정클래스를 Optional하게 주입받기 위해 다음과 같이 Optional을 이용해 주입받았습니다.
이렇게 주입을 받으면 빈이 있다면 주입이될 것이고 아니라면 empty 상태로 남을 것 입니다.

그리고 isPresent()를 통해 빈이 있다면 설정 정보를 추가한다는 의미로 다음과 같이 코드를 작성합니다.

이렇게 해서 메인 모듈의 WebSecurity 설정을 그대로 가져가 일관성있는 설정을 유지한 채 원하는 profile마다 설정을 자유롭게 할 수 있게 됐습니다.
OAuth에 대한 테스트를 하기 위해서는 다음과 같이 @ActiveProfiles 어노테이션과 별도의 test profile을 만들어 OAuth 설정을 해주고 테스트를 작성한다면, 다른 테스트에 영향을 주지 않고 선택적 설정, 빈 주입을 통해 원활한 테스트가 가능할 듯 합니다.


