SpringFramework가 되는지 삽질하던 중 데모에 있는 샘플을 하나잡아서 convert를 시켰습니다-_-
놀랍게도 잘 되네요. 하는 도중 약간의 혈압이 상승했지만요-_-

우선 샘플주소입니다.
http://springguestbook.appspot.com

소스코드 주소입니다. trunk/SpringGuestBook입니다^^
http://my-svn.assembla.com/svn/mudchobosample

마치...그냥 앱엔진에서 제공하는 샘플이랑 같아보여서 사기를 치는 것 같지만, Model2방식의 예제입니다ㅠ

우선 하면서 가장 처음에 겪는 문제점입니다.
Your Web Application Project must be configured to use a JDK in order to use JSPs.

JSP를 쓰려면 jdk를 설정해야한다는 뜻인데요. 보통 JDK를 깔고, 이클립스를 실행하면 디폴트로 JRE가 잡혀있어요. 이걸 JDK로 추가해서 바꿔주시면 돼요.

이클립스에서 Window -> Preferences -> Java -> Installed JREs선택.
Add -> Standard VM -> JRE home에서 Directory선택해서 JDK주소를 찾으세요.
디폴트로 설치하셨다면 C:\Program Files\Java\jdk1.6.0_12 여기에 있을겁니다.
폴더만 선택하고, Finsh를 누르면 추가가 되었습니다. 체크박스를 jdk로 옮겨주세요. 그러면 저 위에 에러 안날꺼에요.

그다음으로 겪는 문제점은....-_- 앱엔진에서 지원안하는 클래스를 쓰는 곳이 있는 것 같아요.
spring mvc를 사용하려면 spring.jar하고 spring-webmvc.jar 두개만 있으면 되는데요. 이거 두개 lib폴더에 넣어놓고 서버에 디플로이 시키면
exception is java.lang.NoClassDefFoundError: javax/naming/NamingException
App engine로그를 볼 수 있는데, 거기서 로그를 보면 클래스를 찾을 수 없다고 나와요. spring-orm.jar에서 쓰는 것 같더라구요. 어차피 구글앱엔진은 jdo만 지원해서 jdo only라이브러리가 있습니다-_- 그걸로 바꿔주시면 돼요.
전 라이브러리복사할 때
spring-beans.jar, spring-context-support.jar, spring-context.jar, spring-core.jar, spring-jdbc.jar, spring-orm-jdo-only-2.5.6.jar, spring-test.jar, spring-tx.jar, spring-web.jar, spring-webmvc.jar를 복사했네요.
여기서 spring-orm-jdo-only-2.5.6.jar는 저도 어디서 받은거라.....-_-
그러고 디플로이하면 잘 됩니다.

또 한가지 문제점은 eclipse에서 제공하는 dynamic web project에서는 WEB-INF/lib에 library파일을 복사하면 자동으로 클래스를 코드힌트로 쓸 수 있는데, 이놈은 코드힌트를 할 수 없어요-_- 그래서 수동으로 추가를 해줘야해요.
프로젝트 이름에 Properties를 선택하고, Java Build Path에서 Add JARs에서 추가한 spring파일 등을 선택해서 추가해줘야 에러가 안나네요^^(이건 뭐 다른 방법이 있을 지도.....-_-저에게 최선의 방법이였다는 ㅠ)

또 JDO라는 걸 전혀 몰라서 조금 고생했는데, Hibernate같은 orm이더군요. 사실 아직도 잘 모르겠습니다. 좀 더 알아봐야할 것 같네요. orm하면 Hibernate랑 JPA밖에 없는 줄 알았는데, 뭐 디게 많네요ㅠ

또.....-_- localhost에서 Datastore테스트를 하면 war/WEB-INF/appengine-generated라는 폴더가 생겨요. 디비가 저장되는 것 같은데, 저게 있는 상태에서 디플로이하면 안돼요. 지우고 하면 됩니다.

또 이런저런 문제가 있었는데, 기억이 안나네요. 그래도 정말 대단한 것 같습니다. 대세는 클라우드-_-

참고자료
http://peterbacklund.blogspot.com/2009/04/running-spring-on-google-app-engine.html
http://groups.google.com/group/google-appengine-java/browse_thread/thread/f1a541fe52e172dd

 
Posted by 머드초보
,
 
