BackEnd/spring

[Spring] bean이 없는 경우 허용하도록 처리

하용권 2025. 5. 1. 19:01

글로벌 프로젝트를 진행하고 있고, 나라마다 법률이 다릅니다.

 

나라마다 개인 정보를 저장하기 위해서 필요한 정보가 다르고 보관 기간이 다릅니다.

국내 서비스 개인 정보를 저장하기 위한 모듈을 만들면서 마주친 문제입니다.

 

 

문제

현재 프로젝트 구조는 헥사고날 구조로 이루어져 있습니다.

 

비즈니스 로직은 나라가 서로 동일하지만, 데이터를 가져오는 방식이 다릅니다. 즉, 나라마다 apdater를 구현하도록 할 수 있습니다.

서비스 제공 사양은 동일하여 controller는 하나로 구현되어 있습니다. 

 

 

그렇다보니 국내 서비스를 위해서 개인 정보 로깅 로직이 들어가면, 다른 나라 서비스에 영향을 줄 수도 있습니다.

이를 해결하기 위해 해당 bean이 있을 경우에만 동작하도록 할 필요가 있었습니다.

 

하지만 spring을 이용하다보면, bean이 없다는 에러를 종종 마주칠 수 있습니다.

bean이 없어도 동작하려면 어떻게 할 수 있을 지 알아보겠습니다.

 

 

해결

알아본 결과 다양한 방법이 있었습니다.

@Nullable, Optional 등이 있었는데, 저는 그 중에서도 Optional를 살펴보겠습니다.

 

 

@Component
@Profile("Korea")
public class KoreaLog {


}

 

한국의 개인 정보 로깅을 위한 bean 입니다. Profile을 이용해서 한국일 경우에만 bean을 생성하도록 할 수 있습니다.

 

 

그리고 모든 나라가 사용하고 있는 controller입니다.

@Controller
@RequiredArgsConstructor
public CustomController {

	private final KoreaLog koreaLog;
    
    
}

이 경우에 다른 나라에서 실행할 경우 빈 주입이 되지 않아 에러가 발생합니다.

 

이를 해결하기 위해서는 Optional을 사용할 수 있습니다.

@Controller
@RequiredArgsConstructor
public CustomController {

	private final Optainl<KoreaLog> koreaLog;
    
    
	@GetMapping("/")
	public ResponseEntity<String> provideInfo() {
    
    	koreaLog.ifPresent(koreaLog -> ....);
    }
    
}

Optional 말고 @Nullable 등 다양한 방법이 있지만, 저는 Optional이 좋아보였습니다.

 

그 이유는 따로 null 검사를 할 필요가 없기 때문입니다.

Optional을 이용한다면, 실수로 다른 나라에 서비스를 하기 위한 코드에서 KoreaLog를 이용하게 되더라도 안전하게 처리할 수 있습니다.

하지만 KoreaLog koreaLog라면, 매번 널 검사를 해야 하는 등의 문제가 있습니다.

반응형