들어가기에 앞서
실제 프로젝트 진행했던 코드 내용은 업로드하지 않았습니다
1. 개발 기획
2. 금일 구현하고자 하는 것들 (애노테이션 기반)
참고. 함수형 프로그래밍 스타일로 설계
- 함수형 프로그래밍 특징
- 상태가 없음
- 대입문이 없음
- 부작용 (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와 요청, 응답
(1) 도메인 작업 (JPA는 추후 디테일하게)
- Admin : 관리자 관련 도메인
- AdminPlaceMap : Admin과 Place를 연결, 매핑해주는 도메인
- Event : 이벤트 관련 도메인
- Place : 장소 관련 도메인
- 각 도메인의 Type을 위한
Enum
타입 생성 / EventStatus(이벤트 상태), PlaceType(장소 분류)
(2) Controller 일부의 Handler Method 수정/구체화
- AdminController > GetMapping place 메소드 변경
return
값 String
/ 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 설정
(3) BaseErrorController 생성
- BaseController에 있던 Error 메소드 기능을 별도의 컨트롤러로 분리시켜 구현
- BaseErrorController : 에러 페이지를 담당하는 컨트롤러
- Error 페이지 수정
- Error 메소드 수정