본문 바로가기
Projects/청하-청년을 위한 커뮤니티 서비스

[청하] 21. Android 강제 업데이트 버전 설정 기능 구현

by Lpromotion 2024. 10. 16.

강제 업데이트 검사 기능에 이어 “ADMIN” 권한을 가진 사용자만 요청할 수 있는 버전 설정 기능을 추가했다. 관리자가 강제 업데이트 버전 설정이 필요할 때 실행할 수 있다.

 

1. 프로젝트 구조

src/main/java/com/example/withpeace/
│
├── config/                 # 설정 관련 클래스
│   └── SecurityConfig.java # Spring Security 설정
│
├── domain/                 # 도메인 모델 (엔티티)
│   └── AppVersion.java     # 앱 버전 엔티티
│
├── repository/                    # 데이터 접근 계층
│   └── AppVersionRepository.java  # 앱 버전 레포지토리
│
│
├── controller/             # 컨트롤러 계층
│   └── App.java            # 앱 관련 API 엔드포인트
│
└── service/                # 비즈니스 로직 계층
    └── AppService.java     # 앱 관련 비즈니스 로직

 

2. Spring Security 설정 파일 구현

SecurityConfig

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
    // ... (기존 설정 생략)
    
    @Bean
    protected SecurityFilterChain securityFilterChain(final HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                .csrf(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .sessionManagement((sessionManagement) ->
                        sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(requestMatcherRegistry -> requestMatcherRegistry
                        // ... (다른 경로 생략)
                        .requestMatchers("/api/v1/app/setForceUpdateVersion/android").hasAnyRole(ERole.ADMIN.toString())
                        .anyRequest().authenticated())

                // ... (기존 설정 생략)
    }
}
.requestMatchers("/api/v1/app/setForceUpdateVersion/android").hasAnyRole(ERole.ADMIN.toString())

`/api/v1/app/setForceUpdateVersion/android` 엔드포인트에 대한 접근을 `ADMIN` 역할을 가진 사용자로 제한한다.

관리자만 강제 업데이트 버전 설정을 할 수 있도록 설정했다.

 

3. 컨트롤러 구현

@RestController
@RequiredArgsConstructor
@RequestMapping("api/v1/app")
public class AppController {
    // ... (기존 코드 생략)

    // 안드로이드 강제 업데이트 버전 설정
    @PostMapping("/setVersion/android")
    public ResponseDto<?> setAndroidForceUpdateVersion(@UserId Long userId, // 사용자 ID
                                                       @Valid @RequestBody int updateVersion // 설정할 버전
                                                       ) {
        int updatedVersion = appService.setAndroidForceUpdateVersion(userId, updateVersion);
        return ResponseDto.ok(updatedVersion);
    }
}

인증된 사용자 ID와 설정할 버전 정보를 받아 서비스로 전달한다.

`updateVersion`(설정할 버전)은 POST 요청에서 데이터 변경 작업의 내용을 body에 포함하는 것이 일반적이기 때문에 `@RequestBody` 를 사용했다.

 

4. 서비스 구현

@Service
@RequiredArgsConstructor
public class AppService {

    private final UserRepository userRepository;
    private final AppVersionRepository appVersionRepository;

    private int androidForceUpdateVersion;
    
    // ... (기존 코드 생략)

    @Transactional
    public int setAndroidForceUpdateVersion(Long userId, int updateVersion) {
        // 사용자 존재 여부 확인
        userRepository.findById(userId).orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_USER));

        try {
            // AppVersion 엔티티를 가져옴
            AppVersion appVersion = appVersionRepository.findFirstByOrderByIdAsc();
            if (appVersion != null) {
                // 기존 레코드의 버전 정보를 업데이트
                appVersion.setAndroidForceUpdateVersion(updateVersion);
                appVersionRepository.save(appVersion);
                // 업데이트된 버전 정보를 androidForceUpdateVersion에 저장
                androidForceUpdateVersion = updateVersion;
            } else {
                throw new CommonException(ErrorCode.NOT_FOUND_APP_VERSION);
            }
            return androidForceUpdateVersion;
        } catch (Exception e) {
            throw new CommonException(ErrorCode.SERVER_ERROR);
        }
    }
}
  1. 사용자를 조회한다. (존재 여부 확인)
  2. `findFirstByOrderByIdAsc()`를 통해 최신 강제 업데이트 정보를 가져온다.
  3. AppVersion 엔티티가 존재할 경우 버전 정보를 업데이트하고, `androidForceUpdateVersion` 클래스 변수에 저장한다.
  4. AppVersion 엔티티가 존재하지 않는 경우 예외를 발생시킨다.

`@Transactional` 어노테이션을 통해 변경사항이 자동으로 저장되기 때문에 `save` 메서드 호출이 불필요하다. 이후 리팩토링 때 수행할 것이다.

 

5. API 응답 예시

요청 URL

[POST] http://cheongha.site/api/v1/app/setVersion/android

 

Response Body

{
  "data": int, // 설정된 버전
  "error": null
}
반응형

댓글