[Spring] 스프링 입문 공부4 !

석연걸·2025년 1월 30일

스파르타 코딩클럽

목록 보기
12/17

Client에서 Server로 데이터를 전달하는 방법 !!

  1. GET + Query Parameter
  • URL의 Query Parameter을 사용하여 전달
    • url에서 ?뒤에 들어가는 부분이 쿼리 파라미터이다.
  • 예시코드
@Slf4j
@Controller
public class RequestParamController {

    @GetMapping("/request-params")
    public void params(
			HttpServletRequest request,
			HttpServletResponse response
			) throws IOException {
															 
        String key1Value = request.getParameter("key1");
		String key2Value = request.getParameter("key2");
				
		log.info("key1Value={}, key2Value={}", key1Value, key2Value);
        response.getWriter().write("success");
    }
}
  • response.getWriter().write()
    • HttpServletResponse를 사용해 직접 응답값을 다룰 수 있다.
    • @Controller와 @ResponseBody를 함께 사용한 것과 같다
      • @Controller + ResponseBody = @RestController

  1. POST + HTTP Form Data
  • HTTP Request Body에 쿼리 파라미터 형태로 전달하는 방법
  • 예시 코드
@Slf4j
@Controller
public class RequestBodyController {

    @PostMapping("/form-data")
    public void requestBody(
			HttpServletRequest request,
			HttpServletResponse response
			) throws IOException {
															 
        String key1Value = request.getParameter("key1");
		String key2Value = request.getParameter("key2");
				
		log.info("key1Value={}, key2Value={}", key1Value, key2Value);
        response.getWriter().write("success");
    }
}
  • HTTP Form Data와 Query Parameter 모두 HttpServletRequest를 사용했다.
  • HttpServletRequest.getParameter("key")를 사용하면 두 경우 모두 데이터 형식(key=value)이 같기 때문에 해당 값에 접근이 가능

  1. HTTP Request Body
  • 데이터(JSON,TEXT,XML 등)를 직접 HTTP Message Body에 담아서 전달한다.
  • 주로 @RestController에서 사용하며, 대부분 JSON 형식으로 데이터를 전달
    • POST, PUT, PATCH에서 사용한다.
    • GET, DELETE는 Body에 데이터를 담는것을 권장하지 않는다.

@RequestParam

  • URL에서 파라미터 값과 이름을 함께 전달하는 방식으로, 주로 GET 방식의 통신을 할 때 사용된다.
  • 사용하면 Parameter 값에 아주 쉽게 접근이 가능하다.
  • 예시 코드
@Slf4j
@Controller
public class RequestParamControllerV2 {
	@ResponseBody
	@GetMapping("/v1/request-param")
	public String requestParamV1 (
					@RequestParam("name") String userName,
					@RequestParam("age") int userAge													
	) {
		// logic
		log.info("name={}", userName);
        log.info("age={}", userAge);
		return "success";
	}
}
  1. @Controller + @ResponseBody = @RestController
    • View를 찾는 것이 아닌 ResponseBody에 응답을 작성한다.
  2. @RequestParam
    • 파라미터 이름으로 바인딩한다.
  3. @RequestParam("속성값")
    • 속성값이 파라미터 이름으로 매핑된다.
  • 속성값과 파라미터 이름이 같으면 ("속성값")을 생략할 수 있다.

  • required 속성 설정
    • 파라미터의 필수 값을 설정한다.
    • API 스펙을 규정할 때 사용한다.
    • @RequestParam으로 설정하면 기본값은 true이다.
      • true로 설정된 파라미터가 요청에 존재하지 않으면 400 Bad Request
    • 예시 코드
@ResponseBody
@GetMapping("/v4/request-param")
public String requestParam (
		@RequestParam(required = true) String name, // 필수
		@RequestParam(required = false) int age	// 필수가 아님										
) {
        // logic
        log.info("name={}", name);
        log.info("age={}", age);
        return "success";
}

  • 파라미터 Key값만 있고 Value가 없는 경우
    • ex) http://localhost:8080/request-param?name=
    • 빈 문자열로 인식하며, required가 true여도 빈 문자열은 통과가 됨. (주의!)

@ModelAttribute

  • 요청 파라미터를 받아 필요한 Object로 바인딩 해준다.
  • 주로 HTML 폼에서 전송된 데이터를 바인딩하며, POST인 경우 사용된다.
  • @RequestParam의 과정을 자동화한다.
  • 예시 코드
@ResponseBody
@PostMapping("/v2/tutor")
public String modelAttributeV2(@ModelAttribute Tutor tutor) {
	String name = tutor.getName();
	int age = tutor.getAge();

	return "tutor name = " + name + " age = " + age;
}
  • 여기서 Tutor 클래스에는 Getter와 Setter가 있어야 설정이 된다.

  • 그 때 파라미터 이름과 필드 이름이 반드시 같아야된다.


