본문 바로가기
👩‍💻 BackEnd/🌿 스프링 [Spring]

[SpringBoot] REST API (GET, POST, PUT, DELETE) 작성방법

by minhe2810 2023. 8. 31.

GET API 만들기 

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

1) RequestMapping을 이용한 방법 

import java.util.Map;

@RestController
@RequestMapping("/api/v1/get-api")   //url 사용 규칙 "_" 대신에 "-"사용하기
public class GetController {

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

swagger 화면

content-type : text / plain; charset=UTF-8  --> 일반 문자열 형태를 의미 

 

 

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

- 실무에서는 거의 안씀

    @GetMapping(value = "/hello")
    public String getHello(){
        LOGGER.info("getHello 메소드가 호출되었습니다. ");

        return "Hello World";
    }

3) @PathVariable을 활용한 GET 메서드 구현 (상세글 보기, 수정, 삭제하기 (굳이 파라미터명이 필요 없을 때))

- 실무에서는 매개변수를 받지 않는 메서드가 거의 쓰이지 않음. 

    // http://localhost:8090/api/v1/get-api/variable/{String 값}  
    // http://localhost:8090/api/v1/get-api/variable/바보
    // {}조건 : 1. 받는 쪽 이름은 블록 처리, 2. 메서드 매개변수 이름과 동일
    
    @GetMapping("/variable/{variable}")
    public String getVariable1(@PathVariable String variable){
        LOGGER.info("@PathVariable을 통해 들어온 값 : ", variable);

        return  variable;
    }

매핑된 변수명과  @PathVariable의 매개변수이름이 일치하지 않는 상황에서는 @PathVariable에 변수 명을 지정

    // http://localhost:8090/api/v1/get-api/variable2/{String 값}
    @GetMapping("/variable2/{variable}")
    public String getVariable2(@PathVariable("variable") String var){
        return  var;
    }

    // 여기까지는 파라미터 명 없이 값이 전달하는 방식
    // : 상세글 보기, 수정, 삭제하기 (굳이 파라미터명이 필요 없을 때)

4) @RequestParam을 활용한 GET 메서드 구현 (새 글 입력, 값을 수정했을 경우 값이 여러 개 전송 -> 파라미터명 필요)

 // http://localhost:8090/api/v1/get-api/request1?name=메롱&email=점심&organization=마라탕
 // http://localhost:8090/swagger-ui.html -->  ui dependency를 시켜놓아서 보이는 것
 
    @GetMapping(value = "/request1")
    public String getRequestParam1(
      @RequestParam String name,   //받아온 name속성은 이름을 의미하고 이는 비어있으면 안된다.
      @RequestParam String email,
      @RequestParam String organization){

        return name + " " + email + " " + organization;
    }

 

하지만 @RequestParam의 단점이 존재.

넘어오는 파라미터가 많을 경우 하나씩 다 써주기가 힘들다. 이 경우 파라미터의 개수에 따라서 내부 코드를 수정해줘야 하며 메서드를 추가적으로 생성해줘야 한다. 

따라서, 

  => 넘어오는 파라미터 개수 관계없이 파라미터 명은 키, value 묶어서 처리하면 한 번에 처리 가능

 

5) Map을 활용한 방법 

    // http://localhost:8090/api/v1/get-api/request2?key=메롱&key2=점심&organization=마라탕
    @GetMapping(value = "/request2")
    public String getRequestParam2(@RequestParam Map<String, String> param){
        StringBuilder sb = new StringBuilder();

        // **** map.emtrySet / foreach 사용하여 map에서 값 꺼내기 ****

        // map 이 갖고 있는 키와 값을  entrySet() : 키와 값을 한 쌍으로 추출 forEach를 사용하여 순차적으로 처리
        param.entrySet().forEach(map -> {   // map에서 꺼낸 값을 저장할 변수
            sb.append(map.getKey()+ " : "+ map.getValue() + "\n");
                // 키 추출                      // 값 추출
        });
        return sb.toString();
    }
    // String 타입 사용은 간단한 문자열 처리는 빠르지면 길 수록 처리속도가 느려짐 
    // 그래서 만들어진 것이 StringBuilder 객체 
    // append() 있어서 추가가 용이?
문자열을 더하거나 수정하는 작업에서 StringBuilder를 사용하면 좋은점 

1. 성능 향상 : 
- 문자열을 직접 더하고 수정하는 것 보다 StringBuilder를 사용하면 성능 향상 
- StringBuilder는 내부적으로 가변성을 가지며, 문자열을 변경할 때 새로운 객체를 생성하지 않고
  기존의 내용을 직접 조작할 수 있어서 메모리와 성능 측면에서 효율적 
