Spring boot - API 작성 방법2

hee·2022년 10월 28일
0

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

DTO란?
DTO는 Data Transfer Object의 약자이며 다른 레이어 간의 데이터 교환에 활용 됩니다. 간략하게 설명하자면 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체 입니다.


DTO 클래스에는 전달하고자 하는 필드 객체를 선언하고 gettet,setter 메서드를 구현 합니다. DTO 클래스에서 선언된 필드는 컨트롤러의 메서들에서 쿼리 파라미터의 키와 매핑됩니다. 쿼리스트링의 키가 정해져 있지만 받아야 할 파라미터가 많을 경우에는 DTO 객체를 활용해 코드의 가독성을 높일 수 있고 코드의 양도 줄일 수 있습니다.

메서드 호출 결과는 작성한 코드대로 출력되는 것을 확인 할 수 있습니다.

POST API 만들기 (insert에 주로 사용)

POST API는 웹 애플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 떄 사용되는 API 입니다. GET API에서는 URL의 경로나 파라미터에 변수를 넣어 요청을 보냈지만 POST API는 저장하고자 하는 리소스나 값을 HTTP 바디에 담아 서버에 전달 합니다.
controller 패키지에 PostController라는 이름의 클래스를 생성하고 @RequestMapping을 이용해 공통 URL을 설정 합니다.

@RequestMapping으로 구현하기

POST API 에서 @RequestMapping를 사용하는 방법은 GET API와 유사 합니다. 요청 처리 메서드 요소를 RequestMethod.POST 로 설정하면 됩니다.

위와 같이 메서드를 작성하고

메서드를 호출해주면 return 이 반환되어 출력 됩니다.

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

일반적으로 POST 형식의 요청은 클라이언트가 서버에 리소스를 저장하는 데 사용합니다. 그러므로 클라이언트의 요청 트래픽에 값이 포함돼 있습니다. 즉, POST 요청에서는 리소스를 담기 위해 HTTP body에 값을 넣어 전송 합니다.

Body 영역에 작성되는 값은 일정한 형태를 취합니다. 일반적으로 JSON(JavaScript Object Notation) 형식으로 전송됩니다. 이렇게 Body를 통해 들어온 요청은 아래의 코드로 처리 합니다.

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

위의 코드를 보면 가장 위에 @PostMapping을 사용 하였습니다. @RequestMapping을 사용하면 method 요소를 정의해줘야 하지만 @PostMapping을 사용하면 그럴 필요가 없기 때문 입니다. @RequestBody 라는 어노테이션은 HTTP의 Body 내용을 해당 어노테이션이 지정된 객체에 매핑하는 역할을 합니다.

JSON이란? JavaScript Object Notation의 줄임말로 자바스크립트의 객체 문법을 따르는 문자 기반의 데이터 포맷입니다. 대체로 네트워크를 통해 데이터를 전달할때 사용하며,문자열 형태로 작성되기 때문에 파싱도 쉽게 할 수 있다는 장점을 가지고 있습니다.

위의 코드는 Map 객체를 사용하였습니다. 요청을 통해 어떤 값이 들어오게 될지 특정하기 어려울 떄 주로 사용하고 들어갈 값이 정해져 있다면 DTO 객체를 매개변수 삼아서 작성할 수 있습니다.

@PostMapping(value = "/member2")
    public String postMemberDto(@RequestBody MemberDto memberDto){
        return memberDto.toString();
    }

위의 코드는 DTO 코드 입니다.

PUT API 만들기

PUT API는 웹 애플리케이션 서버를 통해 데이터베이스 같은 저장소에 존재하는 리소스 값을 업데이트 하는 데 사용합니다. POST API와 비교하면 요청을 받아 실제 데이터베이스에 반영하는 과정에서 차이가 있지만 컨트롤러 클래스를 구현하는 방법은 POST API와 거의 동일 합니다. PUT API도 리소스를 서버에 전달하기 위해 HTTP Body를 활용해야 하기 때문입니다.

@RequesBody를 활용한 PUT 메서드 구현

PUT API 는 POST 메서드와 마찬가지로 값을 HTTP Body에 담아 전달 합니다. PUT API도 어떤 값이 들어올지 모를때 Map 객체를 받아 메서드를 구현할 수 있습니다.

@PutMapping(value =  "/member4")
    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 객체를 활용해 구현 합니다.

   @PutMapping(value = "/member5")
   public String postMemberDto1(@RequestBody MemberDto memberDto){
       return memberDto.toString();
   }
   @PutMapping(value = "/member6")
   public MemberDto postMemberDto2(@RequestBody MemberDto memberDto){
       return memberDto;
   }

위의 코드에서는 첫번째 메서드와 두번째 메서드의 타입이 다릅니다. 첫번째 메서드는 String 타입이고, 두번째 메서드는 DTO 객체 타입 입니다.
두 메서드의 요청에 응답 결과를 비교해 보겠습니다.


두 메서드의 응답 결과가 다른것을 확인 할 수 있습니다. 첫번째 메서드는 DTO 객체의 toString 메서드 결과 값이 출력 된 것이고 두번째 메서드는 @ResponseBody 어노테이션은 자동으로 값을 JSON과 같은 형식으로 변환해서 전달하는 역할을 수행하기 때문에 형식을 그대로 유지한 채 출력 됩니다.

ResponseEntity를 활용한 PUT 메서드 구현

스프링 프레임워크에는 HttpEnity를 상속 받은 ResponseEnity 클래스를 활용하면 응답 코드 변경은 물론 header와 body를 더욱 쉽게 구성할 수 있습니다.

@PutMapping("/member7")
    public ResponseEntity<MemberDto> putMember(@RequestBody MemberDto memberDto) {
        return ResponseEntity
                .status(HttpStatus.ACCEPTED)
                .body(memberDto);
    }

위에 코드는 ResponseEntity를 활용한 PUT 메서드 구현 코드 입니다.
메서드의 리턴 타입을 ResponseEntity로 구성하고 리턴 값을 만드는데 status에 넣을 수 있는 값을 다양 합니다. 예제에서 사용한 HttpStatus.ACCEPTED는 응답 코드가 202로 변경 됩니다.

응답 코드가 202로 변경 된것을 확인하실 수 있습니다.

DELETE API 만들기

DELETE API는 웹 애플리케이션 서버를 거쳐 데이터베이스 등의 저장소에 있는 리소스를 삭제할 때 사용합니다. 서버에서는 클라이언트로부토 리소스를 식별할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할을 수행 합니다. 이때 커트롤러를 통해 값을 받는 단계에서는 간단한 값을 받기 때문에 GET 메서드와 같이 URL에 값을 넣어 요청을 받는 형식으로 구현 됩니다. DELETE API는 GET과 유사하기 때문에 코드만 적어 두겠습니다.

@PathVariable을 활용한 구현

 @DeleteMapping(value = "/{variable}")
    public String DeleteVariable(@PathVariable String variable){
        return variable;
    }

@RequestParam을 활용한 구현

@DeleteMapping(value = "/request3")
    public String getRequestParam1(@RequestParam String email){
        return "e-mail:" + email;
    }

Swagger

  • REST API 설계,빌드,문서화 하는데 도움이 되는 OpenAPI 사양을 중심으로 구축된 오픈 소스 도구 세트
  • 코드 몇 줄 추가를 통해 적용하기 쉬우며 문서 화면에서 UI를 통해 바로 API 테스트가 가능한 장점이 있습니다.

0개의 댓글

관련 채용 정보