2021년 11월 27일 토요일

오라클 SQL 기초 강좌 : 오라클 인덱스(ORACLE INDEX) 소개, 인덱스 개념 및 비트리 인덱스(B*Tree Index) 소개(오라클학원교육, ORACLE학원교육)

오라클 SQL 기초 강좌 : 오라클 인덱스(ORACLE INDEX) 소개, 인덱스 개념 및 비트리 인덱스(B*Tree  Index) 소개(오라클학원교육, ORACLE학원교육)


http://ojc.asia/bbs/board.php?bo_table=LecOracle&wr_id=293 


오라클동영상, 오라클 인덱스(ORACLE INDEX) 소개 인덱스 개념 및 비트리 인덱스(B*Tree Index) 소개

오라클 SQL 기초 강좌 : 오라클 인덱스(ORACLE INDEX) 소개인덱스 개념 및 비트리 인덱스(B*Tree Index) 소개인덱스 소개인덱스는 테이블의 칼럼에 대해 생성되는 객체로 별도의 공간에 컬럼값들을 정렬

ojc.asia

https://youtu.be/agFbSyrV22A


https://www.youtube.com/watch?v=FfQJJN4rYew&list=PLxU-iZCqT52DFRbLFQIgGUFp-5En2DYRG&index=6&t=4s 

인덱스 소개


인덱스는 테이블의 칼럼에 대해 생성되는 객체로 별도의 공간에 컬럼값들을 정렬한 후 생성 합니다. 데이터 검색 속도를 향상 시키기 위해 사용되며, 포인터를 이용하여 데이터를 랜덤 액세스random access 합니다. 


예를들어 수천억건 이상의 고객데이터가 있고 고객이름으로 인덱스가 생성되어 있지 않다고 했을 때  “홍길동” 고객을 검색하려면 처음 행부터 “홍길동” 고객이 출현할 때 까지 검색을 해가야 합니다. 운이 없어서 마지막 행에 “홍길동” 데이터가 있었다면 검색속도는 아주 느려질 것 입니다. 그러나 고객이름으로 가나다 순으로 인덱스가  생성되어져 있다면 랜덤 액세스로 바로 찾아 갈 수 있습니다. 이 두경우는 하늘과 땅 차이죠^^ 그만큼 인덱스는 중요하답니다.



오라클에서 인덱스를 통해 데이터를 검색하는 이유는 조건을 만족하는 데이터를 빨리 찾고 거기서 ROWID(오라클에서 실제 레코드, 행이 있는 물리적 주소)를 찾은 후 실제 원본 데이터를 빠르게 접근하기 위해서 입니다. 


우리가 흔히 오라클에서 흔히 만드는 인덱스는 비트리(B*Tree) 인덱스인데요, 


B*Tree 인덱스는 오라클의 대표적인 형태의 인덱스로 오라클에서 CREATE INDEX로 별다른 옵션없이 생성되면 전부 B*Tree 인덱스 입니다. 인덱스 구조가 자료구조에서 배운 TREE와 비슷해서 균형잡힌 트리 B*TREE(Balanced Tree)라고 합니다. 


다음은 EMP 테이블에서 사원이름 컬럼을 내림차순(Z -> A 순서)으로 정렬했을 때의 B*Tree 인덱스의 내부 구조 입니다.  (SELECT * FROM EMP WHERE ENAME = ‘JAMES’)

[그림 13.1 B*Tree 인덱스 내부구조]

B*Tree 인덱스의 리프 블록leaf blocks에는 실제 인덱스 데이터와 원본 테이블 행의 ROWID가 있는데 각 항목은 인덱스 데이터 + ROWID로 정렬되어 있고, 브랜치 블록branch blocks은 리프 블록을 찾아가기 위한 인덱스 데이터를 가지고 있습니다.  모든 리프 블록이 동일한 깊이에 있기 때문에 B-Tree 인덱스는 균형을 이루고 각각의 행들을 검색하는데는 거의 동일한 시간이 소요됩니다.

리프 블록의 ROWID는 인덱스 경유 후 원본 테이블의 데이터에 접근해서 값을 읽어야 하는 경우 이용되며, ROWID에는 object #, file #, block # 및 row #이 포함됩니다. 여기서 file #은 물리적 데이터베이스 파일, block #은 데이터가있는 블록, row #은 블록 내의 테이블 행에 대한 포인터입니다.



