생각기록

2022-11-24 동적 form 전송 본문

SeSAC 풀스택/Nodejs

2022-11-24 동적 form 전송

끼록관 2022. 11. 24. 19:00

항상 새로운 프로젝트 폴더 만들 때

npm 환경설정

1. npm init

2.npm init --yes

3. npm install express

4. npm install -g nodemon

+ nodemon 설치 해주면 됨! 전역 설치를 해줘야 함

5. 버전 확인 nodemon -v

터미널 파워셀로 하지말고,  git bash나 cmd로 해야 오류 없이 가능

6. npm install multer 설치

파일 업로드 위해 사용되는 미들웨어


form validation (폼의 유효성 검사)

데이터가 불필요하게 왓다갓다 하는것을 막을 수 있다.

 

  • 클라이언트 측 html form 유효성 검사 
  • 서버용 nodejs form 유효성 검사

클라이언트 유효성 피해서.. 서버에서 검사하지 않으면 비번 1234라고 해도 뚫을 수 있다.

 

 

html 이용 유효성 검사

input태그에 지정 가능한 유효성 검사 기능

  • required : 필수 값
  • minlength / maxlength : 최소/최대 문자수
  • min / max : 최소/최대 값
  • type : 입력받는 정보 타입
  • pattern : 정규식으로 검사 *정규식

비밀번호에 특수문자를 넣어야 한다던가 그럴떄 정규식을 이용해서 유효성을 검사합니다.

정규식(정규표현식): regex(regular expression) https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions

 

정규 표현식 - JavaScript | MDN

정규 표현식, 또는 정규식은 문자열에서 특정 문자 조합을 찾기 위한 패턴입니다. JavaScript에서는 정규 표현식도 객체로서, RegExp의 exec()와 test() 메서드를 사용할 수 있습니다. String의 match(), matchA

developer.mozilla.org

pattern 속성에서 정규식 사용

<form action="/postfrom_regex" name="login" method="post">
    <input
        type="text"
        name="id"
        placeholder="ID 입력"
        pattern="^([a-zA-Z0-9가-힣]{4,})$"
        title="대소문자, 한글, 숫자, 4글자 이상"
        required
        >
    <input
        type="password"
        name="pw"
        placeholder="pw"
        pattern="^([a-z0-9]){8,12}$"
        title="소문자, 숫자로 8자리 이상 12자리 이하"
        required
        >
</form>
<!-- /:정규식을 사용한다는 의미 > 정규식을 //으로 감싼다. > 자바스크립트에서 쓰임 (html은 쓰일 필요 없어서 안씀)
데이터의 시작점(^)과 데이터의 끝점($)
범위[a-z]:a부터 z까지 중 문자 하나
    [가-힣]:한글의 모든 음절 범위 표현
개수 {} >{2, 4}:2개부터 4개까지
():그룹 검색 및 분류
.:임의의 글자 하나
+:1개 이상의 글자
*:0개 이상의 모든 문자
?:0~1번 반복되는 문자열 -->

 

/ :정규식을 사용한다는 의미 > 정규식을 //으로 감싼다. > 자바스크립트에서 쓰임 (html은 쓰일 필요 없어서 안씀)??
데이터 : 시작점(^)과 데이터의 끝점($)
범위 [a-z] : a부터 z까지 중 문자 하나
        [가-힣] : 한글의 모든 음절 범위 표현
개수 {2, 4} : 2개부터 4개까지
( ) : 그룹 검색 및 분류
. : 임의의 글자 하나
+ : 1개 이상의 글자
* : 0개 이상의 모든 문자
? : 0~1번 반복되는 문자열 

 

 

javascript 응용 유효성 검사

정규표현식.test(“검사할 문자열”)

검사를 통과하면 true

검사를 통과하지 못하면 false

\d{3} 세개의 숫자

휴대폰번호 3글자 - 3글자아니면 4글자 -  4글자

통과하지 않으면 아래 텍스트가 뜬다.

 

정규식을 썻다해서 유효성 검사가 아님

인풋값에 대해서 검사를 진행  => 올바르고 올바르지 않은 값에 대해 검사를 진행 했을때 유효성 검사를 햇다고 한다.

    <input
        type="text"
        name="phone"
        pattern="/^\d{3}-\d{3,4}-\d{4}$"
        placeholder="010-0000-0000"
        oninput="phone_validation(this);"
        required
    >
    <div class="error"></div>

<script>
    function phone_validation(obj){
        var regPhone = /^\d{3}-\d{3,4}-\d{4}$/;
        if (regPhone.test(obj.value) === false ) {
            $(".error").text('휴대폰 번호를 000-0000-0000 형식에 맞게 입력해주십시오.');
        } else {
            $(".error").text("");
        }
    }
