달력

1

« 2020/1 »

  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  


 

 

Maven 프로젝트 설정시 필수항목

Maven 프로젝트 설정시 필수적으로 지정해야 하는 항목입니다.

 

항목

설명

Group ID

·         Top-level package명으로 사용됩니다.

·         패키지 명명 규칙을 따릅니다.

 

https://codedragon.tistory.com/228

Artifact ID

·         프로젝트명 동일하게 설정합니다.

Version

·         버전을 명시합니다.

 

 

 


 

 



Posted by codedragon codedragon

댓글을 달아 주세요


 

 

오류 메시지

Index downloads are disabled, search results may be incomplete.


 

 

 

 

해결방법 1

eclipse 메뉴: [Windows] >> [Preferences] >>

[Maven] 선택 >>

[Download repository index updates on startup] 체크 >>

[Download Artifact Sources] 체크 >>

[Download Artifact JavaDoc] 체크 >> [Apply] >> [Apply and Close]


 

eclipse 재시작


 

이클립스가 재시작하면서 Maven 기본 repository 업데이트합니다.


 

 

 

 

 

해결방법 2

eclipse 메뉴: [Window] >> [Show View] >> [Other] >>

[Maven] > [Maven Repositories]


 

 

central(https://repo.maven.apache.org/maven2) 선택한 >> 마우스 우클릭 >> [Update Index]


 


Posted by codedragon codedragon

댓글을 달아 주세요



 

AOP(Aspect Oriented Programming)

·         AOP OOP 더욱 OOP 답게 만들어 있습니다. , OOP 지원해주는 개념입니다.

·         AOP OOP뿐만 아니라 기존의 절차적 프로그래밍에도 적용될 있습니다.

·         AOP 애플리케이션에서의 관심사(관점) 분리(기능의 분리) , 핵심적인 기능에서 부가적인 기능을 분리합니다. 분리한 부가기능을 애스펙트 (Aspect)라는 독특한 모듈형태로 만들어서 설계하고 개발하는 방법입니다.

·         OOP 적용하여도 핵심기능에서 부가기능을 분리된 모듈로 작성하기 어려웠던 문제점을 AOP 해결해 준다고 있습니다.

·         AOP 부가기능을 애스펙트(Aspect) 정의하여, 핵심기능에서 부가기능을 분리함으로써 핵심기능을 설계하고 구현할 객체지향적인 가치를 지킬 있도록 도와주는 개념입니다.

 

 

 

 

기존 방식

하나의 Application안에 핵심기능(Primary Concern) 부가기능(Cross-Cutting Concern) 함께 썩여있습니다.


 

 

 

 

AOP 적용 방식

·         비즈니스 로직을 구현한 부분인 핵심기능(Primary Concern) 보안, 인증등 부가기능(Cross-Cutting Concern) 분리할 있습니다.

·         부가기능을 Advice 정의해서 분리하고 핵심기능에 적용하기 위해 Point-Cut 정의합니다. Advice Point-Cut 묶어서 Aspect라고 합니다.

·         Advice Point-Cut 정규표현식에 의거해서 핵심기능에 적용하는 과정을 Weaving이라고 합니다.

 


 


Posted by codedragon codedragon

댓글을 달아 주세요



 

 

전자정부 표준 프레임워크 개발 가이드 Manual

http://www.egovframe.go.kr/wiki/doku.php?id=start

 


 



Posted by codedragon codedragon

댓글을 달아 주세요


 

 

오류메시지

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class:

4 06, 2019 4:01:58 오전 org.springframework.context.support.AbstractApplicationContext prepareRefresh

정보: Refreshing org.springframework.context.support.

ClassPathXmlApplicationContext@5910e440: startup date [Sat Apr 06 04:01:57 KST 2019]; root of context hierarchy

4 06, 2019 4:01:58 오전 org.springframework.beans.factory.xml.

XmlBeanDefinitionReader loadBeanDefinitions

정보: Loading XML bean definitions from class path resource [appCTXch02ex11.xml]

4 06, 2019 4:01:58 오전 org.springframework.context.annotation.

ClassPathScanningCandidateComponentProvider registerDefaultFilters

정보: JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: 

Failed to read candidate component class: file [C:\CodeLa

b\git_study\study_Spring\SpringMain\target\classes\ch02\ex11\step2\Article.class]; nested exception

 is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - 

probably due to a new Java class file version that isn't supported yet: file [C:\CodeLab\git_study\study_Spring\SpringMain\target\classes\ch02\ex11\step2\Article.class]; nested exception is java.lang.IllegalArgumentException

at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.

findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:290)