리프 블록은 적절한 다음 및 이전 리프 블록을 가리 킵니다. 이렇게하면 리프 블록 자체가 디스크 전체에 저장 되더라도 인덱스에 논리적 순서가 부여되고 이를 통해 범위 스캔, 내림/오름차순 검색 등을 수행 할 수 있습니다.

테이블의 기본키primary key와 같이 고유 인덱스unique indexes로 생성되면 데이터 값당 하나의 ROWID를 가지고 있고 값이 유일하므로 값에 따라서 정렬됩니다. 하지만 이름처럼 중복될가능성이 있는 경우(고유 인덱스가 아닌 경우)에는 ROWID가 정렬 된 순서로 키에 포함되므로 인덱스 키값 즉 이름 및 ROWID를 기준으로 정렬됩니다. 사원테이블에서 이름이 동일한 사원이 있을 경우 ROWID를 기준으로 정렬됩니다.


만약 이름(ename) 컬럼에 NULL인 데이터가 있다면 ename 오름차순 정렬시 맨 뒤에 위치하며 NULL값은 인덱스에 포함되지 않습니다. 그래서 WHERE ename IS NULL을 사용하면 ename 인덱스를 경유하지 않으니 주의해야 합니다.

만약 여러개의 컬럼으로 B*Tree 인덱스를 구성한다면 첫번째 열, 선행 컬럼은 가장 자주 액세스 되며 유일한 값을 가지는 컬럼을 사용하는 것이 좋습니다.


생성된 B*Tree 인덱스는 오라클에서 자동으로 유지 관리하는데 인덱싱 된 테이블에 값을 삽입/수정 할 때 약간의 오버헤드가 있습니다. 입력 또는 수정이 빈번한 테이블에 많은 인덱스가 있는 경우 문제가 될 수 있으니 주의해야 합니다.



또한 B*Tree 인덱스는 실제 컬럼 값을 인덱스 영역에 정렬해서 보관 하므로 데이터의 중복이 생기고 칼럼 값의 선택도/분포도(전체 데이터중 5~10% 정도 선택, 값이 다양하고 유일할 수 수록)가 좋아야 최적의 성능을 내는 구조 입니다. OR 처럼 범위를 넓히면서 검색하는 경우 인덱스를 사용하지만 제 성능을 내기 어려우며 특히 NOT을 사용하는 부정연산에는 취약 합니다.


인덱스는 한번 생성되면 오라클에 의해 내부적으로 자동 관리되며 인덱스를 생성해야 하는 컬럼은 SQL문의 WHERE절 or 조인절에 빈번히 출현되는 칼럼 입니다. 


아래는 테이블 원본 데이터와 인덱스와의 구조를 표현 했습니다.


[그림 12.1 인덱스구조]


사원(EMP) 테이블의 사원명(ename) 컬럼에 인덱스가 생성되어 있는 모습 입니다. USER라는 테이블스페이스에 EMP 테이블 데이터 원본이 존재하고, 인덱스는 별도의 이름을 가진 다른 테이블스페이스에 생성이 되어 있습니다. 그림의 맨 좌측 16진수 문자열 컬럼은 ROWID 컬럼으로 모든 행들의 물리적인 주소를 가리키는 의사컬럼이 입니다. 


EMP 테이블에서 “CLARK” 사원의 직무 JOB을 조회 합니다. 


 “CLARK” 사원의 직무(JOB) 컬럼을 조회한다면 SQL은 SELECT job FROM EMP WHERE ENAME = ‘CLARK’ 이러한 형태가 되고 인덱스를 경우하여 데이터를 조회한다고 가정을 했을 때 인덱스를 경유한다면 오라클은 원본 테이블 데이터가 있는 USERS 테이블스페이스table spaces의 EMP 테이블에 접근하는 것이 아니라 그림의 오른쪽 인덱스 영역에서 CLARK을 랜덤 액세스하여 찾고 그 ROWID 값을 이용하여 다시 원본테이블에 와서 JOB 컬럼값을 추출 하는 것 입니다. 


인덱스를 생성하는 기본형식은 아래와 같습니다.


[기본형식]

CREATE   [UNIQUE] INDEX   index_name 
ON   table_name (Column|Expr[,Column|Expr]...);



인덱스 종류


