본문 바로가기

etc/개발 Note

Spring Boot Web을 이용해 rest api빌드하기, 테스트

728x90

 

Spring Boot Web을 이용해 Rest API서버를 만들어서 Hello를 출력 해보겠습니다.

I.프로젝트 빌드

Spring Initializr로 빌드 합니다. 저는 Ultimit버전을 쓰고 있습니다. 아니면 Spring.io에서 이 과정을 거쳐도 됩니다.

 

Dependency에 Spring Web을 선택 합니다.

 

Finish를 누르면 끝 입니다.

 

프로젝트가 새로 만들어지고 빌드까지 완료 되었습니다.

 

package를 하나 추가 합니다.

 

저는 com.springjunit01.controllers라는 패키지를 추가 했습니다.

 

 

HelloController Class를 한개 만들어 줍니다.

 

이런 구조가 되겠죠?

 

아래는 HelloController의 내용입니다.

@RestController
public class HelloController {
    @GetMapping("/hello")
    public ResponseEntity<List<String>> hello(@RequestParam(name = "name", defaultValue = "World") String name) {
        List<String> list = new ArrayList<>();
        list.add("hhh");
        list.add("fff");
        return ResponseEntity.ok(list);
    }
}

 

위 클래스는 몇줄 안되지만 많은 내용을 담고 있습니다.

1. @RestController로 이 Class가 Restapi중 일부라는 것을 선언 하고 있습니다.

2. @GetMapping("/hello")로 HelloController안에 있는 hello라는 메소드가 /hello라는 엔드포인트에 매핑을 해주었습니다.

3. @RequestParam은 http request를 보낼 때 파라메터를 같이 보내면 java에서 쓸 수 있게 해줍니다.

여기에서는 ?name=kyeongrok 이라고 보내면 String name이라고 선언한 파라메터에 값을 넣어줍니다.

 

이렇게 하고 실행을 해보겠습니다.

 

실행을 하면 아래와 같이 콘솔에 내용이 나옵니다.

 

8080서버에 Tomcat이 시작 되었다고 나옵니다.

 

http://localhost:8080/hello 를 호출 하면 위와 같이 list를 리턴 해줍니다.

 

 

 

II. Spring Boot로 Restful API를 개발할 때 두가지 문제점

 

1.날짜 처리 문제

request를 server로 보낼 때 파라메터의 타입이 string이라는 것 입니다.

날짜 같은 경우 2019-01-01 00:00:00 이런식의 String타입으로 Request를 보냅니다. 이걸 Java8의 LocalDateTime으로 바꿔줘야 하는 이슈가 있습니다.

public static final LocalDateTime convertToLocalDateTime(String yyyyMMddHHmmss) {
    return LocalDateTime.parse(yyyyMMddHHmmss,
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}

 

위와 같이 파서를 만들어서 처리해주는 방법이 있습니다.

 

2.환경 설정 문제

Spring boot app에서 db를 액세스 합니다.

결국은 db에 있는걸 보여주는건데 db액세스 할 때 처리 해줘야 하는게 많습니다.

dev | qa | prod별로 host, username, password등이 다르기 때문에 이걸 처리해줘야 합니다.

 

그리고 db에 select만 해서 되는게 아니고 select한걸 가공 해줘야 하는 경우가 있습니다.

 

3. test할때 문제

spring boot를 사용해서 처리 하면 데이터 타입(type)의 흐름이 아래와 같습니다.

 

String -> pojo -> jpa entity -> List<>

 

그런데 각 구간별로 method가 한개만 있어도 위 구간이면 총 4개의 구간을 거치는데 각 구간이 통으로 되어 있는게 아니고 메소드로 나누어져 있기 때문에 각 구간이 연결이 잘 돼는지, 내가 생각한 대로 굴러가는지 등은 확인 해야 합니다.

 

그럴러면 unit test를 만들어야 합니다.

 

이거는 spring boot TestRestTemplate을 쓰면 깔끔하게 해결됩니다.

TradeRequest tradeRequest = new TradeRequest();
tradeRequest.setStart("2018-01-11 00:00:00");
tradeRequest.setEnd("2019-01-20 00:00:00");
tradeRequest.setPage(0);

String requestJson = new ObjectMapper().writeValueAsString(tradeRequest);
HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);

JSend response
= this.testRestTemplate.postForObject("/host/data/hello/world", entity, JSend.class);

이런식으로 만들어줍니다.

 

end.

 

 

 

 

 

728x90
블로그 주인장입니다. 원하시는 정보는 얻으셨나요? 이 포스트에서 추가로 필요한 정보가 있으시면 여기에 남겨주세요.