at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.

doScan(ClassPathBeanDefinitionScanner.java:242)

at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.

parse(ComponentScanBeanDefinitionParser.java:84)

at org.springframework.beans.factory.xml.NamespaceHandlerSupport

.parse(NamespaceHandlerSupport.java:73)

at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.

parseCustomElement(BeanDefinitionParserDelegate.java:1438)

at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.

parseCustomElement(BeanDefinitionParserDelegate.java:1428)

at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.

parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:185)

at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.

doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)

at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.

registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerB

eanDefinitions(XmlBeanDefinitionReader.java:493)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.

doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.

loadBeanDefinitions(XmlBeanDefinitionReader.java:334)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.

loadBeanDefinitions(XmlBeanDefinitionReader.java:302)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader

.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.

loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.

loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader

.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243)

at org.springframework.context.support.AbstractXmlApplicationContext.

loadBeanDefinitions(AbstractXmlApplicationContext.java:127)

at org.springframework.context.support.AbstractXmlApplicationContext.

loadBeanDefinitions(AbstractXmlApplicationContext.java:93)

at org.springframework.context.support.AbstractRefreshableApplicationContext.

refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)

at org.springframework.context.support.AbstractApplicationContext.obtainFr

eshBeanFactory(AbstractApplicationContext.java:537)

at org.springframework.context.support.

AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)

at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)

at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)

at ch02.ex11.step2.BBSMain.main(BBSMain.java:12)

Caused by: org.springframework.core.NestedIOException: ASM ClassReader 

failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [C:\CodeLab\git_study\study_Spring\SpringMain\target\classes\ch02\ex11\step2\Article.class]; nested exception is java.lang.IllegalArgumentException

at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:56)

at org.springframework.core.type.classreading.

SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)

at org.springframework.core.type.classreading.

CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)

at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.

findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:266)

... 24 more

Caused by: java.lang.IllegalArgumentException

at org.springframework.asm.ClassReader.<init>(Unknown Source)

at org.springframework.asm.ClassReader.<init>(Unknown Source)

at org.springframework.asm.ClassReader.<init>(Unknown Source)

at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:53)

... 27 more

 


 


 

 

 

 

 

해결방법

pom.xml 에서

Spring Framework 버전을 3.x -> 4.x 버전이상으로 업그레이드 하면 해결됩니다.

 

<!-- Spring -->

<spring-framework.version>3.2.3.RELEASE</spring-framework.version>

<!-- Spring -->

<spring-framework.version>5.1.6.RELEASE</spring-framework.version>

 

 


Posted by codedragon codedragon

댓글을 달아 주세요


 

 

Logback 라이브러리 설치하기

 

Maven Repository 접속

http://mvnrepository.com/

 

 

"logback "으로 검색

logback

https://mvnrepository.com/search?q=logback+

 

 

가장 위에 있는 [Logback Classic Module]항목 선택


 

 

[1.2.3] 버전 링크 클릭

https://mvnrepository.com/artifact/ch.qos.logback/logback-classic


 

 

 

Maven 항목의 depnedency정보 복사

https://mvnrepository.com/artifact/ch.qos.logback/logback-classic/1.2.3


 

 

pom.xml 파일의 <dependencies> 태그안에 붙여넣기 하여 추가합니다.

pom.xml

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->

<dependency>

    <groupId>ch.qos.logback</groupId>

    <artifactId>logback-classic</artifactId>

    <version>1.2.3</version>

    <scope>test</scope>

</dependency>

 

 

Project Explorer [Maven Dependencies]항목을 펼치면 JUnit라이브러리가 추가된 것을 확인할 있습니다.


 


Posted by codedragon codedragon

댓글을 달아 주세요



 

 

 

에러 메시지

Failed to instantiate SLF4J LoggerFactory Reported exception:

