본문 바로가기
Exception (예외)/DB (SQL)

DuplicateKeyException (예외)

by Hwanii_ 2023. 8. 21.
728x90

 
a) 회원 가입 페이지 에서, 회원 가입시 발생 하는 예외.
 
b) DuplicateKeyException.
 
c) DuplicateKeyException 예외 ?

멤버 테이블에 MPHONE 칼럼은 유니크 키로 설정 되어 있다.
유니크 키 이기 때문에,
해당 칼럼의 행 데이터는,
MPHONE 열의 다른 행들과 절대로 동일 할 수 없다.
(무결성 제약 조건 위배)
 
즉, 이미 동일한 핸드폰 번호의 행 데이터가 있기 때문에 발생.
 
d) 해결방안
 
DB 설정에 의하여 발생 하는 이슈이고,
해당 예외 발생시,
당연히, 해당 예외에 대한 예외 처리를 해줘야 한다.
 

 
현재 DB에 위와 같은 전화 번호를 등록한 회원이 이미 있는 상황 이다.
 
이때,
동일한 전화 번호로 회원 가입을 시도 하면, 유니크 키 제약 조건으로 인해 예외가 발생 한다.
 

 
회원가입은 Model의 MemberDAO 클래스 내부의 insert() 메서드가 수행 한다.
 

 
이곳에서 DB를 치고 나오는 jdbcTemplate.update() 메서드에게
try-catch 문을 작성 하여,
발생하는 해당 예외를,
catch 블럭에 예외로 선언 하고,
예외를 잡을 수 있다.

 

하지만,

DAO 내부에서 try-catch문을 사용하는건 가독성과 유지보수에 불리해서,

서비스 레이어 (비즈니스 레이어) 에서 예외 처리를 하는게 좋은듯 하다.

 
그래서,

 
MemberDAO 클래스 내부에 있는 insert() 메서드를 사용하는 주체가

서비스 레이어 (비즈니스 레이어) 에 있는 memberService 이기 때문에,

이곳에 try-catch를 작성 한다.
 

 
SignupController 클래스 내부의 의존 관계인 memberService 이다.
 

 
signup() 메서드 내부를 보면,
 
memberService가 주체로, insert() 메서드를 호출 하고 있다.
 
따라서, memberService가 있는 클래스에 try-catch 문을 작성 하면 된다.
 

 
이곳에서, 회원 가입이 무사히 진행 되면 return 값은 true가 될것이고,
 
예외가 발생하면, 예외 메시지를 콘솔에 띄우고,
return 값으로 false를 반환 한다.
 

 
[ 정리 ]
 
현재는,
예외 발생시 발생한 예외를 잡고, 다시 회원 가입 페이지로 가도록 되어 있지만,
사용자 편의성을 고려한다면,
해당 예외 또는 비슷한 예외가 발생 할 때,
사용자에게 안내 해 줄 수 있는,
Xxx.jsp를 생성 하고,
해당 페이지로 이동 할 수 있도록 하면 좋을듯 하다.
 
하지만, .jsp 파일은 컴파일시, .java 파일이 되고,
해당 .java 파일은 서블릿 == Not POJO 이기에,
너무 세세하게 나눠서 .jsp 에러 페이지를 만들면,
프로젝트 자체가 너무 무거워 지게 된다.
 
그래서, 적당히 예외 페이지를 만드는것이 중요 하다고 생각 한다.

 

++

위의 경우에는,

예외를 혹시나 바로 처리 하지 않는 경우일 때라도 throws를 명시해줄 필요가 없다.

DuplicateKeyException 예외가 언체크드 예외기 때문이다.

반응형