티스토리 뷰

1️⃣ unable to start within 45 seconds

 

에러 전문)

Server Tomcat v8.0 Server at localhost was unable to start within 10 seconds. If the server requires more time, try increasing the timeout in the server editor.

 

원인)

톰캣 서버 구동 시, 서버가 구동되는 시간이 톰캣이 기본 설정해둔 시간제한이 45초보다 길어지게 되어서 발생한다고 한다.

 

 

해결)

시간제한을 늘려주자!

  1. Servers에서 해당 서버 더블클릭
  2. Overview > Timeouts 클릭
  3. Strart(in seconds)초 수정해주기

 


 

 

2️⃣ NullPointException

회원 탈퇴를 위해 로직을 작성하고 실행해봤더니

비밀번호를 작성하고 탈퇴하기 버튼을 눌러 넘기는 구간에서 계속 NullPointException오류가 발생했다.

com.controller.MyPageController.memberDelete(MyPageController.java:141) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1043) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) javax.servlet.http.HttpServlet.service(HttpServlet.java:555) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)

 

 

원인)

MemberDTO member = (MemberDTO) session.getAttribute("member");

부분에서 member 객체가 null 상태였던 것이다.

 

 

해결)

 

따라서, 로그인 정보가 담겨져있는 loginInfo를 사용해

MemberDTO loginInfo = (MemberDTO) session.getAttribute(" loginInfo"); 으로 수정해주고

loginInfo 객체가 null인지 확인해주기 위해 if (loginInfo != null) 를 추가해주었다.

 

 

 


 

 

3️⃣ SQLIntegrityConstraintViolationException

 

NullPointException을 해결하고나니 java.sql.SQLIntegrityConstraintViolationException이 발생했다.

처음 보는 오류라 당황했지만 금세 해결할 수 있었다.

 

원인)

Oracle 데이터베이스에서 외래 키 무결성 제약 조건을 위반하였다는 것을 나타낸다. 즉, 부모 레코드에 연결된 자식 레코드가 존재하여 외래 키 무결성을 위반했다는 것이다.

 

해결)

  1. 외래 키 무결성을 위반한 행을 식별하기
  2. 부모 레코드를 삭제하기 전에 해당 외래 키를 참조하는 자식 레코드를 먼저 삭제하거나 수정하기

확인결과, member테이블과 travel테이블에서 userID가 외래키 관계를 갖고 있었다.

⇒ Transaction 을 사용하여 두 작업을 원자적으로 처리해야한다 ⭐

트랜잭션 처리를 위해 root-context.xml에 추가해주었다.

 

MyPageMapper.xml에 travel 테이블의 레코드를 지우기 위한 delete문을 추가해준다.

 

service는 그대로 두고

serviceImpl에서 @Transactional 어노테이션을 사용해 트랜잭션 처리를 해준다.

memberDelete 메소드 안에는 mapper에 등록했던 travel테이블의 레코드를 지우는 delete문 ( 자식 테이블의 레코드 ) 을 먼저 작성해주고, 그 다음에 member테이블의 레코드를지우는 delete문( 부모 테이블의 레코드 ) 을 작성해줘야 한다.

 

 


 

 

 

여기까지 했는데

test 하려고 만들어 놓은 id들 중에 어떤 것은 문제없이 탈퇴가 되고, 어떤 것은 java.sql.SQLIntegrityConstraintViolationException가 발생했다.

 

어라?

저 예외는 분명 트랜잭션으로 처리를 했는데 또 왜...?!

멘붕에 빠졌다가 예외문을 천천히 다시 읽어보니 아까랑은 다른 점을 발견할 수 있었다.

 

 

뭐 어쩌고 저쩌고...

아까는 travel에서 예외가 발생했다고 떴었는데 이번엔 board에서 예외가 발생했다고 뜬다.

 

확인해보니

트랜잭션 처리를 member와 travel 테이블 처리밖에 안했었는데 참조키 userID는 board, sharedBoard 등 여러 테이블과 연관이 되어있었고, 테스트 한다고 게시판에 글을 써놓은 id가 있었는데 그 id가 탈퇴처리가 안되고 오류가 났던 것...!!!!

결론 = 모든 관련된 테이블과 데이터에 대해 트랜잭션 처리를 해주어야 한다. 그래야 특정 사용자가 탈퇴하면 그 사용자와 관련된 모든 데이터가 안전하게 삭제된다. 

 

 

모두 다 트랜잭션 처리 완료!

 

트랜잭션 개념을 수업에서만 배우고 강사님 따라서 써보기만 했는데, 처음으로 실전에 활용해 본 경험이라 별 거 아닌데도 괜히 뿌듯하고 흥미로웠다.

 

 


 

 

4️⃣ 탈퇴 프로세스 에러 해결

문제1)

ajax의 if(confirm("정말 탈퇴하시겠습니까?")) 부분에서 취소를 클릭해도 탈퇴가 되는 문제를 발견했다.

처음엔 사용자가 ‘확인’이 아닌 ‘취소’를 클릭할 경우 폼 제출을 중단하는 방법으로 문제를 해결하려고 했는데 그러면 ajax가 필요없어지게 되어서…ajax를 유지하면서 취소시에는 실행이 안되게끔 했다.

 

원인과 해결)

방법은 탈퇴 버튼의 Type을 submit이 아닌 button으로 바꾸는 것이었다.

 

결과)

button으로 바꿈으로서 취소 클릭시에는 탈퇴 프로세스가 진행 안되고

 

else문을 추가해 취소 시, 마이페이지 화면으로 돌아가게끔 했다.

 

 


 

 

문제2)

취소시에 탈퇴는 진행안되는데 에러메세지가 뜨지 않는다.

 

해결)

ajax안 if문에 에러메세지를 넣어서 비밀번호가 틀렸다는 알림 후에 뜨도록 수정했다.

기존에 작성했던 것을 주석처리하고 id="errorMesaage"인 div 추가

 

ajax의 if문 안 alert문 다음에 에러메세지를 추가했다.

 

 

결과)

비밀번호를 잘못입력하면 알림이 먼저 뜨고

 

확인을 누르고 나면 알림은 없어지고, 에러메세지가 뜨게 된다!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함