오늘은 동적으로 기능을 활성화하는 방법 중 하나인 Feature Flag에 대해서 다뤄보려고 합니다.
"딥하게 들어가기 전, 개념부터 잡아보자!" 방식으로, 개념을 잡고 가는 포스팅이 되겠습니다..!!
Feature Flag란?
Feature Flag는 애플리케이션 내에서 특정 기능의 활성화 여부를 동적으로 제어할 수 있는 기술입니다.
코드를 배포한 후에도 이를 활용해서 특정 기능을 켜거나 끌 수 있습니다.
그로 인해 새로운 기능을 단계적으로 배포하거나 특정 상황에서 기능을 비활성화하는 데 유용하게 사용되곤 합니다.
주요 활용 사례 예시
1. 점진적 릴리스 : 새로운 기능을 단계적으로 배포해 안정성을 검증
-> 새로운 UI/UX 디자인 적용
-> 모바일 앱에서의 새로운 기능 활성화
2. A/B 테스트 : 사용자 그룹에 따라 다른 기능을 제공하여 효율성을 평가
-> 쇼핑몰의 장바구니 디자인 A와 B의 클릭률 비교
-> 검색 알고리즘 A와 B의 결과 비교
3. 롤백 : 문제가 발생한 기능을 즉시 비활성화하여 사용자 영향을 최소화
-> 새로운 결제 시스템 오류
-> 서버 과부화를 유발하는 실험적 기능
4. 사용자별 맞춤 기능 : 특정 사용자 또는 그룹에게만 기능 제공
-> 프리미엄 사용자에게 고급 기능 제공
-> 특정 지역 사용자에게만 지역화된 서비스 제공
5. API 버전 관리 : 새로운 API 버전 출시 전 호환성 검증
-> 기존 클라이언트는 V1을 사용하고, 새로운 클라이언트는 V2를 사용
Feature Flag를 사용할 때 주의할 점
결국 많은 플래그가 추가되면 코드와 설정 관리가 복잡해질 수 있습니다. 그래서 복잡성 증가를 방지하기 위해 주기적으로 정리해줘야 합니다.
그리고 더 이상 사용하지 않는 플래그와 코드는 빠르게 제거하고, 플래그에 따라 달라지는 코드가 예상치 못한 문제를 발생시킬 수 있으므로 다양한 관점에서의 테스트가 필요합니다.
Spring Boot 프로젝트에서 간단하게 활용해 보기
1. 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
2. 설정 파일 작성
application.yml 파일에서 사용자별로 Feature Flag를 정의합니다.
feature-flag:
post:
enabled-users:
- user1@example.com
- user2@example.com
3. Feature Flag Config
@Component
@ConfigurationProperties(prefix = "feature-flag.post")
public class FeatureFlagConfig {
private List<String> enabledUsers;
public List<String> getEnabledUsers() {
return enabledUsers;
}
public void setEnabledUsers(List<String> enabledUsers) {
this.enabledUsers = enabledUsers;
}
public boolean isPostFeatureEnabled(String userEmail) {
return enabledUsers.contains(userEmail);
}
}
4. PostService
@Service
public class PostService {
public String createPost(String content) {
// 간단한 게시글 생성 로직
return "게시글이 성공적으로 생성되었습니다: " + content;
}
}
5. PostController
@RestController
@RequestMapping("/post")
public class PostController {
private final FeatureFlagConfig featureFlagConfig;
private final PostService postService;
public PostController(FeatureFlagConfig featureFlagConfig, PostService postService) {
this.featureFlagConfig = featureFlagConfig;
this.postService = postService;
}
@PostMapping
public ResponseEntity<String> createPost(@RequestParam String userEmail, @RequestParam String content) {
if (featureFlagConfig.isPostFeatureEnabled(userEmail)) {
String response = postService.createPost(content);
return ResponseEntity.ok(response);
} else {
return ResponseEntity
.status(HttpStatus.FORBIDDEN)
.body("게시글 포스팅 기능이 활성화되지 않았습니다.");
}
}
}
6. 테스트
- application.yml에서 enabled-users에 명시하지 않은 user일 경우
- enabled-users에 명시한 user일 경우
개념을 잡기 위해 간단하게 예시를 통해 Feature Flag에 대해서 알아봤습니다.
개발 속도와 안정성을 모두 잡을 수 있는 강력한 도구임을 알 수 있었고, 특히 Spring Boot와 같이 유연한 프레임워크와 결합하면 손쉽게 구현할 수 있다는 점도 알 수 있었습니다.
Feature Flag에 대해서 더 자세하게 공부한 후, 프로젝트에서 더 활용할 수 있는 강력한 부분에 대해서 알아보고 추후 다뤄보겠습니다.
틀린 부분이 있다면 주저 없이 지적해 주시면 감사하겠습니다😊
'Spring' 카테고리의 다른 글
Spring Batch Application 배포 및 Crontab 설정 (0) | 2025.01.13 |
---|---|
Spring Batch (0) | 2024.09.22 |
Spring Batch - Scheduler (1) | 2024.09.16 |
Spring Batch란? (1) | 2024.09.09 |
Spring Boot 회원가입 - 이메일(SMTP) 인증 구현하기 (0) | 2024.07.28 |