java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/JoranException

 


 

 

 

 

 

해결방법

 

기존 logback 버전을 최신 버전으로 업데이트 해줍니다.

https://codedragon.tistory.com/8916

 

<!-- Logging -->

<logback.version>1.0.13</logback.version>

<logback.version>1.2.3</logback.version>

 

 

 

 

 

https://logback.qos.ch/download.html


 

 


Posted by codedragon codedragon

댓글을 달아 주세요


 

 

AOP 네임스페이스 추가 하기

 

beans.xml 하단의 [Namespaces] 클릭 >> [aop] 항목 체크


 

 

[OK]


 

 

오른쪽의 "Namespace Versions" 항목에서 최신 버전 목록을 체크합니다.


 


Posted by codedragon codedragon

댓글을 달아 주세요


 

 

<context:component-scan> 태그

·         Component Scan 지원하는 태그입니다.

·         Bean 있는 모든 Component들을 자동으로 찾아 Bean Container 등록합니다.

·         , 의존성 관계 등록은 따로 하지 않습니다.

·         특정 패키지 안의 클래스들을 스캔하고, Annotation 확인 bean 인스턴스를 생성합니다. @Component @Controller @Service @Repository 등의 Bean 등록 Annotation 존재해야 bean 스캔한 생성할 있습니다

·         @Autowired @Qualifier Annotation 인식할 있습니다.

·         @Component 통해 자동으로 Bean 등록하고, @Autowired 의존관계를 주입 받는 어노테이션을 클래스에서 선언하여 사용했을 경우에는 해당 클래스가 위치한 특정 패키지를 Scan하기 위한 설정(<context:component-scan> 태그) 스프링 설정 XML 해주어야 합니다.

·         component-scan 선언했다면 context:annotation-config 선언할 필요가 없습니다.

·         component-scan 수동  DI(setter, contructor) 혼용해서 사용할 있습니다.

 

 

패키지명 이후의 하위 패키지를 검색해 @Component 어노테이션을 포함하는 모든 클래스를 Bean으로 자동 등록해 줍니다.

<context:component-scan base-package="packagename" />

<context:component-scan base-package="codedragon.di.annotation" />

 

 

 

<context:include-filter> & <context:exclude-filter>

<context:include-filter>태그와 <context:exclude-filter>태그를 같이 사용하면 자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스를 구체적으로 명시할 있습니다.

 

<!-- 모든 Bean들을 스캔해서 등록합니다.  -->

<context:component-scan base-package="com.tistory.com.SpringBBS"/>

<mvc:annotation-driven></mvc:annotation-driven>

 

use-default-filters="false"속성은 expression 지정한 타입만 include 시켜줍니다.

<!-- Controller 타입의 Bean 스캔해서 등록합니다.  -->

<context:component-scan base-package="com.tistory.com.SpringBBS" use-default-filters="false">

<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

</context:component-scan>

<mvc:annotation-driven></mvc:annotation-driven>

 

<!-- Controller 타입을 제외한 모든 Bean들을 Root Context에서 로딩합니다. -->

<context:component-scan base-package="com.tistory.com.SpringBBS">

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

</context:component-scan>

 

 

Posted by codedragon codedragon

댓글을 달아 주세요



 

 

Interceptor 수행 도식도

·         단일 interceptor 수행

·         다중 interceptor 수행

 

 

 

 

단일 interceptor 수행

Interceptor에는 3가지 콜백 메소드가 정의되어져 있습니다.

 


 

단계

설명

1

요청이 들어오면 Dispatcher servlet 통해 Interceptor 거치게 됩니다.

 

2

처음 요청이 들어오면 Interceptor preHandle() 수행하게 됩니다.

 

3

Controller 수행됩니다.

Controller 해당 로직을 수행한 결과를 postHandle() 전달합니다.

4

적절한 View통해 응답을 해주게됩니다.

5

응답 페이지가 출력됩니다.

6

Response 끝나면 afterCompletion() 수행됩니다.

 

 

 

 

 

 

다중 interceptor 수행

여러 개의 Interceptor 존재하는 경우 수행 순서


 


Posted by codedragon codedragon

댓글을 달아 주세요