REST란 무엇이고, 어떻게 사용하는 거에요?? 아무것도 모르겠어요... ㅠㅠ 당연하다... 개발을 접하고 이것을 처음 접하는 사람은 그야말로 혼돈의 카오스에 사로잡힐 것입니다. 그래서 아주 간단하게 이해하기 쉽게... 간략한 설명과 사용방법에 대해서 코드로 풀어서 설명해보고자 합니다.
REST는 Representational State Transfer의 약자입니다. 말 그대로 전송에 대한 표현/규약 뭐... 이렇게 해석해 봐도 괜찮지 않을까요?? 사실 REST는 HTTP/1.1 스펙과 동시에 만들어졌습니다. 아파치 HTTP 서버 프로젝트의 공동설립자인 로이 필딩 (Roy Fielding)의 2000년 논문에서 처음 소개되었다고 하는데... HTTP의 설계상 우수성을 최대한 활용하고, 이를 위한 디자인 기준을 명확하게 하는 아키텍처 정도로 생각하면 될 듯 싶습니다.
또한, REST의 기본 원칙을 잘 지킨 서비스 디자인을 "RESTful 하다"라고 표현합니다. 그렇다면, REST는 아키텍처고 REST API = RESTful API는 그 아키텍처를 준수하는 API입니다.
그럼 REST에서 몇가지 알아두어야 할 정의를 살펴보겠습니다.
- REST API 중심규칙 및 구성
- HTTP Method 종류
[REST API 중심규칙 및 구성]
1. URI는 정보의 자원을 표현해야 한다.
- URI는 자원자체를 표현하는데 있어서, get create update와 같이 동사로 표현하지 않고 자원자체의 명사로만 표현
- 사실 가독성에 있어서 동사표현이 편할 수 있겠지만, 이는 Method로 처리하는게 규칙
2. 자원에 대한 행위는 HTTP Method로 표현해야 한다.
3. 자원에 대한 행위의 내용은 HTTP의 Message 내부에 추가하여 포함한다.
너무나 딱딱하고 이해가 잘 안가는 말들뿐이네요... 역시나 실습을 통한 이해가 가장 확실한 방법이겠지요?? 그렇다면 이전에 만들어 놓은 DB Table을 가지고 REST API를 구현해 보겠습니다. 구현할 대상은 아래의 목차로 진행하겠습니다.
아무래도 글이 너무나 길어질 수가 있어, 몇개로 나눠서 작성하겠습니다.
- GET - /URI : Get all list in target table
- GET - /URI/{id} : Get a list identified by "id" in target table
- POST - /URI : Insert a new list in target table
- PUT - /URI/{id} : Update a list identified by "id" in target table
- DELETE - /URI/{id} : Delete a list identified by "id" in target table
테스트의 전체 파일 구조는 아래와 같습니다.
1. GET - /URI
테이블에 있는 전체 list를 가져와 보도록 하겠습니다. URI는 간단하게 DB의 table 명으로 하겠습니다.
[Controller.java]
@ApiOperation(httpMethod = "GET"
,value = "전체 Station Mise 리스트 조회"
,notes = "Select All Station Mise List"
,response = UserDTO.class
,responseContainer = "ArrayList")
@RequestMapping(value = "/stationMise", method = RequestMethod.GET)
public ResponseEntity<ArrayList<StationMiseDTO>> selectStationMise(){
L.info("Select Station Mise Start");
return ResponseEntity.ok(userService.selectStationMise());
}
앞서 주로 설명했던 내용이라 설명은 생략하겠습니다.
[Service.java]
public ArrayList<StationMiseDTO> selectStationMise() {
return userMapper.selectStationMise();
}
[Mapper.java]
ArrayList<StationMiseDTO> selectStationMise();
[Mapper.xml]
<select id="selectStationMise" resultType="com.example.ayoteralab.main.dto.StationMiseDTO">
<![CDATA[
SELECT
STATION_NAME,
NO2_VALUE,
O3_VALUE,
PM10_VALUE,
PM25_VALUE,
DATE_TIME
FROM STATION_MISE
]]>
</select>
전에도 본 결과지만... 정상적으로 결과가 나옵니다.
[결과]
2. GET - /URI/{id}
이번에는 테이블에 있는 데이터에 대해서 해당 id로 검색한 결과를 가져와 보도록 하겠습니다. 동일한 경로로 id만 path로 추가하여 전송하는 방식입니다.
[Controller.java]
@ApiOperation(httpMethod = "GET"
,value = "선택 Station Mise 리스트 조회"
,notes = "Select Station Mise List by stationName"
,response = UserDTO.class
,responseContainer = "ArrayList")
@RequestMapping(value = "/stationMise/{stationName}", method = RequestMethod.GET)
public ResponseEntity<StationMiseDTO> selectStationMiseById(
@ApiParam(value = "stationName", required = true) @PathVariable("stationName") String stationName){
L.info("Select Station Mise by stationName Start");
return ResponseEntity.ok(userService.selectStationMiseById(stationName));
}
/{stationName}으로 추가합니다. 그리고 해당 경로로 들어온 값은 @PathVariable annotation을 사용해서 받아옵니다. 추가적으로 @ApiParam은 swagger에서 사용하는 annotation 입니다.
이후 Service와 Mapper가 기존과 달라지는 점은... parameter를 계속 데리고 다니는 점 빼곤없습니다.
[Service.java]
public StationMiseDTO selectStationMiseById(String stationName) {
return userMapper.selectStationMiseById(stationName);
}
[Mapper.java]
StationMiseDTO selectStationMiseById(String stationName);
[Mapper.xml]
<select id="selectStationMiseById" resultType="com.example.ayoteralab.main.dto.StationMiseDTO">
<![CDATA[
SELECT
STATION_NAME,
NO2_VALUE,
O3_VALUE,
PM10_VALUE,
PM25_VALUE,
DATE_TIME
FROM STATION_MISE
WHERE STATION_NAME = #{stationName}
]]>
</select>
SQL Query에서는 Mapper.java에서 전달된 parameter를 #{ }의 방식으로 사용이 가능합니다.
[결과]
이렇게 REST API의 HTTP Method중 GET에 대해서 알아보았습니다.
-Ayotera Lab-
댓글