2020년 9월 5일 토요일

스프링 MVC 인터셉터(Spring MVC Interceptor), 커스텀 로깅 기능 구현 실습, (Spring동영상강좌)스프링 MVC 인터셉터(Spring MVC Interceptor), 커스텀 로깅 기능 구현 실습

 스프링 MVC 인터셉터(Spring MVC Interceptor), 커스텀 로깅 기능 구현 실습, (Spring동영상강좌)스프링 MVC 인터셉터(Spring MVC Interceptor), 커스텀 로깅 기능 구현 실습


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








 

스프링 MVC 인터셉터(Spring MVC Interceptor), 커스텀 로깅 기능 구현 실습

 

n  Spring MVC는 서블릿 필터와 유사하게 HTTP Request(요청)를 앞단/뒤단에서 가로챌 수 있는 메커니즘을 제공한다.(org.springframework.web.servlet.HandlerInterceptor)

 

n  인터셉터가 되기 위해서는 HandlerInterceptor를 구현 또는 HandlerInterceptorAdapter를 상속받아야 한다 HandlerInterceptor를 구현하는 경우에는 세가지 메소드(preHandle(), postHandle(), afterCompletion() )를 다 구현해야 하지만 HandlerInterceptorAdapter를 상속받는 경우에는 필요한 메소드만 재정의하면 된다.

 

 

 

n  preHandle() : 컨트롤러 메소드가 실행되기 전에 실행되며 bool형 리턴 한다실행체인에서 계속 실행할지 중단할지를 true, false로 전달한다. false가 리턴되면 디스패처 서블릿은 핸들러가 직접 요청을 처리하여뷰를 직접 다룬다고 생각하고 다른 인터셉터나 핸들러의 실행을 중단한다.

n  postHandle() : 컨트롤러 메소드가 실행된 후 호출 된다.

