본문 바로가기
코딩수업/AWS 클라우드환경 네이티브

11/14 웹 제작 - MySQL에서 ERD 생성 / Ajax / Ajax를 이용한 jQuery 사용 / Jackson

by 인생즐겜러 2022. 11. 28.
728x90
반응형

AWS 클라우드환경 네이티브 수업 120 일차

 

 

 

진행

1. 웹 제작 - MySQL에서 ERD(Entity Relationship Diagram) 생성

2. 웹 제작 - Ajax를 이용하여 아이디 중복 확인 버튼 만들기

 

 

 

 

 

요약

1. 웹 제작 - MySQL에서 ERD(Entity Relationship Diagram) 생성

2. 웹 제작 - Ajax 개념

3. 웹 제작 - jQuery를 이용한 Ajax 기본 모양

4. 웹 제작 - Jackson 개념

5. 웹 제작 - Ajax를 이용하여 아이디 중복 확인 버튼 만들기

 

 

 

 

 


 

 

 

 

 

mySQL에서 ERD(Entity Relationship Diagram) 생성

 

=> mySQL에서 만들 테이블들간의 관계도를 생성해주는 방법

 

 

 

ERD를 만들 DB에 접속해서 상단 메뉴에 Database - Reverse Enginner 클릭

 

 

 

 

ERD를 만들 DB를 Stored Connection에서 선택

그 후, 해당 DB의 username과 pw를 넣는다. 그리고 Next

 

 

 

 

 

그 후, Next 슝슝 누르다보면 아래 화면이 뜬다.

아래의 경우, Schema 가 한개인데 여러개도 가능하다.

선택할 스키마 체크.

 

 

 

 

여기가 중요하다.

어떤 테이블을, 어떤 함수를, 어떤 트리거를 나타낼지 정할 수 있다.

아래의 경우, 테이블만 나와있는데 기존 데이터가 어떻게 들어있느냐에 따라 달라진다.

 

오른쪽에 Show Filter를 클릭하면 아래처럼 해당 목록들이 뜬다. (아래 그림에는 hide filter)

왼쪽에 있으면 ERD에 나타낼 테이블 / 오른쪽은 ERD에 나타내지 않을 테이블 이다.

지정 후 Execute.

 

 

 

 

그 위에 Next~ Finish 하면 아래처럼 생성이 된다.

 

 

 

 

ERD를 다른 파일이나 이미지로 생성하려면

File - Export 로 들어가면 아래처럼 각 형식에 따라 뽑아낼 수 있다.

 

 

 

 

 

 


 

 

 

 

 

Ajax (Asynchronous JavaScript and XML)

  • 다양한 형태의 데이터자바 스크립트로 조작해서 비동기식으로 서버와 통신하는 방식
  • 웹 페이지 전체를 다시 로딩하지 않고도, 웹 페이지의 일부분만을 갱신할 수 있다. (로드된 후에 서버로 데이터 주고 받기 가능) 
  • 다양한 형태의 데이터 : JSON, XML, HTML, 텍스트 파일 등
  • 최근에는 XML 보다  JSON을 더 많이 사용한다.
  • 비동기식이란 여러가지 일이 동시적으로 발생한다는 뜻으로, 서버와 통신하는 동안 다른 작업을 할 수 있다는 의미

 

 

 

Ajax의 동작방식

  1. 기존의 웹 페이지 구동 방식은 웹에서 서버에 요청을 하면 웹 페이지 전체를 다시 로딩한다.
  2. Ajax 는 XMLHttpRequest 라는 객체를 이용해서 비동기 통신을 해서 요청된 웹 페이지의 일부만 다시 로딩한다. 

 

출처 : http://www.tcpschool.com/ajax/ajax_intro_works

 

 

 

 

 


 

 

 

 

 

jQuery를 이용한 Ajax

 


