설정 값
프로젝트를 진행하다보면 설정 값이 필요합니다. 프로젝트에서 사용하는 설정 값들의 예시는 다음과 같습니다.
- 데이터베이스 설정
- 서버 설정
- 보안 설정
- 로깅 설정
- 메일 설정
- API 키 및 외부 서비스 연동
- 페이지네이션 등등...
이러한 설정 값은 Java 소스 코드가 아닌 설정 파일에서 따로 관리하면 얻는 이점이 있습니다.
설정 파일로 설정 값을 관리하는 이유
설정 값을 자바 코드에서 분리하여 application.properties나 application.yml 파일로 관리하면 다음과 같은 장점이 있습니다.
- 관리와 보안이 좋아집니다. 설정 정보를 한 곳에 관리하여 유지 보수가 좋아지고 민감한 정보(비밀번호, API 키 등)가 소스코드에서 분리되어 보안이 강화됩니다.
- 유연성과 확장성이 좋아집니다. 개발, 테스트, 운영 등 다양한 환경에 따라 서로 다른 설정 파일을 사용할 수 있습니다. 또한 애플리케이션을 재배포 하지 않아도 설정을 변경할 수 있습니다.
설정 값 사용하기
application.yml 이나 application.properties에 설정 값을 저장하고 spring boot에 가져와 사용합니다.
이때 @Value, @ConfigurationProperties 두 가지 방법으로 spring boot와 가져올 수 있습니다.
@Value는 필드에 직접 주입하는 방식이고 @ConfigurationProperties는 클래스 파일을 만들어 클래스 필드에 설정 값을 주입하는 방식입니다. 각 방식의 주로 사용하는 상황과 특징은 다음과 같습니다.
@Value
- 개별적인 값 하나를 주입할 때 사용합니다.
- 간단하게 특정 키의 값을 불러올 때 유용하지만 타입 변환이나 복잡한 객체 구조를 다루기에는 한계가 있습니다.
@ConfigurationProperties
- 한 묶음으로 관련 있는 설정들을 자바 객체로 쉽게 바인딩 할 수 있습니다.
- 타입 안정성을 제공하고, 복잡한 자료 구조를 쉽게 매핑해주며, 계층적인 프로퍼티 관리에 용이합니다.
실무에서는 설정 데이터의 구조가 복잡하거나 여러 설정 값들이 연관된 경우가 많아 @ConfigurationProperties를 사용하는 경우가 더 많다고 합니다. 또한 유지 보수가 좋고 깔끔한 코드를 만들 수 있다는 측면에서도 @ConfigurationProperties가 효율적이라 합니다.
각자의 프로젝트 상황에 맞춰 선택하면 될 거 같습니다. 저는 application.yml과 @ConfigurationProperties를 사용했습니다.
참고로 @Value는 이렇게 사용합니다.
@Value("${app.name}")
private String appName
설정 값 사용하기 구현
순서는 다음과 같습니다.
- application.yml 파일에 설정 값 생성
- @ConfigurationProperties를 적용한 파일에 설정 값 받기
- 애플리케이션 코드 적용
저는 pagination에서 pageSize 설정 값을 생성하고 적용해 보겠습니다.
application.yml 파일에 설정 값 생성
# page setting
app:
pagination:
pageSize: 10
@ConfigurationProperties를 적용한 파일에 설정 값 받기
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "app.pagination")
@Data
public class PaginationConfig {
private Integer pageSize;
}
@ConfigurationProperties 어노테이션을 설정하고 prefix를 통해 가져오고 싶은 설정 값 묶음을 선택합니다.
@Data 롬복 어노테이션으로 Getter와 Setter를 자동으로 생성합니다.
애플리케이션 코드 적용
@Service
@RequiredArgsConstructor
@Transactional
public class ItemService {
// @RequiredArgsConstructor 어노테이션으로 자동 주입
private final PaginationConfig paginationConfig;
public List<ItemListDto> getItemsByLatest(int offset) throws SQLException {
return itemMapper.getItemsByLatest(paginationConfig.getPageSize(), offset);
}
}
PaginationConfig를 주입한 이후 getter를 사용해 설정 값을 사용합니다.