강제 업데이트 검사 기능에 이어 “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);
}
}
}
- 사용자를 조회한다. (존재 여부 확인)
- `findFirstByOrderByIdAsc()`를 통해 최신 강제 업데이트 정보를 가져온다.
- AppVersion 엔티티가 존재할 경우 버전 정보를 업데이트하고, `androidForceUpdateVersion` 클래스 변수에 저장한다.
- AppVersion 엔티티가 존재하지 않는 경우 예외를 발생시킨다.
`@Transactional` 어노테이션을 통해 변경사항이 자동으로 저장되기 때문에 `save` 메서드 호출이 불필요하다. 이후 리팩토링 때 수행할 것이다.
5. API 응답 예시
요청 URL
[POST] http://cheongha.site/api/v1/app/setVersion/android
Response Body
{
"data": int, // 설정된 버전
"error": null
}
반응형
'Projects > 청하-청년을 위한 커뮤니티 서비스' 카테고리의 다른 글
[청하] 23. 게시글 삭제 기능 - 외래키 제약 조건 수정 (2) | 2024.10.16 |
---|---|
[청하] 22. Android 강제 업데이트 검사 기능 - JWT 인증 필터에서 제외 (2) | 2024.10.16 |
[청하] 20. Android 강제 업데이트 검사 기능 구현 (0) | 2024.10.15 |
[청하] 19. 인앱 업데이트 테크 스팩 작성 (2) | 2024.10.15 |
[청하] 18. 댓글 신고 기능 구현 (1) | 2024.10.15 |
댓글