$.ajax ({
  // URL은 필수 요소이므로 반드시 구현해야 하는 Property입니다.
  url	: "url", // 요청이 전송될 URL 주소
  type	: "GET", // http 요청 방식 (default: ‘GET’)
  async : true,  // 요청 시 동기화 여부. 기본은 비동기(asynchronous) 요청 (default: true)
  cache : true,  // 캐시 여부
  timeout : 3000, // 요청 제한 시간 안에 완료되지 않으면 요청을 취소하거나 error 콜백을 호출.(단위: ms)
  data  : {key : value}, // 요청 시 포함되어질 데이터
  processData : true, // 데이터를 컨텐트 타입에 맞게 변환 여부
  contentType : "application/json", // 요청 컨텐트 타입 
  dataType    : "json", // 응답 데이터 형식 (명시하지 않을 경우 자동으로 추측)
  beforeSend  : function () {
    // XHR Header를 포함해서 HTTP Request를 하기전에 호출됩니다.
  },
  success : function(data, status, xhr) {
    // 정상적으로 응답 받았을 경우에는 success 콜백이 호출되게 됩니다.
    // 이 콜백 함수의 파라미터에서는 응답 바디, 응답 코드 그리고 XHR 헤더를 확인할 수 있습니다.
  },
  error	: function(xhr, status, error) {
        // 응답을 받지 못하였다거나 정상적인 응답이지만 데이터 형식을 확인할 수 없기 때문에 
        // error 콜백이 호출될 수 있습니다.
        // 예를 들어, dataType을 지정해서 응답 받을 데이터 형식을 지정하였지만,
        // 서버에서는 다른 데이터형식으로 응답하면  error 콜백이 호출되게 됩니다.
  },
  complete : function(xhr, status) {
    // success와 error 콜백이 호출된 후에 반드시 호출됩니다.
    // try - catch - finally의 finally 구문과 동일합니다.
  }
});

 

 

 

 

 


 

 

 

 

 

Jackson

Java Object를 JSON으로 변환하거나 JSON을 Java Object로 변환하는데 사용할 수 있는 Java 라이브러리

 

 

 

Jackson 특징

  • Stream API : 성능이 좋다. (스트림 형식으로 데이터를 분석하고 생성하기 때문에)
  • Tree Model : 유연성이 좋다. (XML의 DOM처럼 Node 형태로 데이터를 다룰 수 있기 때문에)
  • Data Binding : POJO 기반의 자바 객체들을 JSON으로 변환시킬 수 있습니다.

 

 

 

Jackson 설정

위의 특징 중 3번째 특징을 활용한다.

jackson-databind 라이브러리는 jackson-core 및 jackson-annotation 라이브러리의 의존성을 포함한다.

따라서, Maven에서 jackson-databind 라이브러리만 추가하면 끝.

 

Maven Repository : https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind

 

 
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.0</version>
</dependency>
 
 

 

 

 

 


 

 

 

 

 

Ajax를 이용한 아이디 중복검사 페이지 만들기

 

 

 

(1) View 제작

 

아이디 중복 검사 버튼 뿐만 아니라

맨 아래에 해당 버튼이 동작하기 위한 jQuery를 이용한 Ajax 구문도 넣는다.

 

