[Spring Boot] Restful Service

yihyun·2024년 9월 13일

Spring Boot

목록 보기
14/33

✨ Restful Service

개념 (Representational State Transfer)

  • 클라이언트와 서버 요소를 엄격하게 구분한다. / 하나의 서버로 다양한 플랫폼의 클라이언트 대응 가능 하다.
    → 웹, 안드로이드, 아이폰 등을 모두 분리할 경우 너무 복잡하기 때문에 서버는 하나만 만들어두고 각각의 뷰가 대응할 수 있도록 한다.

  • url 형태로 요청을 명료화 할 수 있다. (GET방식)
    → /detail?lecture=java&idx=15 ▶ /detail/java/15 형태로 보낼 수 있다.

  • 상황이나 요청 데이터에 따라 요청 방식을 선택 하면 된다
    → 일반적으로 Restful Service 에서는 다음과 같은 method를 사용한다. (통상적인 약속)
    GET : 특정 데이터를 조회 할때
    POST : 특정 데이터를 요청 할때
    DELETE : 특정 데이터를 삭제 할때
    PUT : 특정 데이터를 수정 할때
    PATCH : 특정 데이터를 일부 수정 할때

즉, URL을 통해서 자원을 쉽게 가져오는 것을 말한다.

/detail?lecture=java&idx=15 : 기존에는 request 객체를 사용할 경우에는 url을 이렇게 작성했는데, 이렇게 넣을 경우 너무 길어지기 때문에 오타가 발생할 수 있고, 많은 파라미터를 보낼 수 없다.

/detail/java/15 : 그래서 이런식으로 조금 더 쉽게 가져올 수 있게 할 수는 없을까? 에서 시작된 것이다.

클라이언트와 서버 요소를 엄격하게 구분한다 라는 것은
▶ 웹용, 아이폰용, 안드로이드용 등 다 분리해둘 경우 너무 복잡하기 때문에 서버는 하나만 만들어두고 각각의 뷰가 대응할 수 있게 만들자 라는 것으로 나온 개념이다.
→ 그렇기 때문에 뷰와 서버가 엄격하게 구분된다.
백 개발자는 뷰를 만질일이 없다! 구분이 되어있기 때문에

※ 일반적으로는 백엔드가 뷰도 같이 건들지만 Restful Service 를 할 때에는 서버만 건드린다!

그래서 우리는 약속을 했는데 그 약속이 REST API 이다.

API : 규격 (문서도 포함-하는 방법)

  • API(application Programming Interface) 의 개념은 이미 JAVA 에서 배운 바 있다.
  • 웹 상에서 URL 을 통해 원하는 정보를 얻어오거나 특정한 요청을 하는 것을 우리는 REST API 라고 한다.
  • 여기에는 사용 설명서도 포함이 된다.
<html>
    <head>
        <title>우리가 사용했던 form으로 전송 방식</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <form action="http://localhost:8080/14_RestAPI/map">
            <input type="submit" value="map 형태로 받기"/>
        </form>
        <form action="http://localhost:8080/14_RestAPI/object"> 
            <input type="submit" value="object 형태로 받기"/>
        </form>
        <form action="http://localhost:8080/14_RestAPI/list"> 
            <input type="submit" value="list 형태로 받기"/>
        </form>
    </body>

    <script>
    </script>
</html>

→ 기존에는 같은 프로젝트 내에 즉, 같은 서버에 있었기 때문에 그냥 사용이 가능했지만
→ 다른 곳에 있을 경우 사용..


기존에 사용하던 방법은 request 객체를 이용한 forward 방식이었다.
(※ forward 는 요청한 사람이 아닌 누구에게도 줄 수 있기 때문에 순수하게 요청(request)/응답(response) 의 개념은 아니라고 할 수 있다.)
→ 그래서 Model에 값을 넣고 페이지 이름을 반환하여 특정 페이지로 데이터를 보내는 형태이다.

REST 방식은 response를 이용한 방식으로, 요청을 보낸 사람에게만 응답할 수 있다.
그래서 요청을 보낸 페이지로 돌아가고 직접 내용을 보낼 수 없기 때문에 write로 보내줄 내용을 그려서 보내준다.
→ response 객체는 데이터를 담을 수 없다.
→ 요청하지 않은 다른 페이지로 돌아가고 싶을 경우 redirect 를 이용할 수 있다.

