3. API
정의
안드로이드, ios 개발 시 서버는 json [= data format] 으로 고객에게 전달하는 방식
+ 서버끼리 통신할 때도 사용
정적 컨텐츠 제외) 방식 2가지 : html로 vs 데이터 바로
1. MVC 방식 → View를 찾은 뒤, template engine으로 화면 랜더링 → html을 웹브라우저에 넘겨주는 방법
2. API 방식 → 데이터 바로 내림
- API와 MVC 방식의 차이
- API는 별도의 View 생성 없이 http로 문자가 그대로 넘어간다
HelloController에 helloString 생성 (전달 값이 문자일 경우)
마찬가지로 @GetMapping으로 url과 매칭시켜주고, @RequestParam으로 입력값을 받아온다
차이점은 @ResponseBody가 추가 됐다는 것
@ResponseBody : 응답본문
- 스프링 어노테이션 (요청, 응답 中 응답 관련 어노테이션) [서버 → 클라이언트]
- 비동기 처리
- VO객체를 JSON로 변경 후 → http 中 body에 담음
⇒ method의 return값 → http Response body에 담음
∴ View를 통해 출력하지 않고 직접적으로(JSON형식) 출력 (≡ return값과 동일한 html 필요 없음, viewResolver 무시)
Annotation/어노테이션 : 주석
- 소스 코드 사이에 @기호를 앞에 붙여 사용
- 코드 관련 XML 설정을 기술하는 방식
- 컴파일러에게 코드 작성 문법 에러 체크하도록 정보 제공
- 개발툴이 빌드 or 배치시 코드 자동 생성 도움
- 실행 시 특정 기능 실행하게 정보 제공
- EX)
@RequestMapping : 요청 URL을 어떤 method가 처리할지 mapping 해줌
@RequestBody : 요청 온 데이터를 바로 Class나 model로 mapping함; HTTP POST 요청에 대해 request body에 있 는 request message에서 값을 얻어와 mapping, RequsetData를 바로 Model이나 Class로 Mapping
@RequestParam : request의 parameter에서 가져와 → method의 parameter에 사용됨. ?XXX=OOO와 같은 형식의 쿼리 파라미터를 파싱 (URL 뒤에 붙는 parameter값을 가져올 때 사용)
+) in Java -- @Override[오버라이딩], @Deprecated[사용하지 않을 것을 권장하는 필드, 메서드],
@SuppressWarnings[컴파일러의 경고 메시지 안나타나게]
HTTP Body에 직접 담는다면?
출력은 동일하다. 하지만...
소스코드를 확인해보면, mvc 방식은 template engine을 통해 html 문서에 return값이 담겨 출력되지만
API 방식은 html태그 없이 return값만 덩그러니 전달 됨을 확인할 수 있다.
template engine은 화면을 가지고 view라는 템플릿 조작해 data 전달
⇔ Data 그 자체를 그대로 전달
HelloController에 helloString 생성 (전달 값이 Data인 경우)
✓ JSON방식으로 출력된다.
⇒ key = name , value = spring!
JSON
- "key" : "value" 로 구성된 구조
- 기존에 사용하던 XML방식 (<html태그 이용>)에 비해 가볍고 직관적임
→ spring에서 data 반환 시 디폴트 == JSON으로 반환
GETTER & SETTER
- Ctrl + N 클릭 → Actions 탭 → Getter and Setter로 간단 설정 가능
- 자바 bean 규약 - 맴버변수를 private로 선언함 → 꺼내쓰기 위한 public method가 별도로 필요하다.
- Property 접근 방식
* Bean : Spring 컨테이너가 관리하는 자바객체
- Spring에선...직접 new로 생성한 객체 X/ Spring에 의해 생성되고 관리되는 객체(O) 사용
- @Controller : Spring에서 해당 Controller를 Bean으로 등록함
* Java Beans 규약
1. 기본 생성자가 반드시 존재해야한다. (인자 X인 Default 생성자)
2. 속성을 접근하고 꺼내올 수 있는 set___ / get___ method 로 구성해야 함. - public으로 선언 돼야 함
→ Property 접근 방식
3. 맴버 변수 == Property, 접근자는 private로 선언돼야 함
@ResponseBody 진행 과정(원리)
웹 브라우저 → localhost:8080/hello-api?name=spring! 요청
- 톰켓 서버] (스프링 부트의) 내장 톰켓 서버가 요청 받아서 → hello-api를 스프링에게 넘김
- 스프링 부트] "hello-api"과 mapping 된 컨트롤러가 있는지 스프링 컨테이너에서 찾음 → 있음!
✓ @ResponseBody Annotation 존재 (기존에는 viewResolver에게 패스 → return에 매핑된 html 찾아서 돌려줘)
→ HTTP Body에게 그대로 데이터를 넘긴다. (문자 내용을 직접 반환)
- HttpMessageConverter(⇔ viewResolver)가 동작. → 넘기는게 문자? 객체?
- 기본 문자처리: StringHttpMessageConverter [ StringConverter ]가 동작
- 기본 객체처리: MappingJackson2HttpMessageConverter [ JsonConverter ]가 동작
- [Default] 객체를 JSON style (= {"key" : "value"}) 로 바꿈
- -→ HTTP BODY에 실어 요청한 웹 브라우저/서버 에게 전송
- 객체를 Json으로 바꿔주는 라이브러리 = Jackson, Gson ...
+)
- byte처리 등 여러 HttpMessageConverter가 기본 등록 돼 있음
- 클라이언트의 HTTP Accept 헤더 + 서버의 Controller return 타입 정보 조합해 HttpMessageConverter가 선택됨
정리
- 정적 컨텐츠
- 파일 그대로 웹 브라우저에게 전달
- MVC & 템플릿 엔진
- 템플릿 엔진 = Model + View + Controller 방식으로 분할
- View를 템플릿 엔진에서 랜더링 → 랜더링 된 html을 웹 브라우저에게 전달
- API
- HttpMessageConverter를 통해 객체를 JSON style로 반환
- 별도의 view 없이 (html 문서 없이) HTTP BODY에 값 넣어 반환
'Spring > Spring boot 입문' 카테고리의 다른 글
[Java] Stream(스트림) 정리 (0) | 2022.07.30 |
---|---|
[스프링 부트] 회원 관리 예제(1)~(3) - 스프링 입문 강의 / 인프런 (0) | 2022.07.30 |
[스프링 부트] 정적 컨텐츠, MVC와 템플릿 엔진 - 스프링 입문 강의 / 인프런 (0) | 2022.07.24 |
[스프링 부트] View 환경설정, 빌드 후 실행 - 스프링 입문 / 인프런 (0) | 2022.07.20 |
[스프링 부트] 라이브러리 - 스프링 입문 강의/인프런 (0) | 2022.07.18 |