<목차>
1. Http Method GET
2. Get Controller
[ Http Method GET ]
HTTP GET 메서드는, 웹 서버로부터 리소스를 요청하는데 사용되며, 주로 데이터 조회에 사용된다.
특징으로는 아래와 같은 내용이 있다.
- GET 요청은, 데이터를 단순히 조회하는 목적을 갖고 있기 때문에, 서버의 상태를 변경하지 않는다.
- 동일한 REQUEST 는 항상 같은 결과를 리턴한다.
- REQUEST URL에 파라미터를 포함한다.
- Path variable or Query String
- URL 길이에 제한이 있기 때문에, GET 요청으로 전송할 수 있는 데이터의 크기에 제한이 있다.
- 이미지, 스크립트, CSS 등 정적 리소스 요청에 사용된다.
[ Get Controller ]
Spring 환경에서 Get 메서드 컨트롤러를 작성하는 방법에 대해 알아보자.
- @RequestMapping 어노테이션 사용
- 스프링 4.3 버전 이후로는 각 메서드에 맞는 어노테이션을 사용하기에, @RequestMapping 어노테이션의 사용은 권장되지 않는다.
다만, 오래된 시스템의 경우 해당 어노테이션을 사용하고 있을 수 있다. - 아래와 같이, method = RequestMethod.GET 을 사용하여 GET 메서드임을 지정하여 사용한다.
- 스프링 4.3 버전 이후로는 각 메서드에 맞는 어노테이션을 사용하기에, @RequestMapping 어노테이션의 사용은 권장되지 않는다.
/**
* RequsetMapping 사용
* Spring 4.3 버전 이후로는 더 이상 사용되지 않음
* */
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String getHello() {
return "Hello, This is Get Method";
}
- 앞서 기재한 내용대로, 최신 버전의 스프링에서는 @RequestMapping 어노테이션 사용이 권장되지 않는다.
대신, 아래와 같이 각 메서드에 맞는 어노테이션을 제공한다.
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping - 그럼 이제 @GetMapping 어노테이션을 활용한 컨트롤러에 대해 알아보자.
- 파라미터가 없는 컨트롤러
- 사실, 실무에서 파라미터 없이 Request를 보내는 경우는 없다고 봐도 무방하며, 간단한 테스트를 위한 용도로 작성되곤 한다.
/**
* GetMapping
* 1) 매개변수가 없는 Get Method 구현
* */
@GetMapping(value = "/name")
public String getName() {
return "My name is A";
}
- @PathVariable 을 활용한 컨트롤러
- URL 자체에 파라미터를 담아 요청한다.
- @GetMapping 어노테이션의 value로 URL 을 입력할 때, 중괄호 '{' , '}' 를 사용하여 어느 위치에 값을 받을지 지정해야 한다.
- 또한, 파라미터와 그 값을 받을 변수를 @PathVariable 어노테이션으로 명시해야 한다.
- 파라미터를 받을 변수 명을 그대로 사용하는 방법
- 파라미터를 받을 변수 명을 지정하여 사용하는 방법
- 데이터를 조회하기 위한 Key가 되는 파라미터가 적은 경우 사용하는 것이 좋다.
/**
* GetMapping
* 2-1) PathVariable 을 활용한 Get Method
* */
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
return variable;
}
/**
* GetMapping
* 2-2) PathVariable 을 활용한 Get Method
* PathVariable 어노테이션 내, value 지정하여 받음
* */
@GetMapping(value = "/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
return var;
}
- @RequestParam 을 활용한 컨트롤러
- Query String 형식으로 요청하는 경우, URI 의 '?' 를 기준으로 'Key = Value' 형태로 구성된 요청을 처리하는 컨트롤러에 사용한다.
- Query String 에는 파라미터의 Key 값이 적혀있기 때문에, 이 Key 값을 기준으로 메서드의 파라미터에 이름을 매핑하면 값을 가져올 수 있다.
- @PathVariable 과 마찬가지로, 파라미터를 받을 변수명은 value 속성을 통해 매핑할 수 있다.
[Using RequestParam annotation with variables]
/**
* GetMapping
* 3-1) RequestParam 을 활용한 Get Method
* 정해진 파라미터
* */
@GetMapping(value = "/request1")
public String getRequestParam1(@RequestParam String name, @RequestParam String email, @RequestParam String organization) {
StringBuilder builder = new StringBuilder();
builder.append("name : ")
.append(name)
.append("\n")
.append("email : ")
.append(email)
.append("\n")
.append("organization : ")
.append(organization);
return builder.toString();
}
- 어떤 파라미터가 들어올지 이미 알고 있는 상황이라면, 위와 같이 각각의 파라미터에 대한 변수를 지정하여 사용할 수 있으나, 일정하지 않은 파라미터가 요청 값으로 들어오는 경우에는 아래와 같이 Map 을 사용하여 파라미터를 받을 수 있다.
[Using RequestParam annotation with Map]
/**
* GetMapping
* 3) RequestParam 을 활용한 Get Method
* 불특정 파라미터
* */
@GetMapping(value = "/request2")
public String getRequestParam2(@RequestParam Map<String, String> param) {
StringBuilder builder = new StringBuilder();
for(Map.Entry<String, String> entry : param.entrySet()) {
builder.append(entry.getKey()).append(" : ").append(entry.getValue()).append("\n");
}
return builder.toString();
}
- 다만, 위와 같이 Map을 사용하게 되는 경우, 비즈니스 로직을 처리하기 위해, Map으로부터 각 Value 들을 가져와야 하기 때문에 코드가 길어지고 가독성이 떨어지는 측면이 있다.
- 그래서 받은 파라미터의 수가 많은 경우에는 아래와 같이 DTO (Data Transfer Object) 활용해 코드의 가독성을 높일 수 있다.
[Using DTO]
/**
* GetMapping
* 3) Dto 를 활용한 Get Method
* */
@GetMapping(value = "/request3")
public String getRequestParam3(MemberDto dto) {
return dto.toString();
}
지금까지 Http Method 중, GET 에 대한 컨트롤러 구성에 대해 간략하게 알아보았다.
다만, 포스팅에 작성된 소스에 대해 의문점이 있을 수 있다.
모두 String 으로 Return 하고 있다는 것이다.
설명을 위해 모든 컨트롤러의 return type을 String 으로 작성하였으나, 실제로 API 개발하는 과정에선 JSON 으로 요청과 응답을 주고받는 경우가 대부분이다.
아래는, Get Method가 주로 사용되는 목록/상세 조회에 대해 JSON 포맷으로 리턴되는 컨트롤러이다.
ResponseEntity 에 대한 설명은 다른 포스팅으로 작성할 예정이다.
/**
* GetMapping
* 3) Dto 를 활용한 Get Method with ResponseEntity
* POJO LIST
* */
@GetMapping(value = "/request5")
public ResponseEntity<List<MemberDto>> getRequestParam5(MemberDto dto) {
List<MemberDto> list = new ArrayList<>();
list.add(dto);
list.add(dto);
return ResponseEntity.status(HttpStatus.ACCEPTED).body(list);
}
/**
* GetMapping
* 3) Dto 를 활용한 Get Method with ResponseEntity
* SINGLE POJO
* */
@GetMapping(value = "/request4")
public ResponseEntity<MemberDto> getRequestParam4(MemberDto dto) {
return ResponseEntity.status(HttpStatus.ACCEPTED).body(dto);
}
[참고 도서]
<스프링 부트 핵심 가이드>
저자 : 장정우
출판사 : 위키북스
'Spring & Spring boot' 카테고리의 다른 글
[Spring Boot] Rest Controller - 4. PUT (0) | 2024.07.24 |
---|---|
[Spring Boot] Rest Controller - 3. POST (2) | 2024.07.24 |
[Spring Boot] Rest Controller - 1. REST (1) | 2024.07.23 |
스프링 부트(Springboot)란? (0) | 2024.07.23 |
[Spring] 스프링 프레임워크란? (0) | 2024.07.15 |