n  afterCompletion() : 모든 요청이 완료되고 VIEW가 생성 된 후(응답이 만들어 진후호출된다.

 

n  Servlet Filter와 Interceptor의 차이

ü  서블릿 필터는 Dispatcher Servlet이 호출되기전인터셉터는 Dispatcher Servlet이 호출된 후

ü  서블릿 필터는 web.xml에서 설정인터셉터는 스프링 설정파일에서 설정

 

n  실습(인터셉터를 이용한 커스텀 로깅 구현)

n  File >> new >> Project >> Spring Legacy Project >> Spring MVC Project

(STS4 에서는 Spring Legacy Project가 없으니 help >> Eclipse MarketPlace에서 “sts”로 검색 후 “Spring Tools 3 Add-On  for Spring Tools 4 3.9.14.CI”를 설치하자 

n  프로젝트 명 : interceptorTest.

n  Top-level package : a.b.interceptorTest

(기본적으로 Spring Web MVC HelloWorld 예제 템플릿이 다운로드 된다.)

n  LoggingInterceptor.java

package a.b.interceptorTest;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

 

public class LoggingInterceptor

         extends HandlerInterceptorAdapter {

     // Spring5는 별도의 추가없이 Log4j 2.x, SLF4J

     // JUL(java.util.logging)을 자동으로 인식한다.

     private static Logger logger

       = LoggerFactory.getLogger(LoggingInterceptor.class);

    

     @Override

     public boolean preHandle(

       HttpServletRequest request,

       HttpServletResponse response,

       Object handler) throws Exception {

        

              logger.info("[Controller Method 호출 전]");

              logger.info("[" + request.getMethod() + "]" );

            logger.info("[" + request.getRequestURL() + "]");

        

         return true;

     }

}

n  Servlet-context.xml 에 인터셉터 추가

<interceptors>

     <beans:bean class="a.b.interceptorTest.LoggingInterceptor" />

</interceptors>

 

n  실행 http://localhost:8080/interceptorTest/ 요청으로 HelleoWorld 예제를 실행하고 콘솔창에서 로그를 확인하자.

 

INFO : a.b.interceptorTest.LoggingInterceptor - [Controller Method 호출 전]

INFO : a.b.interceptorTest.LoggingInterceptor - [GET]

INFO : a.b.interceptorTest.LoggingInterceptor - [http://localhost:8080/interceptorTest/]

 

INFO : a.b.interceptorTest.HomeController - Welcome home! The client locale is ko_KR.

 

#스프링강좌, #스프링인터셉터, #스프링교육, #스프링강의, #SpringInterceptor, #Spring강의, #Spring강좌, #인터셉터, #스프링Interceptor, #preHandle, #postHandle

2020년 9월 4일 금요일

스프링 @Configuration, @Bean, @Component, @Service, @Repository 소개 및 오라클12C, Spring JDBC를 이용한 데이터 INSERT 실습

 스프링 @Configuration, @Bean, @Component, @Service, @Repository 소개 및 오라클12C, Spring JDBC를 이용한 데이터 INSERT 실습


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

불러오는 중입니다...


https://youtu.be/UJETDiXKwYk



n  클래스 레벨에서 사용되는 @Configuration은 스프링 IoC 컨테이너에게 클래스가 자바 빈을 만드는(구성하는) 클래스임을 알린다.

n  메소드 레벨에서 사용되는 @Bean은 개발자가 만들지 않는 외부 라이브러리의 객체들을 빈으로 등록할 때 사용된다. 물론 개발자가 만든 클래스도 빈으로 만들 수 있지만 개발자가 만드는 클래스들은 주로 @Component, @Service, @Repository 등의 어노테이션을 이용하여 등록한다.

@Configuration


public class Config {


    @Bean


    public Emp getService() {


        return new Emp();


    }


 


    @Bean


    public MyClass1 getArrayList() {


       return new ArrayList();    


}


}

@Component 

n  @Component, @Service, @Repository 등의 어노테이션을 이용하여 등록한 빈을 @Autowired를 이용하여 주입한다.

n  @Component는 스프링 IoC 컨테이너에서 관리되는 자바 빈(객체)임을 표시하기 위해 사용하는 기본적인 어노테이션으로 주로 DTO, VO 용도의 클래스에 대해 주로 사용한다.

n  @Service는 비즈니스 로직이나 영속성 계층(Respository Layer)의 클래스를 호출하는 클래스에 사용된다. 기능적으로는 @Component와 동일하다.

n  @Repository는 DB쪽 데이터 처리를 위한 Data Repository, DAO 클래스임을 나타내는 어노테이션이다. @Component와 기능적으로 동일하지만 @Repository는 발생되는 Unchecked Exception을 Spring의 Runtime 예외인 DataAccessException으로 처리할 수 있게 해준다. DataAccessException은  DAO에서 상용구 catch-and-throw 블록 및 예외 선언을 작성하지 않고도 예외를 처리 할 수 ​​있다.

n  실습(Spring JDBC를 이용한 오라클 사원(Emp) 테이블 Data Insert)

n  오라클쪽에 실습용 테이블 생성

create table  emp3 (

    empno number primary key,

    ename varchar2(50)

);



n  프로젝트 구조


 

n  1. 이클립스에서 file >> new >> project, maven project




 







n  pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>demo</groupId>

  <artifactId>demo1</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <name>demo1</name>

  <description>demo1</description>

 

  <properties>

            <failOnMissingWebXml>false</failOnMissingWebXml>

            <spring.version>5.2.3.RELEASE</spring.version>

            <oracle.version>12.2.0.1</oracle.version>

      </properties>

     

  <dependencies>

            <dependency>

                  <groupId>org.springframework</groupId>

                  <artifactId>spring-context</artifactId>

                  <version>${spring.version}</version>

            </dependency>

           

            <dependency>

                  <groupId>org.springframework</groupId>

                  <artifactId>spring-jdbc</artifactId>

                  <version>${spring.version}</version>

            </dependency>

           

            <dependency>

                  <groupId>com.oracle.jdbc</groupId>

                  <artifactId>ojdbc8</artifactId>

                  <version>${oracle.version}</version>

            </dependency>

                 

      </dependencies>

     

      <repositories>

            <repository>

                  <id>oracle</id>

                  <name>ORACLE JDBC Repository</name>

                  <url>https://maven.xwiki.org/externals/</url>

            </repository>

      </repositories>

     

      <build>

            <sourceDirectory>src</sourceDirectory>

            <plugins>

                  <plugin>

                        <artifactId>maven-compiler-plugin</artifactId>

                        <version>3.8.1</version>

                        <configuration>

                              <source>1.8</source>

                              <target>1.8</target>

                        </configuration>

                  </plugin>

                  <plugin>

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

                        <version>3.2.3</version>

                        <configuration>

                              <warSourceDirectory>WebContent</warSourceDirectory>

                        </configuration>

                  </plugin>

            </plugins>

      </build>

</project>



n  Emp.java

package entity;



public class Emp {

     private String empno;

     private String ename;

    

     public Emp(String empno, String ename) {

          this.empno = empno;

          this.ename = ename;

     }

    

     public String getEmpno() {

          return empno;

     }

     public void setEmpno(String empno) {

          this.empno = empno;

     }

     public String getEname() {

          return ename;

     }

     public void setEname(String ename) {

          this.ename = ename;

     }   

    

}



n  EmpRepository.java

package repository;



import entity.Emp;



public interface EmpRepository {

      void save(Emp e);

}





n  EmpRepositoryImpl.java

package repository;



import javax.annotation.PostConstruct;

import javax.sql.DataSource;



import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Repository;



import entity.Emp;



@Repository

public class EmpRepositoryImpl implements EmpRepository {

         

          @Autowired

          private DataSource ds;

          private JdbcTemplate jdbcTemplate;

         

          @PostConstruct

          private void postConstruct() {

                   jdbcTemplate = new JdbcTemplate(ds);

          }



          public void save(Emp e) {

                   String sql = "insert into emp3 (empno, ename) values (?, ?)";

                   jdbcTemplate.update(sql, e.getEmpno(), e.getEname());

          }

}



n  EmpConfig.java

package config;



import javax.sql.DataSource;



import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.jdbc.datasource.DriverManagerDataSource;



@Configuration

@ComponentScan(basePackages="service, repository")

public class EmpConfig {

     

      @Bean

      public DataSource dataSource() {

            final DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");

        dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:ORCL");

        dataSource.setUsername("scott");

        dataSource.setPassword("tiger");

        return dataSource;

      }

     

}





n  EmpApplication.java

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;



import config.EmpConfig;

import entity.Emp;

import service.EmpService;



public class EmpApplication {

      

      public static void main(String[] args) {

            AnnotationConfigApplicationContext ctx =

                            new AnnotationConfigApplicationContext(EmpConfig.class);

            EmpService empService = ctx.getBean(EmpService.class);

            empService.saveEmp(new Emp("1111""홍길동"));

            empService.saveEmp(new Emp("2222""김길동"));

            System.out.println("Emp Inserted!!");

      }

}



#스프링Ioc, #스프링강좌, #스프링강의, #스프링교육, #Autowired, #스프링자바설정, #스프링Config, #스프링프레임워크, #Spring강의, #Spring주입, #스프링주입, #SpringIoC, #스프링IoC, #스프링컨테이너

(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...