직원 등록 form 에서 3개의 페이지에 걸친 직원 들의 정보를 입력하고 REGISTER 버튼을 누르면 DB에 접근해서 데이터를 넣게 된다.
문제가 없을 줄 알고 DB에 엑셀을 이용해서 데이터를 넣고 있었다. 하지만 실제 사용자가 쓰는 곳은 웹 ui상이므로 나도 테스트 기간에는 데이터를 웹에서 직접 입력한다. 그런데 생각보다 많은 예외와 에러가 발생한다...
validation 체크가 확실하게 다 되지 않아 unexpected 한 값이 넘어가는 것을 잡지 않아서 톰캣 로그에서 error가 터진다.
대표적인것은 Duplicate PRIMARY KEY 이다.
DB 직원 정보 테이블은 SSN Number (소셜 시큐리티 넘버) 를 주요키로 가지게 된다. 이것은 중복된 값이 들어갈 수가 없다. 사용자는 첫 페이지에 ssn_num을 입력하게 되고 세 번째 페이지에서 등록 버튼을 누르게 되는데 애초에 ssn number가 중복값이라면 뒤에 페이지에 입력하는 것들은 무용지물이다. 즉 헛수고를 하게 되는 것이다.
아... 방금 쓰면서 생각난 건데 그냥 첫페이지에서 validate 버튼을 만들어서 (아이디 중복체크처럼) ssn_num 을 검증하는 기능을 ajax로 구현하면 훨씬 사용자 친화적일 수 있을 것 같았다.
그래도 일단 포스팅을 시작했으니 지금 해결 한 것에 한해서 써보겠다.
중복키 에러다.
일단 REGISTER 버튼을 누르면 사진 업로드 페이지로 이동한다. 그 페이지는 사진 업로드를 위해 ssn number가 필요하므로 ssn number를 들고간다. 잘 들고갔는지 로그나 alert로 띄워줬었다. 그런데 중복키에러가 발생했을 때 ssn number는 빈 값이 들어가게 된다.
처음 든 단순한 생각은 브라우저에서 검증해서 아니면 재 입력 폼으로 가게 만드는 것이다. 그래서 스크립트에서 ssn number의 값을 검증하려했다.
1 2 3 4 5 6 7 | console.log("ssn_num : " + "${ssn_num}"); if("${ssn_num}" == null) { alert("unexpected error occured!! inquire to Park or re register please"); } else { alert("ssn number inserted!! : " + "${ssn_num}"); } | cs |
ModleMap으로 View 단으로 내린 값이 없으면 일단 경고 메세지와 함께 페이지 리다이렉트를 하려고 했다. 그런데 alert로 찍으면 분명히 빈 값인데 검증을 null, undefined, 빈 문자열로 해 봤는데 전부다 타질 않는 것이었다... 차이점을 이해하지 못한 것이다.
Javscript empty string 키워드로 구글링 중 엄청난 글을 발견했다.
엄청난 추천 수의 짧은 글이다. 그냥 if안에 변수를 넣는 조건문이다.
바로 검사가 되었다.
그리고 컨트롤러 단에서 중복키를 검사하려고 해봤는데 할 수가 없었다. ssn number로 만든 객체가 바로 서비스로 넘어가기 때문에 검증을 하려면 하나의 컨트롤러에서 ssn number 중복을 체크하고 유효하면 객체를 만들어서 넘겨야 하는데 이거는 훨씬 복잡해지고 로직도 이상해질것 같아서 글 쓰면서 생각한 프런트 엔드에서 입력과 동시에 검증하는 버튼을 만들어야 하겠다.
그리고 각 폼데이터 유효 글자수에서 에러가 터졌다.
내가 쓴것은 부트스트랩 위자드 폼이라는 것이다. 여기서 검증함수를 제공해 준다. 밑에 써져 있는 것처럼 input 의 name을 가져와서 길이를 검증한다. 서버에서 검증하는 것보다 훨씬 효율적이다. 애초에 클라이언트쪽에서 값이 유효하지 않으면 넘어갈수 조차 없게 만들어버리는게 서버 부하를 줄일 수 있기 때문이다. 몇 가지가 빠져있어서 수정했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | $().ready(function(){ var $validator = $("#wizardForm").validate({ rules: { email: { required: true, email: true, minlength: 5 }, first_name: { required: true, minlength: 1 }, last_name: { required: false, minlength: 1 }, cel_tel: { required: true }, skills: { maxlength: 255 }, school_name: { maxlength: 50 }, major: { maxlength: 50 }, grade: { maxlength: 20 }, work: { maxlength: 255 }, reason: { maxlength: 255 } } }); | cs |
그리고 개선해야 할 곳은 컨트롤러의 스파게티이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | @RequestMapping(value="complete.do") public String initComplete(HttpServletRequest request, ModelMap model) throws Exception { EmployeeVO employeeVO = new EmployeeVO(); EmployeeEducationVO employeEducationVO = new EmployeeEducationVO(); EmployeeHistoryVO employeeHistoryVO = new EmployeeHistoryVO(); DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); try{ /** * Employee VO */ String frst_nm = request.getParameter("frst_nm"); String mddl_nm = request.getParameter("mddl_nm"); String last_nm = request.getParameter("last_nm"); String e_mail = request.getParameter("email"); String[] ssn_num_array = request.getParameterValues("ssn_num"); String ssn_num = new String(); for(int i=0; i<3; i++) { ssn_num += ssn_num_array[i]; } String street_addrs = request.getParameter("street_addrs"); String city = request.getParameter("city"); String state = request.getParameter("state"); .................... | cs |
인자로 VO로 받아서 코드 한줄에 끝내려고 했는데 이상하게 맵핑이 계속 되질 않았다. 디비와 VO 필드명을 똑같이 한 것 같은데 계속 넘어가질 않아서 HttpServeltRequest로 일일이 다 썼다.... 저걸 찾아서 수정을 하면 코드의 길이가 매우 줄어들게 될 것이다.
이런 이름 매핑 작업이 귀찮게 되어 JPA를 쓰는 것인데 공부하려고 책을 구매한 상태이다.
그리고 제일 이상한 부분은 여기다.
1 2 3 4 | if(!emp_name.equals("") && !type.equals("") && !job_title.equals("") && !start_dt_str.equals("") && !end_dt_str.equals("")) { Date start_dt = (Date) df.parse(start_dt_str); System.out.println(start_dt_str); System.out.println(start_dt); | cs |
일 경력이 없는 사람들은 일 경력 입력 페이지를 건너뛰게 된다. 이것을 검증하려고 하는 부분인데 도저히 생각이 나질 않아서 일단 저렇게 날 코딩을 했다.
외부키로 묶여있는 WORK_HIST 테이블과 EMPLOYEE 테이블은 상하 관계를 가진다. 내가 WORK_HIST가 없으면 테이블 insert를 하지 않았는데 직원 조회화면은 JOIN으로 모든 테이블을 ssn_num인 pk로 조회하게 된다. 그러면 WORK_HIST에 정보가 없으므로 또 에러가 터져버리게 되었다. 그래서 일 경력이 없으면 "none"값을 가진 row로 WORK_HIST에 insert를 했다. 돌아가긴 하겠지만 이렇게 하면 안될 것 같다....
이상 일지 기록이다.
'프로그래밍 > 해외인턴 개발일지' 카테고리의 다른 글
[인턴 일지] POS기 이미지로딩 스크립트 수정 (0) | 2017.12.02 |
---|---|
[인턴 일지] Amazon S3 이미지 업로드, 다운로드 (3) | 2017.12.01 |
[인턴 일지] 미국 인턴생활과 POS기 사진 띄우기 (5) | 2017.11.04 |
[인턴 일지] 내 프로젝트의 문제점과 나아가야할 방향 (3) | 2017.11.04 |
[인턴 일지] Spring + Amazon S3 이미지 업로드 (0) | 2017.10.28 |