최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.

우선 web.xml에 dispatcherServlet 이름을 지정하여 생성하는데, 그러면 [dispatcherServlet이름]-servlet.xml 이 설정파일이 된다.

이때 servlet.xml 에 무식하게 다 적는 방법이 아닌 다른 설정을 불러와서 추가 하고 싶은경우가 있다면?

DispatcherServlet을 설정할때, contextConfingLocation 초기화 파라미터에 설정파일 목록을 지정하면된다. 
구분자는  콤마(,) 공백 , 탭, 줄바꿈(\n) , 세미콜론(;) 가 가능하다.

        <servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB--INF/main.xml /WEB-INF/bbs.xml</param-value>
</init-param> 
 
</servlet>

요런식으로 가능하게 된다.

혹은 dispatcherServlet 자체를 여러개 만들어도 된다.
 
        <servlet>
<servlet-name>front</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB--INF/front.xml</param-value>
</init-param> 
</servlet>
        <servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/rest.xml</param-value>
</init-param> 
</servlet>

그럼 front-serlvet.xml 과 rest-servlet.xml 2개의 설정파일이 생기게 되는데, 이때 같은빈을 각각의 설정파일에서 등록하고 있다면?
이를 공통화할 수 있다.
공통으로 사용될 빈 객체 정보를 담고 있는 설정파일목록을 아래처럼 service에 넣어서 처리가능하다.

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
        /WEB-INF/service.xml
    </param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 
        <servlet>
<servlet-name>front</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
        <servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

ContextLoaderListener 가 생성하는 WebApplicationContext 는 웹어플리케이션에서 루트컨텍스트, DispatcherServlet이 생성하는 WebApplicationContext는 루트 컨텍스트를 부모로 사용하는 자식 컨텍스트가 된다. 자식은 root가 제공하는 빈을 쓸 수 있으므로 ContextLoaderListener 를 이용하여 설정하는것임

ContextLoaderListener 는 contextConfigLocation 컨텍스트 파라미터를 명시하지 않으면 /WEB-INF/applicationContext.xml 을 설정 파일로 사용한다.

<param-value> classpath:xxx.xml</param-value>
하면 클래스패스에 위치한 파일로부터 설정 정보를 읽어온다.

 
 

 



'IT > 스프링' 카테고리의 다른 글

@Controller 어노테이션... - 1 -  (0) 2012.01.10
filter....  (0) 2012.01.10
Spring 3.0 MVC 정리  (0) 2012.01.10
AspectJ in Spring?  (0) 2012.01.09
weaving??  (0) 2012.01.09

from http://ihoney.pe.kr/entry/%EC%9A%B0%EB%B6%84%ED%88%AC-%ED%95%9C%EA%B8%80%ED%8F%B0%ED%8A%B8-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%95%88%ED%8B%B0%EC%96%BC%EB%A6%AC%EC%96%B4%EC%8B%B1-%EC%A0%81%EC%9A%A9%EB%B2%95



우분투 9.10 버전을 어렵게 어렵게 설치를 한 후, 어색한 폰트들 대신 익숙한 나눔폰트 계열로 수정하려고 하다가 이렇게 기록으로 남긴다. 다른 사람 블로그 찾아다니는 것이 귀찮은 게 가장 크다고 할까? ^^;;

# sudo nautilus

명령실행하여 root 권한을 가진 노틸러스를 실행시킨다.

# /usr/share/fonts/trutype 로 이동 하여 폴더를 생성한다. 생성된 폴더에 원하는 폰트들을 넣는다.


그런 후 터미널에서 

# sudo -s
passwd 입력
# fc-cache -f -v


폰트 리스트 점검을 하는 과정이 완료되고 난 후에 우분투 폰트 리스트에 해당하는 폰트들이 추가가 되었음을 확인해볼 수 있다.

우분투에서는 안티앨리어싱을 끄도록 설정이 되어 있기 때문에, 새로 추가된 폰트들을 넣을 경우 계단지어지고 깨지는 어색한 모습을 볼 수 있다. 폰트와 관련된 안티앨리어싱을 끄도록 하자. 

터미널에서 아래의 명령어를 실행한다.
# sudo gedit /etc/fonts/conf.d/29-language-selector-ko-kr.conf


