Spring/Spring 문법

API와 HTTP 메서드

열심히 해 2024. 10. 19. 22:37

API 요약

Application Programming Interface, 소프트웨어 간 상호작용을 가능하게 하는 인터페이스 또는 프로토콜.

 

  1. API의 역할:
    • API는 두 시스템 간의 연결을 제공하여 서로 데이터를 교환하거나 기능을 호출할 수 있게 합니다.
    • 개발자들은 API를 통해 복잡한 내부 시스템을 직접 구현하지 않고도, 다른 시스템의 기능을 활용할 수 있습니다.
  2. 사용 예:
    • 웹 API: 웹 애플리케이션이나 서버가 인터넷을 통해 다른 서버나 서비스와 통신하기 위해 주로 사용됩니다. 예를 들어, 날씨 앱이 날씨 정보를 제공하는 서버의 API를 통해 실시간 날씨 데이터를 받아오는 경우.
    • 운영 체제 API: 운영 체제(API)를 통해 애플리케이션이 시스템 리소스(파일 시스템, 메모리 등)에 접근할 수 있습니다.
  3. 동작 방식:
    • API는 클라이언트서버 간의 상호작용을 기반으로 동작합니다. 클라이언트는 특정 요청을 서버에 보내고, 서버는 이에 대한 응답을 반환합니다.
    • 일반적으로 요청은 HTTP 프로토콜을 통해 이루어지며, JSON이나 XML 형식으로 데이터를 교환합니다.

 


 

HTTP 메서드 요약

스프링부트에서는 HTTP 메서드를 사용하여 API 엔드포인트를 정의하고, 클라이언트가 서버와 상호작용할 수 있게 합니다.

 

  • GET: 리소스 조회
  • POST: 새로운 리소스 생성
  • PUT: 리소스 전체 업데이트
  • PATCH: 리소스 부분 업데이트
  • DELETE: 리소스 삭제
  • HEAD: 메타데이터 조회
  • OPTIONS: 사용 가능한 메서드 확인

 

 


 

 

API의 유형

  1. REST API: 가장 많이 사용되는 API 유형으로, HTTP 메서드(GET, POST, PUT, DELETE)를 통해 CRUD 작업을 수행합니다. 리소스는 URI로 표현되고, 요청 및 응답 데이터는 주로 JSON 형식으로 전송됩니다.

  2. 라이브러리 API: 프로그램에서 사용할 수 있는 함수나 메서드들이 제공되는 API입니다. 예를 들어, 자바의 String 클래스는 여러 문자열 관련 메서드를 제공하는 API입니다.

  3. 운영 체제 API: 애플리케이션이 운영 체제의 리소스(예: 파일 시스템, 네트워크, 프로세스)에 접근할 수 있도록 하는 인터페이스입니다. 예를 들어, 윈도우 API는 애플리케이션이 윈도우의 기능을 사용할 수 있게 합니다.

  4. 하드웨어 API: 소프트웨어가 하드웨어와 통신하는 방법을 제공하는 API입니다. 예를 들어, 프린터나 카메라 등의 하드웨어 장치와 상호작용할 때 사용됩니다.

 

API의 장점

  1. 모듈성 및 재사용성:
    • API를 사용하면 특정 기능을 독립적으로 구현하고 여러 애플리케이션에서 재사용할 수 있습니다.
  2. 효율적인 통신:
    • API는 복잡한 기능을 단순화하여 클라이언트가 쉽게 요청을 보내고 결과를 받을 수 있도록 합니다.
  3. 확장성:
    • API는 다양한 클라이언트(웹, 모바일, 데스크탑 등)에서 동일한 서버의 기능을 사용할 수 있게 해줍니다.
  4. 보안:
    • API는 인증과 권한 관리를 통해 안전하게 데이터를 주고받을 수 있는 구조를 제공할 수 있습니다.

 

REST API 

REST(Representational State Transfer) API는 RESTful 아키텍처를 따르는 API로, 웹 상에서 데이터를 효율적으로 주고받는 데 적합한 설계를 따릅니다. REST API의 주요 원칙은 다음과 같습니다.

  • 리소스: 데이터나 서비스는 URI(Uniform Resource Identifier)를 통해 접근됩니다.
    • 예: GET /users/1는 ID가 1인 사용자의 정보를 조회.
  • 무상태성: 각 요청은 독립적이며, 서버는 이전 요청의 상태를 기억하지 않습니다.
  • 응답 코드: 서버는 클라이언트 요청에 대해 표준 HTTP 상태 코드를 반환합니다.
    • 200(성공), 201(생성됨), 400(잘못된 요청), 401(인증 필요), 404(찾을 수 없음), 500(서버 오류) 등.

 

 

예시: 날씨 정보를 제공하는 REST API

 

호출:

