IT 강의 정리/윤재성의 스프링 MVC5

[섹션4][Spring MVC 인터셉터와 MyBatis] 34~39강

Nellie Kim 2022. 10. 26. 17:04
728x90

34. Interceptor

Spring Framework강좌에서 AOP를 배웠었다. 스프링프레임워크에서 어떤 메소드를 감시하고 있다가 그 메소드를 호출할 때 그 메소드가 동작되는게 아니라 그 메소드의 호출을 가로채가서 다른 메소드를 호출하는 개념이 AOP이다.

그 AOP를 Spring MVC에서 적용한 요소가 Interceptor이다.

Interceptor는 요청주소에 대해 관심을 갖고 요청이 발생하게 되면 요청주소를 확인하여 컨트롤러의 메소드를 호출하기 전이나 후에 다른 메소드를 호출할 수 있도록 가로채가는 개념이다.

 

요청 발생 시 호출되는 메소드의 코드가 중복되는 부분이 있을 때 인터셉터를 통해 처리하면 중복을 최소화할 수 있다.

로그인 여부 확인, 등급별 서비스 사용권한 확인 등의 작업을 처리할 때 많이 사용한다.

인터셉터는 Java프로젝트와 Xml프로젝트의 세팅방법이 각각 다르다.

인터셉터는 HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdapter를 상속받은 클래스를 만들고 다음 메서드를 구현한다. 오버라이딩 해야할 메소드는 아래와 같다.

- preHandle : Controller의 메서드가 호출되기 전 호출된다. 이 메소드가 false를 반환하면 코드의 흐름이 중단된다.

- postHandle : Controller의 메서드의 수행이 완료되고 view처리를 수행하기 전에 호출된다.

- afterCompletion : view 처리까지 완료되고 응답결과가 브라우저로 전달되기 전에 호출된다.

 

1. Java에서 세팅하기

1) TestInterceptor클래스에서 HandlerInterceptor 인터페이스를 구현하기

 preHandle, postHandle, afterCompletion메서드를 오버라이딩하기

다음단계로 나갈 수 있도록 return true; 

2) ServletAppContext에 인터셉터를 등록하기

addInterceptors메소드를 오버라이딩 하고, 

인터셉터 객체 생성하고 registry에 만든 인터셉트객체 저장하고

addPathPatterns로 주소를 저장한다. " /test1 가 나오면 컨트롤러로 가는게 아니라 inter1를 호출해라. "

테스트 컨트롤러에서 아래와 같이 코드 작성 후 실행해 주면, 인터셉터가 잘 가로채서 순서대로 정상 실행 된다.

하나의 요청에 대해서 여러개의 인터셉터 등록도 가능하다.

이번에는 HandlerInterceptorAdapter를 상속받기. 나머지 코드는 동일하다.

test1주소에 대해 2개의 인터셉터를 설정해보자.

preHandle은 위에서 아래로 코드가 진행되지만, postHandle과 afterCompletion은 역순으로 진행된다.

하나의 인터셉터가 test1과 test2를 둘다 요청했을 때 동작하게 할 수도 있다.

아래처럼 ServletAppContext에 여러 주소를 나열하여 등록해주면, 콘솔에 모두 정상 출력된다.

하위 경로를 설정해보자. Spring MVC에서는 가상의 경로로 세팅하는 것이다. ServletAppContext에 아래와 같이 세팅한다.

만약, 특정 인터셉터는 모든 주소를 요청할 때마다 동작하게 하고 싶을 때는 어떻게 할까?

웹개발시 모든 주소를 addPathPatterns에 입력하는건 힘들다. 그래서 pattern이란 것을 이용하면 편하다.

Pattern 등록

addPathPatterns, <mapping> : 인터셉터가 가로채갈 주소를 등록한다.

excludePathPattern, <exclude-mapping> : 인터셉터가 가로채가지 않을 주소를 등록한다.

 

pattern
- * : 이름 하나를 의미하며 글자수, 글자 등 제한이 없다. 비어있는게 와도 된다.
- ? : 글자 하나를 의미한다.
- ** : 하위 이름까지 포함하여 글자수, 글자 등 제한이 없다. 비어있는게 와도 된다.

그런데 preHandle메소드의 리턴값에 false를 주게되면, 콘솔창에 preHandle만 찍히고 나머지 인터셉터는 중단된다.

2. xml에서 세팅하기

