TIL_220718_강의용 실습 프로젝트 1

창고·2022년 7월 19일
0
post-custom-banner

들어가기에 앞서
실제 프로젝트 진행했던 코드 내용은 업로드하지 않았습니다

1. 개발 기획

  • 목표 구체화 (why)
  • 요구 사항 (서비스가 도움이 되려면... 관리자, 이용자 모두)
    • 서비스 목표
    • 니즈
    • 사용성
    • 필요 기능 요약
      • 관리자
      • 이용자
  • 유즈케이스 작성 (lucid) https://lucid.app/users/login#/login
  • 도메인 설계 (ERD) / *domain naming convetion
  • 요구사항 API 설계

2. 금일 구현하고자 하는 것들 (애노테이션 기반)

  • Controller Class (컨트롤러 클래스)

    • MVC 패턴Handler Method를 포함하는 Controller Bean을 만드는 과정
      • @Controller
      • @RestController = @ResponseBody + @Controller
  • Handler Method (핸들러 메소드)

    • Spring Web 서비스가 받는 URI 요청을 Controller Class
      특정 메소드 (Handler Method)에 매핑하는 과정
      • @~~Mapping
  • View (템플릿 엔진 사용)

    • thymeleaf 사용
    • 디렉토리의 templatesview 기본 경로로 지정됨

참고. 함수형 프로그래밍 스타일로 설계

  • 함수형 프로그래밍 특징
    • 상태가 없음
    • 대입문이 없음
    • 부작용 (side effect)가 없는 순수 함수
    • 불변성 (Immutability)
  • 함수형 엔드포인트
    • Spring Web의 엔드포인트를 함수형 스타일로 작성하는 방법 제공
    • WebMVC.fn
    • Routing, RequestHandling
    • 불변성 고려 설계
    • 기존의 DispactherServlet 위에서 동작
    • 애노테이션 스타일과 함께 사용 가능
  • 주요 키워드
    • HandlerFunction == @RequestMapping
      • 입력 : ServerRequest
      • 출력 : ServerResponse
      • 결과 : data
    • RouterFunction == @RequestMapping
      • 입력 : ServerRequest
      • 출력 : Optional <HandlerFunction>
      • 결과 : data + behavior (url mapping 등)
  • 다만 현업 스타일은 아직까지는 어노테이션 기반이 우세하므로 추후 참고하는 방향으로

3. Controller 생성

(1) application.properties, dependecies 세팅

  • application.properties 수정
    • Debug : debug=true,
    • End Point 확인 : management.endpoints.web.exposure.include=*
  • dependencies 추가
    • actuator : starter-actuator
    • thymeleaf : starter-thymeleaf

(2) 각 Controller 생성

  • 초기 세팅을 위해 return 값은 templates에 별도로 만든 html 파일의 이름으로 지정
    • 추후 return 타입을 String이 아닌 ModelAndView 타입으로 변경
  • BaseController : 초기화면과 관련된 Controller
  • AuthController : 인증 관련 Controller
  • AdminController : 관리자 전용 Controller
  • EventController : 이벤트 관련 Controller
  • PlaceController : 장소 관련 Controller

(3) API 제작

  • 초기 세팅을 위해 return 값은 임의대로 설정, 추후 return 값 구체화
  • APIAuthController : 인증과 관련된 API
  • APIEventController : 이벤트와 관련된 API
  • APIPlaceController : 장소와 관련된 API

4. Handler Methods와 요청 응답 설계

(0) Handler Method와 요청, 응답

  • Handler Method : Spring Web에서 요청(Request)를 받아 응답(Response)를 반환하는 메소드

  • @RequestMapping

    • name : 뷰 템플릿에서 식별할 때 쓰는 이름
    • value, path : URI
    • method : HTTP Method (GET, POST, PUT...)
    • params : 파라미터 검사
    • headers : 헤더 검사
    • consumes : 헤더의 content-type 검사 (json으로 주는 요청만 받는다던지)
    • produces : 헤더의 accept 검사 (client 너 json 데이터 받을 수 있음?)

(1) 도메인 작업 (JPA는 추후 디테일하게)

  • Admin : 관리자 관련 도메인
  • AdminPlaceMap : Admin과 Place를 연결, 매핑해주는 도메인
  • Event : 이벤트 관련 도메인
  • Place : 장소 관련 도메인
  • 각 도메인의 Type을 위한 Enum 타입 생성 / EventStatus(이벤트 상태), PlaceType(장소 분류)

(2) Controller 일부의 Handler Method 수정/구체화

  • AdminController > GetMapping place 메소드 변경
    • returnString / html 페이지가 아닌 ModelAndView로 변경
  • html thymeleaf 적용, places.html 변경

5. 예외 처리

(1) ExceptionHandler, ControllerAdvice

  • @ExceptionHandler
    • 비즈니스 로직이 던진 예외에 반응하는 Handler Method
    • 위치 : 특정 컨트롤러 클래스 내부 혹은 @ControllerAdvice 컴포넌트 내부
    • 특정 예외에 반응
    • 예외 처리 범위
      • 컨트롤러 안에 작성 -> 해당 컨트롤러
      • @ControllerAdvice -> 프로젝트 전체
    • 예외를 입력 인자로 받을 수 있음
  • @ControllerAdvice
    • @ExceptionHandler를 모아서 글로벌하게 적용할 때 사용하는 애노테이션
    • 주로 view 에러 처리에 사용
  • @RestControllerAdvice = @ControllerAdvice + @ResponseBody
    • 속성
      • value = basePackages
      • basePackages : 적용 범위를 문자열을 이용해 특정 패키지로 지정
      • basePackagesClasses : 적용 범위를 대표 클래스 한개를 이용해 특정 패키지를 지정
        ㄴ basePackages를 type-safe 하게 사용하기 위해 제공
      • assignableTypes : 적용 범위를 특정 클래스에 할당할 수 있는 컨트롤러로 지정
      • annotations : 적용 범위를 특정 애노테이션을 사용한 컨트롤러로 지정
    • 주로 json 에러 처리에 사용
  • ResponseEntityExceptionHandler
    • Spring MVC에서 내부적으로 발생하는 예외들을 처리하는 클래스
    • API 예외 처리를 담당하는 @ControllerAdvice 클래스에서 상속 받아 사용
    • 커스터마이징을 원하는 특정 메소드를 오버라이드

(2) DTO 및 Custom Exception 설정

  • API
  • Custom Exception

(3) BaseErrorController 생성

  • BaseController에 있던 Error 메소드 기능을 별도의 컨트롤러로 분리시켜 구현
  • BaseErrorController : 에러 페이지를 담당하는 컨트롤러
  • Error 페이지 수정
  • Error 메소드 수정
profile
공부했던 내용들을 모아둔 창고입니다.
post-custom-banner

0개의 댓글