** anyframe 설치

-. anyframe-x.x.0.zip 파일 다운로드

-. anyframe-x.x.0.zip 압축 해제

-. ANYFRAME_HOME 을 시스템 환경 변수 설정
ex) D:\JAVA\anyframe\anyframe-5.1.0

** eclipse anyframe plug-in 설치
1. anyframe-x.x.0.zip 을 이용한 설치 (잘 안됨 maven을 추천)
-. D:\JAVA\anyframe\anyframe-5.1.0\ide\eclipse-plugins 에 위치한
org.anyframe.common.eclipse.core-4.0.2.jar
org.anyframe.ide.eclipse.core_2.1.0.v20111021.jar

jar 파일을 eclipse plugin 폴더에 복사

D:\JAVA\eclipse\eclipse-jee-indigo-win32\plugins 에 복사

1. maven 을 이용한 network 설치
-. http://dev.anyframejava.org/docs/anyframe/5.1.0/reference/html/ch08.html#installation_eclipseide_maven

** anyframe 프로젝트 생성
1. eclipse 에서 생성 (잘 안됨 ant 명령어로 생성을 추천)
-. FILE > NEW > OTHER > ANYFRAME > PROJECT 로 생성

2. ant 명령어로 생성
-. 커맨드창 실행
-. ANYFRAME_HOME\bin 폴더로 이동
-. ANYFRAME_HOME 환경변수를 설정했다면 ANYFRAME_HOME\bin\env 실행.
-. ANYFRAME_HOME 을 설정 안했다면 아래 명령어 실행 후 env 실행
set ANYFRAME_HOME=D:\JAVA\anyframe\anyframe-5.1.0

-. DB 실행
(내장된 hsqldb 을 실행 D:\JAVA\anyframe\anyframe-5.1.0\ide\db\scripts\hsqldb\start.cmd 실행)
(oracle 일 경우 D:\JAVA\anyframe\anyframe-5.1.0\ide\db\scripts\oracle 스크립트를 실행하여 예제 테이블을 생성)
(예제 DB 스키마가 필요없을 경우 그냥 넘김)
-. anyframe create-project 명령 실행
http://dev.anyframejava.org/docs/anyframe/5.1.0/reference/html/ch10.html#commands_ant_commands_list
-. 프로젝트 생성 후 eclipse 에서 프로젝트를 우클릭하여 ANYFRAME_TOOL > ANYFRAME_IDE 를 실행
-. 프로젝트에 필요한 plugin을 설치한다.

-. 해당 프로젝트에 META-INF/project.mf 파일에 설정된 셋팅을 확인 또는 변경한다.

project 폴더 안에 .project 파일을 아래와 같이 수정해 준다.

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
 <name>anyframe-iocextendedtest-src</name>
 <comment></comment>
 <projects>
 </projects>
 <buildSpec>
  <buildCommand>
   <name>org.eclipse.jdt.core.javabuilder</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>org.hibernate.eclipse.console.hibernateBuilder</name>
   <arguments>
   </arguments>
  </buildCommand>
  <buildCommand>
   <name>org.eclipse.pde.SchemaBuilder</name>
   <arguments>
   </arguments>
  </buildCommand>
 </buildSpec>
 <natures>
  <nature>org.eclipse.jdt.core.javanature</nature>
  <nature>org.hibernate.eclipse.console.hibernateNature</nature>
 </natures>
</projectDescription>

anyframe-lab3-container :: Any Frame - lab 3 2010.03.17

1. Bean 상속

<bean id="parent" abstract="true">
  <property name="userDAO" ref="userDAO" /> 
</bean>

<bean id="com.sds.emp.services.user.UserService"
  class="com.sds.emp.services.user.impl.UserServiceImpl"
  parent="parent">
</bean>

2. Bean의 상속 Lifecycle

<bean id="com.sds.emp.services.user.UserService"
  class="com.sds.emp.services.user.impl.UserServiceImpl"
  init-method="userInitialize" destroy-method="userDestroy" parent="parent">
</bean>

: UserServiceImpl 초기화시 userInitialize 메서드 실행, 소멸시 userDestroy 메서드 실행

3. Container활용테스트

<bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
      <value>userConfigurer.txt</value>
   </list>
  </property>
</bean>

: 속성파일 지정

<bean id="com.sds.emp.services.user.UserService"
  class="com.sds.emp.services.user.impl.UserServiceImpl" init-method="userInitialize" destroy-method="userDestroy">
        <property name="userDAO" ref="userDAO" />
        <!-- TODO : set userCompany value using key name in properties file -->
        <property name="userCompany" value="${user.company}"></property>
</bean>

: UserServiceImpl 에 userConfigurer.txt 파일의 user.company 값이 설정 됨.

4. MessageSource를 활용한 국제화 :: MessageResource 사용

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
         <property name="basenames">
          <list> 
           <value>
            userMessages
           </value>
          </list>
         </property>
