인텔리제이 postman 대체

유요한·2022년 11월 23일
1

Spring

목록 보기
5/15

HTTP Client

주로 API를 테스트하기 위해 간단하게는 cURL, 좀 더 다양한 기능과 편안한 GUI를 원할때는 postman을 사용하곤 합니다. 하지만 인텔리제이에서는 외부 프로그램에 의존하지 않고 API 테스트를 쉽게 수행하도록 도와줍니다.

도와주는 플러그인
HTTP Client

프로젝트를 운영하다보면 로컬 환경외에 개발/운영 환경에서 API요청이 잘되는지 확인할 필요가 있습니다.

  • 베타/운영 서버의 A API 값이 안나와요. 확인좀 해주세요.
  • 베타 서버의 B API 사용해보려면 어떻게 해야 하나요?
  • 전에 사용했던 API URL과 인증키가 어떻게 되나요?

이럴때 postman을 사용했는데 , IntelliJ 2017.3 버전부터 지원하게 된 .http 를 사용해보시는걸 추천드립니다.

장점

1. IntelliJ 기능 지원

  • Code highlighting
  • 코드 자동 완성
  • 직관적인 HttpRequest 구조
  • Request Body에 쓸 JSON 등 적극적 지원 (Language injections)
    리팩토링

2. 파일관리

모든 요청이 .http라는 파일로 관리 되기 때문에 Git으로 관리할 수가 있습니다. A라는 사람이 만든 .http는 Git Push만 하면 누구든 사용할수 있게 되고, 혹시나 누가 삭제했다 하더라도 언제든지 Git History를 통해 되살릴수 있습니다. API 요청 방법의 변경 내역도 언제든지 확인할 수 있습니다.

기본적인 사용법

인텔리제이의 .http파일을 사용하는 방법을 나누고자 한다.

1. 기본 GET 요청

가장 먼저 .http 파일을 생성해보겠습니다.
프로젝트 폴더 구조에서 new 메뉴를 열어 HTTP Request를 선택하고 파일명을 입력합니다.

.http가 생성된다.

여기에 간단하게 GET 요청을 한번 날려보겠습니다.
사용법은 간단합니다.
Http Request 스펙처럼 작성해주시면 됩니다.

GET https://www.devbeginner.com

TIP)
즉, 파일의 첫줄에는 HTTP Method와 URL을,
둘째줄부터는 RequestHeader 부분을 작성해주시면 됩니다.

이거를 실행하면 요청의 결과가 인텔리제이 화면 하단에 등장한다.

브라우저의 개발자도구로 보는것처럼 Response Header와 Body가 상세하게 나오는데요.

특히 HTML이 반환될때는 IntelliJ의 코드 하이라이팅이 그대로 적용되서 보이기 때문에 굉장히 직관적입니다.

자 그럼 이제 좀 더 다양한 Request 방법을 사용해보겠습니다.

2. Post 요청

이번엔 JSON 데이터를 Post 요청해보겠습니다.
테스트 Request 요청을 받아줄 간단한 RestController를 생성하고 테스트를 진행하겠습니다.

@RestController
public class PostController {

    @PostMapping("/group")
    public GroupDto post(@RequestBody GroupDto groupDto){
        return groupDto;
    }

    @Setter
    @Getter
    @NoArgsConstructor
    private static class GroupDto {
        private String groupName;
        private List<String> members;
        private DateObj date;

        @Setter
        @Getter
        @NoArgsConstructor
        private class DateObj {
            private int year;
            private int month;
            private int day;
        }
    }
}

빠르게 클래스를 생성후, SpringBoot로 localhost:9090으로 실행합니다.
그리고 .http 파일에 다음과 같이 JSON POST 요청 코드를 작성합니다.

### 직접 JSON 사용
POST http://localhost:9090/group
Content-Type: application/json

{
  "groupName": "그룹명",
  "members": [
    "회원1",
    "회원2",
    "회원3"
  ],
  "date": {
    "year": 2018,
    "month": 1,
    "day": 24
  }
}

흔히 사용하는 JSON과 동일한 형태로 작성하면 됩니다.
보시면 Content-Type 역시 간단하게 지정할 수 있습니다.
이렇게 해서 요청을 보내보시면됩니다.

