Book/스프링부트 핵심가이드

GET 메서드 구현 방법(feat. @GetMapping)

블로그 주인장 2023. 10. 25.

API를 작성하는 다양한 방법

HTTP 메서드에 해당하는 API를 개발하고 그 과정에서 필요한 내용들 중

하나인 GET 메서드의 구현에 관하여 자세하게 알아보겠습니다.


@RequestMapping

@RestController
@RequestMapping("/Sample")
public class SampleController {

}

클래스 수준에서 @RequestMapping을 설정하면 내부에 선언한 메서드의 URL 리소스 앞에 @RequestMapping의 값이 공통으로 추가된다.

@RequestMapping 어노테이션을 별다른 설정 없이 선언하면 HTTP의 모든 요청을 받는다.


GET API

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

@RequestMapping 어노테이션의 method 요소의 값을 RequestMethod.GET으로 설정하면 GET 요청 형식으로 설정할 수 있다.


@RequestMapping을 이용한 GET 메서드 구현

@RestController
@RequestMapping("/Sample")
public class SampleController {
	
    //http://localhost:8080/Sample/test
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public String getTest() {
    	return "test";
    }
}

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

@RestController
@RequestMapping("/Sample")
public class SampleController {
	
    //http://localhost:8080/Sample/Hello
    @GetMapping(value = "/Hello")
    public String getHello() {
    	return "Hello";
    }
}

@PathVariable을 GET 메서드 구현

실무 환경에서는 매개변수를 받지 않는 메서드가 거의 쓰이지 않는다. 웹 통신의 기본 목적은 데이터를 주고 받는 것이기 때문에 대부분 매개변수를 받는 메서드를 작성하게 된다. 매개변수를 받을 때 자주 쓰이는 방법 중 하나는 URL 자체에 값을 담아 요청하는 것이다.

@RestController
@RequestMapping("/Sample")
public class SampleController {
	
    //http://localhost:8080/Sample/Project/{value}
    @GetMapping(value = "/Project/{value}")
    public String getValue(@PathVariable String value) {
    	return value;
    }
}

해당 메서드는 중괄호({ })로 표시된 위치의 값을 받아 요청한다.

실제 요청 시 중괄호는 들어가지 않고 값만 존재한다.

값을 간단히 전달할 때 주로 사용하는 방법이며, GET 요청에서 많이 사용된다.

 

@GetMapping 규칙

  1. @GetMapping 어노테이션의 값으로 URL을 입력할 때, 중괄호를 사용해 어느 위치에서 값을 받을지 지정해야한다.
  2. 메서드의 매개변수와 그 값을 연결하기 위해 @PathVariable을 명시하며, @GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름을 동일하게 맞춰야한다.

 

@GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름을 동일하게 맞추기 어렵다면?

@PathVariable에는 변수의 이름을 특정할 수 있는 value 요소가 존재하며, 이 위치에 변수 이름을 정의하면 매개변수와 매핑할 수 있다.

@RestController
@RequestMapping("/Sample")
public class SampleController {
	
    //http://localhost:8080/Sample/Project/{Value}
    @GetMapping(value = "/Project/{value}")
    public String getValue(@PathVariable("value") String value) {
    	return value;
    }
}

 

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

URI에서 '?' 를 기준으로 우측에 ' {키}={값}' 형태로 구성된 요청을 전송하는 방법이다.

@RequestParam 어노테이션을 명시해 쿼리 값과 매핑하면 된다.

@RestController
@RequestMapping("/Sample")
public class SampleController {
	
    //http://localhost:8080/Sample/request?name=value1&email=value2
    @GetMapping(value = "/request")
    public String getValue(@RequestParam String name, @RequestParam String email) {
    	return name + " " + email;
    }
}

'?' 오른쪽에 쿼리 스트링(query string)이 명시되어있다. 쿼리스트링에는 키(변수의 이름)가 모두 적혀 있기 때문에 이 값을 기준으로 메서드의 매개변수에 이름을 매핑하면 값을 가져올 수 있다.

키와 @RequestParam 뒤에 적는 이름을 동일하게 설정하기 어렵다면 @PathVariable 예제에서 사용한 방법처럼 value 요소로 매핑한다.

 

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

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

ex) 회원가입 관련 API에서 사용자는 회원가입 시에 ID 처럼 필수 항목이 아닌 선택 항목에 대해서는 값을 기입하지 않는 경우가 있다. 이러한 경우, 매개변수의 항목이 일정하지 않을 수 있어 Map 객체로 받는 것이 효율적이다.

 

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

DTO(Data Transfer Object)

  • 다른 레이어 간의 데이터 교환에 활용된다.
  • 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체이다.
  • 데이터를 교환하는 용도로만 사용하는 객체이기에 DTO에는 별도의 로직이 포함되지 않는다.
import lombok.*;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MemberDto {
    private String name;
    private String email;
}
  • DTO 클래스는 전달하고자 하는 필드 객체를 선언하고 getter/setter 메서드를 구현한다.
  • DTO 클래스에 선언된 필드는 컨트롤러의 메서드에서 쿼리 파라미터의 키와 매핑된다.
  • 쿼리스트링의 키가 정해져있지만 받아야할 파라미터가 많을 경우세는 DTO 객체를 활용해 코드의 가독성을 높인다.
@RestController
@RequestMapping("/Sample")
public class SampleController {
	
    //http://localhost:8080/Sample/request?name=value1&email=value2
    @GetMapping(value = "/request")
    public String getValue(MemberDto memberDto) {
        return memberDto.toString();
    }
}
반응형

댓글