GET 메소드 간단한 응답 코드 구현
클래스 경로 라우터 지정하기
@RequestMapping("/경로")는 클래스에 사용되어 해당 경로로 오는 요청을 해당 클래스에서 처리할 수 있게 합니다.
이를 사용하면 코드의 가독성과 유지보가 쉬워집니다.
예시 코드:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api") // 클래스에 @RequestMapping("/경로")를 지정한다
public class RestApiController {
@GetMapping("/hello") // 도메인/api/hello
public String hello() {
return "Hello SpringBoot";
}
@GetMapping("/hi") // 도메인/api/hi
public String hi() {
return "hi SprintBoot";
}
}
위 코드는 클래스 레벨에서 "/api" 경로를 지정한 예시입니다.
이렇게 하면 클래스 내의 모든 매핑 메소드들이 "/api" 경로를 기반으로 동작하게 됩니다
이를 비교하기 위해 클래스 레벨에서 @RequestMapping을 사용하지 않은 예시도 살펴보겠습니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RestApiController {
@GetMapping("/api/hello") // 도메인/api/hello
public String hello() {
return "Hello SpringBoot";
}
@GetMapping("/api/hi") // 도메인/api/hi
public String hi() {
return "hi SprintBoot";
}
}
위 두 개의 코드는 동일한 기능을 하지만, 클래스 레벨에서 @RequestMapping을 사용한 첫 번째 코드가 가독성 측면에서 더 좋습니다.
클래스 레벨에서 경로를 지정하면 공통된 경로를 한 곳에서 관리할 수 있어 유지보수도 용이해집니다
중요한 개념 설명
서버는 특정 데이터를 요청받고, 이에 대한 응답으로 문자열을 내려줍니다. 해당 문자열이 HTML인지 JSON인지는 브라우저가 판단하여 해석하고 화면에 보여줍니다.
예시 코드:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api") // 클래스에 @RequestMapping("/경로")를 지정한다
public class RestApiController {
@GetMapping("/hello") // 도메인/api/hello
public String hello() {
return "Hello SpringBoot";
}
@GetMapping("/html") // 도메인/api/html
public String html() {
var html = """
<html>
<body>
<h1> Hello SpringBoot </h1>
</body>
<html>
""";
return html;
}
}
위 코드는 서버에서 문자열을 응답으로 내려주는 두 가지 예시입니다.
- /api/hello 경로로 요청이 오면 단순한 문자열 "Hello SpringBoot"을 반환합니다.
- /api/html 경로로 요청이 오면 HTML 형식의 문자열을 반환합니다.
서버는 단순히 문자열을 전송하지만, 브라우저는 해당 문자열을 해석하여 HTML 태그로 변환하고 화면에 표시합니다. 예를 들어, 위의 HTML 응답은 브라우저에서 <h1> 태그로 해석되어 "Hello SpringBoot"라는 큰 제목으로 출력됩니다.
요약
- 서버는 문자열을 전달합니다.
- 문자열을 해석하는 것은 브라우저의 역할입니다.
이 개념을 명확하게 이해하면, 서버와 클라이언트 간의 데이터 전송과 해석 과정을 더욱 쉽게 이해할 수 있을 것입니다.
Query Parameter란?
Query Parameter는 URL의 일부분으로, 특정 데이터나 리소스를 필터링하거나 검색하는 데 사용됩니다. Query Parameter는 ?로 시작하며, key=value의 형태로 구성되고, 여러 개의 파라미터는 &로 연결됩니다.
필터링 예제
예를 들어, 특정 조건의 책을 검색할 때 다음과 같은 URL을 사용할 수 있습니다:
https://www.example.com/book?category=IT&issuedYear=2024&issued-month=01&issued_day=31
여기서:
- category는 IT
- issuedYear는 2024
- issued-month는 01
- issued_day는 31
코드 예제
Spring Boot에서는 @RequestParam 애너테이션을 사용하여 Query Parameter를 매핑할 수 있습니다. 아래는 해당 예제를 구현한 코드입니다.
URI에서 대문자를 사용하는 경우
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RestApiController {
@GetMapping("/book") // 도메인/book
public String queryParam(
@RequestParam String category,
@RequestParam String issuedYear,
// issued-month 는 자바에서 선언이 되지 않습니다
// name으로 매핑을하여 issuedMonth 변수에 할당합니다
@RequestParam(name = "issued-month") String issuedMonth,
@RequestParam(name = "issued-day") String issuedDay
) {
System.out.println(category);
System.out.println(issuedYear);
System.out.println(issuedMonth);
System.out.println(issuedDay);
return category + "/" + issuedYear + "/" + issuedMonth + "/" + issuedDay;
}
}
여기서 @RequestParam(name = "issued-month")와 같이 name 속성을 사용하여 Query Parameter와 자바 변수명을 매핑할 수 있습니다.
URI에서 대문자를 사용하지 않는 경우
대문자를 사용하지 않고, URI 형식에 맞추어 소문자와 하이픈을 사용하는 경우:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RestApiController {
@GetMapping("/book") // 도메인/book
public String queryParam(
@RequestParam String category,
@RequestParam(name = "issued-year") String issuedYear,
@RequestParam(name = "issued-month") String issuedMonth,
@RequestParam(name = "issued-day") String issuedDay
) {
System.out.println(category);
System.out.println(issuedYear);
System.out.println(issuedMonth);
System.out.println(issuedDay);
return category + "/" + issuedYear + "/" + issuedMonth + "/" + issuedDay;
}
}
개발자의 선택
- 일관성 있는 변수명 사용: URI와 자바 변수명을 일관되게 사용하여 혼란을 줄일 수 있습니다. 예를 들어, 모두 소문자와 하이픈을 사용하는 방법.
- URI 형식에 맞추기: URI는 소문자와 하이픈을 사용하고, 자바 변수명은 camel case를 사용하는 방법. 이 경우 @RequestParam의 name 속성을 활용하여 매핑할 수 있습니다.
- 자바 형식을 유지하면서 URI 형식에 맞추기: 자바 변수명을 snake case로 사용하는 것은 추천하지 않는 방법입니다.
추가 설명
- URI에서 대문자 사용: 일반적으로 URI에서는 대문자를 사용하지 않는 것이 관례입니다. 소문자와 하이픈을 사용하는 것이 더 일관되고 가독성이 좋습니다.
- 유지보수성: 코드와 URI의 일관성을 유지하면 유지보수성이 높아집니다. 개발자가 코드와 URI를 일관되게 관리할 수 있도록 규칙을 정하는 것이 좋습니다.
- 표준 준수: 표준을 따르는 것이 중요한 경우, URI에서 대문자 대신 소문자와 하이픈을 사용하는 것이 권장됩니다.
Query Parameter로 데이터 받아 객체 생성하기
모델 클래스 생성
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BookQueryParam {
private String category;
private String issuedYear;
private String issuedMonth;
private String issuedDay;
}
위와 같이 BookQueryParam 클래스를 생성하여 Query Parameter를 객체로 매핑할 준비를 합니다.
컨트롤러에서 Query Parameter 사용하기
import org.example.restapi.model.BookQueryParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RestApiController {
@GetMapping("/book") // 도메인/book
public BookQueryParam queryParam(
BookQueryParam bookQueryParam
) {
System.out.println(bookQueryParam);
return bookQueryParam;
}
}
위 코드에서 @GetMapping("/book")은 /book 경로로 GET 요청이 들어왔을 때 해당 메소드가 실행되도록 설정합니다. queryParam 메소드는 BookQueryParam 객체를 파라미터로 받아서 그대로 반환합니다. 이렇게 하면 Spring이 자동으로 Query Parameter를 BookQueryParam 객체의 필드에 매핑하여 전달해 줍니다.
Query Parameter 매핑 규칙
- 변수명 일치: Query Parameter의 이름과 BookQueryParam 클래스의 필드명이 일치해야 자동으로 매핑됩니다.
- Camel Case 규칙: 보통 Java 코드에서는 Camel Case를 사용하므로, Query Parameter도 Camel Case를 사용하는 것이 좋습니다. 이를 통일하면 매핑이 보다 쉬워집니다.
@RequestParam vs 객체로 받을 때의 차이
- @RequestParam: 개별적인 Query Parameter를 직접적으로 받을 때 사용합니다. 하나 이상의 Query Parameter를 받을 때는 메소드의 파라미터로 ,로 구분하여 여러 개 사용할 수 있습니다.
@GetMapping("/book")
public String getBook(@RequestParam String category, @RequestParam String issuedYear) {
// 로직 처리
}
- 객체로 받을 때: 여러 개의 Query Parameter를 한 번에 객체로 받아서 처리할 때 유용합니다. 코드의 가독성이 좋아지며, 코드 길이를 줄일 수 있습니다.
snake_case 사용에 대한 고려
Java에서는 변수명으로 Camel Case를 선호하지만, 외부 시스템이나 데이터베이스와 통신할 때 snake_case를 사용하는 경우가 있습니다. 이 경우에는 Spring의 @RequestParam을 사용하여 각각의 Query Parameter를 받아 처리하는 것이 적합합니다.
'Spring Boot' 카테고리의 다른 글
[Spring Boot] Web에서 응답 만드는 방법 - Response Entity (0) | 2024.07.02 |
---|---|
[Spring Boot] Rest API Put 메서드 + boolean is 변수명의 문제점 (0) | 2024.07.01 |
[Spring Boot] Rest API Post 메서드 (1) | 2024.07.01 |
[Spring Boot] Rest API GET 메소드(1) (0) | 2024.06.28 |
자바 백엔드 개발자가 알아야 할 지식 (0) | 2024.06.25 |