예전에 닷넷 MS-SQL로 작업할 때는 테이블 필드 제약조건으로 NOT NULL을 적용하면, 웹폼에서 입력값을 누락시켜서 저장하는 상황이 절대로 생긱지 않게 되었는데, 스프링 또는 PHP에서 MySQL 로 작업할때는 '' 공백 문자가 들어가면서, NOT NULL 제약 조건이 무용지물이 되곤 합니다.
물론, DB 입력 전에 웹 자바스크립트단과 자바 또는 PHP 언어 단에서 제약 조건을 두면 되지만, 데이터 중심의 관점으로 프로그램을 보면, 위험한 일이 아닐 수 없숩니다. 매번 프로그램으로 제약 조건을 줄 수 없을 수도 있기 때문 이고, 운영할때 DB결과값 통계에서 잘못된 데이터 입력으로 생길수 있는 부정확한 통계값을 수도없이 보게 됩니다.
다행히 스프링 MVC 프레임웍에선 해당 컨트롤러에 아래와 같은 코드를 추가 하면, 필드별 별다른 제약조건을 주지 않고도 '' 공백문자를 NULL로 변경해서 DB입력시 NOT NULL을 체크할 수 있게 됩니다.
웹 데이터 POST전송시 적용된 소스(아래)
@InitBinder
public void allowEmptyDateBinding(WebDataBinder binder) {
// 빈문자열(empty string) 대신 NULL로 전송값을 대체 합니다..
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
위 기본 소스에 추가로 에러 발생시 이전 페이지URL값을 이용해서 에러 발생 전 화면으로 이동하는 버튼을 적용해 본 수정된 소스는
아래와 같습니다.
1. 게시판 컨트롤러 파일 내용(BoardController.java)
@InitBinder
public void allowEmptyDateBinding(WebDataBinder binder, HttpServletRequest request) {
// 빈문자열(empty string) 대신 NULL로 전송값을 대체 합니다..
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
//이전 페이지 기억
String referrer = request.getHeader("Referer");
request.getSession().setAttribute("prevPage", referrer);
}
2. 공통 예외처리 컨트롤러 파일 내용(CommonExceptionAdvice.java)
@ExceptionHandler(Exception.class)
public ModelAndView errorModelAndView(Exception ex, HttpServletRequest request) {
//logger.info(ex.toString());
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/error_common");
modelAndView.addObject("exception", ex);
//에러시 이전페이지 이동 코딩시작
HttpSession session = request.getSession();
String redirectUrl = (String) session.getAttribute("prevPage");
if (redirectUrl != null) {
session.removeAttribute("prevPage");
}
logger.info("결과" + redirectUrl);
modelAndView.addObject("prevPage", redirectUrl);
//에러시 이전페이지 이동 코딩끝
return modelAndView;
}
3. 공통 에러 출력 페이지(error_common.jsp)
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">${exception.getMessage() }</h3>
</div>
<div class="box-body">
<button type="submit" class="btn btn-warning">이전페이지</button>
</div>
<div class="box-footer">
<ul>
<c:forEach items="${exception.getStackTrace() }" var="stack">
<li>${stack.toString() }</li>
</c:forEach>
</ul>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
$(".btn-warning").on("click", function(){
self.location = "${prevPage}";
});
})
</script>
Ps.
위는 정상 작동 되는 것을 확인 하였고, 아래는 참고삼아 적어보았습니다.
Mysql 설정파일에서 sql mode 를 strict 모드로 변경하면 된다는 말도 있었지만,
실제로 위와 같은 상황이 해결되진 않습니다.
my.ini 수정예, sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ps2.
더미데이터 추가쿼리
insert into tbl_board (title, content, writer)
(select title, content, writer from tbl_board);
자바 AWT를 사용하여 class파일 디컴파일러를 제작해 보았습니다. (0) | 2017.04.13 |
---|---|
이번에 스프링프레임웍 작업하면서, gitlab.com 에서 소스공유(비공개)로 공동작업을 하게 되었습니다 (0) | 2016.08.30 |
전자정부표준프레임웍 제대로 공부하기 (0) | 2016.03.25 |
이클립스-스파크프레임웍-RDD를 사용한 웹통계 출력 기초 (0) | 2016.01.08 |
서브라임 에디터(유료) Java빌드시, OUT 결과에서 한글깨지는 에러처리 방법 (0) | 2015.11.22 |
댓글 영역