[Spring]Resource Path…

http://tech-tauk.blogspot.kr/2010/04/difference-between-classpath-classpath.html

정말 이런지 확인이 필요하다….나중에….ㅠ_ㅠ

나중에…

[web] Spring – Could not resolve view with name

org.springframework.web.accept.ContentNegotiationManagerFactoryBean 을 사용하여 mimeType을 자동으로 지정할 때 주의할 점이 있다.

바로 API extension을 어떻게 할 것인지인데

host/path/api.in

servlet.xml에 mimeType extension에 대한 pattern을 지정하지 않으면 Tomcat에 있는 web.xml의 mimeType 을 applicationContext.getMimeType 메서드를 이용해서 가져오게 된다.

tomcat 7에서 in 에 대한 contentType이 text/plain을 반환하여 JSP view 를 반환하지 못하여 장애로 이어질 수 있다. JSP는 mimeType이 text/html 이다.

웬만하면 well known extension으로 활용해야지 언어코드와 같은 것으로 확장자를 설계하면 피를 볼 수 있다. 잘 알지 못하면 사용하지 말자.

ServletException이 발생한 케이스이다.

call API : host/path/api.in

API extension : in

catalina/web.xml -> mimeType “in” : text/plain

JSP로 반환 해야 하는데 text/html이 아니라 text/plain으로 떨어져 dispatcherServlet에서 올바른 view를 반환하지 못한다.

에러 메시지 :

Could not resolve view with name ‘path/api’ in servlet with name ‘myServlet’

자 다시한번 따라 읽어봅니다.

“잘 모르면 사용하지 말자.”

이 원인을 알게 된 것도 잘 모르고 사용 하다가 발생한 케이스다.

@ 해결 방법을 첨부 하자면

extension을 사용하는 API는 deprecated처리하고

기존에 유입되던 traffic은 신규 API주소로 redirect처리 하였다.

[생각의 정리] spring-boot

Spring-boot을 사용하지 않아야 할 이유를 찾지 못했다.(프로토 타입 개발에만)

Spring-boot 내부에는 톰캣 서버를 가지고 있다.
즉 배포 할 때 target 서버에 tomat이 없어도 된다는 말이다.

설정을 apache-httpd, nginx에 하게 된다면…..tomcat 설정을 별도로 하지 않겠지.

Spring-boot 내부에 있는 tomcat에 제니퍼나 다른 메니저를 붙이거나 debugging 설정을 해야 하는 상황에서 유연하게 대처 할 수 있다면 아마 spring-boot를 사용할 것이다.

여튼 spring-boot의 강점은 빠른 프로토타입과 개발 & 배포가 가능 하다는 점.

서버 구축은 뒤로 미룰 수 있다는 점이 좋다.

docker를 이용해서 표준 환경 이미지를 만들어 두고 싶은데…클라우드 환경 공부를 좀 해봐야겠다.

[Spring] Stereotype Annotation 용도

정보는 스프링 3.0 document를 참고 하였으며

오역?이 있을지도 모르니 원문을 참고 하시면 정확하고 많은 정보를 얻어가실 수 있습니다.
이렇게 긴 글을 친절하게 stackoverflow 에 누군가 요약 해놓았습니다.

오늘은 스프링의 stereotype 어노테이션의 용도와 역사가 무엇인지에 대해 알아 보겠습니다.

일단 stereotype 이라는 사전적인 의미는 다음과 같습니다.

명사 : 고정관념, 정형화된 생각

동사 : 정형화하다.

ㅇ 본문 내용 요약

* 용도가 불문명한 컴포넌트 클래스를 위한 어노테이션

@Component :

Spring 2.5부터 등장.

스프링이 관리하는 컴포넌트라는 표시

* 용도가 분명한 컴포넌트 클래스를 위한 어노테이션 (Component와는 다르게 용도를 표시하기 위해 구별 한다고 합니다.)

@Repository :

Data Acess Object 역할을 하는 class에 표시하기 위해 spring 2.0에서 등장하였습니다.

등장한 이유는 JPI(Java Persistence API)의 Exception을 해석(Translation)하기 위한 용도 입니다.(automatic exception translation in your persistence layer)

