2019년 웹 개발 과정에서 JavaScript로 회원가입 입력값과 주민등록번호 형식을 검증하며 작성한 학습 기록입니다. 브라우저 이벤트와 입력 검증 로직을 직접 연결하면서 클라이언트 코드의 실행 흐름을 익혔습니다. 오래된 예제와 표현이 포함되어 있으므로 당시의 학습 과정으로 참고해주세요.
//입력한 주민번호의 유효성 검증function chkSsn(){ //주민번호의 끝자리가 7자리인지 var obj = document.joinFrm; if(obj.ssn2.value.length==7){ if(obj.ssn1.value.replace(/[0-9]/g,"")!=""){ alert("주민번호는 첫자리는 숫자로만 구성됩니다."); obj.ssn1.value=""; obj.ssn1.focus(); return; }//end if //주민번호 첫번째 자리가 숫자로 구성되어있는지? if(obj.ssn2.value.replace(/[0-9]/g,"")!=""){ alert("주민번호 두번째 자리는 숫자로만 구성됩니다."); obj.ssn2.value=""; obj.ssn2.focus(); return; }//end if var ssn=obj.ssn1.value+obj.ssn2.value; // 주민번호 검증 알고리즘 var flagNum=[2,3,4,5,6,7,8,9,2,3,4,5]; var temp=0; //주민번호의 각 자리에 2,3,4,5,6,7,8,9,2,3,4,5 를 곱한 값의 결과를 모두 더해서 //변수에 할당 for(var i=0; i<flagNum.length; i++){ temp+=ssn.charAt(i)*flagNum[i]; }//end for //위에서 계산된 값을 11로 나눈 나머지를 11에서 빼고 그 결과를 10으로 나눈 나머지를 //구한다. temp=(11-(temp%11))%10; //위에서 계산된 결과가 주민번호의 가장 마지막 자리에 일치한다면 유효, 그렇지않다면 무효. if(temp==ssn.charAt(12)){ //성별체크 var genderFlag= ssn.charAt(6); if(genderFlag %2==0){ // 짝수면 여자 obj.gender[1].checked=true; // 라디오버튼 여자 체크 }else{ // 홀수면 남자 obj.gender[0].checked=true; // 라디오버튼 남자 체크 }//end else var ssn_year=parseInt(ssn.substring(0,2)); //88 var ssn_month=parseInt(ssn.substring(2,4)); //01->1 var ssn_day=parseInt(ssn.substring(4,6)); //01->1 //생년월일. if(genderFlag<=2){ //1900 ssn_year=1900+ssn_year; }else if(genderFlag<=4){ //2000 ssn_year=2000+ssn_year; }//end if //생년월일체크. var b_flag = false; for(var i=0; i< obj.b_year.length; i++){ if(obj.b_year[i].value == ssn_year){ // 옵션에 생년이 존재 obj.b_year[i].selected=true; b_flag=true; break; }//end if }//end for if(!b_flag){ //준비된 생년이 없을 때 //옵션을 생성하여 추가하고 obj.b_year.options[obj.b_year.length]= new Option(ssn_year,ssn_year); //추가된 옵션을 선택해준다. obj.b_year[obj.b_year.length-1].selected=true; }//end if //월설정 obj.b_month[ssn_month-1].selected=true; //일설정 obj.b_day[ssn_day-1].selected=true; //나이 var date=new Date(); obj.age.value = date.getFullYear()-ssn_year+1; }else{ alert("잘못된 주민번호입니다.") } }//end if}
function drawRect() { //1. canvas 얻기 var can= document.getElementById("can"); //2. 2d 그래픽을 그릴 수 있는 객체 얻기 var ctx=can.getContext("2d") //초기화: 그래픽 객체를 초기화 (x, y, 넓이, 높이) ctx.clearRect(0,0,can.width, can.height); //4. 색변경 :속성 fillStyle="rgb(R,G,B)" // fillStyle="rgba(R,G,B,alpha(투명도))" ctx.fillStyle="rgb(255,0,0)"; //3. 지정한 좌표에 사각형 그리기fillRect(x,y,w,h) ctx.fillRect(10,10,80,40); //4. 색변경 :속성 fillStyle="rgb(R,G,B)" // fillStyle="rgba(R,G,B,alpha(투명도))" ctx.fillStyle="rgb(255,0,0,0.2)"//투명도 0.0~1까지 설정 ctx.fillRect(40,40,80,40);}
function drawImg() { //1. canvas 얻기 var can= document.getElementById("can"); //2. 2d 그래픽을 그릴 수 있는 객체 var ctx=can.getContext("2d") ctx.clearRect(0,0,can.width, can.height); //3. 이미지 객체를 생성 var img =new Image(); //4. 이미지 객체의 경로 설정: img.src="이미지 경로" img.src="../common/images/img.png"; //5. 이미지의 크기대로 그린다 // ctx.drawImage(이미지 객체,x,y) //ctx.drawImage(img,100,50); // 이미지 크기를 변경하여 그린다. // HTML에서 이미지 크기 변경 시 자원을 많이 소모(비권장) // drawImgage(img객체, x, y, 넓이, 높이) ctx.drawImage(img,30,30,100,100);}
function drawLine() { //1. canvas 얻기 var can= document.getElementById("can"); //2. 2d 그래픽을 그릴 수 있는 객체 var ctx=can.getContext("2d") ctx.clearRect(0,0,can.width,can.height);//can 초기화 //3. 선긋기 시작함수호출: ctx.beginPath() ctx.beginPath(); //시작좌표: ctx.moveTo(x1,y1) ctx.moveTo(25, 50); //시작 좌표 재설정 //끝좌표: ctx.lineTo(x1,y1) ctx.lineTo(150, 50); //끝좌표를 설정하여 선을 그린다 ctx.lineTo(25, 150);// 위에서 설정된 좌표를 시작점으로 선을 그린다. //마지막선이 설정되지 않으면 자동으로 채워준다. ctx.moveTo(25, 50); // 좌표 시작점을 재설정 ctx.lineTo(25, 150);// 재설정된 좌표에서 설정된 좌표로 선을 연결. ctx.stroke(); // stroke함수로 선을 긋는다. //3. 선긋기 끝 함수 호출: ctx.closePath() ctx.closePath();}
Storage
웹은 비연결성, 멱등성
비연결성
접속자의 요청이 있을 때 서버와 연결하고 요청한 데이터가 응답되면 연결이 서버와 연결이 끊어진다.
웹은 클라이언트가 필요할 때만 서버에 연결, 서버의 자원을 절약할 수 있다.
저사양의 서버로도 많은 접속자를 처리가능
게임은 서버와 계속 연결이 되어 있어야함,(연결성) 자원을 많이 점유한다.
비연결성의 단점은 클라이언트의 상태를 알 수 없다.(몇 명이 접속했는지 모른다.)
비연결성을 해결하기 위해 서버에서는 session과 cookie를 제공
session은 접속자의 정보를 서버측 메모리에 저장
접속자의 정보를 접속자의 HDD에 파일로 저장하는 것이 cookie
storage는 cookie를 대체하기 위한 기술
session storage, local storage가 존재
HTML5에서 지원되는 저장객체
접속자의 정보를 접속자 브라우저에 저장하는 객체
비연결성인 웹에서 접속자의 정보를 저장가능
cookie는 객체는 저장 안되고 문자열만 저장 가능.
최대 크기가 4KB 파일로 생성이 된다.
Storage를 쓰면 브라우저의 저장소에 저장이 됨.
크롬 개발자도구 인스펙터에서 확인 가능
Application - Storage
스토리지 값 직접 변경, 삭제 가능
쿠키와 저장공간이 다르다.
쿠키와 다르게 문자열뿐만 아니라 다양한 데이터를 최대 5MB까지 저장가능
키, 값의 쌍(KVP, key value pair, entity)으로 저장된다.
Sesstion Stroage
컴퓨터끼리의 연결을 session이라고 함.
접속자의 정보가 서버에 연결되어 있을 때만 유지된다.
Local Storage
서버와 연결이 끊어져도 접속자의 정보가 계속 유지가 된다.
스토리지 사용 예
로그인 유지
로그인 된 상태가 서버측 세션에 저장됨
그 상태를 내 브라우저 스토리지에 저장해 둠
Local Storage 사용하면 다음에 접속 시 로그인한 상태를 계속 사용가능
Session Stroage면 다음 접속 시 다시 로그인을 해야 함.
장바구니
다음 접속했을 때도 상품 유지 Local Storage
다음 접속 때 초기화 Session Storage
연결된 상태로 잠깐 쓸 땐 Session Storage
계속 정보를 유지할 땐 Local Storage
쿠키는 1년까지 유지됨
Storage는 사용자가 지워야 사라진다.
사용법
storage는 window객체의 자식으로 제공이 된다.
// 1. Storage 객체 얻기var ls = window.localStorage;var ss = window.sessionStorage;// 2. 이름, 값 할당ls.setItem("키","값");ss.setItem("키","값");// 3. 값 얻기ls.getItem("키");ss.getItem("키");// 4. 값 삭제ls.removeItem("키");ss.removeItem("키");// 5. 모두 삭제ls.clear();ss.clear();
function sSet() { // 세션스토리지에 값 설정 // 스토리지는 문자열만 저장할 수 있는 쿠키와 다르게 다양한 데이터를 저장가능 window.sessionStorage.setItem("name", "노진경"); // string window.sessionStorage.setItem("age", 20); // number window.sessionStorage.setItem("flag", true) // boolean}function sGet() { var divNode = document.getElementById("output"); var output="<ul>"; //세션스토리지에 값을 얻어와서 div출력 var ses=window.sessionStorage; var name= ses.getItem("name"); var age= ses.getItem("age"); var flag= ses.getItem("flag"); output+="<li>이름: "+name+"</li>"; output+="<li>나이: "+age+"</li>"; output+="<li>flag: "+flag+"</li>"; divNode.innerHTML= output;}function sRemove() { //window.sessionStorage.removeItem("name"); //window.sessionStorage.removeItem("age"); //window.sessionStorage.removeItem("flag"); sessionStorage.clear(); //모든값 지우기}
function lSet() { // 로컬스토리지에 값 설정 window.localStorage.setItem("name", "김희철") // string window.localStorage.setItem("age", 25) // number window.localStorage.setItem("flag", true) // boolean window.localStorage.setItem("addr", "서울시 동작구 동작동")}function lGet() { var divNode = document.getElementById("output"); var output="<ul>"; //로컬스토리지에 값을 얻어와서 div출력 var los=window.localStorage; var name= los.getItem("name"); var age= los.getItem("age"); var flag= los.getItem("flag"); var addr= los.getItem("addr"); output+="<li>이름: "+name+"</li>"; output+="<li>나이: "+age+"</li>"; output+="<li>flag: "+flag+"</li>"; output+="<li>주소: "+addr+"</li>"; divNode.innerHTML= output;}function lRemove() { localStorage.removeItem("name"); localStorage.removeItem("age"); localStorage.removeItem("flag"); localStorage.removeItem("addr");}
JSON
JSON은 JavaScript Object Notation의 약자
원래 JavsScript에서 값을 저장하기 위해 사용하는 데이터형으로 시작됨
하지만 주로 이기종 언어간 데이터 전달용으로 사용된다.
데이터를 XML처럼 JSON으로도 전달가능
XML보다 코드량 적다.
파싱비용이 XML보다 적다.
네트워크 트래픽이 줄고 속도가 빨라지고 전력소모량이 준다.
공공데이터는 XML과 JSON으로 모두 제공된다.
다양한 데이터를 저장할 수 있다.
XML은 마크업 언어로 문자열 데이터만 저장가능
JavaScript에서 발생하는 number, string, boolean, JSON안에 JSON을 넣어 보낼 수 있음.
JSON을 배열로 만들 수도 있다.
간단한 문법으로 사용가능
JSON은 이름와 값의 쌍으로 구성
이름으로 값을 조회할 수 있다.
이름은 '로 감싼다.
값은 형에 따라 '또는 "를 직접 사용
JSON은 두가지 형태로 사용가능
JSONObject 와 JSONArray
closure의 형태가 JSONObject와 같다.
JSONObject
JSON 형태의 문자열을 생성 후 eval()을 사용하여 객체를 만듦
// 1. JSONObject 형태의 문자열을 만들고var data = "{ '이름' : '값', '이름2' : '값2', ... }";// 2. eval()로 문자열을 JSONObject로 생성var json_obj = eval("("+data+")");// 3. 이름으로 값을 얻음json_obj.이름;