HTTP Message Body 요청

  • HTTP Message Body에 직접적으로 Data를 전달하는 경우이다.

    • Request Body의 데이터를 바인딩하는 방법이다.
  • REST API에서 주로 사용하는 방법

  • POST, PUT, PATCH에서 주로 사용하는 방법이다. (Create, Update)

  • JSON, XML, TEXT 등을 데이터 형식으로 사용한다.

  • 위의 어노테이션인 @RequestParam@ModelAttribute는 GET + Query Parameter과 POST + HTML Form Data의 데이터를 바인딩 하는 방법

  • HTTP Request, Response 예시

    • 서버에서 Request로 전달받은 데이터를 처리하기 위해 바인딩을 해야 함
    • ex) JSON --> Object

TEXT

  • HTTP Request Body에 데이터가 전송되는 경우 HTTP Message Converter를 통해 바인딩된다.
  • 현대에는 Restful API를 주로 사용해 대부분 JSON 형식으로 통신
  • HTTP Entity
    • HTTP Entity를 사용하면 HTTP Message Converter가 사용된다.
    • 예시 코드
@PostMapping("/v3/request-body-text")
public HttpEntity<String> requestBodyTextV3(HttpEntity<String> httpEntity) { 
		
	// HttpMessageConverter가 동작해서 아래 코드가 동작하게됨
	String body = httpEntity.getBody();
    
	// 매개변수 = Body Message	
	return new HttpEntity<>("response = " + body); 
	
}
  • HTTP Message Converter 덕분에 간단하게 Request Data에 접근이 가능하다.
  • HTTP Entity를 사용하면 HTTP Message Converter가 동작하여 자동으로 매핑된다.
  • 요청 뿐만이 아닌 응답까지 HTTP Entity 하나로 가능하다.

Object Mapper

  • Java 객체를 JSON 형태로 변환하거나, JSON을 Java 객체로 변환시키는 Jackson 라이브러리 클래스
  • 생성비용이 비싸기 때문에 bean/static으로 사용하는 것이 좋다.

@RequestBody

  • @RequestBody를 사용하면 객체를 매핑할 수 있다.
  • HttpEntity<>이나 @RequestBody를 사용하면 HTTP Message Converter가 Request Body의 데이터를 개발자가 원하는 String이나 Object로 변환
  • 쉽게 설명하면 HTTP Message Converter가 Object Mapper를 대신함

  • @RequestBody를 생략하면 @ModelAttribute가 된다.
    • 요청 파라미터를 처리하도록 된다는 것
  • Request Header의 Content-Type은 꼭 application/json 이여야 한다.
    • 위 설정 정보를 기반으로 Message Converter가 실행된다.
  • 클라이언트로부터 JSON 데이터를 요청 받았을 때 파라미터로 바로 바인딩 해준다.

Layered Architecture

  • 애플리케이션을 세 가지 주요 계층으로 나누어 구조화 하는 방법
  • 각 계층간 역할 분담이 이루어져 코드의 재사용성, 유지 보수성, 확장성을 높임

  • Layered Architecture 구조
  • Presentation Layer
    • 사용자의 요청을 받고 응답하는 역할을 수행한다.
    • 화면을 응답하거나 데이터를 응답하는 API를 정의한다.

  • Business Layer (Service Layer)
    • 비즈니스 로직을 수행한다.
    • 요청을 해석해 Repository Layer에 전달한다.
    • 일반적으로 하나의 비즈니스 로직은 하나의 트랜잭션으로 동작한다.

  • Data Access Layer (Repository Layer)
    • DB와 연동되어 실제 데이터들을 관리한다.

  • 용어 설명
    • DTO (Data Transfer Object)
      • 계층간 데이터 전달을 위해 사용되는 객체
    • Model
      • Entity
        • JPA와 관련이 있으며, JPA에서는 Entity라는 형태로 데이터를 반환한다.
    • DAO (Data Access Object)

  • Layered Architecture 적용


  1. Controller
  • 클라이언트의 요청을 받는 역할을 수행한다.
  • 요청에 대한 처리를 Service Layer에 전달한다.
  • Service에서 처리 완료된 결과를 클라이언트에 응답한다.
  • 사용하는 Annotation : @Controller, @RestController

  1. Service
  • 사용자의 요청 사항을 처리한다.
  • DB와 상호작용이 필요한 경우 Repository Layer에게 요청한다.
  • 사용하는 Annotation : @Service

  1. Repository
  • DB와 상호작용을 수행한다.
    • Connection 연결, 해제
    • CRUD 작업 처리
  • 사용하는 Annotation : @Repository

  1. DTO
  • 계층간 데이터 전달을 위해 사용된다.
  • 요청 데이터를 처리하는 객체를 일반적으로 RequestDto로 명명
  • 응답 데이터를 처리하는 객체를 일반적으로 ResponseDto로 명명

0개의 댓글