스프링 2.5 @MVC 컨트롤러 테스트관련 궁금한거..

@Controller
@RequestMapping(“board/*.do”)
@SessionAttributes(value=”board”)
public class BoardController {

    @Autowired
    private BoardService boardService;

    @Autowired
    private BoardValidator validator;

    @RequestMapping
    public void list(ModelMap model){
        model.addAttribute(boardService.getAll());
    }

    @RequestMapping(method=RequestMethod.GET)
    public void add(ModelMap model){
        model.addAttribute(new Board());
    }

    @RequestMapping(method=RequestMethod.POST)
    public String add(@ModelAttribute(“board”) Board board, BindingResult result, SessionStatus status){
        validator.validate(board, result);
        if(result.hasErrors())
            return “board/add”;
        else{
            this.boardService.saveOrUpdate(board);
            status.setComplete();
            return “redirect:board/list.do”;
        }
    }

    @RequestMapping
    public void delete(int id){
        boardService.deleteById(id);
    }

}

위 코드는 간단한 스프링 2.5 @MVC 컨트롤러입니다. CRUD 중에서 U 관련 코드는 생략했습니다.

이 컨트롤러를 작성하면서 확인하고 싶었던 걸 정리하면 다음과 같습니다.
1. board/list.do 라는 요청 결과를 보여줄 뷰는 WEB-INF/board/list.jsp 파일이 맞는지..(ViewResolver 확인)
2. board/list.do 라는 요청을 했을 때 결과 뷰에 넘어가는 모델 객체 중에 List<Board>가 있는지. 그리고 그 모델 객체의 이름이 boardList가 맞는지.(ModelAndView 확인)
3. board/add.do GET 요청이 오면 저 컨트롤러의 add(ModelMap) 메소드가 호출되는지.(RequestMapping 확인)

이 때 2번은 쉽게 테스트가 가능합니다. 인자로 넘겨주는 ModelMap 객체를 하나 만들어서 넘겨주고 해당 메소드를 호출 해보고 ModelMap 객체를 뒤져보면 테스트 하고자 하는 데이터를 찾을 수 있습니다.

그러나.. 1번은 ModelAndVIew 객체를 반환하도록 컨트롤러 코드를 고치지 않는 이상 어떻게 테스트 할 수 있을지 감이 안잡힙니다. 스프링 MVC CoC를 적극 활용하려고 작성한 코드인데 명시적으로 뷰이름을 설정해버리면 그런 의도가 무색해지니까요..

3번도 마찬가지 입니다. 이건 더 감이 안 잡힙니다. 테스트를 할 때 만드는 ApplicationContext가 WebApplicationContext도 아니라서 스프링이 기본으로 등록해주는 빈(request handler, adapter 등)들이 없을 것이기 때문에 스프링 테스트만 가지고는 테스트가 어려울 것 같다는 생각이 듭니다.

어쩌면 컨트롤러 테스트가 아닐 수도 있겠습니다. 스프링 프레임워크가 제공하는 기능에 대한 테스트일 수도 있으니 스프링 코드에서 뷰 리졸버와 요청 맵핑 클래스에 대한 테스트로 만족하고 넘어갈 수도 있겠지만.. 글쎄요. 그래도 왠지 테스트가 하고 싶네요. 혹시 HttpUnit으로 이런걸 할 수 있는건가요. 써보지 않았는데.. 함 살펴봐야겠습니다.

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에서 뵙겠습니다. 바이바이

스프링 2.5 기반(JUnit 4.4 사용) 테스트 코드

위의 코드에 보시면, Context 파일을 명시하고 있지 않습니다. 스프링 2.5에서 도입한 COC중 하나로 생각할 수 있는데요. 만약 테스트 코드를 담고 있는 클래스가 whiteship.MemberTest 면 whiteship/MemberTest-context.xml 이라는 파일을 기본 설정 파일로 읽어오려고 합니다. 물론 명시적으로 설정할 수도 있습니다.

사용자 삽입 이미지
그리고 세터도 없이 @Autowired 애노테이션을 사용하여 Member 객체를 가져오고 있습니다.

위 소스코드를 작성할 때 주의 할 것은.. JUnit 4 라이브러리를 이클립스의 자동완성(컨트롤 + 스페이스)으로 추가하면 안됩니다. 스프링 소스 코드를 받을 때 같이 받은 lib/junit에 있는 jar 파일을 빌드패스에 추가해주어야 합니다.(둘 다 같은 4.4같은데 RunWith 애노테이션의 인자가 다른 것 같습니다.)

따라서 위의 코드를 돌리는데 필요한 Jar 파일은 다음과 같습니다.

  • dist 폴더의 spring.jar (스프링 컨테이너 필요함.)
  • dist/modules 폴더의 spring-test.jar (SpringJUnit4ClassRunner.class 필요함.)
  • lib/jakarta-commons 폴더의 commons-logging.jar (spring.jar 가 종속함.)
  • lib/junit 폴더의 junit-4.4.jar (@RunWith, @Test, assertNotNull 필요함.)