</bean>

: userMessages.properties , userMessages_en.properties 메세지 파일 사용 지정.

UserServiceImpl.java 에 MessageSourceAware 을 implements 한다.

UserServiceImpl.java 에서
System.out.println(new String(messageSource.getMessage("argument.required", new Object[] {"userVO"}, Locale.KOREA).getBytes("8859_1"), "euc-kr"));

로 메세지를 사용.

5. Custom Event :: 사용자 이벤트 작성(요약 못함)

anyframe-lab4-annotation :: Any Frame - lab 4 2010.03.17

1. 속성 정의 xml 파일에 Annotation인식을 위한 태그 추가

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="
http://www.springframework.org/schema/context"
       xsi:schemalLocation="
http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/contxt/spring-context-2.5.xsd">      
<context:annotation-config/>
</beans>


: <context:annotation-config/> 대신 <context:component-scan base-package="com.sds.emp.services.user" /> 으로 대체 가능

2. Managed Components

-. @Service
서비스 레이어를 구성하는 대상 클래스를 정의하는데 사용한다. (ex:@Service("UserServiceA"))
-. @Controller
프리젠테이션 레이어를 구성하는 Controller 클래스를 정의하는데 사용하며, SpringMVC 기반인 경우에 활용 가능하다.
-. @Repository
데이터 접근 레이어를 구성하는 클래스를 정의하는데 사용하며, 퍼시스턴스 레이어에서 발생한 Exception에 대한 Translation이 지원된다
-. @Scope("prototype")


3. Dependency Injection
: 특정 Bean의 기능 수행을 위해 다른 Bean을 참조해야 하는 경우 사용하는 Annotation으로는 @Autowired 또는 @Resource가 있다.

-. @Autowired : 필드, 생성자, 입력파라미터가 여러개인 메소드(@Qualifier는 메소드의 파라미터)에 적용 가능
-. @Resource : 필드, 입력 파라미터가 한 개인 빈 프로퍼티 setter 메소드에 적용가능

anyframe-lab5-aop :: Any Frame - lab 5 2010.03.17

1. AOP 구성 요소

-. JoinPoint(시점) : Crosscutting Concerns 모듈이 삽입되어 동작할 수 있는 실행 가능한 특정 위치를 말한다. 예를 들어 메소드가 호출되는 부분 또는 리턴되는 시점이 하나의 JoinPoint가 될 수 있다. 또 필드를 액세스하는 부분, 인스턴스가 만들어지는 지점, 예외가 던져지는 시점, 등이 대표적인 JoinPoint가 될 수 있다. 각각의 JoinPoint들은 그 전후로 Crosscutting Concerns의 기능이 AOP에 의해 자동으로 추가되어져서 동작할 수 있는 후보지가 되는 것이다.

-. Pointcut(대상) : Pointcut은 어느 JoinPoint를 사용할 것인지를 결정하는 선택 기능을 말한다. AOP가 항상 모든 모듈의 모든 JoinPoint를 사용할 것이 아니기 때문에 필요에 따라 사용해야 할 모듈의 특정 JoinPoint를 지정할 필요가 있다. 일종의 JoinPoint 선정 룰과 같은 개념으로 다음과 같은 Pattern Matching 방법들을 이용하여 룰을 정의할 수 있다.

-. Pointcut Designators : 지시자, Pointcut 정의 방법

-. Advice : Advice는 각 JoinPoint에 삽입되어져 동작할 수 있는 코드로 동작 시점은 pointcut에 Matching되는 JoinPoint 실행 전후이며 before, after, after returning, after throwing, around 중에서 선택 가능하다.

-. Aspect : Aspect는 어디에서(Pointcut) 무엇을 할 것인지(Advice)를 합쳐놓은 것을 말한다

2. 설정

2.1 - 기본

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="
http://www.springframework.org/schema/beans"
 xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
 xmlns:aop="
http://www.springframework.org/schema/aop"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  

<bean id="printStringAspect"
  class="integration.anyframe.services.aop.aspect.xml.PrintStringUsingXML" />  
<aop:config>
  <aop:aspect ref="printStringAspect">
   <aop:pointcut id="getMethods"
    expression="execution(public * integration.anyframe.services..*Impl.get*(..))" />
   <aop:pointcut id="updateMethods"
    expression="execution(public * integration.anyframe.services..*Impl.update*(..))" />
       
   <aop:before method="beforeExecuteGetMethod"
    pointcut-ref="getMethods" />
   <aop:after-returning method="afterReturningExecuteGetMethod"
    returning="retVal" pointcut-ref="getMethods" />
   <aop:after-throwing method="afterThrowingExecuteGetMethod"
    throwing="exception" pointcut-ref="getMethods" />
   <aop:after method="afterExecuteGetMethod"
    pointcut-ref="getMethods" />
   <aop:around method="aroundExecuteUpdateMethod"
    pointcut-ref="updateMethods" />
  </aop:aspect>
 </aop:config>
