키보드워리어

[스프링] REST API정리 본문

Spring framework/REST API

[스프링] REST API정리

꽉 쥔 주먹속에 안경닦이 2023. 4. 8. 09:54
728x90

안녕하세요 【키보드 워리어】블로그

 

⌨🗡🧑 블로그 방문자 여러분, 안경닦이입니다.

오늘은 REST API에 관한 포스팅을 하려고 합니다.

 

처음 자바 공부를 시작할 때만 해도

Hello World를 찍던 제가 REST API를 포스팅하는 날도 오네요..


REST API?

 

REST API는 웹 애플리케이션에서 데이터를 주고받을 수 있는 인터페이스를 제공하는 기술입니다. REST API는 HTTP 프로토콜을 사용하여 데이터를 전송하며, URI(Uniform Resource Identifier)를 사용하여 자원을 표현합니다. REST API는 다음과 같은 특징을 갖습니다.
참고자료: https://meetup.nhncloud.com/posts/92

 

REST API 제대로 알고 사용하기 : NHN Cloud Meetup

REST API 제대로 알고 사용하기

meetup.nhncloud.com

개발자 선배님께서 쓰신 블로그 ㅎㅎ 저도 항상 참고하고 있습니다.

 

간단히 얘기하면 REST는 웹을 위한 조건입니다.

 

 

 

자원 (URL)

 

자원(URI) : REST API는 URI를 통해 자원을 표현합니다. 자원은 데이터의 단위를 의미합니다. 예를 들어, /user, /product 등의 URI를 사용하여 사용자 정보나 상품 정보와 같은 데이터를 표현할 수 있습니다.

 

하지만 많은 자원들이 생긴 이후에, 이것들이 강하게 결합되어 있다면 호환성이 강하기 때문에 하나의 변경점이 생겨도 결합되어있는 다른 내용들까지 전부 변경해야하는 문제가 생겨나게 됩니다.

 

restAPI는 자원을 잘 활용하기 위해서 몇가지 규칙들을 만들고 활용시킵니다.

그리고 이러한 자원을 쓸 때는 동사(Verb)를 쓰지 않고 명사로 표현합니다.

 

 

CRUD

REST API는 HTTP 프로토콜을 사용하여 데이터를 전송합니다. HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 자원에 대한

CRUD(Create, Read, Update, Delete) 작업을 수행합니다.

 

아래와 같이 자바코드를 통해서 To Do List에 대한 내용을 간단하게 만들어 볼 수 있습니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

import jakarta.validation.ConstraintViolationException;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;


@RestController
@RequestMapping("/todolist")
public class ToDoListController {
    @Autowired
    private ToDoListRepository toDoListRepository;
    
    //페이징 처리하여 모든 To Do List 목록 가져오기
    @GetMapping("")
    public ResponseEntity<List<ToDoList>> getAllToDoList(
            @RequestParam(defaultValue = "0") int pageNo,
            @RequestParam(defaultValue = "5") int pageSize) {
    	// 페이지 정보와 정렬 정보 설정
    	Pageable pageable = PageRequest.of(pageNo, pageSize, Sort.by("id"));
    	// 페이지 결과 객체 반환
        Page<ToDoList> pagedResult = toDoListRepository.findAll(pageable);
        // 페이지 내용을 List로 반환하여 응답
        List<ToDoList> todos = pagedResult.getContent();
        return ResponseEntity.ok(todos);
}
        //http://localhost:8080/todolist?pageNo=1&pageSize=5
    
 // Main 페이지 요청에 대한 응답 *삭제
    @GetMapping("/main")
    public ResponseEntity<String> getMainResponseEntity() {
        return ResponseEntity.ok("<h1>This is My To Do List page.<h1>");
    }

 // 특정 To Do List 조회
    @GetMapping("/{id}")
    public ResponseEntity<ToDoList> getToDoListById(@PathVariable("id") Long id) {
        ToDoList toDoList = toDoListRepository.findById(id).orElseThrow(() -> new ToDoListNotFoundException("ToDoList's ID not found"));
        return ResponseEntity.ok(toDoList);
    }
    
