Petclinic을 통해 스프링 3.0 주요기능 살펴보기

Spring Framework 3.0 M2 released

스프링 3.0 m2가 배포됐습니다. 유겐 휄러가 주요 기능을 잘 정리해 뒀네요. 아쉬운건 아직도 레퍼런스 업데이트가 되지 않았다는 겁니다. 어쩔 수 없이 아쉬운 사람이 우물 판다고 예제 코드를 뒤적거릴 수밖에 없더군요.

EL 지원에 관한 예제는 petclinic-servlet.xml에서 볼 수 있습니다.

    <bean id=”visits” class=”org.springframework.samples.petclinic.web.VisitsAtomView”/>

    <bean id=”vets” class=”org.springframework.web.servlet.view.xml.MarshallingView”>
        <property name=”contentType” value=”application/vnd.springsource.samples.petclinic+xml”/>
        <property name=”marshaller” ref=”marshaller”/>
    </bean>

    <bean class=”org.springframework.web.servlet.view.ContentNegotiatingViewResolver”>
        <property name=”mediaTypes”>
            <map>
                <entry key=”xml” value=”#{vets.contentType}”/>
                <entry key=”atom” value=”#{visits.contentType}”/>
            </map>
        </property>
        <property name=”order” value=”0″/>
    </bean>

이렇게 visits와 vets 빈의 contentType 속성에 들어있는 값을 #{vets.contentType}, #{visits.contentType} 이런식으로 참조하여 다른 빈에 주입할수 있습니다. visits에는 contentType속성이 없는 것 같지만 이 속성은 AbstractView에 있는 속성이고 VisitsAtomView 클래스가 그것을 상속했기 때문에 기본값을 가지게 될 겁니다.

다음으로 RestTemplate 기능은 컨트롤러에서 볼 수 있습니다.

@Controller
@RequestMapping(“/owners/{ownerId}/pets/new”)
@SessionAttributes(“pet”)
public class AddPetForm {

    @RequestMapping(method = RequestMethod.GET)
    public String setupForm(@PathVariable(“ownerId”) int ownerId, Model model) {
        Owner owner = this.clinic.loadOwner(ownerId);
        Pet pet = new Pet();
        owner.addPet(pet);
        model.addAttribute(“pet”, pet);
        return “pets/form”;
    }

}

이런 식으로 URL의 일부를 매서드 매개변수로 바인딩 해줍니다. 바인딩 할 필요가 없는 경우 와일드 카드를 이용할 수도 있습니다.

