본문 바로가기

Back-end/Springboot

[SpringBoot] GET API 만들기

 GET API는 웹 애플리케이션 서버에서 값을 가져올 때 사용하는 API이다.

 

1. @RequestMapping으로 구현하기

@RequestMapping 어노테이션을 별다른 설정 없이 선언하면 HTTP의 모든 요청을 받는다. 그러나 GET형식의 요청만 받기 위해서는 어노테이션에 별도 설정이 필요하다. 

@RequestMapping("/api/v1/get-api")
public class GetController {
    // http://localhost:8080/api/v1/get-api/hello
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String getHello() {
        return "Hello World";
    }
}

@RequestMapping을 사용한 메서드 구현

 

2. 매개변수가 없는 GET 메서드 구현

별도의 매개변수 없이 GET API를 구현하는 경우이다. 매개변수가 없는 요청은 URL을 그대로 입력하고 요청할 때 스프링 부트 애플리케이션이 정해진 응답을 반환한다.

public class GetController {
    // http://localhost:8080/api/v1/get-api/name
    @GetMapping(value = "/name")
    public String getName() {
        return "Flature";
    }
}

매개변수가 없는 GET 메서드 구현

 

3. @PathVariable을 활용한 GET 메서드 구현

매개변수가 있는 GET 메서드 구현으로 매개변수를 받을 때 자주 쓰이는 방법 중 하나인 URL 자체에 값을 담아 요청하는 것이다. 요청 예시 URL을 보면 이 메서드는 중괄호({})로 표시된 위치의 값을 받아 요청하는 것을 알 수 있다. 값을 간단히 전달할 때 주로 사용하는 방법이며, GET 요청에서 많이 사용된다. 중괄호를 사용하여 어느 위치에서 값을 받을지 정해야하고 매개변수와 그 값을 연결하기 위해 @PathVariable을 명시하며, @GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름을 동일하게 맞춰야 한다.

@RequestMapping("/api/v1/get-api")
public class GetController {
    // http://localhost:8080/api/v1/get-api/variable1/{String 값}
    @GetMapping(value = "/variable1/{variable}")
    public String getVariable(@PathVariable String variable) {
        return variable;
    }
}

@PathVariable을 활용한 GET 메셔드 구현

* @GetMapping 어노테이션에 지정한 변수의 이름과 메서드 매개변수의 이름을 동일하게 맞추기 어려울 때 다음과 같이 변수명을 지정한다.

@RequestMapping("/api/v1/get-api")
public class GetController {
    // http://localhost:8080/api/v1/get-api/variable2/{String 값}
    @GetMapping(value = "/variable2/{variable}")
    public String getVariable(@PathVariable("variable") String var) {
        return var;
    }
}

@PathVariable에 변수명을 매핑하는 방법

 

4. @RequestParam을 활용한 GET 메서드 구현

GET 요청을 구현할 때 URL 경로에 값을 담아 요청을 보내는 방법 외에도 쿼리 형식으로 값을 전달할 수도 있다. 즉, URI에서  '?'를 기준으로 '{키}={값}' 형태로 구성된 요청을 전송하는 방법이다. 매개변수 부분에 @RequestParam 어노테이션을 명시해 쿼리 값과 매핑하면 된다.

@RequestMapping("/api/v1/get-api")
public class GetController {
    // http://localhost:8080/api/v1/get-api/request1?name=value&email=value2&organization=value3
    @GetMapping(value="/request1")
    public String getRequestParam(@RequestParam String name, @RequestParam String email, @RequestParam String organization) {
        return name + " " + email + " " + organization;
    }
}

@RequestParam을 활용한 GET 메서드 구현

* 만약 쿼리스트링에 어떤 값이 들어올지 모른다면 Map 객체를 활용할 수도 있다.

@RequestMapping("/api/v1/get-api")
// http://localhost:8080/api/v1/get-api/request2?key1=value1&key2=value2
    @GetMapping(value = "/request2")
    public String getRequestParams2(@RequestParam Map<String, String> param) {
        StringBuilder sb = new StringBuilder();
        param.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n");
        });
        return sb.toString();
    }
}

@RequestParam과 Map을 조합한 GET 메서드 구현

위와 같은 형태로 코드를 작성하면 값에 상관없이 요청을 받을 수 있다. 예를 들어 회원 가입 관련 API에서 사용자는 회원 가입을 하면서 ID 같은 필수 항목이 아닌 취미 같은 선택 항목에 대해서는 값을 기입하지 않는 경우가 있다. 이러한 경우 매개변수의 항목이 일정하지 않을 수 있어 Map 객체로 받는 것이 효율적이다.

 

5. DTO 객체를 활용한 GET 메서드 구현

DTO란? Data Transfer Object의 약자로, 다른 레이어 간의 데이터 교환에 활용된다. 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체이다.

  • 먼저 DTO 패키지를 생성하여 MemverDto 클래스를 생성한다.
package com.springboot.api.dto;

public class MemberDto {
    private String name;
    private String email;
    private String organization;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getOrganization() {
        return organization;
    }

    public void setOrganization(String organization) {
        this.organization = organization;
    }

    @Override
    public String toString() {
        return "MemberDto{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", organization='" + organization + '\'' +
                '}';
    }
}
@RequestMapping("/api/v1/get-api")
// http://localhost:8080/api/v1/get-api/request3?name=value1&email=value2&organization=value3
    @GetMapping(value = "/request3")
    public String getRequestParam3(MemberDto memberDto) {
        // return memberDto.getName() + " " + memberDto.getEmail() + " " + memberDto.getOrganization();
        return memberDto.toString();
    }
}

DTO 객체를 활용한 GET 메서드 구현

DTO 클래스에는 전달하고자 하는 필드 객체를 선언하고 getter/setter 메서드를 구현한다. DTO 클래스에 선언된 필드는 컨트롤러의 메서드에서 쿼리 파라미터의 키와 매핑된다. 즉, 쿼리스트링의 키가 정해져 있지만 받아야할 파라미터가 많을 경우에는 DTO 객체를 활용해 코드의 가독성을 높일 수 있다.

 

 

 

참고 문헌: 스프링 부트 핵심 가이드(스프링 부트를 활용한 애플리케이션 개발 실무)

http://www.yes24.com/Product/Goods/110142898

 

스프링 부트 핵심 가이드 - YES24

입문자의 눈높이에 맞춰 차근차근 따라 하면서 배우는 스프링 부트 입문서!《스프링 부트 핵심 가이드》는 스프링 부트 기반의 애플리케이션을 개발할 때 필요한 기초적인 내용들을 소개하고,

www.yes24.com