본문 바로가기

일경험

[국민취업지원제도 일경험프로그램 59일차] 회원가입 form 보내기(ORACLE 함수)

반응형

59일 차 특이사항

1. 오류 발생. 아래 코드에서 무엇이 문제일까? 

SELECT 'TM' || TO_CHAR(TO_NUMBER(SUBSTR(MAX(TB_CHAR_SEQ), 3)) + 1, 'TM000')
FROM T_MEMBER_STUDY;
### SQL: SELECT 'TM' || TO_CHAR(TO_NUMBER(SUBSTR(MAX(TB_CHAR_SEQ), 3)) + 1, 'TM000')  FROM T_MEMBER_STUDY
### Cause: java.sql.SQLException: ORA-01481: invalid number format model

- 함수 해석을 해보자. 

- SUBSTR함수로 TB_CHAR_SEQ의 최댓값의 3번째 문자열부터 출력해 준다. ex: tb007 -> 007

- 출력된 문자열을 숫자로 바꿔준다(TO_NUMBER)

- 숫자로 바꿔준 값에 1을 더해준다. 게시판의 최신 일련번호로 업데이트 하는 것. 

- 'TM000' 이 부분이 문제다.  TM이 아니라 FM이다. 

- 오라클에서 FM이라는 데이터 포맷 형식이 있다. 

 

- TO_CHAR('숫자열','FM999.XXX')

SELECT TO_CHAR('120', 'FM999.00')
FROM DUAL;

위 식의 결과는 120.00이 나온다. '1'을 입력하면 1.00이 나온다. XXX.XX 형태를 유지하는 것이다. 

 

 - 'TM'이라는 문자열에 TO_CHAR() 함수를 통해 나온 문자값을 붙여주는 것이 결과다. 

- 그래서 TM057, TM058... 이런 식으로 데이터 값이 최신 일련번호로 입력된다. 

 

회원가입 FORM

1. CONTROLLER : 게시글 번호를 가져와서 map에 "seq"라는 키값으로 저장한다. 

@RequestMapping("register")
public String insert(@RequestParam Map<String, Object> map, HttpServletRequest request) {

    String SEQ = sqlSession.selectOne("MemberMapper.tbseq"); //  게시글 최신 번호(string)를 가져온다.													 
    map.put("seq", SEQ);	// TB_CHAR_SEQ 값을 최신화 한다. 

    service.tbseqRegister(map);

    return "redirect:list"; 
}

2. 그 map을 service.tbseqRegister() 함수에 입력하면 Oracle DB에 insert 된다. 

 

3. 받아오는 값은 다음과 같다. TB_CHAR_SEQ는 문자와 숫자가 섞인 일련번호다. 위에서 설명한 함수들을 사용하여 다음 일련번호를 select 하는 쿼리문을 추가했다. 그 값이 seq값이 되고, 나머지 id, pass, name, num adrs1, adrs2, email, phnum 값은 jsp에 있는 form에서 받아온다. 

 

1) mapper 

<select id="tbseq" resultType="String">
	SELECT 'TM' || TO_CHAR(TO_NUMBER(SUBSTR(MAX(TB_CHAR_SEQ), 3)) + 1, 'FM000')
	FROM T_MEMBER_STUDY
</select>

<insert id="tbseqRegister">
   insert into T_MEMBER_STUDY
	    (TB_CHAR_SEQ, 
	    TB_MEMBER_ID, 
	    TB_MEMBER_PASSWORD, 
	    TB_MEMBER_NAME, 
	    TB_ADDR_ZIPCODE, 
	    TB_ADDR1, 
	    TB_ADDR2, 
	    TB_EMAIL, 
	    TB_PHONE_NUMBER)
   values (#{seq}, 
   			#{id}, 
   			#{pass}, 
   			#{name}, 
   			#{num}, 
   			#{adrs1}, 
   			#{adrs2}, 
   			#{email1} || '@' || #{email2}, 
   			#{phnum})
</insert>

 

2) SignUp.jsp : 현재 사용하고 있는 api는 우편번호 찾기와 이메일 인증이다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLDecoder" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SingUP</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
    // 우편번호 찾기 버튼 클릭 시 실행되는 함수
    function searchPostalCode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 검색 결과에서 선택한 주소 정보를 가져와 원하는 필드에 할당할 수 있습니다.
                var fullAddress = data.address; // 전체 주소
                var zonecode = data.zonecode;   // 우편번호 (우편번호는 zonecode로 가져옵니다.)
				
                // 가져온 주소 정보를 필드에 할당하는 예제
                document.getElementById("num").value = zonecode;   // 우편번호 필드에 할당
                document.getElementById("adrs1").value = fullAddress; // 주소 필드에 할당
            }
        }).open();
    }
