본문 바로가기
IDE/PostMan

PostMan의 여~~~~러 가지 사용방법

by 코딩하는보기 2022. 3. 15.
320x100
320x100

스킨 색 변경하기

난 개인적으로 검은색을 선호한다

밤에 코딩해도 눈이 안아프고 뭔가 멋있짜놔~~

우측 상단의 톱니바퀴를 눌러주자

Settings 클릭 후 테마에서 오른쪽 선택

사용방법

    1. Collection을 만든다
    2. Folder 또는 Http Request를 만든다
    3. PathVariable, QueryString, ReqeustBody, Header/Authroization을 추가하는 방법을 익힌다
    4. Tests에 js코드를 추가해서 포스트맨 전역, 환경 변수로 갖고 있는 방법을 익힌다
    5. Import 또는 Export를 해서 다른 사용자한테 내 json 데이터를 넘겨주거나, 혹은 다른 사용자의 json 컬렉션 데이터를 받아올 수 있다 + 문서보기

 

0. Workspaces를 만든다

개인/팀별 작업 공간을 만들 수 있다

1. Collection을 만든다

Collection을 하나의 프로젝트라고 봐도 무방하다.

그리고 그 밑에는 Folder를 만드는데, 컨트롤러별로 만들면 좋다

이런 식으로...

추가로 별표 등록을 하면 여러 컬렉션들 중에 위로 올라온다

 

2. Folder 또는 Http Request를 만든다

이미 컬렉션, 폴더는 1번에서 만든거같으니까 Http Request를 만들어보자

폴더나 컬렉션 옆의 별 땡땡땡 3개를 클릭해서 만들 수 있다

만들면 기본적으로 Get 메서드가 만들어지고 이름이 파란색깔로 되면서 변경하라고 표시되어진다

이때 기냥 이름을 변경해주자 - 멋잇는 개발자라면 영어로, 혼자 개발하고 다른사람들은 볼 일 없다하면 한글로 작성하자

변경하고 저장을 하지 않으면 옆에 주황색 불이 생긴다. 가급적 저장을 자주 해서 주황불을 없애자. 탭 20개가 생겼는데 다 주황불이라면 난감하다.. 겪어보면 안다

@ApiIgnore
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/test")
public class TestController {

	@GetMapping
    public String test0(HttpServletRequest servletRequest) {
        String protocol = servletRequest.getProtocol();
        System.out.println("protocol = " + protocol);
        String scheme = servletRequest.getScheme();
        System.out.println("scheme = " + scheme);
        return scheme.equals("http") ? "http Server on" : "https Server on";
    }
    
    ...
}

3.  PathVariable, QueryString, RequestBody, Header/Authorize를 추가하는 방법

- pathVariable은 말 그대로 경로 변수이다

    @GetMapping("/{input}")
    public String kk(@PathVariable String input) {
        return "You input " + input;
    }

스프링에서는 /{변수} 였지만, 포스트맨에서는 :변수를 입력하면 밑에 Path Variable이라는 칸이 생긴다

VALUE값에 아무거나 넣어보자

기대한대로 잘 작동한다

 

- queryString은 말 그대로 질의?문자열 이다

    @GetMapping("/you")
    public String kk(int age, String name) {
        return age > 20 ? name + " are too old" : name + " are so young";
    }

Query Params 밑에 그냥 Key만 입력해주면 알아서 path 에 ? = & 가 붙는다

작성하고 나니 3인칭인데 is가 맞다.......ㅎ 넘어가자

또한 page, size같이 자주 쓰이는 객체들은 class로 만들어서 parameter로 넘겨도 queryString으로 들어간다

   @Getter
    static class PageCondition {
        private Integer page;
        private Integer size;
    }
    
    @GetMapping("/you")
    public String kk(int age, String name, PageCondition pageCondition) {
        return age > 20 ? name + " are too old " + pageCondition.getPage() + " " + pageCondition.getSize()
            : name + " are so young " + pageCondition.getPage() + " " + pageCondition.getSize();
    }

단일변수는 @RequestParam을 안붙여도 동작이 같다.

