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="가입신청">
<input type="reset" value="다시입력">
<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개월이 너무 빨리 가버렸다. 여기서 배운 내용을 잊지 않도록 복습하자. 끝이 아니라 다시 시작이다. 바뀐 것은 아무것도 없다. 계획대로 되는 것은 없지만 목표와 계획이 있다. 난 풀스택 전문 개발자가 될 것이다.
'일경험' 카테고리의 다른 글
[국민취업지원제도 일경험프로그램 58일차] 구글 SMTP 이메일 인증 기능 (2) | 2023.10.30 |
---|---|
[국민취업지원제도 일경험프로그램 57일차] 결재시스템 대리결재 수정 (1) | 2023.10.27 |
[국민취업지원제도 일경험프로그램 56일차] 결재시스템 대리결재 완료 (1) | 2023.10.26 |
[국민취업지원제도 일경험프로그램 55일차] 결재시스템 대리결재 controller (0) | 2023.10.25 |
[국민취업지원제도 일경험프로그램 54일차] 결재시스템 과장 서브쿼리 조건문 (0) | 2023.10.24 |