티스토리 뷰

 

📌 230824 TIL : [Spring Boot] GET, POST, PUT, DELETE 방식 처리


드디어 스프링부트 공부 시작이다 ㅎㅎ

아직 웹 초반이지만 그래도 지금까지 하던게 있으니까 쉬운 부분은 빠르게 복습한다는 느낌으로 공부하고 넘어가는게 목표다

처음으로 코멘트 달아보는데 나쁘지 않을지도..!

 

 


 

1. 스프링부트 개발 환경 세팅

- 빌드 툴 : gradle 

- jdk : java 17

 

 

학생 메일이 아직 살아있기 때문에 학생용 인텔리제이를 사용할 수 있어서 바로 스프링부트 프로젝트를 제작하였다. 

강사님이 빌드 툴을 gradle 로 하시기 때문에 gradle 로 했고, Lombok과 Spring Web 의존성 설치를 완료했다.

 

 

 

강사님께서 실습이지만 MVC 구조를 활용하고 있어, 마찬가지로 컨트롤러와 모델 패키지를 만들어서 실습하였다. 

 

또한 HTTP 방식들을 처리하는 API는 클래스 앞에 해당 어노테이션을 설정해줘야한다. 

@Slf4j //log.~ 사용 가능
@RestController //rest 처리하는 곳
@RequestMapping("/api") //리퀘스트 맵핑
public class RestApiController {

 

📝 GET / DELETE  :  Path Variable, query parameter 가 가능한 방식.

1) GET 방식 

- GET방식은 URL에 Query parameter를 넣어 보내는 방식이다. 

- 리소스를 읽는 용도이다. CRUD 중 R.

- 리소스를 읽기만 하기 때문에 멱등하고 안정하다.

 

보통 두가지 방법을 처리한다.

1. Path Variable 방식 : http://localhost:8080/api/echo/steve/age/20/is-man/true
2. Request Parameter 방식 : http://localhost:8080/api/book?category=IT&issuedYear=2023&issued-month=01&issued_day=31

 

1. Path Variable 방식 (/age/20/is-man/true) : @PathVariable 사용.

- @getMapping 안 에 있는 변수와 이름이 일치해야하지만, 일치하지 않을 경우 name 속성을 사용하면 된다.

    //http://localhost:8080/api/echo/steve/age/20/is-man/true
    @GetMapping("/echo/{message}/age/{age}/is-Man/{isMan}")
    public String echo(
            @PathVariable(name="message") String msg,
            @PathVariable int age,
            @PathVariable boolean isMan) {

        System.out.println("echo message: " + msg);
        System.out.println("age = " + age);
        System.out.println("isMan = " + isMan);

        // TODO String 타입의 변수 외에 다른 타입 받아보기.: boolean, integer
        // int 가 Integer 보다 나은 이유: int의 기본형은 0, Integer는 null 이기 때문에 에러를 막고자 int가 낫다.

        return msg;
    }

 

2. Request Parameter 방식 (book?category=IT&issuedYear=2023) : @ResquestParam 사용.

- @getMapping 안 에 있는 변수와 이름이 일치해야하지만, 일치하지 않을 경우 name 속성을 사용하면 된다.

//http://localhost:8080/api/book?category=IT&issuedYear=2023&issued-month=01&issued_day=31
    @GetMapping(path = "/book")
    public void queryParam(
            @RequestParam String category,
            @RequestParam String issuedYear,
            @RequestParam(name="issued-month") String issuedMonth,
            @RequestParam(name="issued_day") String issuedDay
    ) {
        System.out.println("category = " + category);
        System.out.println("issuedYear = " + issuedYear);
        System.out.println("issuedMonth = " + issuedMonth);
        System.out.println("issued_day = " + issuedDay);
    }

 

혹은 새로운 커스텀 자료형 클래스를 만들어서 활용해도 된다. 

파라미터의 개수가 많을 경우 이 방법을 추천한다. 

 

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BookQueryParam {
    private String category, issuedYear, issuedMonth, issuedDay;

}

-- 
@RestController
@RequestMapping("/api")
public class RestApiController {
    @GetMapping(path = "/book2")
    public void queryParamDTO(BookQueryParam bookQueryParam) {
        System.out.println("bookQueryParam = " + bookQueryParam);
    }
}

 

2) DELETE 방식

- 리소스의 삭제 CRUD 중 D, 역할을 할 때 사용한다. 

- GET 방식과 똑같이 PathVariable 방식, Request Parameter 방식 사용 가능하다. 

    @DeleteMapping(path={"/user/{username}/delete", "/user/{username}/del"})
    //path 넣어주면 여러 주소랑 맵핑이 가능함.
    public void delete(@PathVariable String username) {
        log.info("user-name : {}", username);
    }

 

 

📝 POST / PUT 방식 : HTTP Body에 넣어서 가져오는 방식 

1) POST 방식 

Post 방식은 HTTP body에 데이터를 넣어 전달. 핀테크 분야 같은 보안이 중요한 경우 POST를 더 많이 사용한다. 

넣는 데이터의 포맷은 JSON, TEXT, HTML 같을 수 있다. 

또한 POST  방식은 Get 다르게 파라미터가 기본이 객체로 전달 되므로 따로 클래스로 선언되어져 만들어진 객체를 사용한다. 

 

 

 

Post 방식 연습하기 사이트 : 크롬 웹스토어 api-tester 검색 후 밑의 프로그램 설치.

 

 

방법 ) @RequestBody 이용

- JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) :

변수명 userName 같은 경우를 카멜케이스(camel case)라고 하는데,

json으로 보낼 때 스네이크 케이스(snake case) 방식으로 바꾸어 보내준다. 

snake case 란, 언더바가 있는 변수명 스타일 즉 user_name이다.

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) //user_name,
public class UserRequest {
    private String userName, userEmail;
    private int userAge;
    private Boolean isKorean; 
    //boolean 타입은 lombok에 의해 자동생성된 setter 는 is를 무시한채 setKorean으로 저장됨.그래서 Boolean으로 해줘야함.
}


--

@RestController
@RequestMapping("/api")
public class PostApiController {
// http://localhost:8080/api/post/user
    @PostMapping("/post/user")
    public UserRequest post2(@RequestBody UserRequest userRequest) {
        System.out.println(userRequest);
        return userRequest;
    }

 

결과

 

 

2) PUT 방식 

- 리소스의 갱신, 생성 용도이다. 

- post와 마찬가지로 body에 값을 넣어 주고받는다. 

- log 사용할 때에는 {} 에 자동으로 객체정보를 넣어준다. 

 

@Slf4j //log 관련 어노테이션
@RestController
@RequestMapping("/api")
public class PutApiController {
    @PutMapping("/put")
    public void put(
            @RequestBody UserRequest userRequest) {
        log.info("request : {}", userRequest);
        //로그가 자체로 버퍼를 가져 출력하기 때문에, System.out.print 보다 성능이 좋음. 또한 커스텀도 가능함.
    }
}

결과 )