셋팅이 끝났으니 Hibernate Mapping파일을 생성합니다.
New -> Other -> Hibernate -> Hibernate Mapping Files and POJOs from Database선택 -> File Name은 디폴트 ->
Avaliable Tables에서 sosi테이블 add -> JDK 5 Language Features체크, package는 sm.sosi.sosiage.map입력 후 Finish. 여기서 이상한게 매핑파일을 만들었는데, 패키지가 보이지 않습니다. 처음부터 생성되지 않은 패키지를 선택해서 그런 것 같은데, 넷빈즈 껐다 키면 보입니다-_-;(버그인 듯-_-)

이제 Dao를 하나 만들어봅시다.
sm.sosi.sosiage.dao패키지에 AgeDao클래스를 만들어봅시다. 이 클래스에 메소드는 나이를 알려주는 메소드 1개-_-; 이 클래스는 HibernateDaoSupport를 상속받습니다.
AgeDao.java
[code]public class AgeDao extends HibernateDaoSupport {
    public int searchAge(String name) {
        List<Sosi> sosi = getHibernateTemplate().find("from Sosi where name = ?", name);
        if (sosi.size() > 0) {
            return sosi.get(0).getAge();
        } else {
            return 0;
        }
    }
}[/code]
코드는 간단합니다. 제가 아직 하이버네이트를 공부중이라 저거 하나만 객체로 받아오는 걸 못하겠는데요-_-; List로 받아와서 그냥 첫번째꺼 가져오도록 했습니다-_-;

sm.sosi.sosiage.service패키지에 AgeService를 만들어봅시다.
AgeService.java
[code]public class AgeService {
    private AgeDao ageDao;

    public void setAgeDao(AgeDao ageDao) {
        this.ageDao = ageDao;
    }

    public String searchAge(String name) {
        int age = ageDao.searchAge(name);
        String message;

        if (age == 0) {
            message = name + "은/는 소녀시대의 멤버가 아닙니다.";
        } else {
            message = name + "의 나이는 " + age + "세입니다.";
        }
        return message;
    }
}[/code]
간단하게 메세지를 만들어서 리턴해주는 서비스입니다.

심플컨트롤러를 생성해봅시다. New -> Other -> Srpingframework -> Simple Form Controller선택 -> Class Name은 AgeController, package는 sm.sosi.sosiage.controller -> Finish.
AgeController.java
[code]public class AgeController extends SimpleFormController {

    private AgeService ageService;

    public void setAgeService(AgeService ageService) {
        this.ageService = ageService;
    }

    public AgeController() {
        setCommandClass(Sosi.class);
        setCommandName("sosiAge");
        setSuccessView("successView");
        setFormView("formView");
    }

    /*
    @Override
    protected void doSubmitAction(Object command) throws Exception {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    */

    //Use onSubmit instead of doSubmitAction
    //when you need access to the Request, Response, or BindException objects
    @Override
    protected ModelAndView onSubmit(
            HttpServletRequest request,
            HttpServletResponse response,
            Object command,
            BindException errors) throws Exception {
        Sosi sosi = (Sosi)command;
        ModelAndView mv = new ModelAndView(getSuccessView());
        mv.addObject("message", ageService.searchAge(sosi.getName()));
        return mv;
    }
}[/code]
이제 formView와 successView만 작성하면 끝이네요.
Web Pages -> WEB-INF ->jsp에서 New -> JSP -> JSP File Name은 formView -> Finish.
formView.jsp
[code]<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>소녀시대 짱-_-;</title>
    </head>
    <body>
        <form:form commandName="sosiAge" method="post" action="age.htm">
            소녀시대 멤버이름을 입력하세요:
            <form:input path="name" />
            <input type="submit" value="검색">
        </form:form>
    </body>
</html>[/code]
또다른 View파일 JSP File Name은 successView -> Finish.
successView.jsp
[code]<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>소녀시대 나이 결과</title>
    </head>
    <body>
         <h2>${message}</h2>
    </body>