2. 메모리 사용 감소 : 
- String(불변문자열) 객체는 더하거나 수정할 때 새로운 객체를 생성해야힘 > 메모리 낭비 
- StringBuilder(가변문자열)는 필요한 문자열을 조작, 새로운 객체 계속 생성하지 않아도 되므로 메모리 사용 줄어듦.
3. 코드 가독성 향상 : 
- 문자열을 더하거나 수정하는 코드를 StringBuilder를 사용하면 코드가 간결해짐. 
- 복잡한 연산들을 메서드 체인 형태로 사용할 수 있음.

 

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

- 여러 개의 데이터를 가지고 와야 하는 경우에는 DTO객체를 활용해 코드의 가독성을 높일 수 있다(코드의 양이 줄어듦). 

//http://localhost:8090/api/v1/get-api/request3?name=강민희&email=dfs&organization=마라탕

    @GetMapping(value = "/request3")
    public String getRequestParam3(MemberDto memberDTO){
        return memberDTO.toString();
    }

 


 

POST API 만들기

: 데이터 베이스 등의 저장소에 리소스를 저장할 때 사용되는 API

: GET API에서는 URL의 경로나 파라미터에 변수를 넣어 요청을 보냈지만 POST API에서는 이를 HTTP Body에 담아 서버에 전달한다. 

 

PostController 

1) RequestMapping을 이용한 방법 

:  GET API와 크게 다르지 않음 

// Post API : 데이터 베이스 등의 저장소에 리소스를 저장할 때 사용되는 API
@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {

    // 1. RequestMapping을 이용한 방법 , 리소스 없는 상태에서 단순 요청
    @RequestMapping(value = "/domain", method = RequestMethod.POST)
    public String postExample(){
        return "Hello Post API";
    }

2) @RequestBody를 이용한 방법 

: post 형식의 요청을 클라이언트가 서버에 리소스를 저장하는 데 사용한다. 

클라이언트의 요청 트래픽에 값이 포함돼 있다. 

즉, POST요청에 리소스를 담기 위해 HTTP Body에 값을 넣어 전송 

// 2. @RequestBody를 이용한 방법 , 리소스 전달
// http://localhost:8090/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();
}

 

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

PUT API 만들기

PutController 

: 애플리케이션 서버를 통해 데이터 베이스 같은 저장소에 존재하는 리소스 값을 업데이트하는 데 사용(POST API와 거의동일)

: 리소스를 서버에 전달하기 위해 HTTP Body를 활용해야 하기 때문이다. 

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

    // http://localhost:8090/api/v1/put-api/default
    @PutMapping(value = "/default")
    public String putMethod(){
        return "Hello World!";
    }

 

1) RequestBody를 활용한 put메서드 구현 

@RequestMapping(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();
}

* Map?

파라미터 부분에서 Map을 사용하였는데 어떤 형태의 데이터가 들어올지 모르는 경우 Map 형태로 작성한다. 

보통은 기본적인 설계를 잘못했을 경우(= 설계를 잘못해서 데이터를 싣고 다니는 DTO가 불안한 경우)에 Map형태를 사용

 

설계를 잘하면 Map을 쓸 일이 없다고 한다^^

 

만약 설계를 잘해두어 DTO, VO가 변수명 형태로 생성되어 있다면 Map이 아닌 VO객체로 받아도 되고 이 방법이 조금 더 좋은 방법이다. 

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

① toString() 를 활용하여 반환할 경우 

- Content-Type = text/plain    -> 결과값이 일반 문자열 형태로 전달 

 

② Dto 객체 반환할 경우 

- Content-Type = application/json -> 결과값이 json 형태로 반환됨

@RestController이 지정된 클래스 @ResponseBody 생략 가능 

어노테이션을 자동으로 값ㅇ르 json과 같은 형식으로 변환해서 전달하는 역할 수행 

 

2) ResponseEntity를 활용한 PUT메서드 구현 

- HttpEntity 클래스 존재 

- 이는 Header와 Body로 구성된 HTTP요청과 응답을 구성하는 역할을 수행 

- ResponseEntity와 RequestEntity는  HttpEntity를

- ResponseEntity는 서버에서 들어온 요청에 대해 응답 데이터를 구성해서 전달할 수 있음

 


 

DELETE API 만들기 

- 삭제기능 -> 식별할 수 있는 값을 받아와야 함. 

package com.springboot.api.controller;

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


//  DELETE API : 삭제 -> 식별할 수 있는 값을 받아와야 함.

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

    // 파라미터명이 없이 하나의 값만 이용해서 삭제할 때는PathVariable
    // 파라미터 명을 전달받아 사용할 때는 @RequestParam
    //  http://localhost:8090/api/v1/delete-api/{variable}
    @DeleteMapping(value = "/{variable}")
    public String DeleteVariable(@PathVariable String variable){
        return variable;
    }

    // 파라미터명을 전달받아 사용할 때는 @RequestParam
    //  http://localhost:8090/api/v1/delete-api/request1?email=value
    @DeleteMapping(value = "/request1")
    public String getRequestParam1 (@RequestParam String email) {  // String 부분 : 객체 타입도 가능함.
        return  "e-mail : " + email;
    }


}