.Interceptor

AOP를 적용한 Spring MVC의 요소입니다.

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

요청 발생시 호출되는 메소드의 코드가 중복 되는 부분이 있을때 Interceptor를 통해 처리하게 됩니다.

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

Interceptor는 Java 프로젝트와 XML 프로젝트의 셋팅 방법이 각각 다릅니다.

 

Interceptor 구현

Interceptor는 HandlerInterceptor 인터페이스를 구현하거나 

HandlerInterceptorAdapter를 상속받은 클래스를 만들고 다음 메소드를 구현합니다.

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

- postHandle : Controller의 메소드가 수행이 완료되고  View 처리를 수행하기 전에 호출됩니다.

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

 

   public void addInterceptors(InterceptorRegistry registry){

 

   }

 

<interceptors>  </interceptors>

 

pattern

- * : 이름 하나를 의미하며 글자수, 글자 등 제한이 없습니다.

- ? : 글자 하나를 의미합니다.

- ** : 하위 이름까지 포함하여 글자수 글자 등 제한이 없습니다.

 

Pattern 등록

-addPathPatterns, <mappint> : Interceptor 가 가로채 갈 주소를 등록합니다.

-excludePathPatterns, <exclude-mapping> : Interceptor가 가로채 가지 않을 주소를 등록합니다.

 

'코딩이야기 > Spring' 카테고리의 다른 글

[Spring]Execution  (0) 2020.07.06
[spring]AspectJ  (0) 2020.07.06
[Spring] 어노테이션 정리  (0) 2020.07.01
[Spring] 자동주입  (0) 2020.06.30
[Spring]스프링의 이해?  (0) 2020.06.25

.Execution 명시자

 */

----------------------------------------

 - 메소드 원형 : 접근제한자,  반환값, 메소드명( int kor, int eng, int mat), 매개변수(전달인자)

 

 - 사용 목적 : Pointcut을 지정할 때 사용

 

 - execution(접근제한자,  반환값(리턴타입), 클래스이름, 메소드명(매개변수(전달인자)) )

 

   1) 접근 제한자 : public만 지원합니다.

   2) 리턴타입 : 메소드의 매개변수 타입

   3) 클래스 이름 : 패키지를 포함한 클래스 이름

   4) 메소드 이름 : 메소드의 이름

   5) 매개변수 : 매개변수의 형태

     - ** : 하나의 모든 덧을 이미한다.

     - .. : 개수에 상관없이 모든 것을 의미하다.

 

<!--context-aop 설정-->

<bean id='advisor1' class='kr.co.korea.advisor.AdvisorClass'/>

<aop:config>

<aop:aspect ref='advisor1'>

<!-- 반환타입은 void, kr.co.korea.beans.TestBean1 클래스, method1 메소드, 매개변수 없음.-->

<aop:pointcut id="point1" expression‎="execution(void kr.co.korea.beans.TestBean1.method1())"/>

<aop:before method="firstMethod1" pointcut-ref="point1"/>

<aop:pointcut id="point2" expression‎="execution(void kr.co.korea.beans.TestBean1.method2())"/>

<aop:before method="secondMethod2" pointcut-ref="point2"/>

<aop:pointcut id="point1" expression‎="execution(void kr.co.korea.beans.TestBean1.method1(int))"/>

<aop:pointcut id="point1" expression‎="execution(void kr.co.korea.beans.TestBean1.method1(String))"/>

 

<aop:pointcut id="sss1" expression‎="execution(void kr.co.korea.beans.TestBean1.method1(*))"/>

<aop:after method="Method3" pointcut-ref="sss1"/>

 

<aop:pointcut id="aaa1" expression‎="execution

(int kr.co.korea.beans2.TestSample1.add(int x, int y))"/>

<aop:after method="Method333" pointcut-ref="aaa1"/>

 

<!-- 반환타입은 void, kr.co.korea.beans 패키지, TestBean1 클래스, method1 메소드, 정수형 매개변수 2개 존재. -->

<aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.beans.TestBean1.method1(int, int))"/>

 

<aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.beans.TestBean1.method1(int, String))"/>

 

<aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.beans.TestBean1.method1(String, int))"/>

 

<aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.beans.TestBean1.method1(String, String))"/>

 

   <!-- 반환타입은 void, kr.co.korea.beans 패키지, TestBean1 클래스, method1 메소드, 모든 타입의 매개변수 0개 이상. --> <aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.beans.TestBean1.method1(..))"/>

 

<!-- 반환타입은 void, kr.co.korea.beans 패키지, TestBean1 클래스, 모든 메소드, 모든 타입의 매개변수 0개 이상. -->

<aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.beans.TestBean1.*(..))"/>

 

<!-- 반환타입은 void, kr.co.korea.beans 패키지, 모든 클래스, 모든 메소드, 모든 타입의 매개변수 0개 이상. --> <aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.beans.*.*(..))"/>

 

<!-- 반환타입은 void, kr.co.korea.beans 패키지, 모든 클래스, method1 메소드, 모든 타입의 매개변수 0개 이상. -->

<aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.beans.*.method1(..))"/>

 

<!-- 반환타입은 void, kr.co.korea. 모든 패키지, 모든 클래스, 모든 메소드, 모든 타입의 매개변수 0개 이상. --> <aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.*.*.*(..))"/>

 

<!-- 반환타입은 void, kr.co.korea. 모든 패키지, TestBean1 클래스, 모든 메소드, 모든 타입의 매개변수 0개 이상. -->

<aop:pointcut id="point1" expression‎=

"execution(void kr.co.korea.*.TestBean1.*(..))"/>

 

<!-- 반환타입은 void, 모든 패키지, 모든 클래스, 모든 메소드, 모든 타입의 매개변수 0개 이상. -->

<aop:pointcut id="point1" expression‎= "execution(void *.*(..))"/>

 

<!-- 반환타입은 int, 모든 패키지, 모든 클래스, 모든 메소드, 모든 타입의 매개변수 0개 이상. -->

<aop:pointcut id="point1" expression‎= "execution(int *.*(..))"/>

 

<!-- 모든 반환타입, 모든 패키지, 모든 클래스, 모든 메소드, 모든 타입의 매개변수 0개 이상. -->

<aop:pointcut id="point1" expression‎= "execution(* *.*(..))"/>

 

<!--  모든 패키지 -->

<aop:pointcut id="point1" expression‎= "execution(* *(..))"/>

 

<!--  모든 패키지의 method1인 경우에 -->

<aop:pointcut id="point1" expression‎= "execution(* method1(..))"/>

 

<!-- AOP 적용시 다양한 상황에 대응 할 수 있는 명시자를 제공하고 있습니다. -->

<!-- <aop:around method="aroundMethod" pointcut-ref="point1"/>

<aop:after-returning method="afterReturningMethod" pointcut-ref="point1"/> -->

 

</aop:aspect>

</aop:config> 

'코딩이야기 > Spring' 카테고리의 다른 글

[Spring]AOP Interceptor  (1) 2020.07.10
[spring]AspectJ  (0) 2020.07.06
[Spring] 어노테이션 정리  (0) 2020.07.01
[Spring] 자동주입  (0) 2020.06.30
[Spring]스프링의 이해?  (0) 2020.06.25

AspectJ Annotation

 

- @AspectJ 어노테이션을 이용하여 Advisor 역할을 할 Bean을 설정할 수 있습니다.

 

- 종류 2가지 존재

1)xml: <aop:aspectj-autoproxy/>

2) java : @EnableAspectJAutoProxy

 

- spring은 동적 프락시를 기반으로 AOP를 구현하므로 메소드 조인포트만 지원합니다.

 즉, 핵심기능(타깃)의 메소드가 호출되는 런타임 시점에만 부가기능(Advice)을 적용했습니다.

- 그러나, AspectJ와 같이 고급 AOP프레임워크를 사용하면 객체의 생성, 필드의 값의 조작, 조회, static메소드 호출 및 초기화 등의 다양한 형태의 작업에 부가기능을 적용할 수 있습니다.

 