<!-- registerAjax.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c"	uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"	uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>회원 가입 (AJAX)</title>
</head>
<body>

	<!-- 메뉴바 -->
	<jsp:include page="../common/topMenu.jsp" flush="false"/>
	
	<h1 align="center">회원 가입(AJAX)</h1>
	
	<div class="container">
		<form class="form-horizontal" method="post" action="${contextPath}/member/register">
			<div class="form-group">
				<div class="col-sm-offset-2 col-sm-6">
					<h2 align="center">회원 가입(실시간 아이디 검사)</h2>
				</div>
			</div>
			<div class="form-group">
				<label for="id" class="col-sm-2 control-label">아 이 디</label>
				<div class="col-sm-2">
					<input type="text" class="form-control" id="id" name="name" maxlength="20" placeholder="Enter ID"/>
				</div>
				<div class="col-sm-2">
					<button class="idCheck btn btn-warning" type="button" id="idCheck" 
					onClick="fn_idCheck();" value="N">아이디 중복확인</button>
				</div>
			</div>
			<div class="form-group">
				<label for="id" class="col-sm-2 control-label">비밀번호</label>
				<div class="col-sm-3">
					<input type="password" class="form-control" id="pw" name="pw" maxlength="20" placeholder="Enter PASSWORD"/>
				</div>
			</div>
			<div class="form-group">
				<label for="id" class="col-sm-2 control-label">이  름</label>
				<div class="col-sm-4">
					<input type="text" class="form-control" id="name" name="name" maxlength="50" placeholder="Enter NAME"/>
				</div>
			</div>
			<div class="form-group">
				<label for="id" class="col-sm-2 control-label">이메일</label>
				<div class="col-sm-4">
					<input type="email" class="form-control" id="email" name="email" maxlength="50" placeholder="Enter Email"/>
				</div>
			</div>
			<div class="form-group">
				<div class="col-sm-offset-2 col-sm-10">
					<button type="reset"  class="btn btn-warning">입력취소</button>
					<button type="button" class="btn btn-danger cancel">회원가입 취소</button>
					<button type="submit" class="btn btn-success" id="submit">회원가입</button>
					<button type="submit" class="btn btn-primary signUpBtn"  disabled="disabled">회원가입</button>
				</div>
			</div>
			<div class="form-group">
				<div class="col-sm-offset-2 col-sm-10">
					<input type="text" class="form-control msg" name="msg" placeholder="Message" id="msg"/>
				</div>
			</div>
		</form>
	</div>

</body>

<script>
	function fn_idCheck() {
		// alert($("#id").val());
		
		$.ajax({
			url:		"/member/idCheck",
			type:		"post",
			dataType:	"json",
			data:		{"id" : $("#id").val()},
			success:	function(data) {
				if(data == 1) {
					alert("이미 사용 중인 아이디입니다.\n\n다른 아이디를 입력하십시오.");
				} else if(data == 0) {
					// 버튼 id="idCheck"의 속성인 value의 값을 "Y"로 변경한다.
					$("#idCheck").attr("value", "Y");	
					alert("사용 가능한 아이디입니다.");
				}
			}
		});
	}
</script>
<script>
	$(document).ready(function() {
		// 취소 버튼이 눌렸을 경우 로그인 화면으로 이동한다.
		$(".cancel").on("click", function() {
			location.href = "/member/loginForm";
		});
	
		// 회원가입 버튼을 눌렀을 경우
		$("#submit").on("click", function() {
			// alert("회원가입 버튼을 누르셨습니다.");
			if($("#id").val() == "") {
				alert("아이디를 입력하셔야 합니다.");
				$("#id").focus();
				return false;
			}
			if($("#id").val().length < 4) {
				alert("아이디는 최소 4자리를 입력하셔야 합니다.");
				$("#id").focus();
				return false;
			}
			if($("#pw").val() == "") {
				alert("비밀번호를 입력하셔야 합니다.");
				$("#pw").focus();
				return false;
			}
			if($("#name").val() == "") {
				alert("이름을 입력하셔야 합니다.");
				$("#name").focus();
				return false;
			}
			if($("#email").val() == "") {
				alert("이메일을 입력하셔야 합니다.");
				$("#email").focus();
				return false;
			}
		});
	
		// 아이디 입력란에 글자를 입력하면 실시간으로 사용가능한 아이디 인지 아닌지 검사한다.
		$("#id").on("input", function() {
			// alert("글자를 입력하셨습니다. => " + $("#id").val());
			
			// 입력된 글자의 값을 변수에 저장한다.
			let inputID = $("#id").val();
	
			// 입력한 아이디가 서버에 존재하는 지 알아낸다.
			$.ajax({
				url:		"/member/idCheck",
				type:		"post",
				dataType:	"json",
				data:		{"id" : $("#id").val()},
				success:	function(data) {
					if(inputID == "" && data == '0') {
						$(".signUpBtn").prop("disabled", true);
						$(".signUpBtn").css("background-color", "#AAAAAA");
						// document.getElementById("msg2").innerHTML = "아이디를 입력하십시오.";
						document.getElementById("msg").value = "아이디를 입력하십시오.";
						$("#msg").css("background-color", "#FFFFFF");
					} else if(inputID != "" && data == '0' && inputID.length >= 4) {
						// document.getElementById("msg2").innerHTML = "사용이 가능한 아이디입니다.";
						document.getElementById("msg").value = "사용이 가능한 아이디입니다.";
						$("#msg").css("background-color", "#B0F6AC");
						$(".signUpBtn").prop("disabled", false);
						$(".signUpBtn").css("background-color", "#4CAF50");
					} else if(data == '1') {
						$(".signUpBtn").prop("disabled", true);
						$(".signUpBtn").css("background-color", "#AAAAAA");
						// document.getElementById("msg2").innerHTML = "이미 사용 중인 아이디입니다.";
						document.getElementById("msg").value = "이미 사용 중인 아이디입니다.";
						$("#msg").css("color", "#FFFFFF");
						$("#msg").css("background-color", "#FF3F80");
					}
				}
			});
			
			
		});
		
	});

