[ZB_BOOK STUDY] 스프링 부트 핵심 가이드 (5-1)

Dreamer·2024년 3월 31일
0
post-thumbnail

📖 스프링 부트 핵심 가이드

: 스프링 부트를 활용한 애플리케이션 개발 실무


📝 목차

5장. API를 작성하는 다양한 방법

5-1. 프로젝트 설정
5-2. GET API 만들기
- @RequestMapping으로 구현하기
- 매개변수가 없는 GET 메서드 구현
- @PathVariable을 활용한 GET 메서드 구현
- @RequestParam을 활용한 GET 메서드 구현
- DTO 객체를 활용한 GET 메서드 구현


5장. API를 작성하는 다양한 방법

  • 본격적인 애플리케이션 개발에 필요한 내용
  • 각 HTTP 메서드에 해당하는 API를 개발해보자
  • 외부의 요청을 받아 응답하는 기능을 구현
    ➙ 컨트롤러가 어떻게 구성되는지 알아보자!

5-1. 프로젝트 설정

: 4장에서 알려준 방식으로 프로젝트 생성

5-2. GET API 만들기

: GET API는 웹 애플리케이션 서버에서 값을 가져올 때 사용하는 API

  • 컨트롤러에 @RestController오 @RequestMapping을 붙이면
    내부에 선언되는 메서드에서 사용할 공통 URL을 설정할 수 있다.

  • 클래스 수준에서 @RequestMapping을 설정하면 내부에 선언한 메서드의 URL 리소스 앞에 @RequestMapping 값이 공통 값으로 추가 된다.
    @RequestMapping("/사용할 URL 작성")

@RestController 
@RequestMapping("/get-api")
public class GetController {

}

① @RequestMapping으로 구현하기 ➡️ 사용 ❌

: @RequestMapping 어노테이션에 아무런 설정 없이 선언하면
HTTP의 모든 요청을 받는다.
➙ GET 형식의 요청만 받기 위해서는 어노테이션에 별도 설정이 필요!
➙ @RequestMapping 어노테이션의 method 요소 값을 GET으로 설정하면 된다.
method = RequestMethod.GET


package com.springboot.api.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/get-api)
public class GetController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String getHello(){
        return "Hello World!";
    }
}

⭐ @RequestMappig 어노테이션은 더 이상 사용되지 않는다 ⭐
스프링 4.3 버전 이후로는 각 HTTP 메서드에 맞는 어노테이션을 사용한다.

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping

② 매개변수가 없는 GET 메서드 구현

GET 메서드 = @GetMapping 어노테이션
@GetMapping(value = "/name")

// http://localhost:8080/get-api/name

    @GetMapping(value = "/name")
    public String getName(){
        return "Flature";
    }

③ @PathVariable을 활용한 GET 메서드 구현

매개 변수를 받지 않는 메서드는 거의 쓰이지 않는다.
Why❓ 웹 통신의 기본 목적은 데이터를 주고 받는 것이기 때문

⬇️ URL 자체에 값을 담아 요청하는 방법

// http://localhost:8080/get-api/variable1/{String 값}

@GetMapping(value = "variable1/{variable}")
    public String getVariable1(@PathVariable String variable){
        return variable;
    }

⬇️ 요청 예시 URL
http://localhost:8080/get-api/variable1/{String 값}
중괄호로 표시된 위치의 값을 받아 요청하는 것을 알 수 있다.
값을 간단히 전달할 때 주로 사용하는 방법
GET 요청에서 많이 사용

✅ 이러한 방식으로 코드를 작성할 때 지켜야할 규칙

  • @GetMapping 어노테이션 값으로 URL을 입력할 때
    중괄호를 사용해 어느 위치에서 값을 받을지 지정해야 한다.

  • 매서드의 매개변수와 그 값을 연갈하기 위해 @PathVariable을 명시
    ➙ @GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름이 동일
    ➙ 동일하게 맞추기 어렵다면 @PathVariable 뒤에 괄호를 열어
    @GetMapping 어노테이션의 변수명을 지정
    @PathVariable("variable") String var

⬇️ 메소드 전체

// http://localhost:8080/get-api/variable2/{String 값}

@GetMapping(value = "variable2/{변수명}")
public String getVariable2(@PathVariable("같은 변수명") String 다른 변수명){
        return var;
    }
