Spring Boot/스프링 입문 강의

Spring 입문 Chapter 2-3. 스프링 웹 개발 기초 : API

HEY__ 2022. 2. 6. 19:42
728x90

이 글은 인프런에 있는 김영한님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 강의를 듣고 정리한 필기입니다.

 

⛅️ Spring 웹 개발에서 정적 컨텐츠 방식을 제외한다면?

MVC 방식

원하는 view를 찾은 후, template engine을 통해서 해당 view를 html로 렌더링해서 웹 브라우저(고객)에게 넘겨주는 형식이다.

 

API 방식

spring 개발 시 이야기하는 API방식은, JSON 형식으로 바꾸어 반환하는 것을 말한다.

view없이 그대로 http body에 전달하는 방식이다.

 


⛅️ @ResponseBody

@ResponseBody란?

  • http(통신 프로토콜)의 body 부에 return(반환)값을 직접 넣어주겠다는 뜻.
  • Template engine과의 차이점은?
    - API를 사용하면 view가 따로 없다.
    - 따라서 소스코드 보기를 통해 보아도 html 관련 코드는 없고, 출렷된 문자만 보인다.
  • Template engine은 view라는 템플릿이 있는 상황에서 view를 html로 변환하는 것이고,
    API는 데이터를 그대로 내보내는 것이다.

 

 


⛅️ @ResponseBody는 어떻게 사용하는가?

문자열(String)을 전달하는 경우는 거의 없고, 데이터. 즉, 객체를 요청할 때 주로 사용한다. 

API 방식을 이용하여 helloController를 발전시켜보자.

 

1. Hello라는 클래스를 하나 만들고, 변수 name와 해당 변수에 대한 Getter/Setter를 생성한다.

static class Hello{
	private String name;

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

 

2. @GetMapping을 통해 url과 연결하고, @RequestParam을 통해 url에서 변수의 정보를 받도록 한다.

   그리고 그 정보를 setName을 통해 hello 객체의 변수 name에 대입한다.

   @ResponseBody 어노테이션더 적는다.

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

 

3. 위 코드를 실행하게 되면 JSON 방식으로 표현이 된다.

   예를 들어 hello의 name 변수에 spring을 전달했다면, 웹 브라우저에 {"name" : "spring"}이라고 뜬다.

   즉, 함수에서 @RequestParam을 통해 변수 nameValue를 받은 후, 해당 값을 hello 객체의 name 변수에 받은 값을 넣어준다. 그리고 hello 객체를 반환한다.

 

전체 코드

이러한 방식을 API 방식이라고 한다.

 


⛅️ JSON이란?

참고링크: https://velog.io/@surim014/JSON이란-무엇인가

  • Java Script Object Notation의 약자.
  • key-value 페어로 이루어진 데이터 오브젝트를 전달하기 위해 사용하는 개방형 표준 포맷.
  • http 통신 시, 데이터를 주고 받을 때 사용하는 데이터 포맷 중 하나.
  • null, numer, string, array, object, boolean을 사용할 수 있다.

 

  • @ResponseBody 어노테이션이 적혀있고, 객체를 반환한다면 spring에서 key와 value 쌍 포맷인 JSON을 반환한다.

 


⛅️ Java Bean 규약이란?

1. Java bean 규약을 사용하는 이유

   프론트엔드와 백엔드가 각자 구현할 때, 공통의 약속을 지키며 사용함으로써 일관된 방식으로 java 클래스를 사용할 수 있도록 한다.

 

2. 규약 내용

  • 기본 생성자를 가지고 있어야 한다.
  • default 패키지가 아닌 지정된 패키지에 저장되어 있어야 한다.
  • 멤버 변수의 접근자는 private로 선언한다.
  • 멤버 변수에 접근하기 위한 Getter/Setter를 public으로 선언하여 외부에서 접근하도록 한다.

 

 


⛅️ @ResponseBody 작동 원리

  1. 웹 브라우저에서 localhost:8080/hello-api를 요청하면 tomcat 서버에서 hello-api 요청이 들어왔음을 Spring에게 알린다.
  2. Spring은 먼저 Controller에 hello-api가 Mapping 되어 있는지 확인한다.
    이 때, 만일 @ResponseBody가 적혀있지 않았다면, viewResolver에게 전달해서 template engine이 html로 변환했을 것이다.
  3. 메서드에 @ResponseBody 어노테이션이 있고, String을 반환하는 것이 아닌 hello 객체를 반환할 것이다.
    따라서 기본적으로 JSON 방식으로 데이터를 만들어서 http응답에 반환할 것이다.
  4. helloController에서 메서드가 실행되어 hello 객체를 넘기게 되면 "HttpMessageConverter"가 작동한다.
    만일 단순 문자열을 반환했다면 "StringConverter"가 동작하고, 객체를 반환했다면 "JsonConverter"가 동작한다.
    이 상황에서는 hello 객체를 받았기 때문에 JsonConverter가 동작하여 hello 객체의 내용을 JSON 스타일로 바꾼다.
  5. JSON 스타일로 바꾼 내용을 요청한 웹 브라우저/서버에게 응답한다.
728x90