public String getWeather(String city, String date) {
    RestTemplate restTemplate = new RestTemplate();
    String url = "https://api.weather.com/weather?city=" + city + "&date=" + date;

    HttpHeaders headers = new HttpHeaders();
    headers.set("Authorization", "Bearer <access_token>");

    HttpEntity<String> entity = new HttpEntity<>(headers);
    ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);

    ObjectMapper objectMapper = new ObjectMapper();
    try {
        JsonNode root = objectMapper.readTree(response.getBody());
        return root.path("temperature").asText();
    } catch (Exception e) {
        e.printStackTrace();
        return "날씨 정보를 가져오는데 실패했습니다";
    }
}

 

 

응답:

{
        "city": "Seoul",
        "date": "2024-10-19",
        "temperature": 18,
        "description": "Sunny"
}

 


 

 

 

HTTP 메서드

 

1. GET

  • 역할: 서버에서 리소스를 조회할 때 사용됩니다.
  • 특징:
    • 서버에서 데이터를 요청하여 받아옵니다.
    • 데이터 조회 작업을 수행하며 서버의 상태나 데이터는 변경되지 않습니다.
    • 쿼리 파라미터를 통해 데이터를 필터링하거나 검색하는 데 자주 사용됩니다.
    • GET 요청은 캐시될 수 있으며, 브라우저에 의해 저장될 수 있습니다.
  • 예시: 
@GetMapping("/plans/{id}")
public ResponseEntity<PlanDto> getPlanById(@PathVariable Long id) {
    // Plan 조회 로직
}

 

2. POST

  • 역할: 서버에 새로운 리소스를 생성할 때 사용됩니다.
  • 특징:
    • 클라이언트에서 서버로 데이터를 전송하여 새로운 리소스를 생성합니다.
    • 서버 상태가 변화하며, 데이터베이스에 새로운 데이터가 추가됩니다.
    • 보통 요청 본문(body)에 데이터를 포함시킵니다.
  • 예시:
@PostMapping("/plans")
public ResponseEntity<PlanDto> createPlan(@RequestBody PlanDto planDto) {
    // Plan 생성 로직
}

 

3. PUT

  • 역할: 서버에 존재하는 리소스를 대체하거나 업데이트할 때 사용됩니다.
  • 특징:
    • 리소스 전체를 수정합니다. 부분 수정이 아닌, 전체 데이터를 갱신하는 경우 사용됩니다.
    • 리소스가 없다면 새로 생성할 수도 있습니다(이 경우 POST와 유사).
  • 예시:
@PutMapping("/plans/{id}")
public ResponseEntity<PlanDto> updatePlan(@PathVariable Long id, @RequestBody PlanDto planDto) {
    // Plan 전체 업데이트 로직
}

 

 

4. PATCH

  • 역할: 서버에 존재하는 리소스를 부분적으로 수정할 때 사용됩니다.
  • 특징:
    • PUT과 달리 리소스의 일부만 업데이트할 수 있습니다.
    • 일부 필드만 수정하는 상황에 적합합니다.
  • 예시: 
@PatchMapping("/plans/{id}")
public ResponseEntity<PlanDto> partialUpdatePlan(@PathVariable Long id,
                                                 @RequestBody Map<String, Object> updates) {
    // Plan 부분 업데이트 로직
}

 

5. DELETE

  • 역할: 서버에서 리소스를 삭제할 때 사용됩니다.
  • 특징:
    • 서버에서 특정 리소스를 삭제하고자 할 때 사용합니다.
    • 서버에서 해당 리소스가 사라지며, 데이터베이스에서 삭제 작업이 수행됩니다.
  • 예시:
@DeleteMapping("/plans/{id}")
public ResponseEntity<Void> deletePlan(@PathVariable Long id) {
    // Plan 삭제 로직
}

 

 

6. HEAD

  • 역할: 서버에 리소스의 메타데이터만 요청할 때 사용됩니다.
  • 특징:
    • GET과 유사하지만, 응답 본문(body)이 없는 요청입니다.
    • 헤더 정보만 반환받으며, 리소스의 존재 유무를 확인하는 데 유용합니다.
  • 예시:
@RequestMapping(value = "/plans/{id}", method = RequestMethod.HEAD)
public ResponseEntity<Void> checkPlanExists(@PathVariable Long id) {
    // Plan 존재 여부 확인
}

 

 

7. OPTIONS

  • 역할: 서버에서 특정 리소스에 대해 허용된 메서드 목록을 요청할 때 사용됩니다.
  • 특징:
    • 서버가 지원하는 HTTP 메서드를 클라이언트에게 알려주는 용도입니다.
    • 일반적으로 CORS(Cross-Origin Resource Sharing)와 관련된 작업에 사용됩니다.
  • 예시:
@RequestMapping(value = "/plans", method = RequestMethod.OPTIONS)
public ResponseEntity<Void> availableOptions() {
    return ResponseEntity.ok().allow(HttpMethod.GET, HttpMethod.POST, HttpMethod.OPTIONS).build();
}

'Spring > Spring 문법' 카테고리의 다른 글

ResponseEntity란 무엇일까?  (2) 2024.10.24
Spring MVC 와 3 Layer Architecture  (0) 2024.10.20
@PathVariable vs @RequestParam  (1) 2024.10.18
헤더와 바디  (3) 2024.10.16
Defendenceis  (1) 2024.10.15