이 글은 스프링 부트 핵심 가이드(장정우 저)를 읽고 개인적으로 정리하기 위한 글입니다.
GET API
- 웹 애플리케이션 서버에서 값을 가져올 때 사용하는 API
- @RequestMapping : HTTP의 모든 요청을 받는 어노테이션
- 스프링 4.3 버전 이후로는 새로 나온 어노테이션(@GetMapping, @DeleteMapping, @PostMapping, @PutMapping)을 사용하기 때문에 @RequestMapping은 잘 사용되지 않음
컨트롤러 클래스에 @RestController와 @RequestMapping 설정
@RestController
@RequestMapping("/api/v1/get-api)
public class GetController {
}
@PathVariable을 활용한 GET 메서드 구현
- 실무 환경에서는 매개변수를 받지 않는 메서드가 거의 쓰이지 않음
- 매개변수를 받을 때 자주 쓰이는 방법 중 하나 URL 자체에 값을 담아 요청하는 것
// http://localhost:8080/api/v1/get-api-variable1/{String 값}
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
return variable; // url에 넣은 입력값이 출력이 된다.
}
// @PathVariable에 변수명을 매핑하는 방법
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable("variable") String var) {
return var; // url에 넣은 입력값이 출력이 된다.
}
@RequestParam을 활용한 GET 메서드 구현
- URL 경로에 값을 담아 요청을 보내는 방법 외에도 쿼리 형식으로 값을 전달할 수도 있다.
- URI에서 ?를 기준으로 우측에'{Key}={Value}' 형태로 구성된 요청을 전송하는 방법
- 쿼리스트링에 어떤 값이 들어올지 모른다면 Map 객체를 활용할 수도 있다.
// http://localhost:8080/api/v1/get-api-request1?name=kim&email=test@naver.com
@GetMapping("/request1")
public String getRequestParam(
@RequestParam String name,
@RequestParam String email) {
return name + " " + email // kim test@naver.com;
}
// http://localhost:8080/api/v1/get-api-request1?key1=value1&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();
}
URI와 URL 차이
URL은 우리가 흔히 말하는 웹 주소를 의미하며, 리소스가 어디에 있는지 알려주기 위한 경로를 의미,
반면 URI는 특성 리소스를 식별할 수 있는 식별자를 의미 웹에서는 URL을 통해 리소스가 어느 서버에 위치해 있는지 알 수 있으며, 그 서버에 접근해서 리소스에 접근하기 위해서는 대부분 URI가 필요
DTO 객체를 활용한 GET 메서드 구현
DTO?
- Data Transfer Object, 다른 레이어 간의 데이터 교환에 활용, 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체
- DTO는 데이터를 교환하는 용도로만 사용되는 객체이기 때문에 DTD에는 별도의 로직이 포함되지 않음