@Controller
@RequestMapping(“/owners/*/pets/{petId}/visits/new”)
@SessionAttributes(“visit”)
public class AddVisitForm {

    @RequestMapping(method = RequestMethod.GET)
    public String setupForm(@PathVariable(“petId”) int petId, Model model) {
        Pet pet = this.clinic.loadPet(petId);
        Visit visit = new Visit();
        pet.addVisit(visit);
        model.addAttribute(“visit”, visit);
        return “pets/visitForm”;
    }

}

이런 식으로 말이죠. 간단해 보이네요~

다음으로는 AtomView 지원 기능도 살펴봤습니다. 3.0에 추가된 AbstractAtomFeedView 이 클래스를 상속해서 구현하면 되더군요.

public class VisitsAtomView extends AbstractAtomFeedView {

    @Override
    protected void buildFeedMetadata(Map<String, Object> model, Feed feed, HttpServletRequest request) {

    }

    @Override
    protected List<Entry> buildFeedEntries(Map<String, Object> model,
            HttpServletRequest request, HttpServletResponse response) throws Exception {

    }
   
}

구현은 이런 식이며 피드 메타 데이터는 Feed 객체에 Id와 Title을 그리고 Updated에 날짜를 채워줍니다. 코드에 에러가 있어서 Feed 라는 클래스를 자세히 보지 못해서 아쉽네요. 그 아래 매서드에서는 Entry List를 만들어서 반환해줍니다. Entry도 역시 자세히 보고 싶은데 못봤습니다. id, title, updated, summary 정보를 설정하는 코드로 대충 어떤 속성이 있는지 예상할 순 있었습니다.

마지막으로 OXM 기능을 살펴봤는데 끝내주더군요. @_@

    <bean id=”vets” class=”org.springframework.web.servlet.view.xml.MarshallingView”>
        <property name=”contentType” value=”application/vnd.springsource.samples.petclinic+xml”/>
        <property name=”marshaller” ref=”marshaller”/>
    </bean>

    <oxm:jaxb2-marshaller id=”marshaller”>
        <oxm:class-to-be-bound name=”org.springframework.samples.petclinic.Vets”/>
    </oxm:jaxb2-marshaller>

보시다시피 MarshallingView는 스프링 3.0에서 제공하는 클래스고 Vets는 도메인 클래스입니다. OXM을 지원하는 스키마까지 제공하는군요. 저렇게만 설정하면 객체를 알아서 XML로 변환해주느냐???… 아니요 한가지 더 필요합니다.

 @XmlRootElement
public class Vets {

    private List<Vet> vets;

    @XmlElement
    public List<Vet> getVetList() {
        if (vets == null) {
            vets = new ArrayList<Vet>();
        }
        return vets;
    }

}

캬… 뭐 대충 눈으로 보면 뭐하는건지 알 수 있게해주는 직관적인 코드입니다.

자 이정도면 대충 주요 기능은 거의다 조금 살펴본 것 같습니다. 예제 코드좀 돌려보면 좋겠는데 그건 나중에 해봐야겠습니다. 지금은 번역 땜시..-_-;;

스프링 프레임워크 3.0 m1 임박.

참조: http://jira.springframework.org/browse/SPR?report=com.atlassian.jira.plugin.system.project%3Aroadmap-panel

아마도 S1A 컨퍼런스에 맞춰서 하나 공개하고 싶었는지 이슈를 뒤로(m2)좀 미룬거 같습니다. 캬오..

눈에 띄는 이슈 몇 가지는 흠..
– 내부 코드를 자바 5 기반으로 업그레이드
@RequestMapping에서 URI 템플릿 기능 제공
RSS/ATOM 뷰 지원
@RequestParam에 defaultValue 속성 추가
Expression Language Support(모르겠음)

흠.. REST는 m2에 추가되지만 이번에 추가되는 기능 중에 URI 템플릿 기능과 RSS 지원 기능 그리고 @RequeestParam에 defaultValue 속성 추가는 당장 개발에 써먹을 수 있어 보입니다. 하나 더 EL 기능에 대한 건 잘 파악이 안 됐는데 저게 JSF를 지원하는 기능인건지.. 아님 빈 XML 설정 파일에서 EL을 쓸 수 있게 해주겠다는 건지 좀 햇갈리네요. 자세히 봐야겠습니다.

Spring 2.5 on the Way to 3.0 – 유겐 휄러

참조 : Spring 2.5 on the Way to 3.0

Spring One 2008에서 유겐 휄러의 발표 동영상을 보여줍니다. 별점은. 3.2/5 정도 됩니다. 지난 번에 봤던 Using Spring Security (별점 4/5)보다 평점이 조금 낮네요.

JDK 6 지원
– JDK 1.4, 1.5 호환(1.3은 안 함)
– JDBC 4.0 지원(native connections, LOB 핸들링)
– JMX MXBenas

AspectJ LTW 지원

Java EE 5 지원

JSR-250 애노테이션 지원
– @PostConstruct, @PreDestroy
– @Resource
– self describing.

Further Java EE 5 Annotations
– @WebServiceRef/@EJB
– @TransactionAttrubute
– @PersistenceContext/@PersistenceUnit

Autowiring Annotation
– specific autowiring by type
– @Qualifier

Autodetectable Component
– @Component

@Configurable with AspectJ
– <context:load-time-weaver aspectj-weaving=”on” />
– <context:spring-configured />
– @Configurable

@Transactional with AspectJ
– <context:load-time-weaver aspectj-weaving=”on” />
– <tx:annotation-driven mode=”aspectj” />

Annotated MVC Controllers
– @Controller
– @RequestMapping
– @RequestParam
– @ModelAttribute

Test Context Framework
– @ContextConfiguration
– @TransactionConfiguration
– JUnit 4.4 지원.

Tradeoffs
– 재컴파일(XML 설정 변경은 재컴파일 필요 없다.)
– 설정의 외부화(애노테이션은 클래스를 보면 내용을 알 수 있다.)
– 설정 재정의 가능 여부(애노테이션 설정 바꾸면 컴파일 필요하다.)

Spring 2.5 정리
– Java 5와 Java EE 5 완전 지원
– ApsectJ와 보다 긴밀한 연동
– 애노테이션 설정 강화

The Roadmap for Spring 3.0
– 7월까지 2.5.6
– 8월에 3.0 M1
  – REST 지원
  – 다양한 EL 지원
– Spring 3.0 GA는 4분기 중으로..
=> 흠.. 이미 8월 지난지 오래 됐는데, M1 소식도 못들었네요. 내년 초를 기대해봐야겠네요.

Spring 3: Core Revisions
– Java 5+ 지원
  – 스프링 코어 API에 Generic 적용
– J2EE 1.4+ 호환(웹스피어 6.1, 웹로직 9.2, JBoss 4.2)
– 스프링 EL
– 새로운 커테이너 기능 제공(annotated factory methods)
=> 흠. 제레닉 코드가 코어 API에 들어가면.. 혹시 GenericDAO 같은 거도 스프링이 제공하는건가.. 캬오..

Spring 3 and the Web Space
– 개정된 자바 웹 표준 지원(포틀릿 2.0, 서블릿 3.0)
– REST 지원
– conversation 관리
– 애노테이션 기반 위자드 컨트롤러
=> 스프링 3이 conversation이랑 애노테이션 기반 위자드 마법사를 지원해주면.. 캬오 멋질듯.

Spring 2.5 Mission Continued

Pruning & Deprecation in 3.0
– 가지칠것
  – Commons Attuributes 지원
  – 예전 TopLink API 지원
– deprecation 계획
  – 예전 MVC 컨트롤러 클래스 계층 구조
  – 예전 JUnit 3.8 테스트 클래스 계층 구조
=> 애노테이션 기반 시설 중심으로 가면서 예전 시설은 deprecation.

Spring 3.0 Summary
– REST, EL
– RESTful URI 맵핑, 포틀릿 2.0
– Java 5+, Spring 2.5 환경에서 그대로 호환 가능.

아음.. 발표 시간이 64분인데, 55분동안 2.5 얘기만 하다가 3.0 얘기는 빠르게 지나가 버려서 아쉽습니다. 그래서 별 세개만 줬어요. ㅋㅋ 유겐 횽님 Spring One America에서는 스프링 3.0 얘기 좀 더 해주세요. ㅠ.ㅠ 소스도 배포해 주시구요. 3.0에서 저는 컨버세이션 관리와 위자드 마법사가 제일 궁금해요. 그 다음으로는 코어 API에 추가할 제네릭 클래스들 중에 GenericDao같은 것들도 제공할 것인지도 궁금하구요. 마지막으론 스프링 EL도 궁금한데.. 그건 JSF 확장 기능이겠죠? JSP에서도 사용 가능한건가? 어쨋든 S1A에서 뵙겠습니다. 바이바이