Chapter 14 내용
- @dataTimeFormat
- @PathVariable
- 익셉션 처리
날짜를 이용한 회원 검색
public List<Member> selectByRegdate(LocalDateTime from, LocalDateTime to) { //REGDATE 값이 두 파라미터로 전달받은 값으로 검색
List<Member> results = jdbcTemplate.query(
"select * from MEMBER where REGDATE between ? and ? " +
"order by REGDATE desc",
memRowMapper,
from, to);
return results;
}
- LocalDateTime 타입의 파라미터를 넘겨 받아 검색할 수 있다.
커맨드 객체 Date 타입 프로퍼티 변환 처리 : @DataTimeFormat
<input type = "text" name="from"/>
<input type= "text" name="to"/>
from과 to 라는 객체를 문자열로 입력받아 문자열을 LocalDateTime 타입으로 변환해야한다.
@DateTimeFormat 어노테이션을 사용한다.
public class ListCommand {
@DateTimeFormat(pattern = "yyyyMMddHH") //문자열을 LocalDateTime 타입으로 변환
private LocalDateTime from;
@DateTimeFormat(pattern = "yyyyMMddHH")
private LocalDateTime to;
public LocalDateTime getFrom() {
return from;
}
public void setFrom(LocalDateTime from) {
this.from = from;
}
public LocalDateTime getTo() {
return to;
}
public void setTo(LocalDateTime to) {
this.to = to;
}
}
LocalDateTime 커스텀태그 tag
jstl이 제공하는 날자 형식 태그는 LocalDateTime 타입을 지원하지 않는다. 태그 파일을 사용해 지정한 형식으로 출력하면 된다.
WEB-INF폴더에 해당 태그를 만든다.
<%@ tag body-content="empty" pageEncoding="utf-8" %>
<%@ tag import="java.time.format.DateTimeFormatter" %>
<%@ tag trimDirectiveWhitespaces="true" %>
<%@ attribute name="value" required="true"
type="java.time.temporal.TemporalAccessor" %>
<%@ attribute name="pattern" type="java.lang.String" %>
<%
if (pattern == null) pattern = "yyyy-MM-dd";
%>
<%= DateTimeFormatter.ofPattern(pattern).format(value) %>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html>
<html>
<head>
<title>회원조회</title>
</head>
<body>
<form:form modelAttribute="cmd">
<p>
<%-- @DateTimeFormat 애노테이션에서 yyyMMddHH로 적용했기 때문에 값을 생성할 때 yyMMddHH 형식으로 값을 출력한다. --%>
<label>from: <form:input path="from" /></label>
<form:errors path="from" />
~
<label>to:<form:input path="to" /></label>
<form:errors path="to" />
<input type="submit" value="조회">
</p>
</form:form>
<c:if test="${! empty members}">
<table>
<tr>
<th>아이디</th><th>이메일</th>
<th>이름</th><th>가입일</th>
</tr>
<c:forEach var="mem" items="${members}">
<tr>
<td>${mem.id}</td>
<td><a href="<c:url value="/members/${mem.id}"/>">
${mem.email}</a></td>
<td>${mem.name}</td>
<%--정의해놓은 formatDateTime으로 날짜 패턴 표시 --%>
<td><tf:formatDateTime value="${mem.registerDateTime }"
pattern="yyyy-MM-dd" /></td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
|
cs |
@PathVariable을 이용한 경로 변수 처리
http://localhost:8090/members/10
URL에서 각 경로가 고정되어있지 않고, 달라지도록 하기 위해 @PathVariable을 사용하면 된다.
@Controller
public class MemberDetailController {
private MemberDao memberDao;
public void setMemberDao(MemberDao memberDao) {
this.memberDao = memberDao;
}
@GetMapping("/members/{id}")
public String detail(@PathVariable("id") Long memId, Model model) { //memID 파라미터 값
Member member = memberDao.selectById(memId);
if (member == null) {
throw new MemberNotFoundException();
}
model.addAttribute("member", member);
return "member/memberDetail";
}
}
}
*NULL EXCEPTION이 발생하면 bean 등록 잘 되어 있는지 확인하자*
익셉션이 발생해서 디버깅 돌려보니까 memberDao가 null 값이였다..
MemberDetailController를 bean 등록을 안해줬었다 ;
컨트롤러 익셉션 처리하기
(1) @ExceptionHandler
- 메서드로 발생한 익셉션을 직접 처리할 수 있다.
@ExceptionHandler(TypeMismatchException.class) // TypeMismatchException는 경로 변수값이 올바르지 않을 경우
public String handleTypeMismatchException() {
return "member/invalidId"; //해당 뷰로 이동
}
@ExceptionHandler(MemberNotFoundException.class) //회원이 존재하지 않을 떼
public String handleNotFoundException() {
return "member/noMember"; //해당 뷰로 이동
}
-@ExceptionHandler은 해당 컨트롤러에서 발생한 익셉션만 처리한다.
(2) @ControllerAdvice
- 공통 익셉션 처리
//지정한 범위의 컨트롤러에 공통으로사용될 설정을 지정할수 있다.
@ControllerAdvice("spring") //spring패키지와 하위 패키지에서 handleRuntimeExcepiton() 메서드를 통해서 익셉션을 처리할 수 있다.
public class CommonExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public String handleRuntimeException() {
return "error/commonException";
}
}
- 다수의 컨트롤러에서 동일 타입의 익셉션이 발생할 때 익셉션 처리 코드가 동일하면 @ControllerAdvice를 사용한다.
REFERENCE
초보 웹 개발자를 위한 스프링 5 프로그래밍 입문(최범균)
300x250
'공부 > Spring' 카테고리의 다른 글
[Spring] Chapter 16 - JSON 응답과 요청 처리, Jackson gradle 의존설정, Advanced REST Client(ARC) (0) | 2021.07.23 |
---|---|
[Spring] Chapter 15 - 간단한 웹 어플리케이션의 구조 (0) | 2021.07.23 |
[Spring] Chapter 12 - MVC 2 : 메시지, 커맨드 객체 검증 (1) | 2021.07.11 |
[Spring]Chapter 11 - 요청 매핑, 커맨드 객체, 리다이렉트, 폼 태그, 모델 (0) | 2021.07.11 |
[Spring] Chapter 9-10장 Intellij에서 스프링 MVC 시작하기(Spring+ Gradle + MVC) (3) | 2021.07.11 |