- 지원되는 어노테이션의 종류

 1)@Before : 관심사 동작 이전에 호출한다.

 2)@AfterReturning : 예외 없이 정상적으로 완료되면 호출 됩니다.

 3)@AfterThrowing : 예외가 발생하였을 때 호출됩니다.

 4)@After : 관심사 동작 이후에 호출 됩니다.

 5)@around : 관심사 이전과 이후에 호출합니다.

'코딩이야기 > Spring' 카테고리의 다른 글

[Spring]AOP Interceptor  (1) 2020.07.10
[Spring]Execution  (0) 2020.07.06
[Spring] 어노테이션 정리  (0) 2020.07.01
[Spring] 자동주입  (0) 2020.06.30
[Spring]스프링의 이해?  (0) 2020.06.25

xml : 값을 주어야 합니다.

Java : 파일에 대한 코드를 자유롭게 작성관리합니다.

 

@Configuration : 현재 파일이 빈 등록을 위한 자바파일임을 알려줍니다. = Xml과 같은 역할

 

 .@Bean(자바에서의 빈 등록)

------------------------------------------------------------------------------------------------------

 - @Bean 어노테이션은 Bean 객체를 정의할 때 사용합니다.

 - 메소드의 이름은 bean의 이름이 됩니다.

 - @Bean(name=이름) : bean의 이름을 새롭게 정의합니다.

 - @Lazy : lazy-init 속성을 지정

 - @Scope : bean의 scope 속성 지정

 - @primary : primary 속성 지정

'코딩이야기 > Spring' 카테고리의 다른 글

[Spring]AOP Interceptor  (1) 2020.07.10
[Spring]Execution  (0) 2020.07.06
[spring]AspectJ  (0) 2020.07.06
[Spring] 자동주입  (0) 2020.06.30
[Spring]스프링의 이해?  (0) 2020.06.25

.자동 주입(AutoWire)

------------------------------------------------------------------------------------------------------------------------

- 기존에 생성자 주입,  Setter 주입 등을 이용했었는데, 좀 더 편리하게 주입하기 위하여 사용합니다.

- 자동 주입은 이름, 타임, 생성자를 통하여 할 수 있습니다.

- 자동 주입은 객체 주소 값만 가능하므로 참조 변수를 제외한 나머지들은 직접 명시해 주어야 합니다.

  즉 문자열, 정수형, 실수형 등

 

1) 이름을 이용하여 주입 방법

    <bean id="data1" class='kr.co.ezen.beans.DataBean1'/>

     

    TestBean.java

        private DataBean1 data1;

        private DataBean1 data2;

    => 자동 수입

       <bean id ="data1" class="kr.co.ezen.beans.DataBean1" autowire="byName"/>

       <bean class='kr.co.ezen.beans.TestBean' />

 

       <!-- 자동주입 빈 정의 -->

       <bean id='data1' class='kr.co.ezen.beans.DataBean1' />

       <bean id='data2' class='kr.co.ezen.beans.DataBean2' />

 

2) 타입을 이용하여 자동 주입

     byType : 빈 객체의 프로퍼티 타입과 정의된 빈의 타입이 일치할 경우에 주입합니다.

                 이때, 동일 타입의 빈이 두개 이상 정의되어 있으면 오류가 발생합니다.

 

       <bean id='data3' class='kr.co.ezen.beans.DataBean3' />

    

       DataBean3.java

       ----------------------------

       private DataBean3 data1;

       private DataBean3 data2;

 

