TIL - JAVA spring DAY3 (API)

jihan kong·2022년 1월 6일
0

JAVA spring 입문

목록 보기
4/20
post-thumbnail

DAY3 스프링 웹 개발의 기초를 공부하였다. 정적 컨텐츠, MVC와 템플릿 엔진, API. 그 중 API에 관한 내용을 다룰 예정이다.

API

정적 컨텐츠를 제외하면 개발자는 MVC방식의 템플린 엔진을 통해 view를 찾아 데이터를 렌더링해서 웹 브라우저로 데이터를 보낼지, 아니면 오늘 소개할 API 방식으로 보낼지 크게 두가지 중에 하나를 선택하게 된다. 백문이 불여일견... 직접 예제 코드를 보면서 익히도록 하자.

@Controller
public class HelloController {

	@GetMapping("hello-string")
	@ResponseBody
	public String helloString(@RequestParam("name") String name) 
    	{
    		return "hello " + name;     // "hello spring"
	}
}

코드에서 등장한 ResponseBody는 HTML에서 사용하는 Body tag가 아니다. 단지, HTTP Body 부분에 직접 이 내용을 전달한다는 뜻이다. 즉, ResponseBody를 사용하면 뷰 리졸버(viewResolver)를 거치지 않고 HTTP의 BODY에 문자 내용을 직접 반환하게 된다는 의미이다.
실제로 http://localhost:8080/hello-string?name=spring 웹으로 실행하고 소스코드를 살펴보니 HTML 형식이 아닌 위의 intelliJ 예제코드에서 입력한 내용 그대로 나타나는것을 볼 수 있었다.

이를 응용하여,

@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
}

intellij에 입력한 위 내용을 http://localhost:8080/hello-api?name=spring 을 통해 확인해보면,

위와 같이 key, value 형식으로 나타내어져 있는 것을 알 수 있는데, 이는 내가 그동안 웹 프로그래밍 쪽에서 많이 들었지만 정확하게 알지 못했던 json 방식이라는 것을 알게 되었다. 과거에는 html으로 표현되는 xml 방식을 많이 썻지만, 최근에는 거의 json 방식을 사용한다고 한다. api방식의 작동원리는 다음과 같다.

  • ‘@ResponseBody’ 를 사용
  • HTTP의 BODY에 문자 내용을 직접 반환
  • @ResponseBody 가 붙어있으므로 스프링은 ‘viewResolver’ 대신에 ‘HttpMessageConverter’ 를 동작 시킴
  • 기본(default) 문자처리: ‘StringHttpMessageConverter’
  • 기본(default) 객체처리: ‘MappingJackson2HttpMessageConverter’
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
    (출처: 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술, 강사 김영한)

API에 대해 학습하면서 전에 배웠던 MVC방식과 다른 점을 알게 되었는데, 바로 객체를 처리할 수 있다는 것이다. 지금까지는 단순 문자들을 처리하였기 때문에, StringConverter가 동작했었지만 객체를 입력하였다면 JsonConverter가 동작할 것이다. 객체가 들어오게 되면 기본 default 값은 HttpMessageConverter가 json형식으로 변환해서 http 응답에 반환하겠다는것이 기본 정책이다.

static class Hello {
    private String name;

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

위와 같이 getter setter를 통해 class와 객체를 생성할때 json 방식이 사용된다.

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글