| Title | HTTP Method | Mapping URL | Method Name | Request Param | Response Type | | --- | --- | --- | --- | --- | --- | | 데이터 조회 & 캐시 조회 | GET | /{path} | getDataReadCache | @PathVariable String path, @RequestParam String queryString | Response | | 데이터 조회/생성 & 캐시 조회 | POST | /{path} | postDataReadCache | @PathVariable String path, @RequestParam String queryString, @RequestBody RequestBodyDto body | Response | | 데이터 삭제 & 캐시 갱신 | DELETE | /{path} | deleteDataRefreshCache | @PathVariable String path, @RequestParam String queryString, @RequestBody RequestBodyDto body | Response | | 데이터 수정 & 캐시 갱신 | PUT | /{path} | updateDataRefreshCache | @PathVariable String path, @RequestParam String queryString, @RequestBody RequestBodyDto body | Response |

IUserCacheControllerV1.java

<aside> 💡 일반적인 요청에 대한 내용이 캐시 컨트롤러라는 이름으로 관리되고 있습니다. 일단 cacheControllr니까 cache에 대한 부분도 메서드에 추가했습니다만, 나중에 개선할 때에는 이러한 부분을 신경쓰면 좋을 듯!

</aside>

package com.sinor.cache.cache.controller;

import org.springframework.web.bind.annotation.*;

// <https://www.baeldung.com/jackson-mapping-dynamic-object#using-jsonanysetter>
// 어떤 형태로 요청이 들어오든 json 타입이라는 가정만 있으면 모두 Map<String, Object> 형식으로 저장 가능하다고 생각
// 기술적인 부분은 시간이 없어서 검증을 못했고, 일단 모든 Dto를 구분하는 기존 방식으로 작성

/**
 * 각 API domainPath에 해당하는 내용을 정적으로 구현
 *
 * @param <Response>
 * @param <RequestBodyDto>
 */
@RestController
public interface IUserCacheControllerV1<Response, RequestBodyDto> {
    /**
     * 데이터 조회 및 캐시 조회
     *
     * @apiNote <a href="<https://www.baeldung.com/spring-request-response-body#@requestbody>">reference</a>
     * @param path 요청에 전달된 path
     * @param queryString 요청에 전달된 queryString
     */
    @GetMapping("/{path}")
    @ResponseBody
    Response getDataReadCache(@PathVariable String path, @RequestParam String queryString);

    /**
     * 데이터 조회 또는 생성 및 캐시 조회
     *
     * @apiNote <a href="<https://www.baeldung.com/spring-request-response-body#@requestbody>">reference</a>
     * @param path 요청에 전달된 path
     * @param queryString 요청에 전달된 queryString
     * @param body 요청에 전달된 RequestBody 내용에 매핑된 RequestBodyDto 객체
     */
    @PostMapping("/{path}")
    @ResponseBody
    Response postDataReadCache(@PathVariable String path, @RequestParam String queryString, @RequestBody RequestBodyDto body);

    /**
     * 데이터 삭제 및 캐시 갱신
     *
     * @apiNote <a href="<https://www.baeldung.com/spring-request-response-body#@requestbody>">reference</a>
     * @param path 요청에 전달된 path
     * @param queryString 요청에 전달된 queryString
     * @param body 요청에 전달된 RequestBody 내용에 매핑된 RequestBodyDto 객체
     */
    @DeleteMapping("/{path}")
    @ResponseBody
    Response deleteDataRefreshCache(@PathVariable String path, @RequestParam String queryString, @RequestBody RequestBodyDto body);

    /**
     * 데이터 수정 및 캐시 갱신
     *
     * @apiNote <a href="<https://www.baeldung.com/spring-request-response-body#@requestbody>">reference</a>
     * @param path 요청에 전달된 path
     * @param queryString 요청에 전달된 queryString
     * @param body 요청에 전달된 RequestBody 내용에 매핑된 RequestBodyDto 객체
     */
    @PutMapping("/{path}")
    @ResponseBody
    Response updateDataRefreshCache(@PathVariable String path, @RequestParam String queryString, @RequestBody RequestBodyDto body);
}