3) 생성자를 이용하여 자동 주입

    생성자의 매개변수 타입과 정의된 빈의 타입이 일치하면 주입합니다.

    이때, 동일 타입의 빈이 두개 이상 정의되어 있으면 오류가 발생합니다.

    

    <bean id="data3" class="kr.co.ezen.beans.TestBean3"/>

  

    TestBean3

   -------------------------

     private DataBean3 data1;

     private DataBean3 data2;

 

    public TestBean3(TestBean3 data1, TestBean3 data2){

            this.data1=data1;

            this.data2=data2;

     }

 

    public int getData1() {
    return data1;
    }
    public void setData1(int data1) {  
    this.data1 = data1; 
    }
    public String getData2() {
    return data2;
    }
    public void setData2(String data2) {
    this.data2 = data2;
    }

 

 - 자동 주입은 객체 주소값만 가능하므로 참조변수를 제외한 나머지는 다 직접 명시해주어야 합니다.

   즉, 문자열, 정수형, 실수형 등

 - 자동 주입 설정을 하지 않고, 이름을 가지고 주입을 시도한다면 어떻게 될까요?

 

 

 

 

'코딩이야기 > Spring' 카테고리의 다른 글

[Spring]AOP Interceptor  (1) 2020.07.10
[Spring]Execution  (0) 2020.07.06
[spring]AspectJ  (0) 2020.07.06
[Spring] 어노테이션 정리  (0) 2020.07.01
[Spring]스프링의 이해?  (0) 2020.06.25

어노테이션? 

생성자와 메소드 차이

 

 

 

.IoC 컨테이너(역제어)
-Inversion of Control : 개발자가 코드 등의 흐름이나 객체 생성에 관련된 코드를 프로그래밍에 직접
작성하는 것이 아니라, 프레임워크가 사용하는 파일에 작성하여 이를 토대로 프레임워크가 객체를 성생하고,
반환하고, 코드가 동작하는 순서를 결정하는 것을 의미합니다

-객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권을 가진다.

-IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리합니다
-POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가지게 됩니다
-개발자들이 직접 POJO를 생성 할 수 있지만, 컨테이너에게 맡기빈다.(Bean등록 -> xml파일)

-2가지 표현
1.의존성 건색 : DL(일반적인 데이터 처리, DataBase 연결)

2.의존성 주입: DI => Setter Injection, Constructor Injection, method Injection
각 클래스간에 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 줍니다.

-종류
1)BeanFactory: 3.x주로 사용
-클래스를 통하여 객체를 생성하고, 이를 전달합니다
-상속 등 객체간의 관계를 형성하고 관리합니다.
-xmlBeanFactory

2)ApplicationContext
-클래스를 통하여 객체를 생성하고, 이를 전달합니다.
-상속 등 객체간의 관계를 형성하고 관리합니다
-국제화 지원 등 문자열에 대한 다양한 기능을 제공합니다
-리스너로 등록되어 있는 Bean에 이벤틀를 발생할 수 있다
-Bean에 관련한 성정을 위한 xml 파일은 즉시 로딩되어서 객체를 미리 생성하여 가지게 됩니다

-ClassPathXmlApplicationContext:xml
-FileSystemXmlApplicationContext
-xmlWebApplicationContext

Spring Bean 객체 생성하기
-spring에서는 사용할 Bean객체를 Bean configuration file에 정의하고, 필요할때마다
객체를 가져와서 사용합니다
-Bean태그: 사용할 Bean을 정의하는 태그
1)class: 객체를 생성하기 위하여 사용하는 클래스를 지정합니다(패키지명.클래스명)
2)id: Bean객체를 가져오기 위하여 사용하는 이름 지정합니다 (t1, t2 ...)
3)lazy-init: singleton인 경우에는 xml을 로딩할 때 객체생성 여부가 결정됩니다
      true: xml 로딩 시에 객체를 생성하지않고, 객체를 가져올 때 생성합니다
4)scope: 객체의 범위를 설정합니다.
   -singleton: 객체를 하나만 생성하여 사용합니다.
   -prototype: 객체를 가져올 때마다 객체를 생성합니다.

 

.DI(Dependency Injection)