일반적으로 Restful Service 에서는 다음과 같은 method를 사용한다. (통상적인 약속)

  • GET : 특정 데이터를 조회 할때
  • POST : 특정 데이터를 요청 할때
  • DELETE : 특정 데이터를 삭제 할때
  • PUT : 특정 데이터를 수정 할때
  • PATCH : 특정 데이터를 일부 수정 할때
    ...

java에서 json 형태를 만들어 보내기
만약 GET 방식을 사용해 JSON 형태로 값을 보낸다고 했을 때 아래처럼 작성해줄 경우 당연히 404 에러가 발생한다.

@RequestMapping(value="/", method = RequestMethod.GET)
public String main() {
	return "{\"msg\":\"rest api 형태의 답변입니다.\"}";
}

그래서 @ResponseBody 어노테이션을 선언해줘야 한다 (추가하면 응답을 response로 하게된다.)

@RequestMapping(value="/", method = RequestMethod.GET)
@ResponseBody // 이걸 넣으면 이제부터 응답을 response 로 하게 된다.
public String main() {
	return "{\"msg\":\"rest api 형태의 답변입니다.\"}";
}

java에서는 json과 비슷한 데이터 타입을 활용해 보내는 것도 가능한데 예시로 Map과 class(DTO), List로 받는 코드를 살펴보자

Map

	@RequestMapping(value="/map", method = {RequestMethod.GET, RequestMethod.POST})
	@ResponseBody
	public Map<String, Object> map() { 
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("success", true);
		map.put("msg", "map 형태로 반환 성공");
		
		return map;
	}

→ 원래 Object 로 받으면 casting을 해줘야 하지만 java와 소통하는 것이 아닌 다른 곳에 던지는 것이기 때문에 casting 없이 사용이 가능하다.
🔽 결과 {"msg":"map 형태로 반환 성공","success":true}

DAO(=VO)

@RequestMapping(value="/object")
@ResponseBody
public UserInfo object() {
	
	UserInfo info = new UserInfo();
	info.setId("tester");
	info.setName("Lee");
	info.setAge(55);
	info.setSuccess(true);
	
	return info;
}

🔽 결과 : {"id":"tester","name":"Lee","age":55,"success":true}

List

@GetMapping(value="/list") 
@ResponseBody
public List<String> list(){
		
	List<String> list = new ArrayList<String>();
	list.add("하나");
	list.add("둘");
	list.add("셋");
	
	return list;
}

🔽 결과 : ["하나","둘","셋"]


그렇다면 위에서 설명했던 것처럼 url을 조금 더 단축시킬 수 있는 방법은 어떤게 있을까?

일단 기존 방식을 먼저 살펴보자

@GetMapping(value="/get")
@ResponseBody
public String param(String lec, String no) {
		
	return "{\"msg\":\""+lec+"과목의"+no+ "번째 글 내용\"}";
}

→ 이렇게 코드를 작성할 경우 url에 get?lec=java&no=1 형태로 작성해줘야 한다.

그럼 이렇게 긴 url을 get/java/1 형태로 변환하는 코드를 살펴보자

@GetMapping(value="/get/{lec}/{no}") 
@ResponseBody
public String urlPath(@PathVariable String lec, @PathVariable String no) {
	return "{\"msg\":\""+lec+"과목의"+no+ "번째 글 내용\"}";
}

→ Mapping과 파라미터 내용을 매칭되게 해주기 위해 @PathVariable 어노테이션을 사용해줘야 한다.


JSON

  • Restful 서비스의 반환 값은 일반적으로 XML 과 JSON 을 활용 한다.
  • 그 중 JSON 이 가장 대중적이다.
  • url 요청 내용에 JSON 으로 응답하는 서비스를 만들어 보자

→ 요청을 보낼때는 url / 데이터를 보낼때는 JSON

json을 쓰는 이유 = 웹을 하는 사람은 자바스크립트를 알기 때문에 누구나 알 수 있다고 해서 쓴다!

그런데 자바는 json을몰라서 jackson 이라는 라이브러리를 이용해 문자열 형태의 json을 자바의 객체 형태로 변경이 가능하다.

Spring Boot 에는 라이브러리가 내장되어 있다는 특징이 있었다.

DTO로도 받을 수 있다

rest service의 기본이 url로 끌어낼 수 있어야 한다 이기 때문에 보통 get을 사용한다.


profile
개발자가 되어보자

0개의 댓글