본문 바로가기

공부/Spring

[Spring] Chapter 14 - Date 타입 변환, @PathVariable 경로 변수 처리, 익셉션 처리하기


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