1)베터리 일체형: ex) 베터리가 떨어지면 장난감을 새로 구입합니다
public class CarToy{
   private Battery battery;
   public CarToy(){
      battery = new NomalBattery();
   }
}
2)베터리 분리형: ex) 베터리가 떨어지면 베터리를 교체합니다
public class CarToy{
   private Battery battery;
   public CarToy(){
      
   }
   public void setBattery(Battery battery){
      this.battery = battery;
   }
}
2-1)의미적으로는 배터리가 떨어지면 배터리만 교체합니다.라는 의미이지만 약간의 차이가 있다.
public class CarToy{
   private Battery battery;
   public CarToy(){
      this.battery = battery;
   }
   public void setBattery(Battery battery){
      this.battery = battery;
   }
}

 

.DI 설정(생성자)

 public StudentRegisterService(StudentDao studentDao){

    this.studentDao = studentDao;

}

 

<bean id="studentDao" class="ezen.member.dao.studentDao/>

=>    <bean id="registerService" class="ezen.member.service.StudentRegisterService>

        <constructor-arg ref="studentDao"></constructor-arg>

        </bean>

 

 public StudentModifyService(StudentDao studentDao){

    this.studentDao = studentDao;

}

<bean id="studentDao" class="ezen.member.dao.studentDao/>

=>    <bean id="modifySerivce" class="ezen.member.service.StudentModifyService>

          <constructor-arg ref="studentDao"></constructor-arg>

          </bean>

 

 public StudentDeleteService(StudentDao studentDao){

    this.studentDao = studentDao;

}

<bean id="studentDao" class="ezen.member.dao.studentDao/>

=>   <bean id="deleteSerivce" class="ezen.member.service.StudentDeleteService>

        <constructor-arg ref="studentDao"></constructor-arg>

         </bean>

 

 

 public StudentSelectService(StudentDao studentDao){

    this.studentDao = studentDao;

}

 

=> <bean id="selectService" class="ezen.member.service.StudentSelectService>

        <constructor-arg ref="studentDao"></constructor-arg>

         </bean>

 

 

 

 public StudentAllSelectService(StudentDao studentDao){

    this.studentDao = studentDao;

}

 

=>  <bean id="AllSelectService" class="ezen.member.service.StudentAllSelectService>

        <constructor-arg ref="studentDao"></constructor-arg>

         </bean>

 

 

 

 

생성자 객체 주입


1. 의존성 주입은 스프링에서 아주 중요한 개념이며, 장점이 되는 부분입니다.

2. 빈(~.xml) 객체 생성할때, 빈 객체가 관리할 값이나 객체를 주입하는 것을 말합니다.

3. 빈 객체 생성 | 이후에는 빈 객체가 가질 기본적인 값을 자바 코드로 설정하는 것이 아니고, 빈을 정의 하는 xml 코드에서 정의하여 사용하는 것을 말합니다.

4. 빈을 정의할때 constructor-arg 태그를 이용하여 주입하면, 생성자를 통해 주입이 가능합니다.

[Sample 예제]

      <bean id ="t1" class ="kr.co.ezen.beans.TestBean">

          <constructor-arg value="100" type="int" index="2"/>

          <constructor-arg value="str" type="String" index="2"/>

          <constructor-arg value="100" type="int" index="2"/>

      </bean>

 

      <bean id="data" class="kr.co.ezen.beans.TestData" scope="prototype" />

      

      <bean id="t2" class="kr.co.ezen.beans.TestBean2">

      <constructor-arg ref="data" />

      <constructor-arg ref="data" />

      </bean>

 

 

 

 

 

 

5. 생성자 주입에는 다음과 같은 옵션이 존재합니다.

 - value : 기본 자료형 값과 문자열의 값을 설정합니다.

 - type : 저장할 데이터의 타입

 - ref : 객체를 설정

 - index : 지정된 값을 주입할 생성자의 매개변수의 인덱스 번호

 

 

 

 

 

 

'코딩이야기 > Spring' 카테고리의 다른 글

[Spring]AOP Interceptor  (1) 2020.07.10
[Spring]Execution  (0) 2020.07.06
[spring]AspectJ  (0) 2020.07.06
[Spring] 어노테이션 정리  (0) 2020.07.01
[Spring] 자동주입  (0) 2020.06.30

+ Recent posts