Sagan Project(세이건 프로젝트)는 Spring Framework를 개발/운영하는 팀이 참여한 spring.io 의 레퍼런스 앱 프로젝트입니다.
인터넷에 검색하면 수 많은 Spring Framework로 된 많은 예제 파일들이 많으나, 돌아가지 않는 예제가 많거나, 오래된 코드.라이브러리 사용으로 최신 버전의 Java와 충돌되거나 라이브러리들의 충돌로 작동이 안되는 경우가 많습니다.
위의 문제를 해결하고자 Spring.io에서 Spring Framework로 된 레퍼런스 앱인 Sagan Project를 오픈소스화를 하여 출시하였습니다.
아래는 Sagan Project에 대한 SpringOne2GX 2014 동영상과 슬라이드입니다.
Inside spring.io: a Production Spring Reference Application
Recorded at SpringOne2GX 2014. Speaker: Brian Clozel Slides: http://www.slideshare.net/SpringCentr... Core Spring Track Come take a look inside the newly open-sourced reference application that powers the http://spring.iosite, including:
Idiomatic use of Spring Boot Taking advantage of Spring Framework 4 features A tour of our JavaScript frontend using cujoJS's curl, Bower and Gulp for a clean and modular design Zero-downtime deployment to Cloud Foundry using blue/green deployments And more, with plenty of time for Q&A
Slide 자료
Inside spring.io: a Production Spring Reference Application
Spring 2.x부터 개발을 해본 사람으로서 Spring 4.X까지의 발전을 보니 7년사이에 엄청 많이 바뀌었다는 걸 느꼈음.
(대학원때부터 Spring Framework에 대하여 보긴했음 처음에 IoC(Inversion of Control), DL(Dependency Lookup),DP(Dependency Pull), DI(Dependency Injection) 개념이 책에 나오니 이거 뭥미 하며 헤메던 기억이 나군요 (MVC 소스코드만 Copy & Paste만 하면 되긴 하다만 그런건 학원에서 언제든지 배울수 있는 내용들 -_-;;)
2011년도말 슬라이드이지만 아직도 Spring Framework3를 사용하는 곳이 많으므로 아직도 볼만한 자바 웹개발 시작하기 슬라이드 모음
(현재 2013년 12월경에 Spring Framework 4.0이 나왔지만 아직 4.0대로 완전히 넘어가지 않았고 3.0과 비슷한 점이 많으니 3.0쪽을 많이 보면 됨. 2.0에서 3.0으로 넘어갈때 @(annotation)으로 바뀌면서 완전 바뀌고 3.0에서 4.0으로 넘어갈때엔 xml를 가급적 피하고 java단에서 처리하려는 느낌이 많이 듦)
소스를 받아서 Tomcat으로 웹 소스를 실행하려니 에러 발생. 아래와 같은 에러가 발생했다.
2012. 7. 9 오후 5:59:38 org.apache.catalina.core.ContainerBase addChildInternal 심각: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/***]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:650) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1582) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:142) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5274) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 11 more 2012. 7. 9 오후 5:59:38 org.apache.catalina.startup.HostConfig deployDescriptor 심각: Error deploying configuration descriptor C:\***\***.xml java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/***]] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:904) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:650) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1582) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
위의 문제는 웹 검색을 한 결과 "라이브러리 충돌이 났다"라는 답이 나왔다.
아래의 라이브러리는 M2로서 메이븐 버전입니다. 문제가 있는건 아니지만 아마도 라이브러리 충돌이 나는것 같습니다. 대신 다른 버전의 라이브러리로 사용을 해보시던가 아니면 첨부파일에 있는 예제로 다시 한번 확인 부탁드리겠습니다.
웹 소스에선 org.springframework-3.1.0.M2 를 사용하고 있었고 위의 에러가 주르륵 나왔었고, 위의 글을 보고 나서 최신 버전인 org.springframework-3.1.1.RELEASE 로 변경하였더니 정상적인 코드라고 잘 돌아갔음.
라이브러리 충돌이 왜 났을까? 저장소에 저장된 라이브러리가 최종 소스니, 예전에 문제 없었던것 같은데 왜?