이번에 뉴스 프로젝트를 하게되면서
뉴스 개별페이지 조회시 엔드포인트 하나에
정적인 데이터인 뉴스와 관련 뉴스내용
그리고 동적인데이터로 처리된 조회수 (조회수기반 실시간 인기 뉴스 추출을 위해 redis기반 동적으로구현함)
을 하나의 응답객체 DTO로 묶어서 처리했다.
이러니 문제가생겼는데
뉴스 본문 데이터를 redis를 캐싱하자니 뉴스내용이 너무길어 비효율적이라 판단
CDN캐싱을 진행하려하니 동적인 데이터인 조회수가 묶여있어서
제대로된 캐싱을 할수가 없던것!...
[CDN 캐싱] (이단계에서 데이터를돌려줌)
클라이언트요청 ------> CDN서버 -------> 백엔드서버
처음부터 제대로설계좀 할껄.. 왜 하나로묶었지? 라는 후회와 함께
리팩토링을 진행했다.
조회수(동적데이터)와 뉴스 본문및 상세내용을 별도의 응답 DTO로 분리하고
API호출도 두가지로 분리함
관련해서 많은 코드를 갈아엎었다....
/**
* 뉴스 ID를 기반으로 뉴스 상세 정보를 조회하는 API 엔드포인트입니다.
* <p>
* 1. 뉴스 ID 형식 검증 (KM, DA, KH 접두사 + 숫자)
* 2. 클라이언트 IP 주소 획득
* 3. 조회수 증가 (중복 조회 제외)
* 4. 뉴스 상세 정보 조회 및 응답
*
* @param id 조회할 뉴스의 ID (형식: KM123, DA456, KH789)
* @return 뉴스 상세 정보가 포함된 API 응답
* @throws jakarta.validation.ConstraintViolationException 뉴스 ID 형식이 잘못된 경우
* @author 양병학
* @modified 2025-05-25 양병학
* - 뉴스 ID validation 추가
* @since 2025-05-19 최초 작성
*/
@LogJson
@EntryExitLog
@Override
@GetMapping("/public/news/{id}")
public ResponseEntity<ApiResponse<NewsInfoDetailResponse>> getNewsInfoDetailsByArticleId(
@PathVariable @NewsIdConstraint String id) {
NewsInfoComplete newsInfoComplete = newsInfoDetailProviderUseCase.getNewsInfoDetailByNewsId(id);
return success(toResponse(newsInfoComplete));
}
/**
* 뉴스 ID와 request(카테고리정보, 발행일자) 를 바탕으로 조회수를 받아오는
* 동적데이터 조회 API입니다.
*
* 기존의 조회수 증가 로직 또한 이 API호출에 합쳐져있습니다.
*
* @param id 조회할 뉴스의 ID (형식: KM123, DA456, KH789)
* @param request 조회할 뉴스의 카테고리 정보 및 발행일자 ex: ("category": "economy", "publishDate": "2025-06-08T16:40:00")
* @return 뉴스 ID, 조회수
* @throws jakarta.validation.ConstraintViolationException 뉴스 ID 형식이 잘못된 경우
* @author 양병학
* @since 2025-06-08 최초 작성
*/
@LogJson
@EntryExitLog
@Override
@PostMapping("/public/news/dynamic/{id}")
public ResponseEntity<ApiResponse<NewsInfoDynamic>> getNewsInfoDynamic(
@PathVariable @NewsIdConstraint String id,
@Valid @RequestBody NewsInfoDynamicRequest request) {
NewsInfoDynamic newsInfoDynamic = newsInfoDetailProviderUseCase.getNewsInfoDynamic(
id,
request.category(),
request.publishDate()
);
return success(newsInfoDynamic);
}
내 허술함 덕에 프론트도 수정해야하니..
다음부터는 해당 설계를 고려하고 처음부터 잘만들어야겠다.
'Project' 카테고리의 다른 글
FrontEnd Prettier/Esprint 오류 (0) | 2025.06.16 |
---|---|
[Talkpick] 언론사 RSS 뉴스 데이터 수집 시스템 기능 상세 (2) | 2025.06.08 |
커스텀 어노테이션을 사용한 프로젝트 시나리오별 성능 테스트 (1) | 2025.05.28 |
Spring Cache AOP 문제 트러블슈팅 노트 (0) | 2025.05.27 |
'Youtube 인기영상 분석 및 시각화툴' 프로젝트 사전조사 (4) | 2025.04.14 |