개발일기
API 본문
mvc 패턴에서는 뷰를 찾아가지고 템플릿 엔진을 통해서 화면을 랜더링해서 html에 넘겨주는 방법이 있다.
하나의 또 다른 방법은 API를 쓰는 방법이 있다.
두 방법의 차이점은 HTML방식으로 데이터를 내리냐 아니면 API방식으로 데이터를 바로 내리냐에 차이가 있다.
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello" + name;
}
hello controller에 해당 코드를 추가해준다.
Response Body의 의미는 http에서 Head 부분, Body부분이 있다. http 통신 프로토콜의 body 부분에 이 데이터를 직접 넣어주는 것이다.
만약 name을 김이라고 하면 "hello 김"으로 바뀔 것이다. 내가 넣어준 문자가 요청한 클라이언트에 그대로 내려감
애는 템플릿 엔진과의 차이는 뷰가 필요없이 그냥 문자가 그대로 내려감
http://localhost:8080/hello-string?name=Spring~!
내가 적은게 그대로 적어진다. 만약 문자를 내놓으라는게 아닌 데이터를 내놓으라고 할떄도 많아서 이러한 상황들 덕분에 API방식을 사용 많이한다.
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello();
}
static class Hello{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
이런식으로 만들면 해당 클래스안에서 Hello클래스를 한번 더 사용할 수 있다.
HelloController.Hello 이런식으로 사용 가능하다.
꺼낼 때는 getName, 써줄 때는 setName을 통해서 바꾸고 가져와 줄 수 있다.
Hello 객체 타입형 변수명이 helloApi Request를 받는 것을 하나 생성해주었다.
여기서 hello = new Hello() 이것을 통해서 hello타입형 객체를 하나 생성해주었다.
command + shift + enter를 누르면 자동완성이 된다.
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello{
private String name;
;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
이렇게 작성해주면 처음으로 문자가 아닌 객체를 넘겨주었다.
ctrl + enter를 치면 Getter와 Setter가 뜸 이때 get and Setter 추가 한다.
private String name이라서 해당 하는 아이를 바로 못꺼내준다. 라이버러리 같은 곳이나 내가 쓸때도 get, set메서드를 통해서 접근해야만한다. 자바 bin 표준 방식이다. 이것을 프로퍼티 접근 방식이라고도 말한다.
객체를 넘겨주면 json데이터가 나오는 것을 확인할 수 있다. 이것은 그냥 key, value로 이루어진 구조이다.
과거에는 xml방식도 많이 쓰였다. <html> </html>로 된 파일들 보았을 것이다. 이것은 xml의 방식임
xml 방식은 굉장히 무겁고 열고 닫고를 두번의 태그를 작성해야한다. 이것에 비해 Json이 훨씬 심플하다.
최근에는 거의 Json방식으로 통일 되었다. 또한 스프링도 기본이 객체를 반환하고 Response Body라고 하면 기본으로 json을 반환한다.
옛날의 legacy 프로젝트 같은 경우는 xml을 연동하는 경우가 있는데 이떄는 검색을 통해서 찾아서 사용하자!!
동작 방식)
1. localhost:8080/hello-api로 웹 브라우저에 접근한다.
2. 톰캣 내장 서버에서 hello-api가 왔다 알려준 후 Spring에 던져 준다.
3. helloController에서 해당하는 hello-api를 찾고선 보니 @ResponseBody라는 anotation이 붙어 있다. 이렇게 되면 스피링은 이전에 템플릿은 view Resolve에게 던져서 나한테 맞는 아이를 찾아서 돌려줘야 하지만 @ResponseBody가 있으면 동작을 그대로 넘겨준다. 넘겨줄 때 볼때 기존에는 문자였을 경우 html body에다가 문자를 걍 넣어주고 끝났었지만 객체를 줄 때 Spring 입장에서 한번 더 생각을 해주어야 함.
4. 객체가 오면 "기본 디폴트가 json방식으로 데이터를 만들어서 http응답에 반환하겠다."라는 컨셉을 가지고 있다. 객체를 넘기면 우선 reponsebody가 있으면 HttpMessageConvert라는 아이가 동작한다. 기존에는 view Resolve가 동작했었다. 이때 단순문자라면 StringConvert가 동작하고 객체라면 JsonConvert가 동작한다. 그 후 jsonConvert를 통해서 객체가 json형식으로 바뀜.
json을 바꾼 것을 나를 요청한 웹브라우저든, 서버든 간에 보내준다.
@ResponseBody 를 사용
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter가 동작
- 기본 문자처리 : StringHttpMessageConverter
- 기본객체처리 : MappingJackson2HttpMessageConverter (Json을 바꿔주는 대표적인 Convert중 하나) Jackson라는 라이브러리를 넣어놓아서 쓴다.
- byte 처리 등등 기타 여러 HttpMessageConveter가 기본으로 등록되어 있음.
이에 해당하는 내용들은 기본 그대로 사용한다. 실무에서도 거의 건들지 않는다.
정적 컨텐츠 : 파일 그대로 내려줌
템플릿엔진 : mvc로 쪼개서 프로그랭을 해서 좀 더 가공해서 고객에게 전달해준다.
api방식 : api방식은 객체를 반환해주는 것이다.
'Spring > Spring tutorial - 코드로 배우는 스프링 (김영한)' 카테고리의 다른 글
회원 도메인과 리포지토리 만들기 (0) | 2022.09.17 |
---|---|
비즈니스 요구 사항 정리 (0) | 2022.09.17 |
MVC와 템플릿 엔진 (0) | 2022.09.15 |
정적 컨텐츠 (1) | 2022.09.15 |
빌드하고 실행하기 (0) | 2022.09.15 |