팥빵 먹으면서 코딩하는 블로그

controller 01 - GET 본문

study/JAVA SPRING

controller 01 - GET

김팥빵_ 2024. 8. 25. 01:43

GET(의미: 리소스 취득)

* CRUD: R

* 멱등성: O

* 안정성: O

* Path Variable: O

* Query Parameter: O

* Data Body: X

 

***시작 전에 8080이 아닌 다른 port로 연결하고 싶다면, resources의 application.properties라는 모듈에 server.port = 9090(임의) 라고 작성한다.

 

- controller(=GET에 대한 요청을 받는 것) 패키지 속 class

package com.example.hello.controller;

import com.example.hello.dto.UserRequest;
import org.springframework.web.bind.annotation.*;
import java.util.Map;

@RestController
@RequestMapping("/api/get") //주소
public class GetApiController {


    /*-----------------*/
    /* request mapping */
    /*-----------------*/
	
    //요새 쓰는 방식
    @GetMapping(path = "/hello") //http://localhost:9090/api/get/hello //get 메소드 하나만 동작됨
    public String hello(){
        return "get Hello";
    }

    //예전에 쓰던 방식
    @RequestMapping(path = "/hi", method = RequestMethod.GET) // get http://localhost:9090/api/get/hi
    //"hi"만 쓰면 get/ post / put / delete 모든 methods들이 실행됨
    public String hi(){
        return "hi";
    }




    /*---------------*/
    /* path variable */
    /*---------------*/
    
    // http://localhost:9090/api/get까진 고정
    // http://localhost:9090/api/get/path-variable/{name}  //name은 계속 변할거임 ex.kotlin, java, ...
    // 하지만 변화할 때마다 계속 주소를 추가할 순 없음.
    // 변화하는 부분에 대해 받기 위해서는 {}를 쳐줌

    @GetMapping("/path-variable/{iName}")
    public String pathVariable(@PathVariable(name = "iName") String pathName ){
        //변수 이름을 다른 걸로 선언하되, path variable의 name에다가 해당 {}의 속성을 적어주면 겹치지 x
        //pathName은 메소드 안에서 실제로 사용하는 변수
        System.out.println("PathVariable : " + pathName);
        return pathName;
    }






    /* query parameter */

    /*---------------------------------*/
    /* query parameter 받는 첫번째 방법 */
    /*---------------------------------*/
    
    /* query parameter가 무한정으로 뭐가 들어올지 모를 경우에 사용한다. */
    //쿼리 파라미터는 (?부터 시작함)
    //검색을 할 때, 여러 매개변수의 인자를 말함.
    //&연산자를 기준으로 key-value를 뜻함
    //ex.
    // https://www.google.com
    // /search?q = %ED%81%AC%EB%A1%AC+%EC%9B%B9%EC%8A%A4%ED%86%A0%EC%96%B4 // ? 다음으로 key=value가 들어가고
    // &oq = %ED%81%AC%EB%A1%AC+%EC%9B%B9%EC%8A%A4%ED%86%A0%EC%96%B4 // 다음으로 key=value가 들어가기 위해선 &가 필요함.
    // &gs_lcrp = EgZjaHJvbWUyBggAEEUYOTIGCAEQIxgnMgwIAhAjGCcYgAQYigUyDQgDEAAYgwEYsQMYgAQyCggEEAAYsQMYgAQyDQgFEAAYgwEYsQMYgAQyDQgGEAAYgwEYsQMYgAQyCggHEAAYsQMYgAQyCggIEAAYsQMYgAQyCggJEAAYsQMYgATSAQgyMzU1ajBqN6gCALACAA
    // &sourceid = chrome
    // &ie = UTF-8
    // 종합하면 규칙은 아래와 같다.
    // ?key=value&key2=value2

    // http://localhost:9090/api/get/query-param?user=steve&email=steve@naver.com&age=27

    @GetMapping(path = "query-param")
    public String queryParam(@RequestParam Map<String, String> queryParam){
        //queryParam이라는 변수에 @RequsetParam 주석을 이용해 key와 value를 받을거임.
        //queryParam: size=3

        StringBuilder sb = new StringBuilder();

        queryParam.entrySet().forEach( entry -> {
           System.out.println(entry.getKey());
           System.out.println(entry.getValue());
           System.out.println("\n");

           sb.append(entry.getKey()+" = "+entry.getValue()+"\n");

        });

        return sb.toString();
    }
    
    
    /*---------------------------------*/
    /* query parameter 받는 두번째 방법 */
    /*---------------------------------*/
    
    /* query parameter로 들어오는 수가 적을 때 쓰는 방법 */
    //Map으로 받을 때는 모든 parameters를 받을 수 있다. 하지만 코딩할 때 key를 하나씩 지정해야한다.
    //명시적으로 변수로 받기 위해서는 queryparam을 @RequestParam 주석을 이용해 하나씩 변수로 붙여주면 된다.
    @GetMapping("query-param02")
    public String queryParam02(@RequestParam String name,
                               @RequestParam String email,
                               @RequestParam int age){ //int의 경우에는 string형을 client가 넣으면 400에러가 남.
        System.out.println(name);
        System.out.println(email);
        System.out.println(age);

        return name+" "+email+" "+age;
    }


    /*---------------------------------*/
    /* query parameter 받는 세번째 방법 */
    /*---------------------------------*/
    
    /* 현업에서 가장 많이 쓰이는 방법 */
    //가장 추천하는 방법: 객체를 미리 정의해 받아오는 방법

    @GetMapping("query-param03")
    public String queryParam03(UserRequest userRequest){ //주석을 붙이지 않음.
        // 객체가 들어오게 되면 ?뒤의 값들을 spring boot가 판단을 한다.
        // key에 해당하는 이름들을 해당 객체에서 변수와 이름 매칭을 해주게 됨.
        System.out.println(userRequest.getName());
        System.out.println(userRequest.getEmail());
        System.out.println(userRequest.getAge());

        return userRequest.toString();
    }

}

 

- dto 패키지 속 class (query parameter를 객체로 받아오기 위해 만듦)

- class 이름: UserRequest

package com.example.hello.dto;

public class UserRequest {

    private String name;
    private String email;
    private int age;

    /* copy->Generate->Getter and Setter-> 쉬프트 누르고 파라미터 전체 선택->생성 */

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

 

'study > JAVA SPRING' 카테고리의 다른 글

controller 00.  (0) 2024.08.29
controller 05 - RESPONSE  (0) 2024.08.29
controller 04 - delete  (0) 2024.08.28
controller 03 - PUT  (0) 2024.08.28
controller 02 - POST  (0) 2024.08.25