티스토리 뷰
KH 정보교육원 [ Java ]
KH 114일차 - Spring ( Controller - 예외처리 / 게시판 만들기 ) (*****)
monimoni 2022. 8. 9. 15:23
[ 1. Controller에서 발생하는 예외 처리하기 ]
[ 1 - 1. Controller에서 예외 발생하기 ]
더보기
[ + 코드 보기 ]
package org.zerock.myapp.controller;
import java.sql.SQLException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@NoArgsConstructor
@RequestMapping("/sample3/") // 기본 URI ( base URI )
@Controller
public class SampleController3 { // 예외처리 ver
// =======================================================
// 1. IllegalStateException
// =======================================================
@RequestMapping("")
// + 이 경우에는 http://localhost:8080/sample3/로 요청을 보내야 한다.
public String basic() {
log.trace("basic() invoked.");
throw new IllegalStateException("TEST");
// + 예외를 던짐으로써 예외가 발생하도록 만들고 있다.
// + 이 프로젝트의 경우, web.xml 파일에서 예외를 다루고 있기에
// + 만약 Spring MVC에서 예외를 다루지 않을 경우, web.xml 파일에 등록한대로 진행된다.
} // basic
// =======================================================
// 2. SQLException + throws
// =======================================================
@RequestMapping("sql")
public String basicSql() throws SQLException {
log.trace("basicSql() invoked.");
throw new SQLException("TEST");
} // basicSql
} // end class
[ 1 - 2. 예외처리하는 헨들러 생성 - @ControllerAdvice ]
더보기
[ + 코드 보기 ]
package org.zerock.myapp.exception;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@NoArgsConstructor
@ControllerAdvice
// + @ControllerAdvice가 붙으면 Controller에서 발생한 예외를 처리하는 클래스가 된다.
public class CommonsExceptionHandler {
// =======================================================
// 1. IllegalStateExceptionHandler( Exception e, Model model )
// =======================================================
@ExceptionHandler(IllegalStateException.class)
// + Model 객체를 통해서 JSP로 전달하고자 한다.
// + Spring MVC의 예외처리가 web.xml 예외처리보다 우선되기에
// + 만약 web.xml파일에도 같은 예외를 처리하는 것이 있다 하더라도
// + Spring MVC에 예외처리 핸들러가 있다면 여기서 처리되어 web.xml을 처리하지 않는다.
public String handleIllegalStateException(Exception e, Model model) {
log.trace("IllegalStateException() invoked.");
log.info("\t + Exception e : {}", e);
// + 예외 객체는 log로 {}안에 찍으려고 해도, {} 안에 찍히지 않고 콘솔에 찍힌다.
// + 그렇기에 log.info(e);로만 해도 같은 결과가 나온다.
log.error("\t + 1. Exception Type : {}", e.getClass().getName() );
log.error("\t + 2. Exception Message : {}", e.getMessage() );
// + Request Scope 공유속성으로 바인딩
model.addAttribute("exception",e);
return "errors/errorPage";
} // IllegalState
// =======================================================
// 2. NoHandlerFoundException( Exception e, Model model )
// =======================================================
@ExceptionHandler(NoHandlerFoundException.class)
public String NoHandlerFoundException(Exception e, Model model) {
log.trace("NoHandlerFoundException() invoked.");
log.error("\t + 1. Exception Type : {}", e.getClass().getName() );
log.error("\t + 2. Exception Message : {}", e.getMessage() );
// + Request Scope 공유속성으로 바인딩
model.addAttribute("exception",e);
return "errors/errorPage";
} // NoHandlerFoundException
// =======================================================
// 3. Exception( Exception e, Model model )
// =======================================================
// + Exception으로 하면 원래는 모든 예외를 다루기에
// + 위의 예외들보다 우선시하다고 생각할 수 있으나,
// + 특정 예외를 처리하는 핸들러가 우선시 된다.
// =======================================================
@ExceptionHandler(Exception.class)
public String ExceptionHandler( Exception e, Model model ) {
log.trace("AllExceptionHandler() invoked.");
log.error("\t + 1. Exception Type : {}", e.getClass().getName() );
log.error("\t + 2. Exception Message : {}", e.getMessage() );
// + Request Scope 공유속성으로 바인딩
model.addAttribute("exception", e);
return "errors/errorPage";
} // ExceptionHandler
} // end class
[ 1 - 3. View 생성]
더보기
[ + 코드 보기 ]
<%@ page
language="java"
isErrorPage ="true"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>/JSP/error/errorPage.jsp</title>
</head>
<body>
<h1>/JSP/error/errorPage.jsp</h1>
<hr>
<p>${exception}</p>
<hr>
<ul>
<c:forEach items="${ exception.getStackTrace() }" var="stack">
<li><c:out value="${stack}" /></li>
</c:forEach>
</ul>
</body>
</html>
[ 2. 게시판 만들기 - Oracle Identity Column ( PK속성의 인조키 자동생성 ) ] (****)
더보기
[ + 코드 보기 ]
-- Oracle Identity Column (****)
-- : 인조키(대리키)의 값을 자동으로 생성하는 기능을 가지는 칼럼(PK 속성) 생성기능
--------------------------------------------------------------
-- Basic syntax:
-- GENERATED [ ALWAYS | BY DEFAULT [ ON NULL ] ] AS IDENTITY [ (identity options) ]
-- (1) GENERATED ALWAYS ( 항상 생성 ) (****)
-- a. Oracle always generates a value for the identity column.
-- b. Attempt to insert a value into the identity column will cause an error.
-- + 항상 identity column값으로 생성하며,
-- + 만약 identity column으로 자동생성된 값이 아닌 값을 넣으려고 하면 오류가 발생한다.
-- + 주도권이 Oracle에게 있다.
-- + 인조키의 값은 사실 Oracle에게 맡기는 편이 좋다.
-- (2) GENERATED BY DEFAULT ( 값이 없을 때만 생성 )
-- a. Oracle generates a value for the identity column
-- if you provide no value.
-- b. If you provide a value, Oracle will insert that value into
-- the identity column.
-- c. For this option, Oracle will issue an error
-- if you insert a NULL value into the identity column.
-- + 우리가 값을 지정하지 않을 때만, 값을 자동 생성한다.
-- + 즉, 우리한테 먼저 선택권이 있다는 이야기이다.
-- (3) GENERATED BY DEFAULT ON NULL ( Null값이거나 값이 없을 때 생성 )
-- a. Oracle generates a value for the identity column
-- if you provide a NULL value or no value at all.
-- + 우리가 값으로 NULL을 넣거나, 지정하지 않았을때 오라클에서 값을 자동생성해 준다.
-- * identity options:
-- (1) START WITH intial_value ( 시작하는 값 )
-- controls the initial value to use for the identity column.
-- The default initial value is 1.
-- (2) INCREMENT BY interval_value ( 증가 값 )
-- defines the interval between generated values.
-- By default, the interval value is 1.
-- (3) CACHE n | NOCACHE ( 반복할지, 안할지 )
--------------------------------------------------------------
-- 테이블 완전히 삭제
DROP TABLE o PURGE;
--------------------------------------------------------------
-- 1 ) ALWAYS
--------------------------------------------------------------
CREATE TABLE o (
-- 1부터 시작해서 1씩 증가하는 인조키 생성 ( PK 속성 )
-- NOCACHE이기에 숫자는 반복되지 않으며,
-- ALWAYS를 선택하였기에 ID에 값을 넣어 줄 수 없다.
-- 인조키는 Oracle에게 맡기는 편이 좋기에 ALWAYS를 사용하는 것이 좋다. (***)
ID NUMBER GENERATED ALWAYS AS IDENTITY (
START WITH 1
INCREMENT BY 1
NOCACHE
)
PRIMARY KEY,
-- text는 50바이트까지 가능하다는 의미이다.
text VARCHAR2(50)
);
--------------------------------------------------------------
-- 2 ) DEFAULT
--------------------------------------------------------------
CREATE TABLE o (
-- New feature added from Oracle12c and above.
-- 값을 지정하지 않으면, Oracle이 인조키를 자동생성해 준다.
-- ALWAYS와 다르게 우리가 값을 지정해 줄 수 있다.
-- ALWAYS와 다르게 주도권이 우리에게 있다.
ID NUMBER
GENERATED BY DEFAULT AS IDENTITY
-- GENERATED BY DEFAULT ON NULL AS IDENTITY
(
START WITH 1
INCREMENT BY 1
NOCACHE
)
PRIMARY KEY,
-- text는 50바이트까지 가능하다는 의미이다.
text VARCHAR2(50)
);
--------------------------------------------------------------
-- 3 ) DEFAULT ON NULL
--------------------------------------------------------------
CREATE TABLE o (
-- 값이 NULL이거나 값을 지정하지 않으면, Oracle이 인조키를 자동생성해 준다.
-- ALWAYS와 다르게 우리가 값을 지정해 줄 수 있다.
-- ALWAYS와 다르게 주도권이 우리에게 있다.
ID NUMBER
GENERATED BY DEFAULT ON NULL AS IDENTITY
(
START WITH 1
INCREMENT BY 1
NOCACHE
)
PRIMARY KEY,
-- text는 50바이트까지 가능하다는 의미이다.
text VARCHAR2(50)
);
--------------------------------------------------------------
DESC t;
INSERT INTO o ( text )
VALUES ( 'TEXT_1' );
INSERT INTO o ( text )
VALUES ( 'TEXT_2' );
INSERT INTO o ( text )
VALUES ( 'TEXT_3' );
INSERT INTO o ( text )
VALUES ( 'TEXT_4' );
INSERT INTO o ( id, text )
VALUES ( 5 ,'TEXT_5' );
INSERT INTO o ( id, text )
VALUES ( NULL ,'TEXT_6' );
COMMIT;
728x90
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 116일차 - Spring ( 게시판 만들기 - 영속성 / 비지니스 계층 ) (****) (0) | 2022.08.11 |
---|---|
KH 115일차 - Spring ( 게시판 만들기 ) (*****) (0) | 2022.08.10 |
KH 113일차 - Spring MVC ( 파일 업로드 처리 ) (****) (0) | 2022.08.08 |
KH 112일차 - Spring ( Controller ) (****) (0) | 2022.08.05 |
KH 111일차 - Spring ( Spring MVC - Controller ) (*****) (0) | 2022.08.04 |
댓글