</script>
<!-- 정규표현식.test('검사할 문자열')
-검사를 통과하면 true
-검사를 통과하지 못하면 false 
\d{3} 세개의 숫자
-->

test() 메서드는 주어진 문자열이 정규 표현식을 만족하는지 판별하고, 그 여부를 true 또는 false로 반환합니다.

 

.text()
선택한 요소 안의 내용을 가져옵니다. 태그는 가져오지 않습니다.
var jb = $( 'h1' ).text();
는 h1 요소의 내용을 변수 jb에 저장합니다.

.text( textString )
이전 내용을 지우고 새로운 내용을 넣습니다. 예를 들어
$( 'div' ).html( '<h1>Lorem</h1>' );
는 div 요소의 내용을 <h1>Lorem</h1>로 바꿉니다. HTML 태그는 텍스트로 처리합니다.

 


 

일반 form 전송은

  • <input type = " submit " > 이나 < button type=" submit " > 을 이용해 전송
  • <input method = "get or post"> 인풋 태그에 메소드 지정
  • 전송 시 페이지 이동

 

동적 form 전송

네이버같은 경우 비번이 틀리면, 페이지가 바뀌지않고 메세지가 뜸

  > 비동기 hppt 통신 이라고 한다.

 

동기 방식

한번에 하나만 처리 >  페이지를 아예 이동해 서버가 데이터 처리

 

비동기 방식

서버에 데이터를 보내 놓고, 서버의 응답을 기다리면서 다른 처리 가능!

일반 폼 전송과 동적 폼 전송의 차이점

dynamic

웹 문서가 정적으로 멈춘 것이 아닌 일부 내용이 실시간으로 변경되는 것

비동기 http통신 : 폼의 데이터를 서버와 dynamic하게 송수신 하는 것

 

ex) 메일이 새로오면, 숫자만 새로 추가 됨

특정한 부분만 실시간으로 변화 = 웹문서를 다이나믹하게 설정했다

 

 

비동기 http 통신의 방법은 3가지가 있다.


Ajax

xml 마크업 언어

  • html과 비슷한 마크업 언어
  • html과 달리 정해져 있는 것이 아니라 사용자가 정의해서 사용 가능하다.

js를 이용해 클라이언트와 서버간 데이터를 주고 받는 비동기 http 통신

 

장점

제이쿼리 통해 쉽게 구현 가능

Error, Success, Complete 의 상태를 통해 실행 흐름을 조절할 수 있다.

 

단점

Promise 기반이 아니다  = 다른것과 호환이 어렵다

제이쿼리를 사용해야만!! 간편하고 호환성이 보장됨 (xml 사용은 복잡)

 

 

사용법

https://api.jquery.com/category/ajax/

 

Ajax | jQuery API Documentation

Register a handler to be called when Ajax requests complete. This is an AjaxEvent. Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event. Attach a function to be executed before an Ajax request is sent. This is an

api.jquery.com

제이쿼리에서 제공하는 ajax 여러 api들이 있다.

jQuery.ajax()문법
jQuery.ajax( [  settings ] )

settins는  Ajax통신을 위한 옵션을 담고 있는 객체가 들어간다.
옵션으로는
data
클라이언트에서 서버로 데이터를 전송할 때 이 옵션 사용

dataType
서버가 우리에게 돌려주는 데이터가 어떤 형식의 데이터로 해석할 것인가 지정한다.
지정하지 않으면, jQuery가 알아서 판단한다.
xml, json, script, html 등이 있다.

success
성공했을 떄 호출할 콜백을 지정한다.
일종의 이벤트

type
get, post 방식을 지정





Axios

node.js와 브라우저를 위한 Promise API 를 활용

비동기 HTTP 통신이 가능 

return이 Promise 객체로 온다. ( 받아온 데이터를 처리하기 편리하다 )

 

장점

브라우저 호환성이 뛰어나다

Promise 기반으로 만들어짐

timeout 기능이 존재한다

 

단점

설치를 해야한다

모듈 설치 or 호출을 해줘야 사용이 가능하다.

# 서버 (npm)
npm install axios

# 클라이언트 (cdn)
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

 

Axios 사용법

Axios cdn을 파일 위에 해준다.

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

 

가기전에 참고하면 좋을듯

https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-%EC%9A%94%EC%B2%AD-%EA%B0%9D%EC%B2%B4%EC%99%80-%EC%9D%91%EB%8B%B5-%EA%B0%9D%EC%B2%B4-req-res

 

