13.10. Handling exceptions
특정 예외가 발생했을 때 특정 페이지로 이동 시킬 수 있습니다.
먼저 컨트롤러든 서비스 단이든 벨리데이션 할 때든 에러를 발생시킵니다. 예외 처리 할 것도 없기 때문에 RuntimeException이 좋겠네요.
public void add(MemberInfo memberInfo) {
if(memberInfo.getConfirmMember().equals("ajnapaqj")){
String email = memberInfo.getEmail();
if(memberInfoDao.findByEmail(email) == null)
memberInfoDao.insert(memberInfo);
else
throw new AlreadyExistEmailException();
}
else
throw new InvalidMemberCodeException();
}
if(memberInfo.getConfirmMember().equals("ajnapaqj")){
String email = memberInfo.getEmail();
if(memberInfoDao.findByEmail(email) == null)
memberInfoDao.insert(memberInfo);
else
throw new AlreadyExistEmailException();
}
else
throw new InvalidMemberCodeException();
}
저는 서비스 단에 구현했습니다. 사실 고민이 됩니다. 이런 거는 벨리데이터에 넣어야 필드 값 검사할 때 같이 하면 좋을 것 같은데 아직 벨리데이터를 만들지 않았기 때문에 간단하게 서비스 단에 구현해 뒀습니다. 나중에 옮겨야 벨리데이터 만들고 옮겨야 겠습니다.
그리고 사용자 예외를 만들어 줍니다.
public class AlreadyExistEmailException extends RuntimeException {}
public class InvalidMemberCodeException extends RuntimeException {}
public class InvalidMemberCodeException extends RuntimeException {}
그리고 Spring의 ExceptionResolver를 등록해줍니다.
<!-- Exception Resolver -->
<bean id="exceptionMapping"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="InvalidMemberCodeException">
/exception/joinFailedByMemberCode
</prop>
<prop key="AlreadyExistEmailException">
/exception/joinFailedByExistingEmail
</prop>
</props>
</property>
</bean>
<bean id="exceptionMapping"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="InvalidMemberCodeException">
/exception/joinFailedByMemberCode
</prop>
<prop key="AlreadyExistEmailException">
/exception/joinFailedByExistingEmail
</prop>
</props>
</property>
</bean>
이런식으로 Exception과 view 이름을 매핑 시켜 주면 view 리졸버에 의해 view를 찾게 됩니다.