티스토리 뷰

 

[ 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
댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항