개발군싹

[Spring] 요청 데이터 매개변수를 이용한 데이터 맵핑 예제 본문

Spring

[Spring] 요청 데이터 매개변수를 이용한 데이터 맵핑 예제

개발자군싹 2023. 12. 10. 14:03

⭐ 매개변수 매핑 예제를 보기 앞서  Encoding Filter → SpringFramework에서 제공하는 필터 적용하기

➡️ 클라이언트의 요청이 WAS에 전달되고 POST방식으로 전달될 경우 인코딩 설정을 해주지 않으면 한글데이터가 깨지는것을 확인할 수 있다. 이전 Servlet / JSP이용 시 servlet마다 인코딩 설정을 하던가, ServletFilter를 이용하여 특정 페이지에 인코딩 필터를 씌우는 작업을 해보았다. 스프링에서 또한 EncodingFilter를 제공하기에 web.xml에 아래 코드를 등록해주면 된다.

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern> // 모든 페이지는 EncodingFilter를 거쳐 전환
</filter-mapping>

 


클라이언트가 요청한 데이터를 매개변수와 매칭할 수 있다.

Demo.java (DTO) 예제 객체

package com.bs.spring.demo.model.dto;

import java.sql.Date;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Demo {
    private int devNo;
    private String devName;
    private int devAge;
    private String devGender;
    private String devEmail;
    private String[] devLang;
    private Date birthDay;
    private Address address;
}

 

클라이언트의 화면에서 입력한 Input태그의 name값이 demoDTO객체의 필드명이 같다고 가정

ex)

<input type="text" name="devName" id="devname" placeholder="이름을 입력하세요" />

<input type="number" name="devAge" id="devage" />

<input type="text" name="devEmail" id="devemail" />

...

//클라이언트가 보낸 데이터를 매개변수와 매칭하여 전닳받기
    //클라이언트가 보낸 데이터의 name값과 선언한 매개변수의 변수명이 동일해야한다.
    @RequestMapping("/demo/demo.do")
    public String demo2(String devName, int devAge, String devEmail, String devGender, String[] devLang) {
	System.out.println(devName + devAge+ devEmail+ devGender+ Arrays.toString(devLang));
	return "demo/demoResult";
    }

 

➡️ 기본 매개변수부터 배열까지 알아서 매칭해서 데이터를 전달해준다. 단, 전달하는 name값과 Controller에서 매칭시키는 변수의 명이 같아야한다. (※ 필수 값을 받을 때 사용하면 좋다. (무조건 넘어오는 데이터 값))

 

🔥Input태그로 요청 데이터를 처리할 때 클라이언트가 값을 입력하지 않으면 BadRequest 에러가 발생한다.

(특히 int형의 경우 입력값이 없기 때문에 'NullPointerException' 발생할 수 있다.)

➡️ @RequestParam 어노테이션으로 해결할 수 있다.

@RequestMapping("/demo/demo.do")
    public String requestParamTest(@RequestParam(value="devName" ) String name, 
                                @RequestParam(value="devAge", defaultValue="10") int age,
                                @RequestParam(value="devEmail") String email, 
                                @RequestParam(value="devGender", required=false) String gender,
                                @RequestParam(value="devLang", required=true) String[] lang, Model model ) {

➡️ 옵션 설정

  • value : 입력될 데이터(클라이언트가 보낸 데이터의 name)
  • default : 데이터가 입력되지 않았을 때 기본값
  • required : 데이터 전달 필수 여부

클라이언트가 요청한 데이터의 name(key)과 DTO 필드명이 같은 객체 선언 시 springframework가 알아서 객체화 해준다. (데이터 가공의 편리성)

//DTO객체로 직접 클라이언트가 보낸 데이터 받기
//꼭! 클라이언트가 보낸 데이터의 key(name)값과 필드명이 일치해야한다.

@RequestMapping("/demo/demo.do")
public String commandMapping(Demo demo, Model m) {
System.out.println(demo);

m.addAttribute("demo", demo);

return "demo/demoResult";
}

➡️ 위 Demo(DTO)객체와 요청 데이터의 name값이 같다고 가정했을 경우 @RequestMapping() 메소드 매개변수로 DTO객체 선언 시 SpringFramework가 자동으로 데이터(객체)를 생성하여 만들어준다. (개발자가 new연산자를 사용하지 않고 객체 생성) ,, 편리함 그 자체 ~.~🤓

Spring에서 데이터를 저장할 수 있는 클래스 제공 (Model 클래스)

➡️ 생명주기가 HttpServletRequest와 동일하다.

  • addAttribute() 메소드를 이용 addAttribute(key(String), value(Object));
  • 어노테이션으로도 사용가능하다.
public String commandMapping(@ModelAttribute Demo demo, ...)

 


Map으로 클라이언트가 전송한 데이터 받기

//Map으로 받을 시 단일값에 대한 데이터만 정상적으로 처리, 다수값에 대해서는 1개의 데이터만 저장하게 되어있다.
@RequestMapping("/demo/demo.do")
public String demo5(@RequestParam Map param,String[] devLang,Model m) {

param.put("devLang", devLang);
System.out.println(param);
m.addAttribute("demo",param);

return "demo/demoResult";
}

➡️ DTO와 마찮가지로 Map을 매개변수로 선언 시 해당 name과 데이터를 'key:value'의 형식의 Map형태로 알아서 만들어준다. 단, 기본자료형에 대해서만 생성해주므로 checkBox와 같은 다중값의 데이터를 배열 형태로 받아와야 할 경우 이는 따로 매개변수를 매칭하여 저장받아야 한다.


🐔❓ ReqeustMapping 속성 중 method 속성을 이용하여 get,post 방식을 매칭시켜 메소드를 등록 할 수 있다.

@RequestMapping(value="/demo/demo.do", method=RequestMethod.POST)
public String commandMapping(@ModelAttribute Demo demo, Address address, Model m) {
demo.setAddress(address);
System.out.println(demo);	
m.addAttribute("demo", demo);

return "demo/demoResult";
}

➡️ method 속성을  이용하여 해당 RequestMapping으로 설정된 메소드는 post방식으로 전달 시 수행도되록 설정 할 수 있다.

'Spring' 카테고리의 다른 글

[Spring]Spring Security 암호화  (0) 2023.12.12
[Spring]MyBatis 연결/등록하기  (0) 2023.12.12
[Spring]@RequestMapping()  (1) 2023.12.10
[Spring]Spring Bean?  (0) 2023.12.07
[Spring]Spring이란?  (1) 2023.12.07