</script>


</html>

 

 

 

 

 

(2)  Mapper

 

<!-- memberMapper.xml -->

<!-- 아이디 중복 검사 : 입력한 아이디가 존재하는지 알아낸다. -->
	<select id="idCheck" parameterType="com.edu.member.vo.MemberVO" resultType="int">
		<![CDATA[
		SELECT	COUNT(*)
		FROM	t_member
		WHERE	id = #{id}
		]]>
	</select>

 

 

 

 

 

(3) DAO

 

	// DAO 인터페이스

	//================================================================
	// 아이디 중복 검사 (AJAX)
	//================================================================
	public int idCheck(MemberVO memberVO) throws DataAccessException;

 

	// DAO
    
	//================================================================
	// 아이디 중복 검사 (AJAX)
	//================================================================
	@Override
	public int idCheck(MemberVO memberVO) throws DataAccessException {
		
		logger.info("MemberDAOImpl 아이디 중복 검사() 시작..." + memberVO.getId());
		
		return sqlSession.selectOne(Namespace + ".idCheck", memberVO);
	}

 

 

 

 

 

(4) Service

 

	// service 인터페이스

	//=====================================================
	// 아이디 중복 검사 (AJAX)
	//=====================================================
	public int idCheck(MemberVO memberVO) throws Exception;

 

	// service
    
	//================================================================
	// 아이디 중복 검사 (AJAX)
	//================================================================
	@Override
	public int idCheck(MemberVO memberVO) throws Exception {
		
		logger.info("MemberServiceImpl 아이디 중복 검사() 시작...");
		
		int result = memberDAO.idCheck(memberVO);
		return result;
	}

 

 

 

 

 

(5) Controller

 

	// 컨트롤러 인터페이스
    
	//=====================================================
	// 아이디 중복 검사 (AJAX)
	//=====================================================
	public int idCheck(MemberVO memberVO) throws Exception;

 

	// member 컨트롤러

	//=====================================================
	// 회원가입 화면 불러오기 (AJAX)
	//=====================================================
	@Override
	@RequestMapping(value = "/registerAjaxForm", method = RequestMethod.GET)
	public String RegisterAjaxForm() throws Exception {
		
		System.out.println("MemberController 회원가입 화면 불러오기 (AJAX) ==> ");
		return "/member/registerAjax";
	}

	//=====================================================
	// 아이디 중복 검사 (AJAX)
	//=====================================================
	@Override
	@ResponseBody
	@RequestMapping(value = "/idCheck", method = RequestMethod.POST)
	public int idCheck(MemberVO memberVO) throws Exception {

		System.out.println("MemberController 아이디 중복 검사 (AJAX) id ==> " + memberVO.getId());
		
		int result = memberService.idCheck(memberVO);
		System.out.println("result : " + result);
		return result;
	}

 

 

 

 

 

(6) 결과

 

 

 

 

728x90
반응형

댓글