</script>
</head>
<body>
	<form name = "regifrm" id = "regifrm">
		<table width="1400" height="650">
			 <tr>
			   <td width="100%" height="10%">회원가입</td>
			 </tr>
		 <tr>
		 <td height="60%" align="center" valign="top">
		  <hr><br>
		  
		  <p align="left" style="padding-left:160px">
		  <br><br>
			  아이디 : <input type="text" size="10" maxlength="15" name="id" id = "id">
			  	    <input type = "button" name = "idChk" id = "idChk" value = "중복체크">
			 <br><br>
			  비밀번호 : <input type="password" size="15" maxlength="20" name="pass" id = "pass"><br><br>
			  비밀번호 확인 : <input type="password" size="15" maxlength="20" name="pass2" id = "pass2"><br><br>
			  이름 : <input type="text" size="13" name="name" id = "name"><br><br> 
			  우편번호 : <input type="text" size="9" name="num" id = "num"> 
			  		 <input type = "button" name = "searchnum" id = "searchnum" value = "우편번호 찾기" onclick="searchPostalCode();">
			  		 <br><br> 
			  주소 : <input type="text" size="25" name="adrs1" id = "adrs1"><br><br>
			  상세주소 : <input type="text" size="15" name="adrs2" id = "adrs2"><br><br>
			     	
			  이메일 : <div id="mail_input" name="mail_input">
			   			<input type="text" size="15" name="email1" id = "email1" value="" >@
			  			<input type="text" size="15" name="email2" id = "email2" value="">
			  			<select name="emailselect" id="emailselect" required> 
			  		  	  <option value="">선택</option> 
					      <option value="naver">naver.com</option> 
					      <option value="gmail">gmail.com</option> 
					      <option value="nate">nate.com</option> 
					      <option value="daum">daum.net</option> 
					      <option value="choice">직접입력</option> 
				     	</select> 
			  			<button type="button" id="sendBtn" name="sendBtn" onclick="sendNumber()">인증번호</button>
			  		</div>
		  		    <div id="mail_number" name="mail_number" style="display: none">
					    <input type="text" name="number" id="number" placeholder="인증번호 입력">
					    <button type="button" name="confirmBtn" id="confirmBtn" onclick="confirmNumber()">이메일 인증</button>
				    </div>
		  		   <br>
	   		 	   <input type="text" id="Confirm" name="Confirm" style="display: none" value="">
	   		 	   </br>
   		 	  연락처 :  <input type="text" size="15" name="phnum" id = "phnum" placeholder="번호를 입력하세요">
		  		<input type = "button" name = "phnum2" id = "phnum2" value = "인증번호">
		  		<br><br>
		  		<input type="text" size="15" name="phnum3" id = "phnum3" placeholder="인증번호를 입력하세요">
		  		<input type = "button" name = "phnum4" id = "phnum4" value = "확인"><br><br>    
			 </td>
			 </tr>​
		 <tr>
			  <td align="center">
			  <hr><br>
			   <input type="button"  name = "regi_btn" id="regi_btn" value="가입신청">&nbsp;
			   <input type="reset" value="다시입력">&nbsp;
			   <input type="button" value="취소" id="can_btn">
			  </td>
		 </tr>
		</table>
	</form>

 <script>
 $(document).ready(function() {
	    $('#emailselect').on('change', function() {
	        var selectedOption = $(this).val();
	        if (selectedOption === 'naver') {
	            $('#email2').val('naver.com');
	        } else if (selectedOption === 'gmail') {
	            $('#email2').val('gmail.com');
	        } else if (selectedOption === 'nate') {
	            $('#email2').val('nate.com');
	        } else if (selectedOption === 'daum') {
	            $('#email2').val('daum.net');
	        } else {
	            $('#email2').val('');
	        }

	    });
	});

 function sendNumber() {
	    var email1 = $("#email1").val();
	    var email2 = $("#email2").val();

	    // 이메일 주소 생성
	    var email = email1 + "@" + email2;

	    if (email1 && email2) {
	        $("#mail_number").css("display", "block");
	        $.ajax({
	            url: "mailconfirm",
	            type: "post",
	            dataType: "json",
	            data: { "mail": email },
	            success: function(data) {
	                alert("인증번호 발송");
	                $("#Confirm").attr("value", data);
	            }
	        });
	    } else {
	        alert("이메일 주소를 모두 입력하세요.");
	    }
	}

 function confirmNumber(){
     var number1 = $("#number").val();
     var number2 = $("#Confirm").val();

     if(number1 == number2){
         alert("인증되었습니다.");
     }else{
         alert("번호가 다릅니다.");
     }
 }
 
 $("#regi_btn").click(function() {
	 $("#regifrm").attr("action","register").attr("method","post").submit();	
 });
 </script>

</body>
</html>

각 항목에 대한 유효성 검사는 아직 완료되지 않은 상태다. 가입신청을 눌렀을 때, 각 항목이 입력되지 않으면 가입 신청이 불가능하도록 해야 한다. 

 

경제 정보 모음, 경제 블로거 커뮤니티

1. 웹 페이지 제작 시작해 보자. 

- 경제 커뮤니티

- 쇼핑몰(어머니 물건 팔아보기)  

 

2. 지금까지 한 내용을 프로젝트로 복습해 보자. 

 

마지막 날

3개월이 너무 빨리 가버렸다. 여기서 배운 내용을 잊지 않도록 복습하자. 끝이 아니라 다시 시작이다. 바뀐 것은 아무것도 없다. 계획대로 되는 것은 없지만 목표와 계획이 있다. 난 풀스택 전문 개발자가 될 것이다. 

 

 

 

반응형