개인 프로젝트 3일차 <Get요청과 @RequestParam>

2024. 11. 20. 17:36TIL

 문제발생

오늘의 할일목록과 이번주의 할일목록은 DB,SERVICE,CONTROLLER에서 따로따로 분리를 해놓았다. 하지만 이번 달의 할일 목록, 이번 년도의 목록을 추가할때마다 계속해서 DB를 추가하는 식으로 만들 필요는 없다 생각하여 MONTH와 YEAR을 동시에 하나의 DB에서 관리하기로 하였다. 

type Column을 추가하여 Month인지 YEAR인지를 구분하였고 추후에 상반기,하반기 혹은 다른 요소들을 추가할때도 TYPE으로 구분이 가능하여 이런식으로 설계하였다. 오늘 할일목록과 이번주의 할일목록도 같이 통합하지 않은 이유는  TODAY 목록과 WEEK 목록은 데이터의 양 자체가 MONTH/YEAR에 비해서 압도적으로 많기 때문에 DB를 따로 설계하였다. 

MONTH와 YEAR 조회 관련한 SQL 쿼리를 작성하고 적용을 하였다.

package hjp.givemeideas.model.monthyear

import hjp.givemeideas.entity.PlannerMonthYear
import hjp.givemeideas.entity.QPlannerMonthYear
import hjp.givemeideas.infra.queryDsl.QueryDslSupport
import org.springframework.stereotype.Repository
import java.time.LocalDate

@Repository
class QueryDslMonthYear : QueryDslSupport() {

    private val planner = QPlannerMonthYear.plannerMonthYear

    fun findAllMonthPlan(): List<PlannerMonthYear> {
        val startDate = LocalDate.now().withDayOfMonth(1) // 이번 달 첫째 날
        val endDate = LocalDate.now().withDayOfMonth(LocalDate.now().lengthOfMonth()) // 이번 달 마지막 날

        return queryFactory.selectFrom(planner)
            .where(
                planner.type.eq("MONTH"),
                planner.createdAt.between(startDate, endDate)
            )
            .fetch()
    }

    fun findAllYearPlan(): List<PlannerMonthYear> {
        val startDate = LocalDate.now().withDayOfYear(1) // 이번 연도의 첫째 날
        val endDate = LocalDate.now().withDayOfYear(LocalDate.now().lengthOfYear()) // 이번 연도의 마지막 날

        return queryFactory.selectFrom(planner)
            .where(
                planner.type.eq("YEAR"),
                planner.createdAt.between(startDate, endDate)
            )
            .fetch()
    }

}

 

하지만 SWAGGER로 테스트를 해본결과 오류가 발생하였다.

 

 

🆘 해결 과정

 

@GetMapping("/planner/month_year")
fun getToDoMonthYear(@RequestBody dto: MonthOrYearDto): ResponseEntity<List<ToDoResponse>> {
    return ResponseEntity.status(HttpStatus.OK).body(plannerService.getMonthYearToDo(dto))
}

일반적으로 Get 요청에는 RequestBody를 쓰는것은 비표준적이라고 한다. Get요청은 HTTP 규격상 안전한 요청으로 간주되기 때문에 쿼리 파라미터를 사용해야한다.

 

 

 해결

 

@RequestBody -> @RequestParam으로 변경하는것으로 해결하였다.

@GetMapping("/planner/month_year")
fun getToDoMonthYear(@RequestParam type: String): ResponseEntity<List<ToDoResponse>> {
    return ResponseEntity.status(HttpStatus.OK).body(plannerService.getMonthYearToDo(type))
}

 

 

아주 간단하게 필수적으로 구현해야할 API 구현이 완료되었다.

'TIL' 카테고리의 다른 글

간단한 CSS 찍먹하기!  (0) 2024.11.22
간단한 HTML 찍먹하기!  (0) 2024.11.21
QueryDsl 설정 관련 오류  (0) 2024.11.19
개인프로젝트 1일차  (0) 2024.11.14
개인 프로젝트 0일차  (0) 2024.11.13