본문 바로가기
Web Develop/Book Study

[Book Study] 스프링 부트 핵심 가이드 - 5. API를 작성하는 다양한 방법

by tripleup 2023. 8. 30.
728x90
반응형

[Book Study] 스프링 부트 핵심 가이드
5. API를 작성하는 다양한 방법


 

5 - 1 프로젝트 설정

 

5 - 2 GET API 만들기

1. @RequestMapping으로 구현하기

 

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {

    //http://localhost:8080/api/v1/get-api/hello
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String getHello() {
        return "Hello World";
    }
}

 

@RequestMapping은 스프링 4.3 버전 이후로는 더 이상 사용되지 않는다,

@RequestMappig은 별다른 설정 없이 선언하면 HTTP의 모든 요청을 받는다.

그러므로 요청 형식을 설정하는 method=RequestMethod.GET 도 사용되지 않는다.

 


2. 매개변수가 없는 GET 메서드 구현

 

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {

    //http://localhost:8080/api/v1/get-api/name
    @GetMapping(value = "/name")
    public String getName() {
        return "Flature";
    }
}

 

요청할 때 스프링 부트 애플리케이션이 정해진 응답을 반환

 


3. @PathVariable을 활용한 GET 메서드 구현

 

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    //http://localhost:8080/api/v1/get-api/variable1/{String 값}
    @GetMapping(value = "/variable1/{variable}")
    public String getVariable1(@PathVariable String variable) {
        return variable;
    }
}

 

웹 통신의 기본 목적은 데이터를 주고받는 것이기 때문에 대부분 매개변수를 받는 메서드를 작성

매개변수를 받을 때 자주 쓰이는 방법 중 하나는 URL 자체에 값을 담아 요청하는 것

 

* 규칙

- GetMapping 어노테이션의 값으로 URL을 입력할 때 중괄호를 사용해 어느 위치에서 값을 받을지 지정

- 메서드의 매개변수와 그 값을 연결하기 위해 @PathVariable명시

- @GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름을 동일하게 맞춤

 

 

만약, 맞추기 어렵다면 @PathVariable 뒤에 괄호를 열어 @GetMapping 어노테이션의 변수명을 지정

 

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    //http://localhost:8080/api/v1/get-api/variable2/{String 값}
    @GetMapping(value = "/variable2/{variable}")
    public String getVariable2(@PathVariable("variable") String var) {
        return var;
    }
}

 

@PathVariable에는 변수의 이름을 특정할 수 있는 value 요소가 존재

이 위치에 변수 이름을 정의하면 매개변수와 매핑

 


4. @RequestParam을 활용한 GET 메서드 구현

 

쿼리형식으로 값을 전달

URI에서 '?'를 기준으로 우측에 '{키}={값}'  형태로 구성된 요청을 전송하는 방법

매개변수 부분에 @RequestParam 어노테이션을 명시해 쿼리 값과 매핑

 

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    //http://localhost:8080/api/v1/get-api/request1?name=value1&email=value2&organization=value3
    @GetMapping(value = "/request1")
    public String getRequestParam1(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam String organization) {
        return name + " " + email + " " + organization;
    }
}

 

키와 @RequestParam 뒤에 적는 이름을 동일하게 설정하기 어렵다면 @PathVariable 예제에서 사용한 방법처럼 value 요소로 매핑

 

 

만약 쿼리스트링에 어떤 값이 들어올지 모른다면 Map 객체를 활용 / 값에 상관없이 요청받기 가능

선택 항목에 대해서는 값을 기입하지 않을 때 Map 객체로 받는 것이 효율적

 

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    //http://localhost:8080/api/v1/get-api/request2?key1=value1&key2=value2
    @GetMapping(value = "/request2")
    public String getRequestParam2(
            @RequestParam Map<String, String> param) {
        StringBuilder sb = new StringBuilder();

        param.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n");
        });

        return sb.toString();
    }
}

 


5. DTO 객체를 활용한 GET 메서드 구현
 

DTO (Data Transfer Object)

- 다른 레이어 간의 데이터 교환

- 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체

- 데이터를 교환하는 용도로만 사용하는 객체이기 때문에 별도의 로직이 포함되지 않음

 

package com.springboot.api.dto;

public class MemberDto {

    private String name;
    private String email;
    private String organization;

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getOrganization() {
        return organization;
    }

    public void setOrganization(String organization) {
        this.organization = organization;
    }

    @Override
    public String toString() {
        return "MemberDto{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", organization='" + organization + '\'' +
                '}';
    }

}

 

DTO 클래스에 선언된 필드는 Controller의 메소드에서 쿼리 파라미터의 키와 매핑됨

쿼리스트링의 키가 정해져 있지만 받아야 할 파라미터가 많을 경우에는 DTO객체를 활용해 코드의 가독성을 높일 수 있음

 

