-
[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도 비슷한 맥락으로 작성하면 된다.
'JAVA > Spring Boot' 카테고리의 다른 글
[Spring] Bean이 도대체 뭘까? (2) 2021.08.31 [Spring Boot] 이미지 로딩 방식 고찰 (0) 2021.05.26 [Spring Boot] DTO 관련 에러 해결 (Post 요청 시) (0) 2021.04.17 [Spring] 왜 백앤드 개발자가 되고 싶은지 (0) 2021.03.04