보다 자세한 설명은 링크을 참고 하시기 바랍니다.

@Service :

Spring 2.5부터 등장.

용도 : Service Layer 표시.

@Controller :

Spring 2.5부터 등장.

용도 : Presentation Layer 표시.

용도 구분해서 사용한다면 어노테이션 종류 별로 Exception translation, 전후처리 등을 커스터마이징 처리 할 수 있을 것 같습니다. ^^

오늘은 여기까지 : )

[오류] Emmla plugin Failed to load ApplicationContext

Spring 기반환경에서 Junit Test를 할때는 잘 되는데

Emma 를 사용하여 Test Case 수행시

Failed to load ApplicationContext 오류가 나면 로그를 확인해보라.

로그 내용 일부 중 플러그인 하위 폴더에 있는 내용에 컴파일된 클래스를 찾을 수 없다는 이야기이다.

.metadata\.plugins\com.mountainminds.eclemma.core\.instr\8bf188a22723e06a5af19db13832f192

한마디로 하위 폴더를 싹 날려주기만 하면 된다.

(이전에 생성했던 클래스가 삭제되면서 찾을 수 없는 문제로 보인다.)

[Spring] Custom Transactional Annotation in AOP

가끔 프로그래밍을 하다보면 다음과 같이 앞뒤로 (Before, After) Code duplication 이 발생한다. 이를 AOP를 이용하여 깔끔하게 코드 중복을 정리할 수 있는데 원리(rule)는  @Transactional Annotation과 비슷하다.

Before Job: begin Transaction

Processed : execute queries

After Job : end Transaction

Spring에서도 Interceptor를 위한 AOP를 구현해보자

Interceptor에 대해 이해가 잘 가지 않는다면 다음 wiki를 참고하길 바란다.

http://en.wikipedia.org/wiki/Interceptor_pattern

Step 1. xml bean configuration

<beans xmlns=”http://www.springframework.org/schema/beans&#8221;
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xmlns:p=”http://www.springframework.org/schema/p&#8221;
xmlns:mvc=”http://www.springframework.org/schema/mvc&#8221; xmlns:context=”http://www.springframework.org/schema/context&#8221;
xmlns:tx=”http://www.springframework.org/schema/tx&#8221; xmlns:aop=”http://www.springframework.org/schema/aop&#8221;
xsi:schemaLocation=”
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
default-autowire=”byName”>
<aop:aspectj-autoproxy />
<context:component-scan base-package=”org.simple.aop”> 

Step2. Annotation 생성

@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TransactionApply {

}

Step3. Aspect Bean 만들기

package org.simple.aop;

@Aspect
@Component
public class SimpleAspect {

@Around(“execution(public * *(..)) && @annotation(txApply)“)
public Object transactionAround(ProceedingJoinPoint joinPoint, TransactionApply txApply) throws Throwable {

Object retVal = null;
// TODO : Begin Transaction
try {

retVal = joinPoint.proceed();

} catch (Throwable t) {

// TODO : Transaction Roll Back

throw t;

}

//TODO : end Transaction
return retVal;

}

}

package org.simple.aop;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TransactionApply {
}

Step4. Apply Custom Annotation

@Service(“SimpleBO”)

public class SimpleBOImpl implements SimpleBO {

@TransactionApply
@Override
public Object updatePolicy(Object param) {

// TODO : select, update, delete in joinPoint.proceed

}

}

Tip : 만약 bean creation 시 다음과 같은 오류가 발생한다면 cglib의 version을 2.2 이상으로 올리는 것을 추천한다.

Caused by: java.lang.NoSuchMethodError: net.sf.cglib.proxy.Enhancer.setInterceptDuringConstruction(Z)V

위 issue의 원인은 cglib 2.0.2 version에서 setInterceptDuringConstruction이라는 Method가 없기 때문이다.

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-full</artifactId>
<version>2.0.2</version>
</dependency>

2.2 이상으로 설정하면 오류가 사라지며 bean 생성이 정상적으로 이루어짐을 확인할 수 있다.

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>

Attention : this exam requires cglib version higher than 2.2, aspectj dependency