package com.springboot.api.controller;

import com.springboot.api.dto.MemberDto;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    //http://localhost:8080/api/v1/get-api/request3?name=value1&email=value2&organization=value3
    @GetMapping(value = "/request3")
    public String getRequestParam3(MemberDto memberDto) {
        //return memberDto.getName() + " " + memberDto.getEmail() + " " + memberDto.getOrganization();
        return memberDto.toString();
    }

}

 


5 - 3 POST API 만들기

POST API

- 웹 애플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API

 

GET API : URL의 경로나 파라미텅 변수를 넣어 요청을 보냄

POST API : 저장하고자 하는 리소스 값을 HTTP (바디)에 담아 서버에 전달 (URI가 GET API에 비해 간단)

 

일반적으로 POST 형식의 요청은 클라이언트가 서버에 리소스를 저장하는 데 사용 -> 클라이언트의 요청 트래픽에 값이 포함되어 있음 -> 리소스를 담기 위해 HTTP Body에 값을 넣어 전송(JSON 형태로 값 입력)

 

package com.springboot.api.controller;


import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {

    //http://localhost:8080/api/v1/post-api/member
    @PostMapping(value = "/member")
    public String postMember(@RequestBody Map<String, Object> postData) {
        StringBuilder sb = new StringBuilder();

        postData.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n");
        });

        return sb.toString();
    }
}

 

@RequestBody : HTTP의 Body 내용을 해당 어노테이션이 지정된 객체에 매핑하는 역할

Map 객체 : 요청을 통해 어떤 값이 들어오게 될지 특정하기 어려울 떄 주로 사용


5 - 4 PUT API 만들기

PUT API

- 웹 애플리케이션 서버를 통해 데이터베이스 같은 저장소에 존재하는 리소스 값을 업데이트 하는 데 사용

- POST API와 컨트롤러 클래스를 구현하는 방법이 거의 동일 (HTTP Body 활용)

 

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {

    //http://localhost:8080/api/v1/put-api/member
    @PutMapping(value = "/member")
    public String postMember(@RequestBody Map<String, Object> putData) {
        StringBuilder sb = new StringBuilder();

        putData.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n");
        });

        return sb.toString();
    }
}

 

만약 서버로 들어오는 요청에 담겨 있는 값이 정해져 있는 경우에는 DTO 객체를 활용해 구현

 

package com.springboot.api.controller;

import com.springboot.api.dto.MemberDto;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {

    //http://localhost:8080/api/v1/put-api/member1
    @PutMapping(value = "/member1")
    public String postMemberDto1(@RequestBody MemberDto memberDto) {
        return memberDto.toString();
    }

    //http://localhost:8080/api/v1/put-api/member2
    @PutMapping(value = "/member2")
    public MemberDto postMemberDto2(@RequestBody MemberDto memberDto) {
        return memberDto;
    }

	//http://localhost:8080/api/v1/put-api/member3
    @PutMapping(value = "/member3")
    public ResponseEntity<MemberDto> postMemberDto3(@RequestBody MemberDto memberDto) {
        return ResponseEntity
                .status(HttpStatus.ACCEPTED)
                .body(memberDto);
    }
}

 

member1 결과

 

 

member2 결과

 

 

member3 결과

 


5 - 5 DELETE API 만들기

 

DELETI API

- 웹 애플리케이션 서버를 거쳐 데이터 베이스 등의 저장소에 있는 리소스를 삭제할 때 사용

- 서버에서는 클라이언트로부터 리소스를 식별 할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할 수행

- URI에 값을 넣어 요펑을 받는 형식으로 구현

 

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1/delete-api")
public class DeleteController {

    //http://localhost:8080/api/v1/delete-api/{String 값}
    @DeleteMapping(value = "/{variable}")
    public String DeleteVariable(@PathVariable String variable) {
        return variable;
    }

    //http://localhost:8080/api/v1/delete-api/request1?email-value
    @DeleteMapping(value = "/request1")
    public String getRequestParam1(@RequestParam String email) {
        return "e-mail : " + email;
    }

}

 

@DeleteMapping 어노테이션에 정의한 value의 이름과 메서드의 매개변수 이름을 동일하게 설정해야 삭제 할 값이 주입됨

@RequestParam 어노테이션을 통해 쿼리스트링 값도 받을 수 있

 


5 - 6 [한걸음 더] REST API  명세를 문서화하는 방법 - Swagger

명세 : API가 어떤 로직을 수행하는지 설명하고 이로직을 수행하기 위해 어떤 값을 요청하며, 이에 따른 응답값으로는 무엇을 받을 수 있는지를 정리한 자

 

 

 

 

5 - 7 [한걸음 더] 로깅 라이브러리 - Logback

Logback 설정
Logback 적용하기

 

728x90
반응형

댓글