ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Controller와 GET, POST 사용 방법
    JAVA/Spring Boot 2021. 3. 28. 13:33

    맨 처음 강의를 들었던 것은 김영한 님의 스프링부트 기초 과정을 들었던 적이 있다.

    그 뒤로는 패스트 캠퍼스를 통해 자바의 문법을 다지고 슬슬 본격적으로 Spring을 공부하는 중이다.

    첫 글로는 어떤 것을 정리하면 좋을까 생각했고, Controller를 다루는 포스팅을 해보자고 생각했다.

     

    Controller란 무엇일까?

    먼저, Controller는 MVC 패턴에서 C를 담당하는 부분이다. MVC는 Model, View, Controller의 약자이다.

    개발할 때 보통 MVC패턴을 활용하여 개발한다. 만약 이러한 구분없이 코드를 짜게 된다면 코드가 주구장창 길어질 수 있고

    이렇게 된다면유지 보수가 어려워지고 개발하기 또한 어려워 지게 된다.

     

    Controller는 MVC 중의 Model 과 View 간의 상호작용을 하기 위한 과정이고, Client 에서 요청을 처리하긴 위한 로직을

    구현하여 View 반환한다.

     

    CRUD - GET, POST, UPDATE, DELETE

    controller에서 어떤 식으로 CRUD를 구현하는지 간단히 보도록 하자.

    각 매서드의 방식에는 여러가지가 있다. 

    • RequestMapping(method = " ") 를 통한 방식
    • "CRUD"Mapping 의 방식 ex) GetMapping, PostMapping 등

     

    데이터 전송 과정에서의 방식

    • @PathVariable을 통한 방식
    • Query를 통한 방식
    • DTO를 통한 방식 (현업에서 가장 많이 쓰인다고 한다.)

     

     

    1. GET

     

    먼저, RequestMapping 과 GetMapping을 보도록하자.

    package com.example.hello.controller;
    
    import org.springframework.web.bind.annotation.*;
    import java.util.Map;
    
    @RestController
    @RequestMapping("/api-get")
    public class GetApiController {
    
        // http://localhost:8080/api-get/hello
        @GetMapping("/hello")
        public String hello(){
            return "hello";
        }
    
        // http://localhost:8080/api-get/hello-spring
        @RequestMapping(path = "hello-spring", method = RequestMethod.GET)
        public String helloSpring(){
            return "hello-spring";
        }
    
    }

    맹 윗줄의 RequestMapping("api/get")을 볼 때 이 컨트롤러는 baseUrl 인 http://localhost:8080/에서 api/get이 추가된

    http://localhost:8080/api/get 으로 시작하는 url이 여기 이 컨트롤러에 작동하게 된다.

     

    RequestMapping에 method를 지정해주지 않으면 CRUD의 과정들 상관없이 모두 작동하게 된다.

     

    첫번째 @GetMapping의 어노테이션을 볼때, path = " " 부분은 default로 작동하여 경로만 적을 경우 생략 가능하다.

    @GetMapping("/hello")로 가능하다.

     

    두번째 @RequestMapping은 method = RequestMethod.GET 을 통해 어떤 method를 쓸 것인지 적어주었고,

    사실상 위의 GeetMapping과 같은 역할을 한다.

     

     

     

    GET에서 데이터를 주고 받는 상황에 대해서 알아 보자.

     

    package com.example.hello.controller;
    
    import org.springframework.web.bind.annotation.*;
    import java.util.Map;
    
    @RestController
    @RequestMapping("api-get")
    public class GetApiController {
    
        @GetMapping("/path-variable/{id}")
        public String path(@PathVariable String id){
            System.out.println("PathVariable : " + id);
            return id;
        }
    
        // http://localhost:8080/api-get/query-params?id=kimjinoh&passwod=kjo& ....이런식의 형식
        @GetMapping("/query-params")
        public String param(@RequestParam Map<String, String> queryParam){
            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();
        }
    
    }

     

    첫번째 @PathVariable을 통한 방식에서는 {id} 를 통해 어떤 사용자가 오는 지 url의 id 값으로 받을 수 있다.

    @PathVariable 어노테이션을 통해 String id (변수명은 똑같이 해준다) 으로 받을 수 있다.

    만약 변수 명이 다른 변수명과 겹치게 하고 싶다면 @PathVariable(name = "id") String id_number 을 통해 변수 명을 수정 할 수 있다.

     

    두번째 쿼리를 통한 데이터 전달 방식을 보도록 하자.

    query parameter을 통해 데이터를 전달하고 싶다면 해당 URL뒤 ?을 붙인 뒤 key=value 값을 &을 기준으로 나누어 보낸다.

    예를들어 user : 데굴, passwod: degurii 를 쿼리를 통해 보내고 싶다면,

    http://localhost:8080/api-get/query-params?user=데굴&password=degurii 의 URL을 통해서 받을 수 있다.

     

     

     

    마지막 DTO를 통해 주고 받는 과정을 보겠다.

    현업에서도 가장 많이 쓰이고 내가 보기에도 이런식으로 짜 놓으면 코드의 유지보수가 쉬울 것 같았다.

     

    먼저 DTO란 무엇일까??

    Data Transfer Object의 약자로서 데이터를 전송할 때 객체를 주고 받는 것이다.

    먼저 전송할 객체를 정의 해보도록 하자.

    User 객체에 정보 이름, 이메일 주소, 나이를 둔다. 

     

    UserRequest객체

    package com.example.hello.dto;
    
    public class UserRequest {
        private String name;
        private String email;
        private int age;
    
    
        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 +
                    '}';
        }
    }
    

     

    해당 객체를 통해 데이터를 주고 받을 때, Controller의 코드는 이렇다.

    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 {
    
        @GetMapping("/dto")
        public String dto(UserRequest user){
            System.out.println(user.getName());
            System.out.println(user.getEmail());
            System.out.println(user.getAge());
            return user.toString();
        }
    
    }

    객체를 통해 데이터를 전달 하거나 받게되면 위 처럼 @ 어노테이션을 통해 전달하지 않아도 될 뿐더러, 코드가 깔끔해진다.

    해당 객체에 어떤 것이 들어있는지 dto 의 객체들을 보며 알 수 있어 매우 유용하고 좋은 방법인 것 같다.

     

     

    2. POST

    위의 GET 방식과 마찬가지로 데이터를 전송할 수 있다. query를 통해 데이터를 전달 받을순 있지만,

    보통 @RequestBody를 통해 데이터를 받는다.

     

    데이터 전송 방식

    • Map을 통해 RequestBody의 정보를 가져오기
    • DTO를 통한 데이터 전송

     

    1. Map함수 활용

     

    package com.example.hello.controller;
    
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.Map;
    
    @RestController
    @RequestMapping("/api")
    public class PostApiController {
    
        @PostMapping("/post")
        public void post(@RequestBody Map<String, Object> requestData){
            requestData.forEach((key, value) -> {
                System.out.println("key : " + key);
                System.out.println("key : " + value);
            });
        }
    
    }
    

     

     

    2. DTO를 통한 데이터 전달

     

    - 전달 받고자하는 객체를 위의 GET과 같이 정의 한다.

     

    - post에서의 dto 방식

    package com.example.hello.controller;
    
    import com.example.hello.dto.PostRequestDto;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api")
    public class PostApiController {
    
        @PostMapping("/post-dto")
        public void postDto(@RequestBody PostRequestDto req){
            System.out.println(req);
        }
        
    }
    

    GET 방식에서의 전달방법과 똑같이 작성해주면 된다.

     

    이것으로 Controller에서의 GET, POST 방식을 마치겠다. UPDATE, DELETE도 비슷한 맥락으로 작성하면 된다.

    댓글

Designed by Tistory.