API 요약
Application Programming Interface, 소프트웨어 간 상호작용을 가능하게 하는 인터페이스 또는 프로토콜.
- API의 역할:
- API는 두 시스템 간의 연결을 제공하여 서로 데이터를 교환하거나 기능을 호출할 수 있게 합니다.
- 개발자들은 API를 통해 복잡한 내부 시스템을 직접 구현하지 않고도, 다른 시스템의 기능을 활용할 수 있습니다.
- 사용 예:
- 웹 API: 웹 애플리케이션이나 서버가 인터넷을 통해 다른 서버나 서비스와 통신하기 위해 주로 사용됩니다. 예를 들어, 날씨 앱이 날씨 정보를 제공하는 서버의 API를 통해 실시간 날씨 데이터를 받아오는 경우.
- 운영 체제 API: 운영 체제(API)를 통해 애플리케이션이 시스템 리소스(파일 시스템, 메모리 등)에 접근할 수 있습니다.
- 동작 방식:
- API는 클라이언트와 서버 간의 상호작용을 기반으로 동작합니다. 클라이언트는 특정 요청을 서버에 보내고, 서버는 이에 대한 응답을 반환합니다.
- 일반적으로 요청은 HTTP 프로토콜을 통해 이루어지며, JSON이나 XML 형식으로 데이터를 교환합니다.
HTTP 메서드 요약
스프링부트에서는 HTTP 메서드를 사용하여 API 엔드포인트를 정의하고, 클라이언트가 서버와 상호작용할 수 있게 합니다.
- GET: 리소스 조회
- POST: 새로운 리소스 생성
- PUT: 리소스 전체 업데이트
- PATCH: 리소스 부분 업데이트
- DELETE: 리소스 삭제
- HEAD: 메타데이터 조회
- OPTIONS: 사용 가능한 메서드 확인
API의 유형
- REST API: 가장 많이 사용되는 API 유형으로, HTTP 메서드(GET, POST, PUT, DELETE)를 통해 CRUD 작업을 수행합니다. 리소스는 URI로 표현되고, 요청 및 응답 데이터는 주로 JSON 형식으로 전송됩니다.
- 라이브러리 API: 프로그램에서 사용할 수 있는 함수나 메서드들이 제공되는 API입니다. 예를 들어, 자바의 String 클래스는 여러 문자열 관련 메서드를 제공하는 API입니다.
- 운영 체제 API: 애플리케이션이 운영 체제의 리소스(예: 파일 시스템, 네트워크, 프로세스)에 접근할 수 있도록 하는 인터페이스입니다. 예를 들어, 윈도우 API는 애플리케이션이 윈도우의 기능을 사용할 수 있게 합니다.
- 하드웨어 API: 소프트웨어가 하드웨어와 통신하는 방법을 제공하는 API입니다. 예를 들어, 프린터나 카메라 등의 하드웨어 장치와 상호작용할 때 사용됩니다.
API의 장점
- 모듈성 및 재사용성:
- API를 사용하면 특정 기능을 독립적으로 구현하고 여러 애플리케이션에서 재사용할 수 있습니다.
- 효율적인 통신:
- API는 복잡한 기능을 단순화하여 클라이언트가 쉽게 요청을 보내고 결과를 받을 수 있도록 합니다.
- 확장성:
- API는 다양한 클라이언트(웹, 모바일, 데스크탑 등)에서 동일한 서버의 기능을 사용할 수 있게 해줍니다.
- 보안:
- 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 |