사실 스프링에서 명시적으로 @RequestParam을 붙여주면 필수값 여부, 기본값 설정, List 변수 등등을 할 수 있게 된다

    @GetMapping("/you")
    public String kk(
        @RequestParam(required = false) int age,
        @RequestParam(defaultValue = "boki") String name,
        @RequestParam List<Integer> numbers,
        PageCondition pageCondition) {
        System.out.println(Arrays.toString(new List[]{numbers}));
        return age > 20 ? name + " are too old " + pageCondition.getPage() + " " + pageCondition.getSize()
            : name + " are so young " + pageCondition.getPage() + " " + pageCondition.getSize();
    }

받은게 잘 출력된다~

 

- RequeystBody는 말 그대로 요청하는 바디이다(이 어노테이션의 경우 jackson2HttpConverter가 json의 데이터를 변환시키기 때문에 json데이터를 받아야 한다

 

@Getter
    static class Human {
        private String name;
        private Integer age;
        private ArrayList<String> hobbies;
    }

    @GetMapping("/you")
    public String kk(@RequestBody Human human) {
        return "Your name is " + human.getName() + ", age is " + human.getAge() + ", and hobbies are " + human.getHobbies();
    }

postman에서는 body 탭을 누르고 raw로 바꾸고 입력값을 Text -> Json로 바꿔주자

그리고 { } 안에 "key": "value" 형태로 입력해주면 된다

자 잘 작동한다. 아 참고로 우측 하단에 보면 HttpStatus응답 상태 값과 걸린 시간, 사이즈가 나온다

Response값이 HTML일 경우에는 Response Type을 변경해주면 된다

    @GetMapping("/you")
    public String kk(@RequestBody Human human) {
        String html = "<html><head></head><body><h1>I'm hungry</h1></body></html>";
        return html;
//        return "Your name is " + human.getName() + ", age is " + human.getAge() + ", and hobbies are " + human.getHobbies();
    }

프리뷰로 볼 수 있다

 

- Header와 Authorization은 Type Definition의 명확성 차이이다. Header에 Key가 Authorization을 넣고 하나 똑같다 다만 Value 앞의 [Type] [Real Value] split된 앞 칸이 타입을 명시하는 것이다

(ex: "Authorization": "bearer xzcadtadstadt.adfadf.zcvzct"}

이 뜻은 bearer타입의 Authorization 헤더이고, 실제 값은 bearer 뒤의 값이 된다.

근데 인증헤더 말고 추가로 다른 헤더(api-key)를 넣어줘야 하는 경우도 있다는 것을 알아두자

    @GetMapping("/you")
    public ResponseEntity<Object> kk(@RequestHeader String api_key) {
        if(api_key.equals("password1234!")) {
            return ResponseEntity.ok("OK");
        }
        else {
            throw new RuntimeException("잘못된 요청입니다");
        }
    }

보통은 openApi를 개발할때 ID나 E-mail, Phone인증에 따라 고유한 api_key 키 값을 주고, 일일/월별 사용량, 분당 n회 제한 등을 주어 만든다. 또는 추가로 정보를 받거나 요구할때 헤더를 이용하기도 한다

이렇게 헤더만 받지 않고, 헤더와 바디, 파라미터, 쿼리스트링 등등을 혼합한다

자, 그럼 Authorization bearer를 테스트 해보자

    @GetMapping("/you")
    public String kk(HttpServletRequest request) {
        String authorization = request.getHeader("Authorization");
        String token = authorization.split("Bearer ")[1];
        System.out.println("token = " + token);
        return token;
    }

보통은 @RequestHeader를 이용하지 않고, HttpServletRequest에서 getHeader를 해온다

잘 된다

또 다른 동작 방법은

Authorization 탭을 이용하는 것이다

헤더에는 각종 기타 정보들이 담길 수 있는 반면, Authorization Header는 오직 인증만을 위한 명확한 헤더라 할 수 있다

밑의 값은 타입을 나타낸다

Bearer 방식으로 놓고, Bearer를 제외한 토큰 값을 넣어줬더니 잘 반환한다

JWT에 궁금하다면 https://jwt.io/의 소개와 다른 블로그들, 앞으로 나의 글들을 주목해주자!

짧게 말하면 A.B.C로 구분된 암호화된 토큰인데, 파싱하면 데이터는 다 보여지므로 인증하기에 최소의정보(유저번호), 이메일(암호화)만 담아줘서 네트워크 트래픽을 최소화하고 DB단의 I/O를 줄이는게 목적이다. 하지만 배보다 배꼽이 더 크다고, 제 2의 인증장소(Redis)가 필요하게 된다거나... JWT를 다룰라면 Filter, Spring Security, JWT Token, DTO, Redis 등등을 다 알아야되서 공부좀해야된다 ㅎㅎ

 

지금까지 뭔가 괜찮다고 느끼지만 2% 부족하다고 생각되지않는가?

바로, 저 긴 토큰값을 일일이 복사 붙여넣기 해야되며, localhost가 아니거나(다른 ip) 다른 api가 다른 port에서 동작한다면...?

일일이 다 언제 쳐주고있나~~ 이말이다

 

4. Tests에 js코드를 추가해서 Postman 전역or환경변수로 값들을 가지는 방법

뭔가 거창하게 썼지만, 별거없다.ㅎㅎ

왼쪽 탭에서 Environments 탭을 클릭해보자. 뭔가 더하기 누르면 컬렉션처럼 지정할 수 있을 것 같지 않은가?

일단 환경에는 Globals, Environments... 가 있다

글로벌은 전역 변수처럼 쓸 수 있는 변수이고, Environments는 환경 변수로 쓸 수 있다는 말이다

자 무슨 말일까? 한번 환경을 만들어보자

더하기 버튼을 누르자~

wow-dev와 wow-prod를 추가했다

이제 우측에 개발, 배포 서버의 주소와 포트를 각각 입력해주면된다

wow-dev를 이렇게 맞춰줬다

참고로 INITIAL VALUE랑 CURRENT VALUE랑은 일치시켜야 되고 실수로 엔터가 들어가 있는지 체크하자

참고로 이렇게 수정사항이 저장되어 있지 않으면 이 환경들을 사용하지 못하니 주의하고 꼭 저장을 누르자

 

이제 wow-prod를 등록해보자

자 이제 감이 오는가?

잠시 컬렉션으로 돌아가기 전에 글로벌도 눌러보자

예전에 내가 심심풀이로 저장해놓은 변수들이다

자 이제 다시 Collections으로 돌아가자

여기 글에는 jwt 토큰을 만드는 부분은 없지만, 일단 눈으로라도 봐보자

user라는 rootJsonPath에 담아서 email, password로 로그인을 하면

user라는 rootJsonPath에 email, token, username, bio, image를 response한다

당연히 DB단을 거쳐오는거란건 서비스개발을 한다면 알 것 이다

자 이제 이 결과값에서 뭐를 변수로 삼고싶은가?

저기 user.token을 변수로 삼고싶지않나?

이번에는 Tests탭으로 넘어가서 이 코드들을 보자

responseBody를 JSON으로 파싱한 데이터를 가변형 var jsonData로 받는다

그리고 pm(아마도 postman의 약자인듯). globals (전역)에 .set(세팅한다) "jwt_token"이라는 변수명에다가 jsonData.user.token데이터를

나는 결과값이

{
    "user": {
        "email": "jake@jake.jake",
        "token": "eyJhbGciOiJIUzUxMiJ9.eyJpZCI6MSwiZW1haWwiOiJqYWtlQGpha2UuamFrZSIsInVzZXJuYW1lIjoiamFrZSIsImJpbyI6IkkgbGlrZSB0byBiYXNrZXRiYWxsIiwiaW1hZ2UiOiJodHRwczovL2kuc3RhY2suaW1ndXIuY29tL3hIV0c4LmpwZyIsImlhdCI6MTY0NzI4MTY3NiwiZXhwIjoxNjQ3MzE3Njc2fQ.Iac2H11Rm1v-vPrONnVYghKsE5rcwYyOQiRBMvrFss0mjJP9zGv0IFvCWyUckVYXUS5fPE0lQqxZwF6oW17Yrg",
        "username": "jake",
        "bio": "I like to basketball",
        "image": "https://i.stack.imgur.com/xHWG8.jpg"
    }
}

처럼 넘어왔기에 jsonData.user.token이었지만, 만약에 user 없이 { toekn: ... }으로만 내려온다면?

그냥 jsonData.token을 하면 되겠다~

그럼 위에는 전역변수에 저장한거였으니깐

밑에는 환경변수에 저장을 한 것이다

환경변수..??잉?? 이게뭐지?? 싶지만

이 부분이 당신의 환경변수이다

아까 만들어놨던 wow-dev로 바꾸면서

local변수를 하나 더 추가해줬다

이 로컬변수는 {{ }} 형태로 포스트맨의 모든 곳에서 사용이 가능하다!!!

환경을 wow-dev로 바꾸고 {{local}}로 해서 다시 테스트를 해보겠다

이 스크립트대로라면 전역변수에도 이 토큰값이 저장되고, 환경변수에도 저장이 되었을거라 기대한다

가보자

토큰값의 끝4자리는 ef9w다

글로벌 변수 합격

wow-dev 환경 변수 합격

wow-dev에는 jwt_token이라는 변수가 없었는데도, response 데이터에서 뽑아와서 값을 만들어줬다

자, 이제 이 토큰값을 어디서 사용할까?

아까 위에 Authorization Tab누르고 Bearer 타입 선택하고 복사 붙여넣기 했던 과정을 생략해줄것이다

이전 방식
변수 방식

이제 Ctrl+C, Ctrl+V의 시대는 끝났다

걍 로그인 한번 하면 토큰은 포스트맨 내부변수에 저장이 될 것이다

이제는? 배포 환경으로 바꿔서 테스트 하면 된다(임시로 prod는 local로 줬다)

우측 위의 환경만 바꾸고, 변수는 동일하지만 value만 다르게 줬다면 이것이 진정한 런타임 리팩토링일 것이다 ㅋㄷ

추가로 Response 자체에 Bearer가 붙어서 나갈 경우는 이렇게 해주면 된다

var jsonData = JSON.parse(responseBody);
var token = jsonData.token.split('Bearer ');
pm.environment.set("token", token[1]);

굿굿

5. Import 또는 Export를 해서 다른 사용자한테 내 json 데이터를 넘겨주거나, 혹은 다른 사용자의 json 컬렉션 데이터를 받아올 수 있다 + View Documentation

뭐 안해도 비디오인데.. 이정도 따라오셨으면...ㅎ

이 5번이 필요한 경우는, 회사 내/외의 여러 외부 팀하고 작업할때 내가 사용한 api들을 공유해서 빠른 개발속도를 갖기 위함이다

 

1. http://192.131.132.125:8080/api/test

POST 요청이고 Body는 ~~ 넣어주세요

아, 거기 숫자 아니고 String이에요!!

 

2. PostMan Collection Export -> 파일 넘겨줌

거기 포스트맨 돌려보시고 Response 스펙에 맞춰서 프론트 화면 맞춰주세요

 

 

1번과 2번 중 어느 방법이 .. 말하는것도 입아프다, 당연 2번이다

내가 열심히 포스트맨으로 지지고 볶아봤자 프론트팀이 작업을 완수하지 못하면 둘다 집 못가는건 똑같다

차라리 백단 빨리 개발하고 넘겨줘서 알아서 개발할수있게 하고 나는 다른 api 추가로 개발하면 되는 것이다

 

이렇게 Export로 내보내면 파일로 내보낼 수 있다

반대로? Import 하면 다 받아서 테스트 해볼 수 있겠지

 

저기 체크표시 위에 View documentation이 보일 것이다

문서를 보면 깔끔하게 알 수 있다

테스트 없이 결과값으로만 빠른 프론트 개발을 해야될 때 좋다

우측에 보면 북마크 표시로 뛰어갈수도 있다

'IDE > PostMan' 카테고리의 다른 글

PostMan Hoeny Tips 3  (6) 2023.09.25
PostMan Honey Tips 2  (0) 2022.05.22

댓글