[EXPRESS] 📚 요청 객체와 응답 객체 (req, res) 정리

응답 객체 - response res.app: 똑같이 res 객체를 통해 app 객체에 접근한다. res.app.get('')같이 사용 가능. res.set(헤더, 값) / res.setHeader(헤더, 값): 응답의 헤더를 설정한다. req.get()이 헤더값을 가져오는거

inpa.tistory.com

1. 클라이언트가 서버에 먼저 요청을 보낸다.

클라이언트에서 axios 함수를 통해 요청을 서버에게 보낸다.

이때 보내는 요청 데이터가 axios({data: {여기가 데이터 들어갈 부분 ( key:value 형태로 )})

json은
 딕셔너리 형태 { 키: 벨류 }로 되어있는 데이터 표현식 
데이터를 json으로 나타낼 수 있다. (경량의 DATA 교환 형식)

쓰는 이유 : 서버 클라이언트와 왓다갓다 할때 json으로 하자 라는 규약이 있다.

 

2. 서버가 요청값 데이터를 받는다

서버에서는 클라이언트의 요청 데이터를

get 방식일 경우에는 params로 보낸 걸 req.query로 받고,

post 방식일 경우에는 data로 보낸 걸 req.body로 받는다.

즉, 클라이언트에서 data: { a: 1 } 이렇게 보냈으면 > 서버에서 req.body = { a: 1 }
비동기 http 통신을 할 때는 요청을 보냈으면 그에 대한 응답을 무조건 보내야 한다.
만약, 응답을 보내지 않으면 클라이언트(요청을 보낸 쪽)은 무한정 기다린다. ( 대기상태 )

3. 서버는 정해진 작업을 하고, 응답한다.

서버에서는 추가작업을 하고, 클라이언트에게 응답한다. 이때,

응답하는 함수가 res.send()

promise 기반
> return 받아오는 것은 함수 실행하고 .then으로 받는다.

예시

res.send로 서버가 요청에 대한 응답을 보내줫다 

값이 정확히 나오지 않는다.

이런식으로 저장되어있는 객체.key

res.data = {aa: ~~~} 객체에 대한 원하는 키를 정확히 해야 정확한 값을 받을 수 있다.

res.data.aa 이런식으로 정확한 값을 받아 올 수 있다.

 

 

4. 클라이언트가 응답을 받는 곳 .then

클라이언트는 보낸 요청에 대한 응답을 .then( function(rrr){ }) 으로 받는데,

이때 rrr에 들어오는 값이 res.send(~~~~) 에서 보낸 ~~~~ 값이다.

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<body>
    <button type="button" onclick="sendGet()">get</button>
    <button type="button" onclick="sendPost()">Post</button>
    <form id="form_info">
        <input type="text" name="name">
    </form>
</body>
<script>
    function sendGet(){
      var form = document.getElementById('form_info');//name
      //form.name.value (폼 태그 안에 네임속성이 네임인 벨류를 가져오겠다)
      //form.age.value (age속성의 값) 이런식이 가능해서 모든 fom에 이름지정 필용 ㅓㅄ다.
      //네임속성 지정해서 값을 가져오는 방법
        //axios get 전송
        //axios 는 값으로 메소드형식, url주소 받을 데이터는 parms?
      axios({
             method : "get",
             url: "/form",
             params: { name: form.name.value } //입력창값을 보내겟다
        }).then(function(res){
            // console.log(res); //then으로 받은 형태 확인(요청에 대한 답을 다 보내준다.)
            //res.data = {msg: ~~~} 객체에 대한 원하는 키를 정확히 해야 정확한 값을 받을 수 있다.
            alert(res.data.msg);
        });
    }
    function sendPost(){
        var form = document.getElementById('form_info');
        axios({
            method : "post",
            url : "/form", //post는 body에서 받아서 data에 담긴다 외워! get은 params!!
            data: { name: form.name.value
                    }
        }).then(function(res){
            alert(res.data.msg);
        });
    }
</script>

 

 

실습 1 동적 폼전송으로

회원가입 버튼 누르면, 콘솔로 정보값 찍히고

알림창으로 정보 보여주기

 

 


동적 post

실습 2

//ejs 파일
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

</form>
<h1>test_2</h1>
<form id="form_info">   
    아이디 <input type="text" name="id"><br>
    비밀번호 <input type="password" name="password"><br>
<button type="button" onclick="sendPost()">회원가입</button>
<div id="result"></div>
</form>
</body>
<script>
    // 힌트 2. ejs 코드
    //document.querySelector('#result').innerHTML = res.data ;
    function sendPost(){
        var form = document.getElementById('form_info');
        axios({
            method : "post",
            url : "/test_form2",
            data: { id_ : form.id.value,
                    ps_ : form.password.value
                    }
        }).then(function(res){
            document.getElementById('result').innerHTML = res.data;
        });
    }
</script>
//서버파일

app.post('/test_form2', function(req,res){
    console.log(req.body);
    // 힌트 1. 서버 코드
    // if(req.)if (req.body.id_ == "ar" && req.body.ps_ == '0302'){
    //     res.send('<p style="color: blue;">로그인 성공</p>');
    // } else {
    // 힌트 2. ejs 코드
    //document.querySelector('#result').innerHTML = res.data ;
    //     res.send('<p style="color: red;">로그인 실패</p>');
    // }
    console.log(req.body.id_);
    if (req.body.id_ == "ar" && req.body.ps_ == '0302'){
        res.send('<p style="color: blue;">로그인 성공</p>');
    } else {
        res.send('<p style="color: red;">로그인 실패( 아이디 또는 비밀번호가 틀렸습니다.)</p>');
    }
})

 

내가 못했던 부분

텍스트를 보여주려면 이런식으로도 가능하다.

div 객체에 innerHTML(태그인식) = res.data

서버에서 받은 데이터를 div객체에 넣겠다.


Fetch

셋 중 가장 최신

  • ES6부터 들어온 js 내장 라이브러리
  • promise 기반

 

장점

js 내장 라이브러리이므로 별도의 import 필요 x  => 설치를 하지 않아도 된다.

프로미스 기반

 

단점

  • 최신 문법이여서 브라우저 호환성이 뛰어나지 않다. = 인터넷 익스플로어에서 안돈다는 의미
  • 상대적으로 Axios에 비해 기능 부족
  • 타임아웃기능이 없다 => 네트워크 에러(서버에 요청 보내고 특정시간동안 답이 안오면 에러를 내보내는데) 얘는 기다린다....

api주소, 두번째 인자 필수 x

fetch는 promise{ } 객체로 반환

호출할 api 주소,


달래 fetch()함수 강의

 

json placeholder웹사이트

https://jsonplaceholder.typicode.com/

 

JSONPlaceholder - Free Fake REST API

{JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. As of Oct 2022, serving ~1.7 billion requests each month.

jsonplaceholder.typicode.com

다양한 종류의  가짜 데이터를 제공함 ( 글, 사진 ...등등)

가이드메뉴에 가보면, 어찌사용할지 가이드가 나와있음 > 예제가 fetch함수가 되어있어서 학습하는데 도움이 된다.

예제

fetch() get 방식
콘솔로 fetch('api')
첫번째 인자만 쳐도
promise 객체가 pending 상태

디폴트로 get방식
get방식은 요청 바디를 갖지 않아서 두번째 인자가 없어도 된다.
응답 객체(res)를 출력해본다.


우리는 보통 body에 관심이 많으니 body까지 출력해보자

바디 속성이 문자열이 아닌 stream 객체라는 걸 알 수 있다.
다행이도 우리는 응답을 대부분 json 형태로 응답을 하기 때문에
stream 처리를 해줄 필요가 없다.

콘솔로 json()을 찍어보면
promise를 다시 반환한다.

promise가 제공하는 값에 다가가려면,
.then 메서드를 또 사용해야 한다.

첫번째 인자 AIP 주소 속 데이터 값이 도출 된다.
첫번째 .then은 stream 객체를 json형식으로 값을 보내고,
두번째 .then으로 json형식이 된 데이터 값들을 볼 수 있다.


fetch() post 방식

위에서 성공적으로 저장되었던것을 확인 했으니
데이터를 가져와보자

get처럼
.then에 res.json() > json형태로 바꿔주고
두번째 .then으로 그 값을 받아서 출력한다.

                           우리가 body에 넣엇던 데이터가 그대로 출력되어 오는 것을 확인 할 수 있다.

fetch()함수는

첫번째 인자 url

뒤에 오는 then을 json() 함수 처리

.then 그다음 데이터를 받는다.

 

추가로 주의할 점

서버에서 응답을 보내줄 떄json 인식은 태그를 인식 하지 않는다. > { 키 : 값  } 딕셔녀리 형태로 보내줘야 한다

 

'SeSAC 풀스택 > Nodejs' 카테고리의 다른 글

2022-11-26 미들웨어, 파일 업로드  (0) 2022.11.26
2022_11_25_화면 출력 관련 / 참고 사이트  (0) 2022.11.25
2022-11-22 Express, ejs 수업  (0) 2022.11.23
2022_11_19_프로미스  (0) 2022.11.19
callback  (0) 2022.11.17