Post로 JSON 데이터를 보낼때는 복잡한 형태가 많아서 실제 파일채로 보내고 싶을때가 있습니다.
IntelliJ의 .http는 파일 데이터도 그대로 보낼 수가 있습니다.
예제로 post.json 파일을 하나 만들겠습니다.

꺽쇠(<)를 기준으로 파일 위치를 지정하시면 해당 파일의 데이터를 전송합니다.

JSON 데이터가 잘 넘어갔습니다!

Request Header와 데이터형태를 변경하면 multipart/form-data와 같이 파일 업로드, 이미지 업로드 등의 API도 쉽게 테스트할수 있겠죠?

3. Request Header 수정

이번엔 Request Header에 특정 필드를 추가해서 요청하는 기능을 테스트하겠습니다.
예를 들어, 서버간 JSON API 통신에서는 인증키를 Request Header에 심어서 주고 받습니다.
운영에서 사용중인 API를 갑자기 테스트해야할때면 Request Header에 심어야하는데요.
Postman으로 테스트하기에 어려운점이 많아 Mod Header 등을 사용했습니다.
이런 기능들도 .http로 해결해보겠습니다.


4. Cookie 수정



메서드 구분자를 주석처럼 활용하기

http 파일에선 각각의 요청을 ### 구분자를 통해 구분합니다. 구분자 뒤에 해당 api에 대한 설명을 작성할 수 있는데요, 이를 활용해 해당 API가 어떤 방식으로 활용되는지 기입하고, 개발자의 API에 대한 이해를 돕습니다.

http host를 프로필 별로 관리하기

http client에선 {{변수명}} 스니펫을 활용해 변수를 활용할 수 있습니다.
이에 더해 환경 별로 실행환경 변수 (Environment variables) 를 지원하는데요, 이 기능을 활용해 로컬 환경, 개발 환경, 운영 환경 별로 host를 지정해 간단하게 동일한 API 테스트를 진행할 수 있습니다.
먼저 host를 특정한 변수로 변경합니다.



http-client.env.json 파일이 저장되는 거의 즉시, 실행 환경에 추가됩니다.






서버를 부팅하고 로그인 http를 실행하면, username과 password가 잘 전달되어 성공한 것을 볼 수 있습니다.

.gitignore에 http-client.private.env.json 추가하기

VCS tool로 git을 사용하고 있다면, 해당 파일을 .gitignore에 추가하여 해당 파일이 실수로 remote 저장소에 업로드 되는 일을 차단해줍니다.

tpl 파일로 어떤 변수가 필요한지 가이드 해주기



본문에서는 token을 이용해 로그인 정보를 유지한다고 가정하겠습니다.
위 로그인 예제에 요청을 받는 api를 추가하고, http를 하나 만들겠습니다.
very-very-secret라는 값을 하드코딩하고, Authorization에 Bearer 양식으로 해당 토큰이 들어오면 200을 내려주는 코드입니다.

만약 별도의 조치가 없으면, 내 정보 확인 api를 테스트 하기 위해서 1. 인증 api 실행, 2. 응답으로 내려온 토큰값 복사 & 붙여넣기 의 굴레를 벗어날 수 없습니다.

이 과정을 자동화하기 위해 Response Handler를 이용할 수 있습니다.

위 문법을 사용하면, 응답값으로 내려온 토큰을 전역 변수 목록에 저장할 수 있습니다. 추가로 응답값 로깅과 테스트도 진행해보겠습니다.

### 로그인
POST {{review-api}}/login
Content-Type: application/json

{
 "username" : "{{user_name}}",
 "password": "{{password}}"
}

{%
client.test("Validate", function() { // Validate라는 이름의 테스트를 수행
client.assert(response.status === 200, "Response status is not 200"); // 응답값이 200이면 통과
client.assert(response.contentType.mimeType === "application/json", "Expected 'application/json'"); // 응답값이 application/json이면 통과
client.assert(response.body.accessToken.trim().length > 0); // 토큰 길이가 0보다 크면 통과
});

client.log(response.body.accessToken); // 토큰 값 로깅, body에는 응답받은 json이 객체 형식으로 저장된다. 즉 { accessToken:"value" }가 응답이라면, 여기선 value라 로깅된다.
client.global.set("access_token",response.body.accessToken) // 토큰 값을 global 변수에 set
%}


profile
발전하기 위한 공부

0개의 댓글