Published 2022. 9. 27. 15:18

제이쿼리의 종속맨으로 항상 $.ajax 만 쓰다가 이번에

바닐라 자바스크립트를 본격적으로 사용하게 되면서

(정확히는 나의 코드에서 제이쿼리를 걷어내기)

fetch 에 대해 배우게 되었고 비동기 통신 또한 ajax 가 아닌 fetch 로 갈아타고 있는 중이다.

아직은 프로미스 객체에 대해,,, 와닿지가 않고 있지만..

먼저, 기존의 ajax 동작은

1. ajax

$.ajax({
         url       : '/test1/test1'
       , data      : $("#frm").serialize()
       , async     : true
       , type      : "post"
       , dataType  : 'json'
       , beforeSend: function(xhr) {
           xhr.setRequestHeader('AJAX', true);
         }
       , success   : function(data) {
 	                   var textArea = $('#textArea');
                       console.log('data', data);
                       textArea.empty();

				       var html = "";
                       
                       html += '<li>' + data.username + '</li>'
                       html += '<li>' + data.age + '</li>'

                       textArea.append(html);
                }
                , error     : function(err) {
                    console.log('data');
                    alert('에러,,,타입 미스매치 일 것임.');
                }
            })

이런 식으로 사용을 하였다.

2. fetch

<form id="testFrm">
		<input type="text" name="name" value="name123">
		<input type="text" name="id" value="id123">
		<input type="text" name="tel" value="tel123">
		<button type="button" onclick="test()">aaaaaa</button>
</form>

이런 폼을

const formData = new FormData(document.querySelector("#testFrm"))
		
	async function test() {
		const url = '/test1/test1';
		const option = {
			method : 'POST',
			header : {
				'Content-Type' : 'application/json;'
			},
			body   : formData,
		}

		let response = await fetch(url, option);
		let data = await response.json();
		console.log('data ===> ', data);
	}

이렇게 사용하게 된다, input 값들을 따로 떼내어서 매칭을 해줄 수 도 있지만,

나는 스프링에 의하여 값들이 vo로 쏙쏙 매핑 되기를 원했다. 그래서 폼 자체를 전송하는 방법을 테스트 하였다.

3. 자바에서 받기

@Slf4j
@RequestMapping("/test1/test1")
public String test1(@ModelAttribute TestVo testVo) {
	
	System.out.println("practiceVo.getName() = " + practiceVo.getName());
	System.out.println("practiceVo.getId() = " + practiceVo.getId());
	System.out.println("practiceVo.getTel() = " + practiceVo.getTel());
    
	return null;
}

테스트로 작성된 코드이다.

기존과 동일하게 @ModelAttribute 를 통해서 vo를 명시하고 값들을 명시한 vo 에 매핑 받을 수 있다.

처리는 기존의 비동기 방식과 동일하게 !! 

조금 더 깔끔하고 조금 더 Promise 를 예쁘게 쓸 수 있는 버전을 만들어서 작성하자.

4. P.S VO 매핑이 안될 시, POM 의존성 추가 및 DISPATCHER-SERVLET 설정 추가

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <property name="maxUploadSize" value="2097152000"/>
</bean>

 

'JavaScript' 카테고리의 다른 글

[iframe] 자식창에서 부모창으로 데이터 넘기기  (0) 2022.11.08
[JSON] 에 대하여,  (0) 2022.10.07
javaScript 의 Garbage Collector  (0) 2022.09.24
fetch 가 ES6 부터 내장으로 들어왔다.  (0) 2022.09.24
Node.insertBefore()  (0) 2022.09.16
복사했습니다!