EventController

워니·2024년 6월 30일

puppyWalk 서비스를 만들면서,
가장 먼저 항해플러스에서 배운 "실시간 특강 신청"을 응용해서,
매일 선착순 n명에 500포인트를 지급하는 기능을 먼저 설계하기로 했다.
현재 페이지는 EventController를 만들면서, 새로 배운 annotation이나 코드의 의미를 정리하도록 하겠다.


@RestController, @Controller의 차이

@Controller

  • 스프링 MVC에서 웹 요청을 처리하는 컨트롤러 클래스임을 나타내는 어노테이션
  • 주로 HTML페이지를 반환하는 용도로 사용됨
  • @ResponseBody 어노테이션이나 @RestController 어노테이션과 함께 사용하지 않으면, 메서드가 반환하는 문자열은 View 이름으로 간주됨

@RestController

  • @Controller의 특수한 형태로, RESTful 웹 서비스의 컨트롤러임을 나타내는 어노테이션
  • 주로 JSON 또는 XML 형식의 데이터를 반환하는 용도로 사용된다
  • @ResponseBody 어노테이션이 이미 내장되어 있어, 메서드가 반환하는 객체는 HTTP응답부분으로 직접 전송됨(view의 이름xxx)
  • 일반적으로, @RestController을 사용할때는 각 메서드에 @RequestMapping, @GetMapping 등의 HTTP 메서드 별 어노테이션을 함께 사용하여 요청을 매핑한다.

@RequiredArgsConstructor, @NoArgsConstructor 차이

@RequiredArgsConstructor

  • final이나 @NonNull인 필드들을 대상으로 생성자를 생성
  • 객체 생성 시 필수적으로 초기화해야 하는 필드들을 간편하게 처리할 수 있다

@NoArgsConstructor

  • Lombok에서 제공하는 어노테이션 중 하나로, 기본 생성자를 자동으로 생성해줌

왜 @NoArgsConstructor 대신 @RequiredArgsConstructor를 사용할까

  • Final 필드의 초기화: 주로 스프링에서는 service나 repository와 같이 '@AutoWired'로 주입받는 필드를 final로 선언하는 것을 추천함. 이 경우, @RequiredArgsConstructor를 사용하면 필드들을 자동으로 초기화하는 생성자를 생성할 수 있음
  • 클래스 코드 간소화 : 필드들을 초기화하는 생성자를 명시적으로 작성하지 않아도 됨

반환형: ApiResponse

/*
	// EventController.java

    * 이벤트 목록
    */
    @GetMapping
    public ApiResponse<List<GetEventsResponse>> getEvents() {
        final List<Event> events = eventService.getEvents();
        return ApiResponse.isOk(GetEventsResponse.from(events));
    }
	// ApiResponse.java
    public static <T> ApiResponse<T> isOk(T data) {
        return new ApiResponse<>(HttpStatus.OK.value(), data);
    }

기존의 내 코드라면 당연히 반환형을 List로 했을 테이지만, 컨트롤러에서 모든 응답을 받아 처리하기 위해 return값을 ApiResponse로 설정했다. 그 이유는 다음과 같다

  1. 응답의 표준화 및 일관성 유지
    ApiResponse 클래스를 사용하면 모든 API 응답이 일관된 구조를 가지게 됩니다. 이는 클라이언트가 응답을 처리하는 데 있어 예측 가능성과 일관성을 제공하여, 클라이언트 코드의 복잡성을 줄여줍니다.

  2. 상태 정보 제공
    ApiResponse 클래스는 HTTP 상태 코드를 포함합니다. 이는 클라이언트가 응답의 성공 여부를 쉽게 확인할 수 있게 해줍니다. 단순히 List를 반환할 경우, 성공 여부를 확인하기 위해 추가적인 작업이 필요할 수 있습니다.

  3. 확장성
    ApiResponse를 사용하면 응답에 추가적인 메타데이터를 쉽게 포함할 수 있습니다. 예를 들어, 페이징 정보, 요청 처리 시간, 디버깅 정보 등을 포함할 수 있습니다. 이를 통해 API의 기능을 확장하고 클라이언트에게 더 많은 정보를 제공할 수 있습니다.

  4. 에러 처리
    표준화된 응답 구조를 사용하면 에러 처리도 일관되게 할 수 있습니다. 성공 응답뿐만 아니라 에러 응답도 같은 구조를 따르기 때문에, 클라이언트가 이를 처리하기가 쉬워집니다.

  5. 데이터 변환 및 추상화
    GetEventsResponse 클래스를 사용하면, 도메인 모델(Event)을 클라이언트에 직접 노출하지 않고, 필요한 데이터만 제공하거나 데이터를 특정 형식으로 변환할 수 있습니다. 이는 보안성과 캡슐화를 높이는 데 도움이 됩니다.

profile
매일, 조금씩 나아가는중

0개의 댓글