xml설정만 다르고 나머지는 동일하다.

요약 - 인터셉터
1) TestInterceptor클래스에서 HandlerInterceptor 인터페이스 구현 or HandlerInterceptorAdapter를 상속받기
 preHandle, postHandle, afterCompletion메서드 오버라이딩
2) ServletAppContext에 인터셉터를 등록하기
addInterceptors메소드를 오버라이딩 하고, 인터셉터 객체 생성하고 registry에 만든 인터셉트객체 저장하고
reg.addPathPatterns("/test1")로 주소를 저장한다. 

35. 예외처리

프로그램 실행 중 오류가 발생되면 프로그램 실행이 중단된다. 이를 방지하기 위해 '오류처리' 라는 개념을 두었다.

보통 웹 애플리케이션에서 오류가 발생하면 웹 브라우저에 오류메시지가 나타나는데 사용자 입장에서는 보기 좋지 않다.

그래서 보통 오류발생시 보여줄 jsp를 구성하고 오류가 발생하면 이 jsp로 응답결과를 생성하여 브라우저로 전달한다.

 

컨트롤러에서 일부러 존재하지 않는 10번째 인덱스를 호출하면, 아래와 같이 500오류메시지가 뜬다.

사용자에게 보이지 않게 처리해보자.

1. @ExceptionHandler 처리

Controller에서 @ExceptionHandler를 통해 메서드를 오류 종류별로 정의해주면 오류발생시 이 메서드를 자동호출한다.

이 메서드가 반환하는 JSP정보를 통해 응답결과 화면을 만들고 이 응답결과를 브라우저로 전달한다.

이 때 사용하는 JSP를 예쁘게 오류페이지용으로 만들어주면 된다.

2. Global Exception Handler 처리

그런데 @ExceptionHandler는 컨트롤러마다 만들어줘야 한다.

만약 컨트롤러마다 발생 가능한 예외들이 있다면 한번만 정의해서 사용하는게 효율적일 것이다.

Global Exception Handler를 구현하면, 컨트롤러에 정의한 ExceptionHandler중에 해당 오류에 대한 것이 없다면 Global Exception Handler로 이동하여 예외에 관련된 처리를 해주게 된다.

 

따로 GlobalExceptionHandler클래스를 만들어서 @ControllerAdvice 붙여주고, ServletAppContext에 스캔처리해주기

요약
1. @ExceptionHandler 처리 - 오류별로 메서드 정의
2. Global Exception Handler 처리 - 한번만 정의

37. MyBatis Java

JDBC : Java언어를 이용해 데이터베이스와 연동하는 프로그램을 만들 수 있는 기술

MyBatis : JDBC 프로그래밍을 보다 쉽게 하기 위해 설계된 라이브러리. 스프링 프레임워크에서 라이브러리를 제공한다.

 

라이브러리 추가 : 데이터베이스 드라이버 jar, spring jdbc, dbcp, mybatis, mybatis-spring

 

MyBatis사용을 위한 세팅하기

1. Properties 파일 작성하기

데이터베이스 접속정보를 코드에 직접 작성하지 않고 properties파일에 작성한다. ServletAppContext에 등록

2. Mapper 인터페이스 만들기

Mapper는 쿼리문을 작성하는 파일. 일단 파일만 만들어 놓기. 쿼리는 나중에 세팅

먼저 만들어 놓는 이유는 나중에 마이바티스 세팅을 할 때, 어떤 Mapper파일을 쓸지 정해야 하기 때문이다.

3. BasicDataSource Bean 정의

BasicDataSource는 접속 정보를 관리하는 객체. ServletAppContext에 등록

4. SqlSessionFactory Bean 정의 

SqlSessionFactory는 접속, 쿼리 관리 등을 하는 객체. ServletAppContext에 등록

이 객체가 DataSource를 참조하여 MyBatis와 오라클서버를 연동시켜준다.

5. Mapper Bean 정의

쿼리문을 관리하는 Mapper를 정의한다. 이 Mapper를 주입받아 쿼리를 실행하게 된다. ServletAppContext에 등록

MyBatis 사용하기

1. 테이블 만들기

이클립스에서 데이터베이스 파일 생성하고, 오라클에 붙여넣고 실행눌러서 테이블 생성시키기 

2. 빈객체 만들기

데이터를 저장하고 가져올 수 있는 빈객체 만들기 (컬럼 이름과 동일하게 작성하기)

