Spring

[Spring] REST API 방식 (CRUD)

jane.dev 2021. 10. 2. 21:52
반응형

2021.09.30 - [Spring] - [Spring] REST(Representational State Transfer) API

 

[Spring] REST(Representational State Transfer) API

다른 소프트웨어로부터 지정된 형식으로 요청, 명령을 받을 수 있는 수단을 API(Application Programming Interface)라고 하는데 REST API는 Rest 아키텍처 스타일의 디자인 원칙을 준수하는 API SOAP과 REST 비교.

wheneveryouwantsz.tistory.com

 

TestVO 객체 정보

public class TestVO{
    private Integer mno;
    private String name;
    private Integer age;
}

 

먼저 Controller에서 Service를 호출하기위한 의존성 주입

@RestController
@RequestMapping("/crud")
public class Controller{
    @Autowired
    private TestService service;

 

Create

@PostMapping(value="/new", consumes="application/json", produces={MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> insert(@RequestBody TestVO vo){
    // 빈 entity 생성
    ResponseEntity<String> entity = null;
    // insert 로직을 실행하고 에러가 발생하지 않으면,
    try{
        service.insertTest(vo);
        entity = new ResponseEntity<String>("success", HttpStatus.OK);
    // insert 로직을 실행하고 에러가 발생하면,
    }catch(Exception e){
        e.printStackTrace();
        entity = new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
    }
    // try ~ catch 구문에서 얻은 entity를 반환
    return entity;
}

consumes

해당 메서드의 파라미터가 어떠한 형식으로 전달할지에 대한 설정으로 여기서 지정한 타입과 일치할 때 요청이 매칭됨

produces

입력받은 데이터를 토대로 로직을 실행하고 사용자에게 결과로 보여줄 데이터의 형식을 나타냄

여기서 작성된 TEXT_PLAIN_VALUE 는 문자열을 의미

ResponseEntity

REST 방식으로 호출되는 경우는 데이터 자체를 전송하는 방식으로 처리되기 때문에 요청한 쪽에서 해당 데이터가 정상적인지 구분할 수 있는 방법을 제공해야함

ResponseEntity 는 데이터와 함께 HTTP 헤더의 상태 코드와 에러메시지를 전달하기 때문에 확실한 결과를 알 수 있음

@RequestBody

JSON의 데이터를 원하는 타입의 객체로 변환해야 하는 경우에 사용

Request(전달된 요청)의 Body(내용)을 이용해 해당 파라미터의 타입으로 변환을 요구함

여기에서는 JSON 데이터를 서버에 보내 TestVO 객체러 변환을 요구

HttpStatus

BAD_REQUEST: 상태 코드 400으로 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음을 의미

OK: 상태 코드 200으로 요청이 성공적임을 의미하며 '성공적'의 의미는 HTTP 메서드에 따라 다름

여기서는 PostMapping으로 수행 결과에 대한 리소스가 메시지 바디에 전송되었음을 의미

 

Read

@GetMapping(value="/{mno}",
             produces={MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
public ResponseEntity<TestVO> select(@PathVariable("mno")int mno){
    ResponseEntity<TestVO> entity = null;
    try{
        entity = new ResponseEntity<TestVO>(service.selectTest(mno), HttpStatus.OK);
    }catch(Exception e){
        e.printStackTrace();
        entity = new ResponseEntity<TestVO>(HttpStatus.BAD_REQUEST);
    }
    return entity;
}

@PathVariable

REST 방식에서는 해당 어노테이션을 이용해 URL 상 경로의 일부를 파라미터로 사용

{}, 중괄호로 작성된 부분은 컨트롤러의 메서드내에서 변수로 처리가 가능하며, {bno}는  '~/경로?bno=값'과 같은 것으로 간주됨

 

Update

@RequestMapping(value="/{mno}",
                // @Put/PatchMapping을 사용하지 않고 RequestMethod에 두가지를 작성해 함께 처리
                method= {RequestMethod.PATCH, RequestMethod.PUT},
                consumes = "application/json", 
                produces = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<String> update(@RequestBody TestVO vo, @PathVariabe("mno")int mno){
    ResponseEntity<String> entity = null;
    try{
        // mno는 요청주소를 통해 전달받으며, 메서드 내부에서 setter를 통해 지정해줘야함
        vo.setMno(mno);
        service.updateTest(mno);
        entity = new ResponseEntity<String>("success", HttpStatus.OK);
    }catch(Exception e){
        entity = new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
    }
    return entity;
}

 

Delete

@DeleteMapping(value="/{mno}", produces={MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> delete(@PathVariable("mno")int mno){
    ResponseEntity<String> entity = null;
    try{
        service.deleteTest(mno);
        entity = new ResponseEntity<String>("success", HttpStatus.OK);
    }catch(Exception e){
        e.printStackTrace();
        entity = new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
    }
    return entity;
}