아래와 같은 API 유닛테스트 호출시 Data 값이 없이 나왔다...

@GetMapping("/role/list")
	@ResponseBody
	public Callable<Object> getRoleList(@RequestParam Map<String, Object> paraMap) {
		System.out.println("paramap ::"+paraMap);
		return () -> roleManagementService.getRoleList(paraMap);
	}

검색및 질문결과 

MockMvcResultHandlers.print()  로 찍었을때 Data 가 비어서 나타났다.

'Callable' 요 친구가 비동기 처리 방식이기때문에 위에 방식으로는 결과값을 알 수 없었다.

해당 값을 확인하기 위해 getAsyncResult() 비동기처리의 결과값을 확인할 수 있었다.

 

여기서 궁금증... 동기 및 비동기의 차이점은 무엇인가

 

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

POJO 란 무엇인가?  (0) 2021.02.16
[JAVA]  (0) 2020.06.29
[JSP&Servlet]  (0) 2020.05.28
[JAVA]입출력  (0) 2020.05.01
[JAVA] 람다식  (0) 2020.04.29

.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

+ Recent posts