
: 스프링 부트를 활용한 애플리케이션 개발 실무
📝 목차
5장. API를 작성하는 다양한 방법
5-1. 프로젝트 설정
5-2. GET API 만들기
- @RequestMapping으로 구현하기
- 매개변수가 없는 GET 메서드 구현
- @PathVariable을 활용한 GET 메서드 구현
- @RequestParam을 활용한 GET 메서드 구현
- DTO 객체를 활용한 GET 메서드 구현
: 4장에서 알려준 방식으로 프로젝트 생성
: GET API는 웹 애플리케이션 서버에서 값을 가져올 때 사용하는 API
컨트롤러에 @RestController오 @RequestMapping을 붙이면
내부에 선언되는 메서드에서 사용할 공통 URL을 설정할 수 있다.
클래스 수준에서 @RequestMapping을 설정하면 내부에 선언한 메서드의 URL 리소스 앞에 @RequestMapping 값이 공통 값으로 추가 된다.
@RequestMapping("/사용할 URL 작성")
@RestController
@RequestMapping("/get-api")
public class GetController {
}
: @RequestMapping 어노테이션에 아무런 설정 없이 선언하면
HTTP의 모든 요청을 받는다.
➙ GET 형식의 요청만 받기 위해서는 어노테이션에 별도 설정이 필요!
➙ @RequestMapping 어노테이션의 method 요소 값을 GET으로 설정하면 된다.
method = RequestMethod.GET
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/get-api)
public class GetController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String getHello(){
return "Hello World!";
}
}
⭐ @RequestMappig 어노테이션은 더 이상 사용되지 않는다 ⭐
스프링 4.3 버전 이후로는 각 HTTP 메서드에 맞는 어노테이션을 사용한다.
GET 메서드 = @GetMapping 어노테이션
@GetMapping(value = "/name")
// http://localhost:8080/get-api/name
@GetMapping(value = "/name")
public String getName(){
return "Flature";
}
매개 변수를 받지 않는 메서드는 거의 쓰이지 않는다.
Why❓ 웹 통신의 기본 목적은 데이터를 주고 받는 것이기 때문
⬇️ URL 자체에 값을 담아 요청하는 방법
// http://localhost:8080/get-api/variable1/{String 값}
@GetMapping(value = "variable1/{variable}")
public String getVariable1(@PathVariable String variable){
return variable;
}
⬇️ 요청 예시 URL
http://localhost:8080/get-api/variable1/{String 값}
중괄호로 표시된 위치의 값을 받아 요청하는 것을 알 수 있다.
값을 간단히 전달할 때 주로 사용하는 방법
GET 요청에서 많이 사용
✅ 이러한 방식으로 코드를 작성할 때 지켜야할 규칙
@GetMapping 어노테이션 값으로 URL을 입력할 때
중괄호를 사용해 어느 위치에서 값을 받을지 지정해야 한다.
매서드의 매개변수와 그 값을 연갈하기 위해 @PathVariable을 명시
➙ @GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름이 동일
➙ 동일하게 맞추기 어렵다면 @PathVariable 뒤에 괄호를 열어
@GetMapping 어노테이션의 변수명을 지정
@PathVariable("variable") String var
⬇️ 메소드 전체
// http://localhost:8080/get-api/variable2/{String 값}
@GetMapping(value = "variable2/{변수명}")
public String getVariable2(@PathVariable("같은 변수명") String 다른 변수명){
return var;
}
// http://localhost:8080/get-api/variable2/{String 값}
@GetMapping(value = "variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var){
return var;
}
value 속성은 생략이 가능
public String getVariable2(@PathVariable(value = "variable") String var){
: 쿼리 형식으로 값을 전달하기
URL에서 '?'를 기준으로 우측에 '{키}={값}' 형태로 구성된 요청을 전송하는 방법
이런 형식을 처리하려면 @RequestParam을 활용
매개변수 부분에 @RequestParam 어노테이션을 명시해 쿼리 값과 매핑!
// http://localhost:8080/get-api/request1?name=value&email=value2&organization=value3
@GetMapping(value = "/request1")
public String getRequestParam1(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
'?' 오른쪽에 쿼리스트링(query string) 명시
/request1?name=value&email=value2&organization=value3
쿼리스트링에는 키(변수의 이름)가 모두 적혀 있기 때문에 이 값을 기준으로 메서드의 매개변수에 이름을 매핑하면 값을 가져올 수 있다.
: 값에 상관없이 요청을 받을 수 있다.
예를 들어,
회원 가입 관련 API에서 사용자는 회원 가입을 하면서 필수 항목이 아닌 값을 기입하지 않는 경우가 있다.
이러한 경우에는 매개변수의 항목이 일정하지 않을 수 있어 Map 객체로 받는 것이 효율적!
// http://localhost:8080/get-api/request2?key1=value&key2=value2
@GetMapping("/request2")
public String getRequestParam2(@RequestParam Map<String, String> param){
StringBuilder sb = new StringBuilder();
param.entrySet().forEach(map ->{
sb.append(map.getKey() + " : " + map.getValue() + "\n");
});
return sb.toString();
}
DTO(Data Transfer Object) 란?
dto package 생성 - dto class 만들기
⬇️ DTO 클래스의 예
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 + '\'' +
'}';
}
}
Dto 클래스에는 전달하고자 하는 필드이 객체를 선언
➙ getter/setter 메서드 구현
➙ Dto 클래스에 선언된 필드는 컨트롤러의 메서드에서 쿼리 파라미터의 키와 매핑
⬇️ DTO 객체를 활용한 GET 메서드 구현
@GetMapping("/request3")
public String getRequestParam3(MemberDto memberDto){
return memberDto.toString();
}
URL
: 우리가 흔히 말하는 웹 주소
리소스가 어디에 있는지 알려주기 위한 경로
URI
: 특정 리소스를 식별할 수 있는 식별자를 의미
웹에서는 URL을 통해 리소스가 어느 서버에 위치해 있는지 알 수 있으며,
그 서버에 접근해서 리소스에 접근하기 위해서는 대부분 URI가 필요
VO
: 데이터 그자체로 의미가 있는 객체
가장 특징적인 부분은 읽기전용(Read-Only)으로 설계한다.
값을 변경할 수 없게 만든다 ➡️ 데이터의 신뢰성을 유지
DTO
: 데이터 전송을 위해 사용되는 데이터 컨테이너로
즉, 같은 애플리케이션 내부에서 사용되는 것이 아니라 다른 서버(시스템)로 전달하는 경우에 사용
✅ DTO는 다른 레이어 간의 데이터 교환에 활용된다고 설명
여기서 레이어는 애플리케이션 내부에 정의된 레이어일 수도 있고
인프라 관점에서의 서버 아키텍처 상의 레이어일 수도 있다.
= 이러한 개념의 혼용이 DTO와 VO의 차이를 흐리게 만듬