spring mvc 및 RESTful 서비스
1. spring mvc의 개념 및 구조
- mvc 패턴 : 어플리케이션을 모델 뷰 컨트롤러로 분리하여 역할을 명확히 하고, 유지보수를 용이하게 하는 패턴
- Model : 데이터와 비즈니스 로직 담당, view : 사용자에게 데이터 표시, controller : 사용자 입력을 처리하고, 모델과 뷰를 연결
- mvc를 지키며 코딩하는 방법
-> 모델은 컨트롤러와 뷰에 의존하지 않아야 (모델 내부에 컨트롤러/뷰와 관련된 코드가 없어야)
-> 뷰는 모델에만 의존하고 컨트롤러엔 의존하면 안된다
*spring web mvc : mvc패턴을 웹 애플리케이션에 최적화하여 구현한 프레임워크
spring web mvc 동작방식
- view Resolver 란?
2. view resolver
- mapping between view names and actual views를 제공 (mvc 패턴에서 컨트롤러가 처리 마친 후에 어떤 뷰로 응답을 생성할지 결정하는 역할)
* 타임리프 view resolver 사용예시
1) 의존성 추가
2) (선택) 템플릿 파일 경로 설정
3) 컨트롤러에서 확인
3. RESTful 웹서비스 : rest 아키텍처를 완전히 준수하는 웹 서비스 - HATEOAS를 포함한 REST의 여섯가지 제약조건 모두 만족해야함
" representaional state transfer " : 자원의 표현에 의한 상태 전달을 의미
REST 구성 요소 - 자원 : http uri / 자원에 대한 행위 : http method / 자원에 대한 행위의 내용 : http method payload
REST 설계 원칙 : 클라-서버 아키텍처 / Layered 시스템 / stateless / uniform interface / cacheability / (code on demand)
<spring에서의 RESTful 웹서비스 구현>
- @RestController : @Controller와 @ResponseBody의 기능을 모두 하는 어노테이션 -> 반환되는 객체가 json 또는 xml형태로 자동 변환된다
- @RequestMapping : 요청 uri 매핑에 사용
- @GetMapping , @PostMapping 등 : 역시 uri 매핑에 사용되지만, 위와의 차이는 주로 메소드레벨에서 쓰임(메소드가 명확히 특정되어 있어 코드 가독성이 높아짐)
- 클래스단에서 @requestmapping 사용 , 메소드단에서 @getmapping, @postmapping등을 사용
REST 하게 구현하기 위한 단계
LV2가 4가지 HTTP METHOD로 CRUD구현, 상태코드 구분 (위의 예시는 2단계)
LV3은 HATEOAS까지 적용한 버전
4. HATEOAS를 활용한 API 설계
HATEOAS : 응답과 관련된 링크들을 함께 주는 것 (속성과 링크(href) 제공) -> 클라는 특정 요청에 대한 응답에서 필요한 추가정보를 링크로 제공받음 -> 서버-클라 간 의존성 낮추게 해줌
- 실무에선 많이 안씀 : swagger와 같은 api 명세서 툴을 보통 쓰기에
적용 방법 : gradle dependency 추가 -> 리소스에 hypermdeia support 추가 -> 링크 추가
<과제 : HATEOAS와 커스텀 예외 처리를 포함한 REST API 구축 >
먼저 간단한 REST api를 구현해보자
postman에서 테스트해보면 이렇게 아직 아무 회원 데이터도 없는 것을 확인 가능
회원 등록
몇개 더 가입시키고 다시 회원조회를 해보면 이렇게 가입된 회원들이 뜨는 것을 볼 수 있다
이제 커스텀 예외처리를 구현하자
이렇게 커스텀 예외 클래스를 만들어준 후 ,
이런식으로 사용해준다
위와 같이 Hateoas 적용도 해보았다