</beans>

 2.2 Annotation 사용

 


Any Frame 3.2.1 로 따라하기 시작 함.. (샘플은 Lab-Anyframe-Student-3.2.0 을 사용)

> Lab 1

-. Bean look up 방식

1. ClassPathXmlApplicationContext 생성

  ClassPathXmlApplicationContext context;

  String[] locations = getConfigLocations();
  context = new ClassPathXmlApplicationContext(locations, false);
  context = new ClassPathXmlApplicationContext("context-helloworld.xml");
  context = new ClassPathXmlApplicationContext("context-*.xml");
  context.refresh();

    IHelloWorldService iHelloWorldService = (IHelloWorldService) context.getBean(IHelloWorldService.ROLE);
    System.out.println("HelloWorldService : " + iHelloWorldService.greet());

2. ClassPathResource 생성

  ClassPathResource resource = new ClassPathResource("context-helloworld.xml");
  BeanFactory factory = new XmlBeanFactory(resource);
    IHelloWorldService iHelloWorldService = (IHelloWorldService) factory.getBean(IHelloWorldService.ROLE);
    System.out.println("HelloWorldService : " + iHelloWorldService.greet());

3. Annotation 으로

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:/spring/context-user-setter.xml" })
public class SetterInjectionTestCase extends AbstractDependencyInjectionSpringContextTests
{
}

> Lab 2

http://dev.anyframejava.org/anyframe/doc/core/3.2.1/corefw/guide/ioc-dependencies.html

-. Dependency Injection(DI)
1. Setter Injection

 * XML
 <bean id="com.sds.emp.services.user.UserService"
  class="com.sds.emp.services.user.impl.UserServiceImpl">
  <!-- TODO : setter injection -->
        <!-- <property name="userDAO" ref="userDAO" /> -->
        <property name="userDAO"><ref local="userDAO"/></property>
 </bean>
 
 <bean id="userDAO" class="com.sds.emp.services.user.impl.UserDAO"/>

 * JAVA
    // TODO - for setter injection
    public void setUserDAO(UserDAO userDAO){ this.userDAO = userDAO; }

2. Constructor Injection

 * XML
 <bean id="com.sds.emp.services.user.UserService"
  class="com.sds.emp.services.user.impl.UserServiceImpl">
  <!-- TODO : constructor injection -->
     <constructor-arg ref="userDAO"/>  
 </bean>
 
 <bean id="userDAO" class="com.sds.emp.services.user.impl.UserDAO"/>

 * JAVA
    // TODO - for constructor injection
    public UserServiceImpl(UserDAO userDAO){ this.userDAO = userDAO; }

3. Method Injection
3.1 Lookup Method Injection :: Singleton Bean이 Prototype Bean을 참조해야 할 경우 <lookup-method>를 설정한다.

 * XML
 <bean id="com.sds.emp.services.user.UserService"
  class="com.sds.emp.services.user.impl.UserServiceImpl">
  <!-- TODO : method injection -->
  <lookup-method name="getUserDAO" bean="userDAO"/>
 </bean>
 
 <!-- TODO : change scope from singleton to prototype (non singleton) -->
 <bean id="userDAO" class="com.sds.emp.services.user.impl.UserDAO" scope="prototype" />

 * JAVA
    // TODO - for method injection
    public UserDAO getUserDAO(){  return null;  }

3.2 Method Replacement :: 이미 존재하는 기존의 메소드를 수정하지 않은 상태에서 메소드의 기능을 변경하고자 할 때 <replaced-method>를 이용한다. 사용 예제는 다음과 같다.

 * XML
<bean id="beanFirst" class="test.BeanFirst"/>
<bean id="beanSecond" class=" test.BeanSecond">
        <replaced-method name="sayHello" replacer="methodReplacer">
            <arg-type>String</arg-type>
        </replaced-method>

</bean>
<bean id="methodReplacer" class="test.SayHelloMethodReplacer"/>

4. auto wiring, depends on bean

 * XML
 <!-- TODO : set autowiring, depends on bean -->
 <bean id="com.sds.emp.services.user.UserService"
  class="com.sds.emp.services.user.impl.UserServiceImpl" autowire="byType" depends-on="userSample">
 </bean>
 
 <!-- TODO : set lazy initialization -->
 <bean id="userDAO" class="com.sds.emp.services.user.impl.UserDAO" lazy-init="true"/>
 
 <bean id="userSample" class="com.sds.emp.services.user.impl.UserSample"/>


2009.12.01

CHAR 2
@Annotation 사용 :: 소스에서 annotation 사용으로 spring 설정 파일에 빈 객체를 등록하지 않고, 빈 객체를 사용하는 방법

+ Recent posts