1. Get
//@RequestMapping(value="/hello", method=RequestMethod.GET) // 4.3이전 버전
@GetMapping(value="/hello") // 4.3 이후 버전
public String getHello() {
return "Hello World";
}
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
return variable;
}
매개변수에서의 변수명을 variable에서 var로 바꾸고 싶다면
@PathVariable("variable") String var
형식으로 사용하면 된다.
// http://localhost:8080/api/v1/get-api/request1?name=value1&email=value2&organization=value3
@GetMapping(value = "/request1")
public String getRequestParam1(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
🧡 URI와 URL의 차이
URL은 우리가 흔히 말하는 웹 주소를 의미하며, 리소스가 어디에 있는지 알려주기 위한 경로를 의미한다. 반면 URI는 특정 리소스를 식별할 수 있는 식별자를 의미한다.
웹에서는 URL을 통해 리소스가 어느 서버에 위치해 있는지 알 수 있으며, 그 서버에 접근해서 리소스에 접근하기 위해서는 대부분 URI가 필요하다.
💛 DTO와 VO
DTO는 Data Transfer Object로, 다른 레이어 간의 데이터 교환에 활용된다. DTO는 데이터를 교환하는 용도로만 이용되기에 별도의 로직이 포함되지 않는다.
VO는 데이터 그 자체로 의미가 있는 객체를 의미한다. 따라서 읽기 전용이고, 값을 변경할 수 없게 만들어 데이터의 신뢰성을 유지해야 할 필요가 있다.
2. Post
// http://localhost:8080/api/v1/post-api/member2
@PostMapping(value = "/member2")
public String postMemberDto(@RequestBody MemberDto memberDto) {
return memberDto.toString();
}
위처럼 @RequestBody
로 MemberDto를 설정해두면 MemberDto의 멤버 변수를 요청 메시지의 키와 매핑에 값을 가져온다.
3. Put
PUT은 웹 애플리케이션 서버를 통해 데이터베이스같은 저장소에 존재하는 리소스 값을 업데이트 하는 데 사용한다. POST와 비교하면 요청을 받아 실제 데이터베이스가 반영하는 과정(서비스 로직)에서 차이가 있지만 컨트롤러 클래스를 그현하는 방법은 POST와 거의 동일하다. 리소스를 서버에 전달하기 위해 HTTP Body를 활용해야 하기 때문이다.
// http://localhost:8080/api/v1/put-api/member1
@PutMapping(value = "/member1")
public String putMemberDto(@RequestBody MemberDto memberDto) { // 1번
public MemberDto putMemberDto(@RequestBody MemberDto memberDto) { // 2번
return memberDto.toString(); // 1번
return memberDto; // 2번
}
1번은 MemberDto 클래스에서 오버라이딩한 .toString() 메서드를 리턴하고, 2번은 memberDto 인스턴스 자체를 리턴한다. 이에 따라 이 요청에 대한 응답은
//1번 응답(context-type: text/plain;charset=UTF-8)
MemberDTO{name='Flature', email='thinkground.flature@gmail.com', organization='Around Hub Studio'}
//2번 응답(context-type: application/json;charset=UTF-8)
{
name : "Flature",
email : "thinkground.flature@gmail.com",
organization : "Around Hub Studio"
}
💚 ResponseEntity
// http://localhost:8080/api/v1/put-api/member3
@PutMapping(value = "/member3")
public ResponseEntity<MemberDto> putMemberDto(@RequestBody MemberDto memberDto) {
return ResponseEntity
.status(HttpStatus.ACCEPTED) // 응답코드 202
.body(memberDto);
}
위처럼 ResponseEntity
를 사용하면 원하는 HttpStatus와 body를 간단하게 결합하여 응답을 만들 수 있다.
4. Delete
Delete는 데이터베이스 등의 저장소에 있는 리소스를 삭제할 때 사용한다. 서버에서는 클라이언트로부터 리소스를 식별할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할을 수행한다. 이 때 컨트롤러를 통해 값을 받는 단계에서 간단한 값만을 받기 때문에 Get 메서드와 같이 URI에 값을 넣어 요청을 받는 형식으로 구현된다.
💙 Swagger
API를 개발하면 명세를 관리해야 한다. 명세란 해당 API가 어떤 로직을 수행하는지 설명하고 이 로직을 수행하기 위해 어떤 값을 요청하며, 이에 따른 응답값으로는 무엇을 받을 수 있는지를 정리한 자료이다.
Swagger는 API 명세를 관리하기 위해 도움을 주는 오픈소스 프로젝트이다.
💜 Logback
Logback은 스프링 부트의 spirng-boot-starter-web 라이브러리 내부에 내장돼있어 별도의 의존성을 추가하지 않아도 된다.