본문 바로가기
FrameWork & Runtime/Spring

Spring의 Request & Response

by jaeaemin 2022. 3. 1.

 

 

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 메서드는 규약이지 규칙이 아니다. ( 메서드에서 다른 행동을 한다 해도 에러는 발생하지 않음 ). 

 

https://www.codepresso.kr/

 

 

 

추가로 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