글목록

2020년 2월 10일 월요일

@Before("execution(*org.zerock.service.SampleService*.*(..))") 사용시 에러



INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@6eebc39e, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@464bee09, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@f6c48ac, org.springframework.test.context.support.DirtiesContextTestExecutionListener@13deb50e, org.springframework.test.context.transaction.TransactionalTestExecutionListener@239963d8, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@3abbfa04]
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [file:src/main/webapp/WEB-INF/spring/root-context.xml]
INFO : org.springframework.context.support.GenericApplicationContext - Refreshing org.springframework.context.support.GenericApplicationContext@3b0143d3: startup date [Mon Feb 10 11:42:52 KST 2020]; root of context hierarchy
INFO : org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
WARN : org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.event.internalEventListenerProcessor': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 47
execution(*org.zerock.service.SampleService*.*(..))
                                               ^

ERROR: org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@f6c48ac] to prepare test instance [org.zerock.service.SampleServiceTests@2f953efd]
java.lang.IllegalStateException: Failed to load ApplicationContext
 at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
 at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
 at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117)
 at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
 at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
 at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
 at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.event.internalEventListenerProcessor': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 47
execution(*org.zerock.service.SampleService*.*(..))
                                               ^

 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:589)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)
 at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
 at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
 at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
 at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:128)
 at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
 at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:107)
 at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:243)
 at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
 at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)
 ... 25 more
Caused by: java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 47
execution(*org.zerock.service.SampleService*.*(..))
                                               ^

 at org.aspectj.weaver.tools.PointcutParser.resolvePointcutExpression(PointcutParser.java:316)
 at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:294)
 at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:227)
 at org.springframework.aop.aspectj.AspectJExpressionPointcut.obtainPointcutExpression(AspectJExpressionPointcut.java:198)
 at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:177)
 at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:225)
 at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:288)
 at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:320)
 at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:126)
 at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:95)
 at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:76)
 at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:352)
 at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:304)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:439)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1712)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:581)
 ... 39 more



이번에는 공백 하나 때문에 에러를 맞이했다.

공백 하나 때문에 에러가 나타날 줄은 전혀 몰랐다.

잘못된 사용법

@Before("execution(*org.zerock.service.SampleService*.*(..))")



올바른 사용법

@Before("execution(* org.zerock.service.SampleService*.*(..))")




주의해서 사용하도록 하자.


맥북 오라클 유저는 SQLDeveloper 보다 DataGrip 추천

맥북의 경우에는 오라클 설치가 되지 않기 때문에

도커 안에 오라클을 설치해두고 SQLDeveloper로 접근하는 경우가 많다.

근데 이상하게 도커에 있는 오라클에 접근해서 그런건지

SQLDeveloper 자체 문제인지 모르겠으나 SQLDeveloper이 먹통이 되는 경우가 생각보다 자주 있다. 

맥북의 문제인가 싶어서 맥북을 포맷했는데도 같은 현상...

그래서 맥북이 한글로 설정되어있어서 문제인가? 싶어서 영어버전으로 포맷했는데도

증상이 해결되지 않았다.

SQLDeveloper이 멈추는 현상에대해 구글링을 해봐도 딱히 나오는 자료도 없었다.




그래서 알아보던 툴 중에서 DataGrip라는 툴을 알게되어 사용했는데

현재까지 사용에 있어서 SQLDeveloper처럼 먹통이 되는 경우도 없었고

단축키 같은 부분도 인텔리제이나 WebStorm, 이클립스처럼 다른 툴과 비슷하기 때문에 편안하다.

아쉬운점은 유료이다..

대학생이라면 꼭 대학교 메일을 발급받아서 신청하기 바란다.

대학생들은 대학교 이메일을 발급받아서 사용하면 무료니까~


2020년 2월 9일 일요일

맥북에서 스프링 multipartResolver 파일 업로드 경로


맥에서 스프링 파일 업로드 경로 때문에 제법 삽질을 했다.

윈도우의 경우 C드라이브가 있기 때문에 맥이랑 좀 달라서 헷갈리는 경우가 있다.

예를 들어 윈도우의 경우에는 경로가 이렇게 되있다.


<beans:property name="uploadTempDir" value="file:C:/upload/tmp"></beans:property>

