프로젝트/팀 프로젝트 - MyPill

[개선 작업] @Value → @ConfigurationProperties

호준송 2023. 7. 20. 03:14
728x90
728x90

배경


프로젝트 기간이 끝난 후 서면 피드백을 받았다.

 

발표 직후 받은 피드백을 포함하여 정리한 내용은 다음과 같다.

1. 테스트가 실패했다.
2. @Value 대신 @ConfigurationProperties 사용을 고려해 봐라

 

실제로, 시크릿 키를 담은 “Application-secret.yml”이 없을 때 테스트가 실패했다.

테스트 실패 원인은 @Value 때문이 아니었고, 간단하게 해결했다.

따라서, @ConfigurationProperties에 대해 알아보고 적용했다.

 

 

추가 학습


@Value  VS  @ConfigurationProperties

 

Relaxed Binding

  • @Value는 정확히 일치하게 적어야 해당 값을 매칭할 수 있다.
  • @Configuration은 정확히 일치하지 않아도 특정 규칙을 통해 해당 값을 매칭한다. 
api:
	business-register-number: 'SECRET KEY'
  • 위 .yml 코드에 대해 다음 4가지 규칙이 허용된다.
    api.business-register-number properties, yml 권장 표기법
    api.businessRegisterNumbe 표준 카멜 케이스 문법
    api.business_register_number properties, yml 에서 사용 가능한 표기법
    API_BUSINESS_REGISTER_NUMBER 시스템 환경 변수일 경우 권장 표기법

SpEL

  • SpEL은 꽤 복잡하고 다양하다.
  • 주제와 관련이 거의 없기에 링크로 남긴다.
 

SpEL(Spring Expression Language)에 대해서 간단하게 아라보자!

객체 그래프를 조회하고 조작하는 기능을 제공Unified El과 비슷하지만, 메소드 호출을 지원하며 ,문자열 템플릿 기능도 제공OGNL, MVEL, JBOss EL 등 자바에서 사용할 수 있는 여러 EL이 있지만 SpEL은 모

velog.io

 

 

개선 내역


yml 파일

api:
	business-register-number: 'SECRET KEY'
	nutrient-business-register-number: 'SECRET KEY'

 

기존 코드

  • @Value 사용
@Service
public class CertificationService {

    @Value("${api.business-register-number}")
    private String BUSINESS_SERVICE_KEY;

    @Value("${api.nutrient-business-register-number}")
    private String NUTRIENT_BUSINESS_SERVICE_KEY;

		/*
		나머지 동작 코드
		*/
}

 

수정 후 코드

  • @ConfigurationProperties 적용
@Getter
@Setter
@RequiredArgsConstructor
@Component
@ConfigurationProperties(prefix = "custom.api")
public class CertificateProperties {
	  private String businessRegisterNumber;
		private String nutrientBusinessRegisterNumber;
}
  1. 어노테이션 추가
    • @ConfigurationProperties(prefix = "custom.api")
    • 해당 어노테이션을 사용해도 스프링 빈으로 등록되지 않는다.
  2. 빈 등록
    • 다음 두 가지 방법 중 하나만 사용해도 된다.
      1. 해당 properties 클래스에 @Component 추가
      2. 메인 클래스에 @EnableConfigurationProperties(CertificateProperties.class) 추가
  3. @Getter & @Setter 추가
  4. @RequiredArgsConstructor 추가

 

이후 서비스 단에서 주입받아 사용

@Service
@RequiredArgsConstructor
public class CertificationService {
		private final CertificateProperties certificateProperties;

		/*
		나머지 동작 코드
		*/
}
  1. CertificateProperties 클래스 주입
  2. Getter 사용
    • certificateProperties.getBucketName() 형식으로 값 사용

 

 

참고


Spring, Spring Boot와 Properties ? 외부 설정

https://mangkyu.tistory.com/207

 

 

728x90
728x90