-
Notifications
You must be signed in to change notification settings - Fork 1
[의사결정] Device ID 발급 위치 전략 결정 #92
Copy link
Copy link
Open
Labels
의사결정Good for newcomersGood for newcomers
Description
Device ID 발급 위치 재검토
현재 구현된 Device ID 발급 방식에 대해 팀원들과 논의하고 싶습니다.
현재 구현 방식
Device ID 발급 로직을 Filter에 배치했습니다.
모든 요청 → DeviceIdCookieFilter → deviceId 쿠키 확인
├── 쿠키 있음 → request attribute 설정 → 통과
└── 쿠키 없음 → UUID 생성 → Set-Cookie → request attribute 설정 → 통과
문제 제기
Filter는 모든 요청에 공통으로 적용되는 횡단 관심사를 처리하는 계층입니다.
그런데 Device ID는 좋아요 기능에서만 필요한 식별자입니다.
- 랭킹 조회, 부스 목록 조회, 공지사항 조회 등 Device ID와 무관한 요청에서도 쿠키 발급 로직이 실행되고 있음
- 횡단 관심사(IP 추출, CORS, 인증)와 성격이 다름
- 좋아요라는 특정 비즈니스 기능을 위한 식별자를 모든 요청에서 처리하는 것은 책임 과잉
선택지 비교
| 위치 | 설명 | 적합 여부 | 이유 |
|---|---|---|---|
| Filter 전체 경로 (현재) | 모든 요청에서 쿠키 발급 | 부적합 | 좋아요와 무관한 요청에도 실행 |
| [A] Filter 경로 한정 | /api/v1/booths/*/likes에만 Filter 적용 |
적합 | 필요한 경로에서만 실행, 책임 분리 유지 |
| [B] Controller 엔드포인트 | GET /api/v1/device-id 프론트 호출 |
부적합 | 불필요한 HTTP 왕복, 프론트 초기 호출 의존 |
| [C] Controller 직접 처리 | 좋아요 Controller에서 쿠키 읽고 없으면 발급 | 부적합 | Controller가 쿠키 발급 책임까지 가져 SRP 위반 |
선택지 상세
[A] FilterRegistrationBean으로 경로 한정
Filter는 유지하되 /api/v1/booths/*/likes 경로에만 적용
@Bean
public FilterRegistrationBean<DeviceIdCookieFilter> deviceIdFilter(DeviceIdCookieFilter filter) {
FilterRegistrationBean<DeviceIdCookieFilter> bean = new FilterRegistrationBean<>(filter);
bean.addUrlPatterns("/api/v1/booths/*/likes");
return bean;
}| 장점 | 단점 |
|---|---|
| 필요한 경로에서만 실행 | 경로 패턴 관리 필요 |
| 프론트 초기 호출 불필요 | |
| Filter 계층으로 책임 분리 유지 |
[B] 기존 Controller 엔드포인트 방식
GET /api/v1/device-id 엔드포인트를 두고 프론트가 앱 진입 시 호출
| 장점 | 단점 |
|---|---|
| 명시적, 필요할 때만 실행 | 프론트 초기 호출 의존 |
| 불필요한 HTTP 왕복 |
[C] 좋아요 Controller에서 직접 처리
@PostMapping("/{booth-id}/likes")
public ResponseEntity<ApiResponse<Long>> like(
@PathVariable Long boothId,
@ClientIp String clientIp,
HttpServletRequest request,
HttpServletResponse response
) {
String deviceId = resolveOrIssueDeviceId(request, response);
...
}| 장점 | 단점 |
|---|---|
| 좋아요 요청에만 정확히 적용 | Controller가 쿠키 발급 책임까지 가짐 (SRP 위반) |
| 경로 패턴 관리 불필요 | HttpServletRequest/Response 직접 주입 |
내 의견
[A] FilterRegistrationBean으로 경로 한정이 효율적이라고 생각합니다.
- Device ID가 필요한 경로에서만 발급 로직 실행 → 책임 범위 명확
- 프론트 초기 호출 불필요 → 연동 단순화 유지
- Filter 계층 유지 → DispatcherServlet 이전 처리로 Controller 책임 분리
- DispatcherServlet 이후로 안넘어 가기 때문에 빠른 Response Time 제공
- [C] 대비 Controller가 쿠키 처리를 몰라도 됨
팀원분들 의견 부탁드립니다.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
의사결정Good for newcomersGood for newcomers