하지만 맥에는 C가 없기 때문에 조금 달라서 경로를 찾아줘야한다.

예를 들어 본인이 원하는 폴더의 경로를 알고 싶다고 하자.

터미널을 열고 pwd를 입력해주면 경로가 나온다.

나타난 해당 경로를 복사 하고

value="file: 복사한 경로 "

<beans:property name="uploadTempDir" value="file:/Users/clyne/Project/STS/upload/tmp"></beans:property>





나는 아래와 같이 설정을 해줬다.


 <beans:bean id="multipartResolver"
  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <beans:property name="defaultEncoding" value="utf-8"></beans:property>
  <!-- 1024 * 1024 * 10 bytes 10MB -->
  <beans:property name="maxUploadSize" value="104857560"></beans:property>
  <!-- 1024 * 1024 * 2 bytes 2MB -->
  <beans:property name="maxUploadSizePerFile"
   value="2097152"></beans:property>
  <beans:property name="uploadTempDir"
   value="file:/Users/clyne/Project/STS/upload/tmp"></beans:property>
  <beans:property name="maxInMemorySize" value="10485756"></beans:property>
 </beans:bean>





submit을 눌러주면





데이터가 정상적으로 전달되는 것을 알 수 있다.












2020년 2월 7일 금요일

자바 next(), nextLine() 함수 차이

자바의 next()와 nextLine()로 각각 함수의 동작 방식을 메모리 구조로 설명해보려고 한다.

우선 바로 소스코드를 가져와서 보자



import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String[] str = new String[3];

        Scanner scn = new Scanner(System.in);

        System.out.print("값 입력 : ");

        for(int i=0; i<str.length; i++) {
            str[i] = scn.next();
        }

        for(int i=0; i<str.length; i++) {
            System.out.print(str[i]);
        }
    }
}










값 입력 :  a  b c

한번에 입력을 했는데 어떻게 각각의 배열에 값이 다 들어가게 됐을까?

바로 next함수의 키보드 문자 처리 방식과  키보드의 입력 구조 때문이다.

키보드를 입력하면 텍스트들은 큐 메모리 영역에 저장되게 된다.

큐 메모리는 FIFO(FistInFistOut)구조를 가지는데 먼저 들어온 값이 먼저 나간다는 의미이다.

즉 A B C를 입력 했으면 A B C순서로 큐 영역에 저장됐다가 A B C 순서대로 빠져나간다.





그럼 어떻게 한 줄에 A B C를 입력 했는데 각각의 배열에 값이 저장됐을까?

next함수의 처리 방식 때문인데 next함수의 경우 실행되면서 우선 큐 메모리 영역에 접근을 하면서 안에 저장된 문자들을 탐색하면서 순서대로 가져오기 시작한다.

그러다가 스페이스 또는 엔터키를 만나게되면 탐색을 종료한다.

예를 들어 ABC   DEF  GGG 라고 입력을 하게되면

큐 메모리에 접근하여 내부에 저장된 문자들을 탐색한다.

ABC까지 탐색하고 스페이스를 만나게 되는데 여기서 더 탐색하지 않고 ABC까지만 가져오게 된다.

그럼 DEF  GGG는 어떻게 될까?

메모리에서 사라지는게 아니라 큐 메모리 영역에 그대로 남아있게 되는데

그럼 다음 for문이 실행되면서 자동적으로 next함수가 큐 메모리 영역에 접근해서

DEF를 가져오고 종료된 후 또 다시 for문이 실행되면서 GGG까지 가져와 변수에 저장하는 것이다.






그렇다면 이제 nextLine함수는 어떻게 동작하는지 바로 알게 됐을 것이다.

큐 메모리를 탐색하다가 스페이스바를 만나도 함수의 역할이 종료되는게 아니라 엔터키를 만날 때까지 탐색하고 종료된다.



import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String[] str = new String[3];

        Scanner scn = new Scanner(System.in);

        System.out.print("값 입력 : ");

        for(int i=0; i<str.length; i++) {

            str[i] = scn.nextLine();

        }

        for(int i=0; i<str.length; i++) {
            System.out.println(str[i]);
        }
    }
}






















엔터키를 만나야 함수가 종료되기 때문에 a b c를 연속해서 3번 입력해줘야 실행이 종료된다.