본문 바로가기
  • 소소한 개발자 이야기
Software/Spring Boot 핵심 가이드

05_스프링부트 API 작성하기

by Siwan_Min 2023. 5. 7.
728x90

5.1 GET API 만들기

GET API: 웹 애플리케이션 서버에서 값을 가져올 때 사용하는 API.

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

@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";
    }
}
  • @RequstMapping 어노테이션을 별다른 설정 없이 선언하면 HTTP의 모든 요청을 받는다.
  • GET 요청만 받기 위해서는 어노테이션에 별도 설정이 필요
    - method = RequestMethod.GET
  • 스프링 4.3 버전 이후로는 새로 나온 어노테이션을 사용하기 때문에 @RequsetMapping 어노테이션은 불필요
    - @GetMapping
    - @PostMapping
    - @PutMapping
    - @DeleteMapping

5.2.2 @Pathvariable 을 활용한 GET 메서드 구현

  • 실무 환경에서 매개변수를 받지 않는 메서드가 거의 쓰이지 않는다.
  • 웹 통신의 기본 목적은 데이터를 주고받는 것 때문에 대부분 매개변수를 받는 메서드를 작성하게 된다.

PathVariable 을 활용한 GET 메서드 구현

// <http://localhost:8080/api/v1/get-api/variable1/>{String 값}
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
    return variable;
}
  • 중괄호({})로 표시된 위치의 값을 받아 요청하는 것
  • 값을 간단히 전달할 때 주로 사용하는 방법, GET 요청에서 많이 사용
  • @GetMapping 어노테이션의 값으로 URL을 입력할 때 중괄호를 사용해 어느 위치에서 값을 받을지 정해야 함.

PathVariable에 변수명을 매핑하는 방법

// <http://localhost:8080/api/v1/get-api/variable2/>{String 값}
@GetMapping(value = "/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
    return var;
}
  • @PathVariable 에는 변수의 이름을 특정할 수 있는 value 요소가 존재

5.2.3 @RequsetParam을 활용한 GET 메서드 구현

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

  • 쿼리 형식으로 값을 전달
  • URI 에서 ‘?’ 를 기준으로 우측에 ‘{키}={값}’ 형태로 구성된 요청을 전송하는 방법
  • 쿼리스트링에는 키가 모두 적혀 있기 때문에 이 값을 기준으로 메서드의 매개변수에 이름을 매핑하면 값을 가져올 수 있다.
// <http://localhost:8080/api/v1/get-api/request1?name=value&email=value2&organization=value3>
@GetMapping(value = "/request1")
public String getRequestParam1 (
        @RequestParam String name,
        @RequestParam String email,
        @RequestParam String organization ) {
    return name + " " + email + " " + organization;
}

@RequestParam과 Map을 조합한 GET 메서드 구현

  • 쿼리스트링에 어떤 값이 들어올지 모른다면 Map 객체를 활용할 수 있다.
  • 회원 가입 API에서 필수 항목이 아닌 취미 같은 선택 항목에 대해서는 값을 기입하지 않는 경우가 있다. 이러한 경우에는 매개변수의 항목이 일정하지 않을 수 있어 Map 객체로 받는 것이 효율적입니다.
// <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();
}

Tip URI와 URL의 차이

  • URL: 웹 주소
  • URI: 특정 리소스를 식별할 수 있는 식별자 웹에서는 URL을 통해 리소스가 어느 서버에 위치해 있는지 알 수 있으며, 그 서버에 접근해서 리소스에 접근하기 위해서는 대부분 URI가 필요하다.

 

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

  • Data Transfer Object의 약자로, 다른 레이어 간의 데이터 교환에 활용
  • 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체
  • 별도의 로직이 포함되지 않는다.
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 + '\\'' +
                '}';
    }
}

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

5.2 POST API 만들기

  • POST API는 웹 애플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API이다.
  • POST API 에서는 저장하고자 하는 리소스나 값을 HTTP 바디에 담아 서버에 전달한다. 그래서 URI가 GET API에 비해 간단하다.

5.2.1 @RequestMapping으로 구현하기

@RequestMapping 사용 예

@RequestMapping(value = "/domain", method = RequestMethod.POST)
public String postExample() {
    return "Hello Post API";
}

5.2.2 @RequestBody를 활용한 POST 메서드 구현

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

  • POST 형식의 요청은 클라이언트가 서버에 리소스를 저장하는 데 사용
  • POST 요청에서는 리소스를 담기 위해 HTTP Body에 값을 넣어 전송
  • 일반적으로 JSON 형식으로 전송

@RequestBody와 Map을 활용한 POST API 구현

DTO 객체를 활용한 POST API 구현

// <http://localhost:8080/api/v1/post-api/member2>
@PostMapping(value = "/member2")
public String postMemberDto(@RequestBody MemberDto memberDto) {
    return memberDto.toString();
}

위와 같이 @RequestBody를 사용하여 작성하면 MemberDto의 변수를 요청 메시지의 키와 매핑해 값을 가져온다.

 

5.3 PUT API 만들기

  • 웹 애플리케이션 서버를 통해 데이터베이스 같은 저장소에 존재하는 리로스 값을 업데이트 하는 데 사용
  • 리소스를 서버에 전달하기 위해 HTTP Body 를 활용

5.3.1 @RequestBody를 활용한 PUT 메서드 구현

@RequestBody와 Map을 활용한 PUT 메서드 구현

@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 객체를 활용한 PUT 메서드 구현

//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;
}

 

DTO 타입

  • RestController 어노테이션이 지정된 클래스는 @ResponseBody 를 생략할 수 있는데, @ResponseBody 어노테이션은 자동으로 값을 JSON과 같은 형식으로 변환해서 전달하는 역할을 수행

5.3.2 @ResponseEntity를 활용한 PUT 메서드 구현

HttpEntity 클래스

스프링 프레임워크에는 HttpEntity라는 클래스가 있다. HttpEntity는 다음과 같이 헤더(Header)와 Body로 구성된 HTTP 요청과 응답을 구성하는 역할을 수행

  • RequestEntity와 ResponseEntity는 HttpEntity를 상속받아 구현한 클래스이다.
  • ResponseEntity는 서버에 들어온 요청에 대해 응답 데이터를 구성해서 전달할 수 있게 한다.
  • ResponseEntity는 HttpEntity로부터 HttpHeaders와 Body를 가지고 자체적으로 HttpStatus를 구현한다.

ResponseEntity를 활용한 PUT메서드 구현

5.4 DELETE API 만들기

  • 웹 애플리케이션 서버를 거쳐 데이터베이스 등의 저장소에 있는 리소스를 삭제할 때 사용
  • 서버에서는 클라이언트로부터 리소스를 식별할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할을 수행

5.4.1 @PathVariable과 @RequestParam을 활용한 DELETE 메서드 구현

@PathVariale을 활용한 DELETE 메서드 구현

// <http://localhost:8080/api/v1/delete-api/>{String 값}
@DeleteMapping(value = "/{variable}") // value 이름과 메서드의 매개변수 이름을 동일하게 설정해야 삭제할 값이 주입된다.
public String DeleteVariable(@PathVariable String variable) {
    return variable;
}

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

@RequestParam을 활용한 DELETE 메서드 구현

// <http://localhost:8080/api/v1/delete-api/v1/delete-api/request1?email=value>
@DeleteMapping(value = "/request1")
public String getRequestParam1(@RequestParam String email) {
    return "e-mail : " + email;
}
  • @RequestParam 어노테이션을 통해 쿼리스트링 값을 받을 수 있다.
728x90

댓글