</html>[/code]
이제 dispatcher-servlet.xml에 bean을 등록해봅시다.
dispatcher-servlet.xml
[code]<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>
                <prop key="age.htm">ageiController</prop>
            </props>
        </property>
    </bean>
   
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <!-- dao -->
    <bean name="ageDao"
          class="sm.sosi.sosiage.dao.AgeDao"
          p:sessionFactory-ref="sessionFactory" />

    <!-- service -->
    <bean name="ageService"
          class="sm.sosi.sosiage.service.AgeService"
          p:ageDao-ref="ageDao"/>

    <!-- controller -->
    <bean name="indexController"
          class="org.springframework.web.servlet.mvc.ParameterizableViewController"
          p:viewName="index" />
    <bean name="ageController"
          class="sm.sosi.sosiage.controller.AgeController"
          p:ageService-ref="ageService" />[/code]
실행해보면
정보: Hibernate: select sosi0_.idx as idx0_, sosi0_.name as name0_, sosi0_.age as age0_ from hibernate.sosi sosi0_ where sosi0_.name=?
이런 쿼리가 날아가네요.
사용자 삽입 이미지
사용자 삽입 이미지
태연 짱-_-; 역시 원더걸스 예제보다 소녀시대 예제가 더 접근성이 높은 듯-_-;

PS. 보니까 Hibernate도 애노테이션으로 할 수 있는 듯 한데, 그것도 좀 해봐야겠네요. 다시 하이버네이트 책을 좀 읽어봐야겠어요-_-;
 
Posted by 머드초보
,
 
요즘 하이버네이트3 프로그래밍(최범균 저)를 보고 있는데, 뭔소린지 잘 이해가 안가서 쉬어갈 겸-_-; 넷빈즈에서 스프링이랑 하이버네이트 연동하는 거 정리해서 올립니다-_-;

환경 : GlassFishV3 + SpringFramework 2.5 + Hibernate 3.2.5 + MySQL5.0 + Netbeans6.5

접근성을 높이기 위해(?) 소녀시대를 예제로 작성해봅시다. 멤버이름을 입력하면 멤버의 나이를 알려주는 웹애플리케이션을 만들어봅시다-_-;

