프로그래밍/해외인턴 개발일지

[인턴 일지] 스프링 각종 코드 수정 작업 중, 잔 버그 해결

Jay Tech 2017. 12. 5. 02:26
반응형

직원 등록 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를 했다. 돌아가긴 하겠지만 이렇게 하면 안될 것 같다....


이상 일지 기록이다.





반응형