열린 gedit 의 내용 중에서 아래 항목을 찾아 <match target~ 부분을 주석처리(<!-- -->로 막는다. 
<!-- Turn off antialias and autohint for Korean fonts depending on pixelsize -->
<!-- <match target="font">
        <test name="lang" compare="contains">
                <string>ko</string>
        </test>
        <test name="pixelsize" compare="more">
        <int>10</int>
    </test>
        <test name="pixelsize" compare="less">
        <int>22</int>
    </test>
        <edit name="antialias" mode="assign">
        <bool>false</bool>
    </edit>
        <edit name="autohint" mode="assign">
        <bool>false</bool>
    </edit>
        <edit name="hintstyle" mode="assign">
        <const>hintmedium</const>
    </edit>
</match> -->


다음 항목 을 찾아 마찬가지로 주석처리한다.
<!-- Turn off antialias and autohint for ttf-alee depending on pixelsize -->
<!-- <match target="font">
        <test name="family">
                <string>Guseul</string>
        </test>
        <edit name="autohint" mode="assign">
        <bool>true</bool>
    </edit>
</match>
<match target="font">
        <test name="family">
                <string>Guseul</string>
                <string>Guseul Mono</string>
        </test>
    <test name="pixelsize" compare="more">
        <int>11</int>
    </test>
    <test name="pixelsize" compare="less">
        <int>16</int>
    </test>
    <edit name="antialias" mode="assign">
        <bool>false</bool>
    </edit>
        <edit name="autohint" mode="assign">
        <bool>false</bool>
    </edit>
</match> -->


※ 이 옵션은 저 파일을 삭제하는 것과 동일하므로, 차라리 저 파일을 삭제하는 것도 괜찮다.
Alt + F2 하신 다음,
gksu rm /etc/fonts/conf.d/29-language-selector-ko-kr.conf


최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.



흐음.. 이게 벌써 몇번째 정리인지 모르겠다.

아무튼 스프링책을 다시 보면서 정리하는 중이니 역시 정리하겠다. 스프링 또한 여차 프레임웍처럼 스프링 MVC를 제공한다.

간단하게 정리하자면.. 이 모든것을 총괄하는 커맨드센터격는 DispatcherServlet 이다.

1. 기본흐름

클라이언트 ---- 요청 ----> DispatcherServlet 

DispatcherServlet ---- 처리할 컨트롤러 파악 ----> HandlerMapping
DispatcherServlet <---- 처리할 컨트롤러 파악 ---- HandlerMapping

DispatcherServlet ---- 처리요청 ----> Controller 
DispatcherServlet <---- ModelAndView 리턴 ---- Controller
DispatcherServlet ---- ModelAndView 결과를 보여줄 View 파악 ----> ViewResolver
DispatcherServlet <---- View 리턴 ---- ViewResolver
DispatcherServlet ---- 결과물 출력요청 ----> View


개발자는 컨트롤러와 클라이언트의 응답결과화면 보여줄 뷰화면을 만드는게 주이다.
보통은 DispatcherServlet , HandlerMapping, ViewResolver 는 기본 클래스를 쓴다.


하여
ㄱ. DispatcherServlet을 web.xml파일에 설정한다.
ㄴ. 컨트롤러를 작성한다.
ㄷ. ViewResolver를 설정한다. 이는 컨트롤러가 전달한 ModelAndView 값을 이용해서 만듬
ㄹ. 뷰 관련 템플릿(jsp etc...) 로 화면을 만든다.


아니면 개발 과정으로 설명하자면

ㄱ. 클라이언트의 요청을 받을 DispaatcherServlet 을 web.xml에 선언한다.
ㄴ. 클라이언트의 요청을 처리할 컨트롤러 클래스를 만든다.
ㄷ. 컨트롤러가 만든 ModelAndView 데이터를 이용해서 View를 처리할 ViewResolver를 설정한다. ( xml)
ㄹ. Velocity 나 JSP로 뷰를 작성한다.



2. DispatcherServlet 설정
web.xml을 설정하는 과정이다.
/WEB-INF/web.xml
 서블릿과 서블릿 맵핑 정보를 추가하면됨

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
// *.do로 들어오는 클라이언트요청을  dispatcher에서 처리함
<url-pattern>*.do</url-pattern>
<url-pattern>/game/*</url-pattern>
</servlet-mapping>
 
DispatcherServlet은 WEB-INF/ 디렉토리에 위치한 [서블릿이름]-servlet.xml 파일을 스프링 설정파일로 사용한다.

위의 경우 dispatcher 이므로 dispatcher-servlet.xml 파일을 설정파일로 사용한다.
해당 설정파일에는 Controller,ViewResolver,View 등의 빈을 설정한다.


3. Controller 구현
컨트롤러를 구현하려면 @Controller 어노테이션 을 해당 클래스에 적용한다.
@RequestMapping 어노테이션을 이용하면, 클라이언틔 요청을 처리할 메소드를 지정할 수 있다.

@Controller
public class HelloController {

@RequestMapping("/hello.do")
public ModelAndView hello() {
              ModelAndView mav = new ModelAndView();
mav.setViewName("hello");    // 뷰 이름이 hello (.jsp)
mav.addObject("greeting", getGreeting());
return mav;
        }
        ....
}



스프링 MVC는 ModelAndView 말고도 String,Map 등과 같은 타입을 이용해서 뷰이름과,정보를 보낼 수 있다.

당연히 해당 컨트롤러를 DispatcherServlet에서 찾을 수 있도록 스프링 컨테이너의 빈 으로 등록해주어야한다. 

스프링 2.5에서는 컨트롤러 어노테이션에 대해서 추가 작업이 필요하나 3.0에서는 변경되었다.

위의 맵핑에서 정의한 컨트롤러의 메소드에서 ModelAndView 로 결과를 리턴하는데 이 결과와 매칭되는 뷰 구현체를 찾기위해
ViewResolver를 사용한다.  스프링은 여러 벨로시티등의 여러가지 뷰 구현체를 지원하는데 jsp 를 사용할경우 
org.springframework.web.servlet.view.InternalResourceViewResolver 구현체를 빈으로 등록해주면된다.

in [서블릿이름]-servlet.xml 파일안에 
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
// ViewResolver 가 /WEB-INF/view/뷰이름.jsp 를 뷰 JSP로 사용.  위의 컨트롤러에서 view 이름을 hello로 잡았으므로 실제 리턴하는 파일은 
// /WEB-INF/view/hello.jsp 파일이다.  즉 [prefix]뷰이름[suffix] 가 된다.
</bean> 
  

이제 호출하면된다. 
http://localhost:8080/hello.html



자.. 그럼 다시 살펴보면 우선 web.xml에 DispatcherServlet 과 Mapping 설정을 해두었다.
사용자가 특정 url 요청을 하게 되면 Mapping 해두었던 설정에 따라 어떤 dispatcherServlet을 쓸지 확인하고 해당 dispatcherSerlvet 의 설정파일 [dispatcherServlet]-servlet.xml 파일을 읽어서 요청에 맞는 url 패턴을 가진 컨트롤러를 등록된 빈 에서 찾는다.

찾았으면 해당 컨트롤러에 가서 정의된 @RequestMapping 어노테이션중 맞는것을 찾아서 ModelAndView 를 만들고, 리턴한다.

그러면 이를 처리할 ViewResolver 를 찾아야 하는데 그건 [dispatcherServlet이름]-serlvet.xml 파일에 정의된 viewResolver 를 사용해서 

prefix/suffix를 이용한 url을 만든다. 사용자의 눈에는 그 url 이 보이진 않는다. viewResolver가 view를 찾아서 그걸 보여주기만 할뿐 주소의 변경은 없다.

해서 요청 url 패턴이 html 이었다면 .html로 요청한 주소는 그대로이고, viewResolver 에서 만든 주소(by prefix,suffix) 의 대상이 실제 보이게 된다.


'IT > 스프링' 카테고리의 다른 글

filter....  (0) 2012.01.10
DispatcherServlet... more  (0) 2012.01.10
AspectJ in Spring?  (0) 2012.01.09
weaving??  (0) 2012.01.09
Pointcut 표현식... execution , within  (0) 2012.01.06
최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.

흐음.. 기본적으로 스프링AOP는 스프링의 빈 객체에 대해서만 적용된다.
즉 스프링을 이용하지 않는 객체에 AOP를 적용하고 싶다면...?

스프링의 xml 설정을 바꾸어서 AspectJ를 적용할 수 있다.

AspectJ 를 이용해서 그냥 new 등을 통해 생성된 객체에도 AOP 기능을 쓸 수 있다는 의미이다!!

예제 결과를 보기 전 까지는 이게 뭐지였음; 근데 실행문을 보고 나서야 의미를 알았음;
아마 AspectJ를 몰라서 그런거였겠지;?


객체와 Advice 를 weaving 할 설정은
<?xml version="1.0" encoding="utf-8" ?>

<!DOCTYPE aspectj PUBLIC 
"-//AspectJ//DTD//EN"
"http://www.eclipse.org/aspectj/dtd/aspectj.dtd">

<aspectj>
// Aspect 의 설정 및 적용할 범위를 정의함 
<weaver>
<include within="madvirus.spring.chap05.board.service.*" />
<include within="madvirus.spring.chap05.board.Article" />
</weaver>
// 어떤 Aspect를 적용할지 정의함
<aspects>
<aspect name="madvirus.spring.chap05.aop.annot.ProfilingAspect"/>
</aspects>
</aspectj>

이렇게 어떤 패키지에 어떤 Aspect를 적용할지 설정 한다.  

 그 다음 스프링 설정 xml 에 <context:load-time-weaver /> 를 추가함

==============================================

AspectJ를 이용한 객체의 DI 처리..
 
스프링 컨테이너를 통해서 생성되는 빈객체는 의존관계처리가 가능하고, 결과 의존성도 줄이고 결합도도 낮출 수 있다.
허나 역시,  스프링 컨테이너를 통하지 않은 생성에서는 제어할 수 없다.

 이를 스프링의 AspectJ 지원기능을 이용하면 스프링 컨테이너밖에서 생성되는 객체에 대해서도 DI를 적용할 수 있게 된다.

해당 클래스에 
 @Configurable 어노테이션을 적용한다.
역시 설정에 weaving을 해야하고,  


'IT > 스프링' 카테고리의 다른 글

DispatcherServlet... more  (0) 2012.01.10
Spring 3.0 MVC 정리  (0) 2012.01.10
weaving??  (0) 2012.01.09
Pointcut 표현식... execution , within  (0) 2012.01.06
JointPoint ..?  (0) 2012.01.06

http://dev.anyframejava.org/anyframe/doc/core/3.2.0/corefw/guide/aop-components.html



Weaving 또는 CrossCutting

AOP가 Core Concerns 모듈의 코드를 직접 건드리지 않고 필요한 기능이 작동하도록 하는 데는 Weaving 또는 CrossCutting이라고 불리는 특수한 작업이 필요하다. Core Concerns 모듈이 자신이 필요한 Crosscutting Concerns 모듈을 찾아 사용하는 대신에 AOP에서는 Weaving 작업을 통해 Core Concerns 모듈의 사이 사이에 필요한 Crosscutting Concerns 코드가 동작하도록 엮어지게 만든다. 이를 통해 AOP는 기존의 OOP로 작성된 코드들을 수정하지 않고도 필요한 Crosscutting Concerns 기능을 효과적으로 적용해 낼 수 있다.

Weaving은 기존의 자바 언어와 컴파일러에서는 쉽게 구현할 수 있는 방법이 아니었으며 본격적인 AOP 기술이 등장한 것은 1990년대 후반 제록스 PARC 연구소에서 그레거 킥제일(Gregor Kiczales)에 의해 AspectJ가 개발되면서라고 볼 수 있다. 
Weaving을 처리하는 방법은 다음과 같이 3가지가 존재한다.
Weaving 방식
설명
Compiletime Weaving별도 컴파일러를 통해 Core Concerns 모듈의 사이 사이에 Aspect 형태로 만들어진 Crosscutting Concerns 코드들이 삽입되어 Aspect가 적용된 최종 바이너리가 만들어지는 방식이다. (ex. AspectJ, ...)
Loadingtime Weaving별도의 Agent를 이용하여 JVM이 클래스를 로딩할 때 해당 클래스의 바이너리 정보를 변경한다. 즉, Agent가 Crosscutting Concerns 코드가 삽입된 바이너리 코드를 제공함으로써 AOP를 지원하게 된다. (ex. AspectWerkz, ...)
Runtime Weaving소스 코드나 바이너리 파일의 변경없이 Proxy를 이용하여 AOP를 지원하는 방식이다. Proxy를 통해 Core Concerns를 구현한 객체에 접근하게 되는데, Proxy는 Core Concerns 실행 전후에 Cross Concerns를 실행한다. 따라서 Proxy 기반의 Runtime Weaving의 경우 메소드 호출시에만 AOP를 적용할 수 있다는 제한점이 있다. (ex. Spring AOP, ...)


'IT > 스프링' 카테고리의 다른 글

Spring 3.0 MVC 정리  (0) 2012.01.10
AspectJ in Spring?  (0) 2012.01.09
Pointcut 표현식... execution , within  (0) 2012.01.06
JointPoint ..?  (0) 2012.01.06
Advice..?  (0) 2012.01.06
최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.
 


ApsectJ 문법으로 Pointcut 을 만들때 문법...


execution([public|protected|private] [return Type] [className][메소드이름](parameter) 
수식어패턴? 리턴타입패턴 클래스이름패턴?이름패턴(파라미터패턴)

- 수식어패턴 : public protected ... (생략가능)
- 리턴타입패턴 : 리턴타입명시
- 클래스이름패턴 / 이름패턴 : 클래스이름 및 메서드 이름을 패턴으로 명시한다. 
- 파라미터패턴 : 매칭될 파라미터에 대해서 명시한다.

각 패턴은 "*" 로 표현가능하다
'..' 을 이용하여 0개 이상의 의미를 나타낼 ㅅ수 있다.


execution(public void set*(..)) 
: 리턴타입이 void , 메서드이름이 set으로 시작하고 파라미터가 0개 이상인 메소드 호출함

execution(* madvirus.spring.chap05.*.*())
:  madvirus.spring.chap05 패키지의 파라미터가 없는 모든 메소드 호출

execution(* madvirus.spring.chap05..*.*())
: madvirus.spring.chap05 패키지 및 하위패키지에 있는, 파라미터가 0개 이상인 메소드 호출

execution(Integer madvirus.spring.chap05..WriteArticleService.write(..))
: 리턴타입이 Integer인, WriteArticleService 인터페이스의 write() 메소드 호출

execution(* get*(*))
: 이름이 get으로 시작하고 1개의 파라미터를 갖는 메소드 호출

execution(* read*(Integer,..))
: 이름이 read로 시작하고, 첫번째 파라미터 타입이 Integer이며, 1개 이상의 파라미터를 갖는 클래스




within 명시자는 메소드가 아닌 특정 타입에 속하는 메소드를 Pointcut으로 설정할때 사용된다.

within(madvirus.spring.chap05.board.service.WriteArticleService)
:WriteArticleService 인터페이스의 모든 메소드 호출

within(madvirus.spring.chap05.board.service.*)
: madvirus.spring.chap05.board.service 패키지에 있는 모든 메소드 호출


bean 명시자는 스프링빈 이름을 이용하여 Pointcut을 정의한다.
bean(writeArticleService)
: 이름이 writeArticleService 인 빈의 메소드 호출

bean(*ArticleService)
: 이름이 ArticleService로 끝나는 빈의 메소드 호출




 

'IT > 스프링' 카테고리의 다른 글

AspectJ in Spring?  (0) 2012.01.09
weaving??  (0) 2012.01.09
JointPoint ..?  (0) 2012.01.06
Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
흐음... AOP 의 용어인데 그건 집어치우고... (가 아니라 알아보고 와라 )
 아무튼 JointPoint 가 필수인 Advice ( Around ) 나 옵션이 것들에서... 아규먼트의 순서는 반드시 첫번째여야 한다.

JointPoint가 제공하는 메소드는

Signature getSignature() : 호출되는 메소드의 정보
Object getTarget() : 대상 객체를 구함
Object[] getArgs[] : 넘겨받은 파라미터를 구함
proceed() : 대상 객체 실행

Signature 가 제공하는 메소드는
String getName() : 메소드이름
Strong toLongString() : 메소드를 풀네임으로 보여줌 (리턴타입 파라미터 모두)
String toShortString() : 메소드를 줄여서 보여줌

 

'IT > 스프링' 카테고리의 다른 글

weaving??  (0) 2012.01.09
Pointcut 표현식... execution , within  (0) 2012.01.06
Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
AOP 몇가지..  (0) 2012.01.05

Before Advice
After Returning Advice
After Throwing Advice
After Advice
Around Advice 

이런것들이 Advice 인것이다. 

이런 advice들이  pointcut-ref 를 이용해서 pointcut을 설정하는것이고....  

그러면 pointcut으로 정해진 메소드들이 실행되려는 순간 적절한 Advice 들이 실행된다. 

'IT > 스프링' 카테고리의 다른 글

Pointcut 표현식... execution , within  (0) 2012.01.06
JointPoint ..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
AOP 몇가지..  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29

+ Recent posts