Database
[code]CREATE TABLE `sosi` (
  `idx` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `age` int(10) unsigned NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

INSERT INTO `sosi` (`idx`,`name`,`age`) VALUES
 (1,'윤아',20),
 (2,'수영',20),
 (3,'효연',21),
 (4,'유리',21),
 (5,'태연',21),
 (6,'제시카',21),
 (7,'티파니',21),
 (8,'써니',21),
 (9,'서현',19);
[/code]

New Project -> Java Web -> Web Application -> Project Name : SosiAge -> Glass Fish V3으로 하구요 -> Spring Web MVC 2.5랑 Hibernate 3.2.5체크합니다.
Hibernate에서 DB를 설정해야하는데, New Database Connection해서 Name을 MySQL로 맞추고, 설정에 맞게 입력한 뒤, 추가한 것으로 선택한 뒤 Finish를 누른 뒤 완료합니다.

한글문제로 인한 web.xml파일에 아래 코드를 추가합니다.
web.xml
[code]<filter>
          <filter-name>Request Encoding</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
          <init-param>
               <param-name>encoding</param-name>
               <param-value>UTF-8</param-value>
          </init-param>
     </filter>
     <filter-mapping>
          <filter-name>Request Encoding</filter-name>
          <servlet-name>dispatcher</servlet-name>
     </filter-mapping>[/code]
hibernate를 사용하기 위한 필수작업인 session bean을 생성해야합니다.
applicationContext.xml
[code]<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    </bean>[/code]
설정을 여기에 다 적고, datasource를 session에 di를 해도 상관없고, hibernate.cfg.xml파일에 설정해도 다 되더군요. 우선 기본적으로 hibernate.cfg.xml파일을 직접 만들어주니 configLocation설정해서 해봅시다.

하이버네이트 설정파일에서 SQL문을 직접볼 수 있는 옵션을 추가합시다.
Source Packages -> default package -> hibernate.cfg.xml파일을 열어봅니다.
design모드에서 Configuration Properties에서 add한 뒤, hibernate.show_sql값 true로 추가합니다. 쿼리를 직접보도록...-_-;

이제 뭐 셋팅이 끝났네요. 셋팅 끝나면 뭐 그냥 쓰기만 하면 됩니다-_-;
다음 장에서......
 
Posted by 머드초보
,
 
열이 아빠님의 글을 보고 http://koko8829.tistory.com/575 삽질을 시작했습니다.
사실 Spring Bean을 BlazeDS에서 사용하는 것은 이미 다른 사람들이 많이 만들었죠^^ 근데 스프링소스에서 공식적으로 지원을 해주다니 대단합니다^^ 제가 한번 해봤습니다-_-; 스프링과 BlazeDS의 기본만 알고 있어서 하는데에는 무리가 없었습니다-_-;

환경 : JDK 6 U 10 + Tomcat 6.0.18 + BlazeDS 3.2.0.3978 + Spring BlazeDS Integration 1.0.0.M1 + Flex SDK 3.2 + Flex Builder 3.0.2 + SpringFramework 2.5.6

SpringFramework 2.5.6 Download
BlazeDS 3.2.3978 Download
Spring BlazeDS Integration Download

쉬운 개발환경을 위해 플렉스빌더에서.....
New Flex Project -> Project name은 SpringBlazeDS, Web application을 선택하고, Application server type은 J2EE로 합니다 ^^ Next를 하시면 Target runtime은 Tomcat 6.0, Flex WAR파일은 BlazeDS를 다운로드해서 blazeds.war파일을 선택합니다. Finish를 때려줍니다-_-;

프로젝트의 Properties에서 Flex Server에 보면 Context root부분이 /WebContent로 되어있는데, /SpringBlazeDS로 바꿔줍니다.

라이브러리는 Spring에서 spring.jar, spring-webmvc.jar, Spring BlazeDS Integration에서 org.springframework.flex-1.0.0.M1.jar를 WEB-INF/lib폴더에 복사하면 됩니다.

자바쪽 셋팅을 해봅시다.
Webcontent/WEB-INF/web.xml파일을 열어서 수정합니다.
기존에는 MessageBrokerServlet을 사용해서 하는데, Spring BlazeDS Integration에서는 Spring Servlet을 사용합니다. MessageBroker Servlet을 servlet-mapping과 함께 지워주고, Spring Servlet을 선언합니다.
web.xml
[code]<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>SpringBlazeDS</display-name>

    <context-param>
        <param-name>flex.class.path</param-name>
        <param-value>/WEB-INF/flex/hotfixes,/WEB-INF/flex/jars</param-value>
    </context-param>

    <!-- Http Flex Session attribute and binding listener support -->
    <listener>
        <listener-class>flex.messaging.HttpFlexSession</listener-class>
    </listener>

    <!--  Spring Dispatcher Servlet -->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>
   
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
[/code]
설정파일을 작성하기 전에 초간단 스프링 빈을 하나 만들어봅시다.
service패키지를 하나 만들고, HelloService라는 클래스를 만듭시다.
[code]package service;

public class HelloService {
    public String sayHello(String name) {
        return name + "! 메리추석!";
    }
}
[/code]
이제 /WebContent/WEB-INF/applicationContext.xml파일을 생성합니다.
applicationContext.xml
[code]<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
   
    <bean id="mySpringManagedMessageBroker"
        class="org.springframework.flex.messaging.MessageBrokerFactoryBean" />
       
    <!-- Maps request paths at /messagebroker to the BlazeDS MessageBroker -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
        p:mappings="/*=mySpringManagedMessageBroker" />
   
    <!-- Dispatches requests mapped to a MessageBroker -->
    <bean class="org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter"/>
   
    <bean id="helloService" class="service.HelloService" />
   
    <bean id="hello"
        class="org.springframework.flex.messaging.remoting.FlexRemotingServiceExporter"
        p:messageBroker-ref="mySpringManagedMessageBroker"
        p:service-ref="helloService"/>
       
</beans>
[/code]
기존 MessageBroker가 Spring에 의해 관리된 MesssageBroker로 들어있는 것 같습니다. 그래서 Remote요청이 들어오면 Spring MessageBroker가 해당 destination을 찾아서 해주는 것 같습니다. 그리고, Spring Bean인 helloService를 불러오는 방법은 FlexRemotingServiceExporter를 이용해서 하는 것 같습니다. 요청하고 싶은 Bean을 FlexRemotingServiceExporter에 DI를 해서 사용하는 것이군요.
이곳에서 FlexRemotingServiceExporter의 id가 destination입니다^^ 저기서 hello로 정의했으니 Flex에서는 destination을 hello로 맞춰주면 되겠죠? ^^
나중에 destination을 추가하는 것은 service-config.xml에서 하는 것이 아니라 이곳에서 해야겠죠.
제가 잘못 이해하고 있는 것이 좀 많은 것 같아서...원문을 참조하세요~ ^^

이제 service-config.xml에 추가해야할 부분이 있습니다.
[code]<services>
    <service-include file-path="remoting-config.xml" />
    <service-include file-path="proxy-config.xml" />
    <service-include file-path="messaging-config.xml" />   
    <default-channels>
       <channel ref="my-amf"/>
    </default-channels>   
</services>
[/code]
아....중요합니다. default-channels를 추가해야합니다!

이제 클라이언트로 가봅시다.
SpringBlazeDS.xml
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    <mx:RemoteObject id="srv" destination="hello" />
    <mx:TextInput id="inputName" />
    <mx:Button label="전송" id="btnConfirm" click="srv.sayHello(inputName.text)" />
    <mx:Label id="labelResult" text="{srv.sayHello.lastResult}" />
</mx:Application>
[/code]
RemoteObject로 sayHello함수를 input에 입력해서 결과를 Label에 쓰는 간단한 프로그램입니다.
서버를 실행시키고 실행해봅시다.
사용자 삽입 이미지
로그도 자세히 남는군요.
2008. 12. 27 오전 2:31:42 org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter handle
정보: Channel endpoint my-amf received request.

젠장......어느카테고리에 넣어야 하지-_-; Spring에 넣자-_-;
 
Posted by 머드초보
,
 
아...저번 회 때에는 박재성씨가 준비한 세미나를 들어서 그 때에는 스프링에 관한 것 보다 그냥 협업프로세스를 도울 만한 유용한 프로그램이나 작업 방법을 소개하는 자리였습니다. 그래서 스프링에 관해서는 많이 듣지 못했는데요.

오늘 세미나는 우선 2가지 세션을 못들은 것이 좀 아쉽구요. 그래도 백기선씨의 Spring AOP가 도움이 많이 되었구요. 박찬욱씨의 그 괴물같이 손이 보이지 않을 정도로 하는 라이브로 코딩하는 실력을 보면서 감탄사를 내뱉느라 제대로 못 듣기는 했지만, 꽤나 유용한 시간이였습니다. 그리고 스프링 보안인 Spring Security에 관한 설명도 들었는데....마침 이 시간이 졸려서-_- 잤습니다(발표자님께는 죄송하지만ㅠ)

우선 11시에 도착을 했는데, 20분부터 한다고 공지가 되어있더라구요.

1. 박찬욱님의 Refactoring JDBC Programming
우선 기존 JDBC를 접근하는 방식을 스프링 jdbc templete을 라이브로-_-; 만들어 보는 과정을 보게 되었습니다. 이건 뭐 감탄사밖에 안 나오는 군요. 이런 것을 한번도 보지 못한 저로썬 그냥 놀랄 따름입니다-_-; 보통 이클립스의 리펙토리 기능은 잘 쓰기 힘든데, 저걸 저렇게 활용하는 사람도 있구나 라는 생각이 드는군요 ^^
기존에 JDBC는 Try Catch Finally Try Catch의 반복으로 이루어져있죠. 그래서 그걸 템플릿으로 만들어서 중복코드에 대한 제거를 하고, 바뀌는 부분만 비교해서 잘 보여주셔서 이해가 매우 빨랐습니다. (하지만....휙휙~지나가는 화면들..OTL...)
사실 기존에 DB연동 부분은 그냥 항상 사용하기만 해서 내부 구조를 볼 겨를이 없었거든요. 실제 구현체를 보니 신기할 따름이군요. 그냥 queryForObject, queryForList, update, delete, insert 등의 메소드를 가져다가 쓰기만 했지, 어떻게 돌아가는지 몰랐는데, 이제 보니 확실히는 아니지만, 어느정도 알겠네요. 인터페이스를 활용하여 Strategy패턴을 이용해서 하는 것이더군요. 이제부터 디자인패턴을 공부해야겠다는 생각이 좀 드네요-_-; 사실 Head First Design Patterns책이 있는데...왠지 펼치기 싫습니다만, 이제 펼쳐야겠습니다 ㅠ
아....그리고, 저도 이클립스 단축키를 좀 외워야겠습니다-_-; 저도 이제부터 간지코딩을...-_-;

2. 박현준님의 Spring Security
헉.....순간 졸다가 기절했습니다-_-; Spring Security를 사용 안해봐서 인지 모르겠지만, 내용도 너무 어렵고ㅠ 졸리고 해서....ㅠ 자다가 일어나니 그 데모를 좀 보여줬는데, 대충 내용을 보니, 그....로그인 프로세스를 데모로 보여준 것 같습니다. 인증을 한 페이지를 보여주고 막 그랬던 것 같은데.....사실 잘 모르겠군요 ㅠ
얼마전 OAuth를 공부한 적이 있었는데, Spring Security에서도 지원을 한다고 한 것이 생각나는군요. 갑자기 얘기가 또 새네-_-; 암튼 보안쪽도 공부를 해봐야겠습니다 ㅠㅠ

3. 백기선님의 Spring AOP
우선 AOP에 대한 개념을 쉽게 설명해주어서 좋았구요. 하지만, 제 친구는 AOP에 대한 개념을 처음 접하는데, 용어가 너무 어렵다고 하더군요. 저도 친구들이랑 AOP스터디를 했을 때 advice, advisor, pointcut, joinpoint 등의 용어가 처음에는 헷깔렸는데, 그런 용어를 통해 친구가 그냥 처음에 들으려니까 어려운 부분이 있었나 봅니다. 암튼, AOP에 대한 EMAIL예제를 보여주시고, 1.X대 방식, 2.0.X방식, 2.5방식(어노테이션)을 보여주시고 ^^ 예전에 최범균님의 스프링2.5프로그래밍이라는 책에서 나온 예제가 있는데, 그것이 생각나더군요. 거기에서도 다 나와있었어요. 1.X대 방식은 어떤 인터페이스를 구현하는 것으로 나오고 ^^ 2.0.X는 POJO로 하고, XML설정파일에서 포인트컷을 정의를 해주는 방식이죠. 2.5의 어노테이션은 마법이죠 ^^
아...그리고 신기했던 것이 저도 @AspectJ 붙이면 컴포넌트 스캔이 안되는데, 그걸 포함시킬 수 있더군요.
저는 그냥
[code]<bean class="~~~~.AnnotMyAop" />[/code]그냥 선언해줬는데-_-; 컴포넌트 스캔에 AspectJ클래스를 넣으면 되는군요.
그리고, Spring AOP와 AspectJ를 비교하셨는데, 역시 AspectJ는 안써봐서 모르겠군요-_-;
또 하이버네이트는 제가 안해봐서 몰르겠는데, 이거 db를 객체랑 매핑해주는 거로 알고 있는데, add를 하면 insert를 하는건데, 이거 지가 필요하면 하는 거군요. 그래서 jdbctemplete이랑 같이 쓰면 데이터를 가져오면 insert가 안되서 문제가 발생하는데, 이걸 AOP로 해결할 수 있더군요. AOP를 예전에 회사에 적용해보려고 하다가 실패를 했던 기억이 있어서-_-; 다시 한번 해봐야겠습니다-_-;

근데, 이번 세미나를 마지막으로 무료세미나를 마친다고 한 것 같더라구요. 이제 돈내고 들어야하는건가....
암튼, 어느 정도 좋은 정보를 얻을 수 있었고, 도움이 많이 되었습니다. 스프링에 대해서 공부를 안한지 쫌 됐는데, 다시 한번 되새기게 만들어주네요. 우선 @MVC관련된 강의를 듣지 못해서 좀 아쉽구요. 저도 열심히 공부를 해야겠다는 생각이 드는군요.

이런 모임이 자주 있어서 좋은 정보를 공유했으면 하는데, 아직도 스프링 자료는 외국에서 많이 찾아야해요 ㅠ


 
Posted by 머드초보
,