인덱스를 만드는형태에 따라 하나의 컬럼으로 인덱스를 만드는 단일인덱스, 여러개의 컬럼으로 인덱스를 만드는 복합 인덱스, 오름차순 또는 내림차순 인덱스, SQL함수나 표현식에 생성하는 함수기반 인덱스로 구분할 수 있습니다.


실제 인덱스가 내부적으로 어떻게 구성되어 지는지에 따라서 일반적인 오라클 인덱스인 균형잡힌 트리 형태의 B*Tree 인덱스, 비트를 이용하여 컬럼 값을 간결하게 저장하는 Bitmap 인덱스, 두 테이블 조인시 조인한 결과 칼럼에 대해 비트맵 인덱스를 생성하는 Bitmap Join 인덱스, 인덱스 컬럼의 값을 역으로 변경하여 B*Tree 인덱스를 구성한 역전환키 인덱스reverse key indexes 등이 있습니다.

인덱스가 꼭 필요한 이유


인덱스는 테이블 데이터에 액세스access 할 때마다 모든 행을 검색하지 않고도 데이터를 빠르게 찾는 데 사용됩니다. 기업에서 데이터베이스를 많은 자금을 들여 도입하는 이유중 하나는 빠른 검색 속도 입니다. 테이블에 데이터가 100건 있으나 수천억건 있으나 조회 속도는 비슷해야 한다는 이야기 입니다.


실무 현장에서 개발할 때 개발환경의 테이블에는 몇개의 행이 없지만 실 운영 상태가 되어 데이터 이행등을 한 후에는 어마어마한 데이터가 있을 수도 있다는 사실을 명심하고 


사소한 SQL문을 작성할 때도 항성 검색 성능에 신경을 쓰고 개발을 해야 합니다.


#오라클학원, #오라클교육, #오라클동영상, #ORACLE학원, #ORACLE교육, #ORACLE동영상, #ORACLE인덱스,#오라클인덱스, #ORACLE, #오라클, #비트리인덱스, #인덱스란, #CREATEINDEX, #인덱스생성


오라클학원, 오라클교육, 오라클동영상, ORACLE학원, ORACLE교육, ORACLE동영상, ORACLE인덱스,오라클인덱스, ORACLE, 오라클, 비트리인덱스, 인덱스란, CREATEINDEX, 인덱스생성

[스프링학원]Spring MVC HelloWorld, XML방식 및 자바설정(Java Config), 스프링동영상교육, 학원교육도좋지만 예제 많이 만들어 보세요~

 [스프링학원]Spring MVC HelloWorld, XML방식 및 자바설정(Java Config), 스프링동영상교육, 학원교육도좋지만 예제 많이 만들어 보세요~

http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=888 


Spring MVC HelloWorld, XML방식 및 자바설정(Java Config), 스프링동영상교육

