Spring Framework에서의 Request & Response 처리
1. Spring Controller
: 요청에 대한 처리 ( Controller )
- Annotation을 통해 Spring Framework를 통해 run-time 내 코드 생성 & 추가 작업 지시
- 계층형 아키텍처의 Presentation Layer에 해당함
- Client의 요청에 대해 Application Layer로 처리를 위임하고
- 기본적으로 요청은 url , 응답은 view or data
[1] Controller의 역할을 수행할 클래스를 지정하자 !
[1-1] @Controller : return의 정보를 View파일의 리턴값으로 받아들인다 ( html )
기본 View파일의 위치는 ( resource/templetes/ "html파일" ) 중 해당하는 파일이 선택되어 리턴된다.
[1-2] @RestController : return의 정보를 Data 형식의 리턴값으로 받아들인다 ( 문자열, json 등 )
[2] Class 내부에서 특정 Request를 처리할 메소드를 지정하자 !
[2-1] @RequestMapping : 인자로 들어온 값에 대해서 url를 검사하여 메소드를 매핑시킨다.
- RequestMapping이 붙은 메소드의 경우 client 요청 시 Spring Framework에 의해 호출된다.
- Client 요청의 구분자는 URI Path 정보로 "기본 도메인/" 뒤에 이어지는 내용이다.
1. Spring Request
: Request Mapping의 Request Parameter 선택
Server에 요청 시 URI만 필요한 경우도 있지만, 추가적인 데이터 (닉네임, 글번호) 등이 필요한 경우가 존재한다.
이러한 경우 추가적으로 URI에 접속함과 동시에 데이터를 전송해야 할 필요가 생긴다
이를 해결할 수 있는 것이 바로 Request Parameter이다.
Spring Framework에서는 Request 파라미터가 들어오면 메소드(ReqeustMapping)의 파라미터에 저장하게 된다.
Request 파라미터의 종류
[1] Query String
- URI와 파라미터의 영역을 구분해서 사용한다.
- key-value 쌍으로 만든다. ( ? , & , = )
(ex) www.naver.com/search?name=jam&age=25
[1-1] @RequestParam
Query String을 활용하기 위해서 @RequestParam이라는 어노테이션을 사용한다
@RequestParameter내의 파라미터와 QueryString의 Key와 매핑되어서 일치하면 실행된다.
아래는 RequestMapping을 통해서 /post 뒤에 오는 QureyString에 대해 RequestParam을 사용해서 각 변수를 할당하는 예제이다.
url의 예시는 : localhost8080/post?category=order&id=jam예시대로 실행된다면 category에는 order라는 string 객체가, id에는 jam이라는 string 객체가 파라미터로 들어간다.
@RequestMapping(value = "/post")
public String getPost(@ReqeustParam(name="category") String category,
(@RequestParam(name="id") String id) {
return "category :" + category + " id : " + id );
}
RequestParam 내의 사용가능한 인자
- name : QueryString의 Key를 명시함 ( Key와 변수명이 같을 경우 생략이 가능 )
- required : True라면 URL에 해당 파라미터와 매핑될 key=value 쌍이 존재해야만 한다. (없는경우 에러 발생)
- defaultvalue : 데이터가 없는 경우 세팅될 기본 값
[2] Path Parameter
- URI의 일부를 파라미터 값을 사용한다.
- 즉 "/"로 이어지는 내용에 대해서 특정 부분을 값으로 사용하는 경우
(ex) www.naver.com/domain/user/3/post/27
[2-1] @PathVariable
- RequestMapping value URI에 { }로 Path Param임을 표시한다.
- 메소드 파라미터에 @PathVariable을 사용해서 값을 할당받는다.
- 확실히 URI 경로에 데이터가 파라미터 값이 위치한다면 좋지만, 선택적인 데이터인 경우 사용하기 어렵다.
@RequestMapping내의 파라미터에 { } 의 정보를 통해서 어떤 value가 필요한지 체크된다면
@PathVariable을 이용해 { key } 값의 이름을 통해서 매핑시켜 줄 수 있다.
아래는 RequestMapping으로 전달된 URI의 정보에 따라 @PathVariable을 사용하여 변수를 할당하는 예시이다
@RequestMapping(value = "/user/{type}/id/{id}")
public String getUser(@PathVariable(name="type") String type,
(@PathVariable(name="id") Integer id ) {
return "You requested " + type + " id : " + id );
}
일반적인 추천 사항 - 자원 요청 : Path Param = 모든 자원이 들어와야 함 - 정렬, 필터링 : Query String => 필수 데이터의 경우 Path Param의 속성을 이용한다. 하지만 이 경우 변경하기 까다로움 선택적 데이터의 경우 Query String을 사용하고 상대적으로 확장 편리함 |
[3]Request Body
- 기존의 간단한 데이터 (string, integer)의 경우 Query String 이나 Path Parameter로 전달 가능했다.
- 이보다 크기가 큰 데이터인 경우 다른 방식이 필요함 ( Form 데이터 같은 용량이 있는 데이터 )
- 이를 위해서 Request Body를 사용할 수 있다.
- Post , Put 등 일반적으로 데이터 수정 및 저장을 위한 Methodd는 Request Body를 주로 사용함
- Get , Delete 등 데이터를 주고 받는게 주 목적이 아닌 경우는 Query String, Path Param이 주로 사용됨
- Request Body의 장점은 다양한 포맷의 데이터를 전송 가능하다는 점인데 , 주로 JSON 데이터 형식이 사용된다.
Request Body가 Spring에서 주로 사용되는 방식은, Client에서 이를 이용해 Json 데이터를 전송하면 , Spring 에서 JSON 데이터 형식을 JAVA의 객체 파라미터로 저장한다. 그 후 JAVA 객체에 대해서 목적에 맞게 사용함. |
[1] Request Body의 동작 방식 예시
Post로 보내질 Reqeust Json Data가 아래와 같다면
{
"id":1,
"title":"hello",
"content":"nice to meet you",
"username": "jam"
}
Spring Framework의 Java 코드에서 PostDto 객체를 통해 입력으로 들어온 JSON파일을 처리할 수 있다.
즉 입력으로 들어온 데이터를 DTO 방식으로 계층 간 전달하면서 처리하는 방식이다.
@PostMapping
public String savePost (@RequestBody PostDto postDto) {
System.out.println(PostDto.getTitle());
return "Post /post"
}
/// PostDto class //
public class PostDto{
Integer Id;
String title;
String content;
String username;
...
}
2. Spring Response
이제 요청받은 URI ( 데이터 ) 에 의해 어떤 객체가 선택되고 어떤 메소드가 선택될지 정했다.
그러면 이제 어떠한 처리를 거친 뒤, 응답을 해줘야 한다
Spring Boot의 응답에 대해서 알아보자
- Client에서 Server에 url이나 데이터를 통해 요청을 한다면 요청에 대한 처리 후 결과를 응답해야 한다.
- 응답은 View , 문자열 , 이미지 , 영상 , JSON 등 여러가지 응답 형식이 존재한다.
위의 Controller에서 알아본 것과 마찬가지로 RestController는 어떤 DATA 즉, 값을 반환한다.
이 때 RestController는 객체를 반환할 수 있다.
주로, 이전에 살펴본 DTO(계층간 데이터 교환을 위한 객체)의 형식으로 반환되어 계층간 처리될 수 있다.
## Dto의 예시 : UserDto ##
public class UserDto {
Long id;
String name;
String email;
List<String> specialties
Public UserDto(Long id, String name, String email, List<String> specialties) {
... 생성자,
... getter/setter
## Dto를 반환하는 RestController 예시 ##
@RestController
public class UserController {
@RequestMapping(value = "/user")
public UserDto getUser() {
List<String> specialties = new ArrayList<>();
specialties.add("java");
specialties.add("Spring");
return new UserDto(1, "Jam", "jam@naver.com", "specialties);
}
}
위의 코드에서 DTO를 선언하고 Controller 단에서 DTO를 return하면서 UserDTO라는 객체를 반환했다.
이러한 경우 Spring에서 반환된 객체는 어떠한 형식으로 응답될까?
정답은 JSON 형식이다.
아래는 위의 코드를 통해서 반환된 객체의 형식으로 응답되는 데이터이다.
{
"id": 1,
"name": "Jam",
"email": "jam@naver.com",
"specialties": [
"java"
"spring"
]
}
이를 통해서 View에 JSON 파일을 주고 응답의 결과를 사용자에게 보여주게 된다.
HTTP 메서드
- Hyper Text를 주고 받기 위한 규약으로 웹 서버는 HTTP 표준에 따라 개발&통신 된다.
- HTTP 메서드란 HTTP 규약 중 하나로, 자원에 대해 수행하는 행동 종류를 명시하는 것이다
- CURD : Create, Update, Read, Delete
- PGPD : Post, Get, Put, Delete
- DB의 4가지 원칙 CURD와 매칭할 수 있다.
HTTP 메서드의 장점은 단일 URI로 다양한 행동을 정의할 수 있다는 점이다.
즉 동일한 URI에 HTTP 메서드를 추가하므로 실제 동작을 다르게 구현하는 것이 가능하다.
HTTP 메서드는 규약이지 규칙이 아니다. ( 메서드에서 다른 행동을 한다 해도 에러는 발생하지 않음 ).
추가로 Spring Framework에서는 HTTP Method를 위한 간소화 된 Annotation도 제공한다.
RequestMapping | Annotation for HTTP Method |
@RequestMapping(method = GET) | @GetMapping |
@RequestMapping(method = POST) | @PostMapping |
@RequestMapping(method = PUT) | @PutMapping |
@RequestMapping(method = DELETE) | @DeleteMapping |
'FrameWork & Runtime > Spring' 카테고리의 다른 글
MyBatis (0) | 2022.03.07 |
---|---|
Spring Bean & Dependency Injection(DI) (0) | 2022.03.01 |
Spring 서비스 계층 (0) | 2022.02.28 |
<코드 프레소 웹 개발 트랙> Spring Boot 웹 개발 초급 [1] (0) | 2022.02.22 |
Spring Framework와 DI&IOC (1) | 2022.02.21 |