// http://localhost:8080/get-api/variable2/{String 값}

@GetMapping(value = "variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var){
        return var;
    }

value 속성은 생략이 가능

public String getVariable2(@PathVariable(value = "variable") String var){

④ RequestParam을 활용한 GET 메서드 구현

: 쿼리 형식으로 값을 전달하기

⭐ 값을 알고 있는 경우 ⭐

URL에서 '?'를 기준으로 우측에 '{키}={값}' 형태로 구성된 요청을 전송하는 방법

이런 형식을 처리하려면 @RequestParam을 활용
매개변수 부분에 @RequestParam 어노테이션을 명시해 쿼리 값과 매핑!

// http://localhost:8080/get-api/request1?name=value&email=value2&organization=value3

@GetMapping(value = "/request1")
public String getRequestParam1(
	@RequestParam String name,
    @RequestParam String email,
    @RequestParam String organization) {
    
    return name + " " + email + " " + organization;
}

'?' 오른쪽에 쿼리스트링(query string) 명시
/request1?name=value&email=value2&organization=value3

쿼리스트링에는 키(변수의 이름)가 모두 적혀 있기 때문에 이 값을 기준으로 메서드의 매개변수에 이름을 매핑하면 값을 가져올 수 있다.

⭐쿼리스트링에 들어올 값을 모르는 경우 : Map 객체 활용 ⭐

: 값에 상관없이 요청을 받을 수 있다.

예를 들어,
회원 가입 관련 API에서 사용자는 회원 가입을 하면서 필수 항목이 아닌 값을 기입하지 않는 경우가 있다.
이러한 경우에는 매개변수의 항목이 일정하지 않을 수 있어 Map 객체로 받는 것이 효율적!

// http://localhost:8080/get-api/request2?key1=value&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();
}

⑤ DTO 객체를 활용한 GET 메서드 구현

DTO(Data Transfer Object) 란?

  • 다른 레이어 간의 데이터 교환에 활용
  • 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터의 객체
  • DTO는 데이터를 교환하는 용도로만 사용하는 객체이므로
    DTO에는 별도의 로직이 포함되지 않는다.

dto package 생성 - dto class 만들기
⬇️ DTO 클래스의 예

package com.springboot.api.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;
    }

    public void setOrganization(String organization) {
        this.organization = organization;
    }

    @Override
    public String toString() {
        return "MemberDto{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", organization='" + organization + '\'' +
                '}';
    }
}

Dto 클래스에는 전달하고자 하는 필드이 객체를 선언
➙ getter/setter 메서드 구현
➙ Dto 클래스에 선언된 필드는 컨트롤러의 메서드에서 쿼리 파라미터의 키와 매핑


⬇️ DTO 객체를 활용한 GET 메서드 구현

@GetMapping("/request3")
public String getRequestParam3(MemberDto memberDto){
    return memberDto.toString();
}

📌 Tip

URI와 URL의 차이

  • URL
    : 우리가 흔히 말하는 웹 주소
    리소스가 어디에 있는지 알려주기 위한 경로

  • URI
    : 특정 리소스를 식별할 수 있는 식별자를 의미

웹에서는 URL을 통해 리소스가 어느 서버에 위치해 있는지 알 수 있으며,
그 서버에 접근해서 리소스에 접근하기 위해서는 대부분 URI가 필요

DTO와 VO

  • VO
    : 데이터 그자체로 의미가 있는 객체
    가장 특징적인 부분은 읽기전용(Read-Only)으로 설계한다.
    값을 변경할 수 없게 만든다 ➡️ 데이터의 신뢰성을 유지

  • DTO
    : 데이터 전송을 위해 사용되는 데이터 컨테이너로
    즉, 같은 애플리케이션 내부에서 사용되는 것이 아니라 다른 서버(시스템)로 전달하는 경우에 사용

✅ DTO는 다른 레이어 간의 데이터 교환에 활용된다고 설명
여기서 레이어는 애플리케이션 내부에 정의된 레이어일 수도 있고
인프라 관점에서의 서버 아키텍처 상의 레이어일 수도 있다.
= 이러한 개념의 혼용이 DTO와 VO의 차이를 흐리게 만듬

profile
Moving forward based on records

0개의 댓글