Spring MVC HelloWorld, XML방식 및 자바설정(Java Config), 스프링동영상교육1. File -> New -> Spring Legacy Project 선택Project name : hello3Spring MVC Project 선택top level package 를 a.b.hello3 로 입력 (hello3은 Context…

ojc.asia


https://www.youtube.com/watch?v=OXnif975EoQ&list=PLxU-iZCqT52B7oCYJltUT2-kBzckdr5vp&index=12 

https://www.youtube.com/watch?v=KPiMj6pJQj0&list=PLxU-iZCqT52B7oCYJltUT2-kBzckdr5vp&index=15&t=18s 

 

1. File -> New -> Spring Legacy Project 선택

Project name : hello3

Spring MVC Project 선택


top level package 를 a.b.hello3 로 입력 (hello3은 Context 이름, localhost:8080/hello3)


pom.xml에서 스프링의 버전을 4.3 이상으로… 4.3.0


2. webapp아래의 다운로드된 모든 파일 삭제, a.b.hello3 패키지의 HomeController.java 삭제

3. HelloController.java


package a.b.hello3;


import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;


@Controller

@RequestMapping("/hello")   //http://localhost:8080/hello3/hello

public class HelloController {

@GetMapping

//@RequestMapping(method=RequestMethod.Get)

public String hello(Model model) {

model.addAttribute("message", "Hello Spring MVC framework!");

return "hello";  //View 이름, ViewResolver가 해석함, 주로 접두어. 접미어 붙임

}

}



4. WEB-INF/web.xml (프로젝트에서 우측 마우스 >> j2ee tools >> generate deployment descriptor stub 선택)


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">


<servlet>

<servlet-name>helloServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>  


<servlet-mapping>

<servlet-name>helloServlet</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

  

</web-app>


5. /WEB-INF/helloServlet-servlet.xml (디스패처 서블릿의 설정 파일)


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">


<context:component-scan base-package="a.b.hello3"/>  


<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix">

<value>/WEB-INF/jsp/</value>

</property>

<property name="suffix" value=".jsp"/>

</bean>

</beans>


6. /WEB-INF/jsp/hello.jsp


<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<h3>${message}</h3>

</body>

</html>


실행 : http://localhost:8080/hello3/hello



Spring MVC HelloWorld를 자바설정(Java Config)으로 변경

 

1. File -> New -> Spring Legacy Project 선택

Project name : spring4mvc

Spring MVC Project 선택


top level package 를 a.b.spring4mvc 로 입력


2. 기본적으로 컨트롤러, web.xml, 디스패처 서블릿의 설정파일을 자동 다운로드 한다. 프로젝트에서 우측 마우스 버튼 run as --> run on server 로 실행해보자.

(http://localhost:8080/spring4mvc/)


3. /WEB-INF/web.xml 파일과 /WEB-INF/spring/root-context.xml, /WEBINF/spring/appServlet/servlet-context.xml 파일을 삭제하자.


4. pom.xml에서 아래 플러그인을 추가하자.(web.xml이 없어도 에러나지 않도록)


<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-war-plugin</artifactId>

<version>2.6</version>

<configuration>

<failOnMissingWebXml>false</failOnMissingWebXml>

</configuration>

</plugin>


servlet-api 버전 3.0 이상인지 확인하자.


<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

</dependency>



5. 기본 패키지 아래에 config 패키지 만들고 아래의 두 자바 설정 파일을 만들자.


[Config.java]

/* DispatcherServlet 설정파일의 뷰리졸버를 정의 */

package config;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import org.springframework.web.servlet.view.JstlView;

import org.springframework.web.servlet.view.UrlBasedViewResolver;


@Configuration                      //자바 설정 파일임을 나타냄

@ComponentScan("a.b.spring4mvc")  //XML 설정의 component-scan base-package

@EnableWebMvc                     //Spring Web MVC의 Annotation 이 가능하도록

public class Config {

@Bean

public UrlBasedViewResolver setupViewResolver() {  //뷰 리졸버

UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();

viewResolver.setPrefix("/WEB-INF/views/");

viewResolver.setSuffix(".jsp");

viewResolver.setViewClass(JstlView.class);

return viewResolver;

}

}


[WebInit.java]

/* web.xml 파일의 설정을 정의한다. */

package config;


import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.web.WebApplicationInitializer;

import

org.springframework.web.context.support.AnnotationConfigWebApplicationCont

ext;

import org.springframework.web.servlet.DispatcherServlet;


public class WebInit implements WebApplicationInitializer {

@Override

public void onStartup(ServletContext servletContext) throws ServletException {

AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();

ctx.register(Config.class);

ctx.setServletContext(servletContext);

Dynamic servlet = servletContext.addServlet("appServlet", new DispatcherServlet(ctx) );

servlet.addMapping("/");

servlet.setLoadOnStartup(1);

}

}


6. 브라우저에서 실행해 보자.

http://localhost:8080/spring4mvc/



#스프링학원, #스프링교육, #Spring학원, #Spring교육, #SpringMVC, #스프링HelloWorld, #스프링강좌, #스프링강의


스프링학원, 스프링교육, Spring학원, Spring교육, SpringMVC, 스프링HelloWorld, 스프링강좌, 스프링강의 



[오라클학원, SQL학원]오라클 피봇(Pivot) 함수, 언피봇(Unpivot) 함수로 행값들을 열(칼럼) 값을 변환하세요~

 

[오라클학원, SQL학원]오라클 피봇(Pivot) 함수, 언피봇(Unpivot) 함수로 행값들을 열(칼럼) 값을 변환하세요~


http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=699 


오라클 피봇(Pivot) 함수, 언피봇(Unpivot) 함수로 행값들을 열(칼럼) 값을 변환하세요~

오라클 피봇(Pivot) 함수, 언피봇(Unpivot) 함수로 행값들을 열(칼럼) 값을 변환하세요~오라클 SQL 동영상 참조하세요~pivot, unpivot 함수는 오라클 11G 부터 제공되는 함수입니다.기존에 decode, case등으로

ojc.asia

https://youtu.be/2vf5siPGyew

오라클 SQL 동영상 참조하세요~


https://www.youtube.com/watch?v=6jXlLe6SbYk&list=PLxU-iZCqT52Dlz0zGgFiq1mBz21arFUHS&index=15 


pivot, unpivot 함수는 오라클 11G 부터 제공되는 함수입니다.

기존에 decode, case등으로 행, 열 값을 변환했는데요, pivot, unpivot의 등장으로  한결 파워풀 해 졌습니다.^^


#오라클교육, #오라클학원, #SQL교육, #SQL학원, #오라클PIVOT, #오라클 UNPIVOT, #오라클DECODE, #오라클CASE


오라클교육, 오라클학원, SQL교육, SQL학원, 오라클PIVOT, 오라클UNPIVOT, 오라클DECODE, 오라클CASE 

스프링 예외처리,@ExceptionHandler,@ControllerAdvice를 이용한 컨트롤러 예외처리(자바교육학원/스프링교육학원/JAVA교육학원/Spring교육학원)

 스프링 예외처리,@ExceptionHandler,@ControllerAdvice를 이용한 컨트롤러 예외처리(자바교육학원/스프링교육학원/JAVA교육학원/Spring교육학원)


http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=887 


스프링 예외처리, @ExceptionHandler,@ControllerAdvice를 이용한 컨트롤러 예외처리

스프링 예외처리, @ExceptionHandler,@ControllerAdvice를 이용한 컨트롤러 예외처리컨트롤러 기반 예외처리컨트롤러 내부 메소드 위에 @ExceptionHandler를 사용하면 된다. 스프링은 컨트롤러 안에 @ExceptionHand

ojc.asia


https://www.youtube.com/watch?v=OXnif975EoQ&list=PLxU-iZCqT52B7oCYJltUT2-kBzckdr5vp&index=12&t=11s 


https://www.youtube.com/watch?v=YlXpUGYXrKQ&list=PLxU-iZCqT52B7oCYJltUT2-kBzckdr5vp&index=10 

 

  • 컨트롤러 기반 예외처리

컨트롤러 내부 메소드 위에 @ExceptionHandler를 사용하면 된다.  스프링은 컨트롤러 안에 @ExceptionHandler를 사용한 메소드가 존재하면 그 메소드가 컨트롤러 내부의 예외를 처리하도록 하며 @ExceptionHandler의 인자로 들어오는 예외가 발생하는 경우에 해당 메소드가 실행된다.



@Controller

public class EmpController {

@RequestMapping(value="/emp/{empno}", method=RequestMethod.GET)

public String getEmp(@PathVariable("empno") int empno, Model model) {

if(empno==null) throw new EmpNotFoundException(id);

else {    ...... }

}

@ExceptionHandler(EmpNotFoundException.class) //EmpNotFoundException에 대한 예외처리 메소드

public ModelAndView exHandler(HttpServletRequest request, Exception ex){

ModelAndView modelAndView = new ModelAndView();

modelAndView.addObject("exception", ex);

modelAndView.addObject("url", request.getRequestURL());

modelAndView.setViewName("error");

return modelAndView;

}

}



  • 글로벌 예외처리

@ExceptionHandler  : 스프링 @MVC에서 에러나 예외를 처리하기 위한 특별한 방법을 제공하는데  @ExceptionHandler 어노테이션을 이용하면 된다. 스프링 컨트롤러에서 정의한 메소드에서 기술한 예외가 발생되면 자동으로 받아낼 수 있다. 이를 이용하여 컨트롤러에서 발생하는 예외를 View단 JSP등으로 보내서 처리할 수 있다.

 

@ControllerAdvice : @ControllerAdvice는 스프링3.2 이상에서 사용가능하며  @Controller 나 스프링 4.0이상에서 지원하는 @RestController 에서 발생하는 예외 등을 catch하는 기능을 가지고 있다. 클래스 위에 @ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지 내부 메소드를  선언하여 메소드 상단에 @ExceptionHandler(예외클래스명.class)를 기술한다. 스프링4.0이상에서는 특정한 컨트롤러만 지정해서 캐치할 수 있다.

 

STS에서

File >> New >> Spring Legacy Project

Project Name : springmvcexception

Spring MVC Project 선택

다음 화면의 top level package에서 a.b.springmvcexception 입력


[pom.xml]

Spring Framework 버전이 4.X 아래라면 수정하자.

<properties>

……

<org.springframework-version>4.2.4.RELEASE</org.springframework-version>

……

</properties>


[HomeController.java]

package a.b.springmvcexception;


import java.io.IOException;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;


@Controller

public class HomeController {

@RequestMapping(value = "/")

public String hello() throws IOException {

// 뷰이름 이름, hello.jsp 호출

return "home";

}


@RequestMapping(value = "/test")

public String test() throws IOException {

{

throw new IOException("occured IOException...");

}

}

}


[ExceptionControllerAdvice.java]


package a.b.springmvcexception;


import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.servlet.ModelAndView;


@ControllerAdvice

public class ExceptionControllerAdvice {


@ExceptionHandler(Exception.class)

public ModelAndView exception(Exception e) {

ModelAndView mav = new ModelAndView("exception");

mav.addObject("name", e.getClass().getSimpleName());

mav.addObject("message", e.getMessage());


return mav;

}

}


[ webapp/WEB-INF/views/home.jsp]


<html>

<head>

<title>Spring MVC Exception Handling</title>

</head>

<body>

<h1>Spring MVC Exception Handling</h1>

<a href="/springmvcexception/test">Click here to test Exception handling</a>

</body>

</html>


[ webapp/WEB-INF/views/exception.jsp]

<html>

<head>

<title>Spring MVC Exception example</title>

</head>

<body>

<h1>Error Handing Page</h1>

<b>${name}</b>:  ${message}

</body>

</html>


[실행]

프로젝트에서 우쪽 마우스 버튼 -> Run as -> Run On Server 클릭 후 STS에 기본적으로 내장되어 있는 Pivotal tc Server를 선택하고 Finish를  클릭하여 실행하자

http://localhost:8080/springmvcexception/



"Click here to test Exception handling "를 클릭하자

exception.jsp에서 예외를 받아서 출력한다.

 

  • Spring4 @RestController 컨트롤러 기반 예외처리

 

@RestController  @RequestMapping("/emp")

public class EmpController {

@ExceptionHandler(EmpNotFoundException.class)  //EmpNotFoundException 예외처리용

public ErrorDetail myError(HttpServletRequest request, Exception exception) {

ErrorDetail error = new ErrorDetail();

error.setStatus(HttpStatus.BAD_REQUEST.value());

error.setMessage(exception.getLocalizedMessage());

error.setUrl(request.getRequestURL().append("/emperror/").toString());

return error;

}

@RequestMapping("/get")

public Emp getEmp(@RequestParam(value="empno") String empno) {

if (empno == null) throw new EmpNotFoundException(empno);

......

return emp;        } }


public class EmpNotFoundException extends RuntimeException {

public EmpNotFoundException(String empno){

super(empno +" not found!");

}

}

http://localhost:8080/emp/get?empno=9999

존재하지 않는 사원이라면 오류는 JSON 형태로 리턴된다.

{"status":400,"message":"9999 not found!","url":"http://localhost:8080/emp/get/emperror/"}

 

  • Spring4 @RestController 글로벌 예외처리

 

@RestController

@RequestMapping("/emp")

class EmpApiController {

@RequestMapping(value = "{empno}", produces = "application/json")

@ResponseStatus(value = HttpStatus.OK)

Emp getEmp(@PathVariable Long empno) {

if (empno == null) throw new EmpNotFoundException(empno);    }

}

@ControllerAdvice(annotations = RestController.class)

class ExceptionHandlerAdvice {

@ExceptionHandler(value = EmpNotFoundException.class)

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)

@ResponseBody

public ErrorDetail myError(HttpServletRequest request, Exception exception) {

ErrorDetail error = new ErrorDetail();

error.setStatus(HttpStatus.BAD_REQUEST.value());

error.setMessage(exception.getLocalizedMessage());     error.setUrl(request.getRequestURL().append("/emperror/").toString());

return error;

}

}



스프링예외, 스프링교육, 스프링학원, 자바교육, 자바학원, ExceptionHandler,ControllerAdvice,자바교육학원,스프링교육학원,JAVA교육학원,Spring교육학원



#스프링예외, #스프링교육, #스프링학원, #자바교육, #자바학원, #ExceptionHandler,#ControllerAdvice,#자바교육학원,#스프링교육학원,#JAVA교육학원,#Spring교육학원
 

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...