본문 바로가기

Spring Boot

[Spring Boot] Rest API GET 메소드(2)

728x90

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;
    }
}

위 코드는 서버에서 문자열을 응답으로 내려주는 두 가지 예시입니다.

  1. /api/hello 경로로 요청이 오면 단순한 문자열 "Hello SpringBoot"을 반환합니다.
  2. /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를 받아 처리하는 것이 적합합니다.

728x90