3. Mapper인터페이스에 쿼리문 작성하기 

(데이터 받아서 가공하고 db에 전달해주는 역할,, 분류가공 및 배달)

저장하는 @Insert, 가져오는 @Select 쿼리 작성하기

insert_data가 호출되면 dataBean이 주입되고, 여기 안에 있는 데이터들이 #{data1}, #{data2}, #{data3}로 들어간다.

 

4. 컨트롤러에서 Mapper주입받고 실행하기

왼쪽이 insert_data(저장하기), 오른쪽이 select_data(가져오기)

5. 컨트롤러에 맞춰서 jsp작성하기

6-1. 실행하고 브라우저에서 데이터입력 & 오라클에서 저장된 데이터 확인 - 저장하기

6-2. 브라우저에서 데이터 가져오기

데이터 주입 루트 

38. MyBatis Xml

이전까지는 동일하다.

1. servlet-context.xml 파일 작성하기

1) PropertyPlaceholderConfiguer Bean 정의 : properties파일을 xml에서 사용할 수 있게 정의

2) BasicDataSource Bean정의 : 데이터베이스 접속정보를 관리하는 객체 정의

3) SqlSessionFactoryBean Bean정의 : 데이터베이스 접속정보와 mapper파일을 관리하는 객체 정의

4) SqlSessionTemplate Bean정의 : 쿼리를 전달하는 객체 정의. 이 객체를 전달받아 쿼리를 실행

2. mapper.xml 작성하기

3. 쿼리 실행하기

39. RestController

Restful API

기본 웹 애플리케이션은 응답결과를 브라우저가 사용하는 코드인 HTML, CSS, JavaScript로 생성하여 전달한다.

그런데 최근들어 웹브라우저 외에 모바일, PC등 다양한 플랫폼을 대상으로 서비스를 제공하는 경우가 많아졌다.

그래서 웹에서만 필요한 HTML, CSS, JavaScript가 아닌 only 데이터만 요청하는 경우가 많아졌다.

Restful API 서버는 응답결과를 데이터만으로 구성(보통 JSON형식으로)하여 클라이언트로 전달하는 서버를 의미한다.

클라이언트는 이 JSON데이터를 분석하여 원하는 데이터를 받아서 사용하게되는데, 보통 웹에서는 ajax통신을 사용한다.즉, Restful API는 웹, 모바일, PC등 다양한 플랫폼으로 데이터를 전달할 때 사용한다.

이 데이터를 받은 클라이언트는 이 데이터로 화면을 구성하는 코드를 직접 작업하여 화면을 만들어서 보여준다.

아이디 중복확인 기능을 만들 때 많이 사용한다.

 

스프링에서는 @RestController라는 어노테이션을 제공한다.

원래 Spring MVC에서 Controller를 구성할 때 @Controller를 사용하면 return하는 값은 사용할 JSP를 지정했었다.

@RestController를 통해 return하게 되면 그 값 자체를 브라우저로 전달하는 응답결과로 생성해서 보낸다.

 

아래를 보면, @RestController가 아닌 @Controller를 붙였다면 test2.jsp를 찾아서 반환했을 것이다. 

그러나 @RestController를 붙이고 return "test2";를 하게 되면 리턴 값 그대로 데이터 'test2'가 화면에 그대로 출력된다.

JSON데이터 구성해서 반환하기

1. jackson 라이브러리 다운로드

자바의 객체나 리스트를 JSON문서로 구성하기 위한 라이브러리이다.

빈클래스 만들어주고,

2. 컨트롤러 작성하기

DataBean객체 3개 생성하고, list만들어서 빈객체 넣어주기.

만든 list를 응답결과인 JSON으로 변환하기 위해 ResponseEntity객체로 만들어주기.

entry 리턴해주면, list의 데이터 구조를 파악해서 json으로 만들어준다.

3. 출력해주면 아래와 같이 JSON형식으로 출력이 된다.

보기 편하게 크롬 스토어에서 'JSON Formatter'를 추가해주자.

 

요약 - RestController
1. jackson 라이브러리 다운로드
2. 컨트롤러 작성 ( list만들고, list를 ResponseEntity객체로 만들고 entry반환)
3. 크롬 스토어에서 'JSON Formatter'를 추가

출처 : [인프런] 윤재성의 만들면서 배우는 Spring MVC 5