[Spring Boot] Chapter.5 API를 작성하는 다양한 방법

굿거리·2023년 5월 27일
0

1. Get

//@RequestMapping(value="/hello", method=RequestMethod.GET) // 4.3이전 버전
@GetMapping(value="/hello") // 4.3 이후 버전
public String getHello() {
	return "Hello World";
}
  • @PathVariable을 활용한 GET 메서드
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
	return variable;
}

매개변수에서의 변수명을 variable에서 var로 바꾸고 싶다면
@PathVariable("variable") String var 형식으로 사용하면 된다.

  • @RequestParam을 활용한 GET 메서드
// 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'}
  • 1번 -> body에 toString() 메서드 결괏값이 text/plain 형태의 content-type으로 응답됨.
//2번 응답(context-type: application/json;charset=UTF-8)
{
	name : "Flature",
    email : "thinkground.flature@gmail.com",
    organization : "Around Hub Studio"
}
  • 2번 -> body에 json 형태의 결괏값이 application/json 형태의 content-type으로 응답됨.

💚 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 라이브러리 내부에 내장돼있어 별도의 의존성을 추가하지 않아도 된다.

profile
개발자를 향해

0개의 댓글