// 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;
}
}
POST API
- 웹 에플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API
- GET API에서는 URL의 경로나 파라미터에 변수를 넣어 요청을 보냄
- POST API에서는 저장하고자 하는 리소스나 값을 HTTP 바디(body)에 담아 서버에 전달
- 그래서 URI가 GET API에 비해 간단
@RequestMapping으로 구현하기
@RequestMapping(value = "/domain", method = RequestMethod.POST)
public String postExample() {
return "Hello Post API";
}
// 위와 결과는 같다 RequestMapping보다는 PostMapping 사용!!!
@PostMapping("/domain)
public String postExample2() {
return "Hello Post API";
}
RequestBody를 활용한 Post 메서드 구현
- POST 요청에서는 리소스를 담기 위해 HTTP Body에 값을 넣어 전송
- Body영역에 작성되는 값은 일정한 형태를 취한다.
- 일반적으로 JSON 형식으로 전송
// http://localhost:8080/api/v1/post-api/member
// @RequestBody와 Map을 활용한 POST API 구현
@PostMapping("/member)
public String PostMember(@RequestBody Map<String, Object> postData) {
StringBuilder sb = new StringBuilder();
postData.entrySet().forEach(map -> {
sb.append(map.getKey() + " : " + map.getValue() + "\n");
});
return sb.toString();
}
// DTO 객체를 활용한 POST API 구현
// http://localhost:8080/api/v1/post-api/member2
@PostMapping("/member2)
public String postMemberDto(@RequestBody MemberDto memberDto) {
return memberDto.toString();
}

JSON이란?
JavaScript Object Notation의 줄임말로 자바스크립트의 객체 문법을 따르는 문자 기반의 데이터 포맷
- 현재는 다수의 프로그래밍 환경에서 사용
- 대체로 네트워크를 통해 데이터를 전달할 때 사용
- 문자열 형태로 작성되기 때문에 파싱하기도 쉽다.
PUT API
- 웹 애플리케이션 서버를 통해 데이터베이스 같은 저장소에 존재하는 리소스 값을 업데이트 하는데 사용
- POST와 비교하면 요청을 받아 실제 데이터베이스에 반영하는 과정에서 차이가 있다
- 컨트롤러 클래스 구현하는 방법은 POST와 거의 동일, 리소스를 서버에 전달하기 위해 HTTP Body를 활용해야 하기 때문
@RequestBody를 통한 PUT 메서드 구현
// http://localhost:8080/api/v1/put-api/member
@PutMapping("/member")
public String postMember(@RequestBody Map<String, Object> putData) {
StringBuilder sb = new StringBuilder();
putData.entrySet().forEach(map -> {
sb.append(map.getKey() + " : " + map.getValue() + "\n");
});
return sb.toString();
}
// http://localhost:8080/api/v1/put-api/member2
@PutMapping("/member2")
public MemberDto postMemberDt o2(@ReqeustBody MemberDto memberDto) {
return memberDto; // 응답으로 memberDto 객체를 JSON 형식으로 반환
}

DELETE API
- 웹 애플리케이션 서버에서 데이터베이스 등의 저장소에 있는 리소스를 삭제할 때 사용
- 서버에서는 클라이언트로부터 리소스를 식별할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할 수행
- 컨트롤러를 통해 값을 받는 단계에서는 간단한 값을 받기 때문에 GET 메서드와 같이 URI에 값을 넣어 요청을 받는 형식으로 구현
@PathVariable과 @RequestParam을 활용한 DELETE 메서드 구현
// @PathVariable을 활용한 DELETE 메서드 구현
// http://localhost:8080/api/v1/delete-api/{String 값}
@DeleteMapping(value = "/{variable}"}
public String deleteVariable(@PathVariable String variable) {
return variable;
}
// @RequestParam을 활용한 DELETE 메서드 구현
// http://localhost:8080/api/v1/delete-api/request1?email=value
@DeleteMapping("/request1)
public String getReuqestParam1(@RequestParam String email) {
return "email: " + email;
}
REST API 명세를 문서화 하는 방법
Swagger
- 명세 : 해당 API가 어떤 로직을 수행하는지 설명하고 이 로직을 수행하기 위해 어떤 값을 요청하며, 이에 따른 응답값으로는 무엇을 받을 수 있는지를 정리한 자료
Swagger 의존성 추가

Swagger 설정 코드
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.springboot.api"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Spring Boot Open API Test with Swagger")
.description("설명 부분")
.version("1.0.0")
.build();
}
}
// 기존 코드에 Swagger 명세를 추가
@ApiOperation(value = "GET 메서드 예제", notes = "@RequestParam을 활용한 GET Method")
@GetMapping("/request1")
public String getRequestParam(
@ApiParam(value = "이름", required = true) @RequestParam String name,
@ApiParam(value = "이메일", required = true)@RequestParam String email) {
return name + " " + email // kim test@naver.com;
}
- @ApiOperation : 대상 API의 설명을 작성하기 위한 어노테이션
- @ApiParam : 매개변수에 대한 설명 및 설정을 위한 어노테이션, 메서드의 매개변수 뿐 아니라 DTO 객체를 매개변수로 사용할 경우 DTO 클래스 내의 매개변수에도 정의할 수 있음

로깅 라이브러리
로깅?
애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것을 의미
로깅은 개발 영역 중 ‘비기능 요구사항’, 즉 사용자가나 고객에게 필요한 기능은 아니다
하지만 디버깅하거나 개발 이후 발생한 문제를 해결할 때 원인을 분석하는데 꼭 필요한 요소
Logback
- 자바 진영에서 가장 많이 사용되는 로깅 프레임워크는 LogBack
- log4j 이후에 출시된 로깅 프레임워크, slf4j를 기반으로 구현
- 과거에 사용되던 log4j에 비해 월등한 성능을 자랑
Logback의 특징
- 크게 5개의 로그 레벨(TRACE, DEBUG, INFO, WARN, ERROR)를 설정할 수 있다.
- ERROR : 로직 수행 중에 시스템에 심각한 문제가 발생해서 애플리케이션의 작동이 불가능한 경우
- WARN : 시스템 에러의 원인이 될 수 있는 경고 레벨을 의미
- INFO : 애플리케이션의 상태 변경과 같은 정보 전달을 위해 사용
- DEBUG : 애플리케이션의 디버깅을 위한 메세지를 표시하는 레벨을 의미
- TRACE : DEBUG 레벨보다더 상세한 메세지를 표현하기 위한 레벨을 의미
- 실제 운영 환경과 개발 환경에서 각각 다른 출력 레벨을 설정해서 로그를 확인 가능
- Logback의 설정 파일을 일정시간마다 스캔해서 애플리케이션을 재가동하지 않아도 설정을 변경 가능
- 별도의 프로그램 지원 없이도 자체적으로 로그 파일을 압축할 수 있음
- 저장된 로그 파일에 대한 보관 기간 등을 설정해서 관리할 수 있음
'북스터디 > 스프링 부트 핵심 가이드' 카테고리의 다른 글
| Chapter 08. Spring Data JPA 활용 (0) | 2023.06.11 |
|---|---|
| Chapter 06. 데이터베이스 연동 (3) | 2023.06.11 |
| Chapter 04. 스프링 부트 애플리케이션 개발하기 (0) | 2023.05.27 |
| Chapter 03. 개발 환경 구성 (0) | 2023.05.21 |
| Chapter 02. 개발에 앞서 알면 좋은 기초 지식 (2) | 2023.05.21 |