 // 새로운 To Do List 생성
    @PostMapping("")
    public ResponseEntity<ToDoList> createToDoList(@RequestBody ToDoList toDoList) {
        ToDoList newToDoList = toDoListRepository.save(toDoList);
        return ResponseEntity.ok(newToDoList);
    }
 // To Do List 업데이트
    @PutMapping("/{id}")
    public ResponseEntity<ToDoList> updateToDoList(@PathVariable("id") Long id, @RequestBody ToDoList toDoList) {
        Optional<ToDoList> optionalToDoList = toDoListRepository.findById(id);
        ToDoList existingToDoList = optionalToDoList.orElseThrow(() ->
                new ResponseStatusException(HttpStatus.NOT_FOUND, "ToDoList not found"));
        existingToDoList.setDate(toDoList.getDate());
        existingToDoList.setMemo(toDoList.getMemo());
        ToDoList updatedToDoList = toDoListRepository.save(existingToDoList);
        return ResponseEntity.ok(updatedToDoList);
    }
 // To Do List 삭제
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteToDoList(@PathVariable("id") Long id) {
        toDoListRepository.deleteById(id);
        return ResponseEntity.noContent().build();
    }
 // 유효성 검사 예외 처리
    @ExceptionHandler(ConstraintViolationException.class) //유효성 검사 처리
    public ResponseEntity<Object> handleValidationErrors(ConstraintViolationException ex) {
        Map<String, Object> errors = new HashMap<>();
        errors.put("timestamp", LocalDateTime.now());
        errors.put("errors", ex.getConstraintViolations().stream().map(violation -> violation.getMessage()).collect(Collectors.toList()));
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
    }
}

저는 @RestController 어노테이션을 사용했습니다.

스프링 프레임워크에서 제공해 주는 어노테이션으로, RESTful 웹 서비스를 만들 때 사용됩니다.

@RestController를 사용하면 해당 컨트롤러의 모든 메서드가 @ResponseBody를 포함됩니다.

즉, HTTP 요청에 대한 응답으로 객체를 직접 반환할 수 있게 됩니다.

이는 컨트롤러 메서드의 반환 타입이 HTTP 응답 본문에 직접 작성되어 클라이언트(유저)에 전달되도록 하는 것입니다.


이렇게 REST API는 URI를 통해 자원을 표현하고, HTTP 메서드를 사용하여 자원에 대한 작업을 수행합니다. 이때, 데이터는 다양한 형태의 Representations(JSON, XML, HTML 등)으로 전송될 수 있습니다.

 

요청 (Request) | 응답 (Response)

REST API를 사용하면, 웹 애플리케이션에서 데이터를 효율적으로 전송하고 처리할 수 있죠..! 다양한 클라이언트 환경에서 (브라우저, 앱 등) 데이터를 요청하고 응답할 수 있으며, 다양한 서버(데이터베이스, 파일 시스템 등)에서 데이터를 처리할 수 있습니다.

 

서버는 데이터만 전달해주면 끝!

클라이언트는 데이터를 받아서 UI를 표시해주면 끝! 서로 관심사를 달리해줍니다.

 

이건 제가 간단하게 만든 REST API를 구글 크롬 브라우저를 통해 확인하고 있는 화면이에요.

F12키를 눌러보면 네트워크 -> 헤더에서 요청헤더를 확인해 볼 수 있어요.

Get요청을 하고 있군요.

REST API 응답
REST API 응답

[응답] 탭에서도 볼 수 있습니다.

 

보시는 것처럼, 웹 응용 프로그램이 동작하는 과정에서 브라우저에 URL을 입력하면,

브라우저는 HTTP 요청을 생성하여 웹 서버로 전송합니다.

 

이 요청은 웹 서버의 코드로 입력되고, 웹 서버는 HTTP 요청의 콘텐츠를 기반으로 HTTP 응답을 생성하고 출력합니다.

HTTP 응답은 다시 브라우저로 전송되어 페이지가 표시됩니다.

 

한번 확인해보고 싶으시다면 Google 크롬 확장 프로그램에서

Talend API Tester를 다운로드하여서 잘 작동하는지 확인해 볼 수 있어요.

https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ko 

 

Talend API Tester - Free Edition

Visually interact with REST, SOAP and HTTP APIs.

chrome.google.com

 
 
 
 

 

참고하시면 좋은 글 추천

https://www.youtube.com/watch?v=Tm2mja5_dZs
 
restAPI를 소개하는 10분 테코톡 영상입니다. 
728x90