Spring XML vs Annotation

스프링은 크게 3가지 방식의 설정을 할 수 있다. DB, 빈, 기타등등 스프링 관련 설정들 말이다.

XML             MIXED           ANNOTATION
<---------------------------------------->

그럼 ARABOJA.

XML

스프링의 전통적인 설정 방법이며, 구성을 포함해 모든 자바 빈들을 XML에 정의한다.

  • 원하는 빈만 XML에 담궈 놓고 클래스 목록을 한 번에 볼 수 있다.
  • 필요 시 특정 빈만 주석처리 하는 등 활성화/비활성화가 용이하다.
  • 빈 생성 시 반드시 XML에 정의해줘야 하며, 그렇지 않으면 일반 클래스가 되버린다.
  • 신규 작성시에는 많은 공수시간이 요구되지만, 유지보수 시 부담이 적다.

매우 큰 프로젝트일 경우, 여러 스프링 프로젝트를 운영할 경우 XML 방식을 선호하는 게 이 때문이다.
어노테이션을 쓰게 되면 클래스가 많을 수록 스캔 시간이 길어지지만, 완전 XML에서는 정의된 빈만 스캔하기 때문에 그럴 걱정이 없다.

Mixed

현재 대부분 스프링 프로젝트에서 사용하는 방법이며, 전자정부에서도 기본적으로 이 설정으로 시작하도록 유도하고 있고,
가장 흔한 방식으로, 기본 구성은 XML, 빈 등 가장 많이 차지하는 구성을 어노테이션으로 정의한다.

  • 기본적인 구성 설정(DB, 웹의 경우 Resolver 등)은 XML에 정의한다.
  • 나머지 빈은 패키지 범위를 정해놓고 어노테이션에 맡긴다 (annotation-driven)
  • 이후 빈 생성은 어노테이션만 정의하면 바로 클래스 작성 후 배포할 수 있다.
  • 신규 작성 시 XML보다 공수 시간은 줄어들지만, 수정 및 비활성화가 필요할 경우 재컴파일하여 배포해야 한다.

사실 완전 XML에 비해서 크게 단점으로 작용할 만한 요소는 없다. 대부분 많이 바뀌는 게 바로 기본 구성 성정인 DB나 메시지 정의들이니.
대신 스프링 앱 시작 시 스캔을 시작한다. 여기서 패키지 범위 내 클래스가 많을 수록 스캔 시간은 어쩔 수 없이 길어지게 된다.

Annotation

아예 XML을 쓰지 않고 모든 구성과 빈을 자바에 맡겨놓는 방식이다.

  • 기본 구성 설정부터 @Configuration 어노테이션을 정의한 기본적 클래스로 설정할 수 있다.
  • 이 때 가장 강점은, Strong Type에 가장 부합해 빈 클래스의 무결성을 가장 빨리 검사하고 보장할 수 있다.
  • Java 기반 구성 설정은 Spring 3.0부터 지원하기 때문에 이하 버전에서는 할 수 없다.
  • 자바만 쓰기 때문에 개발생산속도는 가장 빠르지만, 변경 시마다 재컴파일 해야 하기 때문에 유지보수 속도는 매우 떨어진다.

JRebel 같이 실시간 핫스왑으로 개발하거나, 이제 아예 Spring Boot 내부 기능을 통해 재시작 없이 개발할 수 있는 기술의 발달로
더이상 완전한 어노테이션 개발의 문제점은 사라진 상태. 하지만 구성 설정부터 빈까지 모두 스캔해야 하기 때문에 시작속도는 당연히 더 느린 편.
게다가 사소한 수정조차 재컴파일을 거쳐야 하기 때문에 대응속도가 빠르게 요구되는 프로젝트에서는 어려움이 따를 수 있다.

공통

역시 정적 문자열 정의는 properties 가 진리. 텍스트 바꾸고 배포만 하면 되니까.
Spring 4.0 부터는 yml 방식의 구성 또는 메시지도 지원한다고 하니, 좀 더 읽기 쉽고 구조적 구성을 원하면 이거 쓰는것도 나쁘진 않다.

결론

  • 대규모 프로젝트이거나 분산 프로젝트인가? 신규개발은 어렵지만 유지보수가 용이한 XML 설정을 사용하라
  • 별다른 특이사항이 없을 경우 가장 흔히 사용하는 Mixed 방식은 스프링에 접근하기 딱좋다.
  • 가볍고 빠른 생산성으로 소규모 서비스를 원한다면, Spring Boot를 통한 Annotation 기반이 도움이 될 것이다.
  • 프로토타입이나 목업인가? 데모 앱이 필요한가? 그러면 제발 스프링 쓰지마 병시나.

끗.

composite / 2017년 9월 12일 / Piss Development / 0 Comments

스프링 4 나온 기념 예제 개발중.

개발환경은 다음과 같다.

  • 자바 1.6 이상
  • Spring 4.0.0.RELEASE
  • Spring MVC
  • 웹 서버는 내장형 톰캣 (Embedded Tomcat 7.0.47) 이므로 별도 웹서버 필요 없음.

실행 방법은 그냥 net.sample.app.Application 을 자바로 실행하면 내장 웹서버가 실행된다.

그런 다음 http://localhost:8080 들어가 Hello World! 나오면 된다.

아직 해결되지 못한 문제가 있다.

뷰 파일 경로 못찾고 있다.

오픈소스이며 누구나 참여할 수 있으니 같이 머리 맞대고 풀었으면 좋겠다.

https://github.com/composite/spring4-mvc-embed-tomcat7-example

composite / 2013년 12월 19일 / 미분류 / 0 Comments

JSP 및 스프링 뷰를 대체할 최고의 템플릿 언어.

예전에 Scalate 소개글인지 뭔지 여튼 올렸었는데.

괜히 소개한것 같다. 퍼포먼스가 안나온다는 보고도 있고. 나도 경험했고, 실무에 쓰기엔 스칼라 기반은 아직도 팀 커뮤니케이션에 안맞는다는 결론이 나왔다.

짬뽕이 좋은 것만은 아닌 것 같다.

만약 자바 대신 스칼라 프로젝트라면 스칼렛은 더좋은 선택이지만, 자바 프로젝트라면, 괜한고생 하지 않길 바란다.

어쨌든 오늘 JSP와 JSTL 등의 기본 템플릿 언어의 지루함을 해소해줄 2가지 템플릿 엔진을 소개하겠다.

모두 그냥 JSP 페이지 및 스프링 프레임워크에서 사용 가능하다. 취향에 맞게 쓰면 된다.

1. jade4j

프로젝트 사이트 : https://github.com/neuland/jade4j

node.js 를 알게 된 개발자라면 express 웹 프레임워크와, 그 유명한 템플릿 언어 jade를 기억한다면,

당신은 바로 이 프로젝트를 적용해도 손색이 없을 것이다.

jade 공식 페이지에서 다른 언어 바인딩 리스트에 올라와 있으며, jade 3 템플릿 구조와 거의 완벽하게 호환이 가능하다.

비록 커뮤니티 참여로 이루어지긴 해도 상당히 안정적으로 돌아가며, jade 오류 발생시 JSP하고는 차원이 다른 친절함의 극치 오류 페이지를 보여줄 것이다. (play! framework 배낀 느낌 나도 그래도 좋구랴.)

jade4j 를 적용하는 방법은 프로젝트 사이트를 보면 되고,

jade 템플릿 사용법은 그냥 jade 공식 홈페이지를 가면 된다. 다 되니 걱정말고 쓰도록 하자. (http://jade-lang.com/)

자바 웹 프로젝트로 jade 채용하기 전에 충분한 연습이 필요하겠지만, 원체 js 로 만든거라 실습이 쉽게 가능하니 문제는 없을 것이다. 실제 사례도 있기 때문에 실무에 써도 문제될 거 없다.

참고로 이녀석의 실행식(Expression)은 아파치 JEXL(http://commons.apache.org/proper/commons-jexl/)을 채용했다.

그냥 JSP 느낌 나는 실행식이라고 생각하면 된다. 자바답다고. 그러니 자바답게 jade 쓰면 된다.

JSTL 에서는 메서드 지원 안되고 함수 쓰려면 JSTL 태그 정의를 해야 하지만 이건 그딴거 필요없이 바인딩 후 호출하자.

2. rythm

프로젝트 사이트 : https://github.com/greenlaw110/rythm

외국의 닷넷 아닌 웹 개발자들에게 많은 부러움을 산 ASP.NET MVC 3 의 강력한 템플릿 엔진인 Razor 엔진의 자바 버전이라고 보면 된다.

HTML 깨뜨릴 일이 전혀 없으며, 깔끔하고, 문자열과 XML 문법만 잘지키면 완벽하게 소화 가능한 매력이 숨어있다고 보면 된다.

참고로 Play! Framework 의 기본 템플릿 엔진이 이 Razor 기반의 변형 엔진인데, 이녀석은 자바 MVC에 맞게 템플릿을 구성했다고 봐도 좋을 것이다.

게다가 이녀석은 JSP 및 스프링 프레임워크, 심지어 Play! Framework 뷰 엔진으로도 지원한다.

중국과 호주 자바 웹 실제 프로젝트에 투입해도 탈 하나 없는 뷰 엔진이기 때문에 HTML 안깨뜨리고 깔쌈하게 하고자 하는 웹 프로젝트에 이 템플릿을 고려해도 좋을 것이다.

JSTL과는 달리 메서드 호출도 지원되며, Transformer를 통하여 템플릿을 확장할 수 있다. 메서드 확장 개념으로.

번외 3. Thymeleaf

프로젝트 사이트 : http://www.thymeleaf.org/

요즘 인기를 누린다는 블로그 글이 있길래 봤더니.. 닷넷의 Spark 비슷한 HTML 태그/속성 기반의 템플릿 언어다.

대신, namespace 제공 후 사용으로 HTML/XML 처럼 친숙하며, JSP 처럼 태그를 깨뜨리거나 중간에 박는 형식을 최대한 줄임으로써 기존 HTML 사용하면서 깔끔하게 데이터를 출력해주는 괜찮은 템플릿 엔진이다.

현재 2.1 버전이 안정화된 최신이며 쌩 JSP 및 스프링도 지원되니 주저없어 테스트해도 무방할 것이다. 실무에 써도 무방하다.

여담으로 JSTL의 경우 2부터 메서드 호출 지원이 되기는 하는데 여태까지 프로젝트에서 JSTL 2 쓰는 프로젝트를 못봤다.

기술이 좋아지면 뭐해.. 편리해지게 해줘도 당췌 쓰질 않는데.

composite / 2013년 12월 4일 / 미분류 / 0 Comments

재밌는거 발견했다. 유명한 브금저장소.

브금저장소 말이다.

http://bgmstore.net

이녀석 JSP 로 만들었구나.

그것도 서블릿빨이다. 물론 뷰페이지는 JSP이고.

대신 CDN 연동을 하니 그 많은 swf 를 저장하고 관리하지 아니었으면 사이트 뻗고도 남았을 터.

업로드도 자바를 쓰고, 연동 서비스를 이용하나보다.

CDN 서비스는 알게뭐야. 한국에서 잘되면되지. 어자피 그들도 트래픽 감당 안되서 CloudFlare 쓰는데. ㅋㅋ

가끔 한국 서버가 잡히긴 하는데.. 나라면 한국 서버로 잡히는것보다 CloudFlare 통해서 숨기는게 아주 효율적이라 생각하지만

문제는 구글 통계 서비스하고 잘 안맞는대나 모래나. 근데 지금 별문제 없다 하니 굳이 뭐..

그냥 그렇다고. 일베충들 위한 브금저장소인 핱브는 일베와 같은 PHP 에서 변형된 XE 엔진이니 그리 알도록.

composite / 2013년 11월 24일 / 미분류 / 0 Comments

Scalate Template Engine 이용시 참고점

유지보수 항목에 자바 웹 개발항목도 포함되어 있어서 본의아니게 JSP를 하게 되었다.

여기서 JSP 템플릿 엔진 중 흥미롭고 재밌고 나한테 딱 맞는 템플릿 엔진이 있는데 바로 Scalate 이다.

이녀석은 자바의 스칼라 언어 기반의 템플릿 엔진인데, 자바의 JSP 대신 스칼라의 SSP로 JSP 처럼 꾸밀 수 있고,

또한 node.js 의 템플릿 엔진으로 깔끔하고 간결해서 유명한 jade 엔진도 있다.

닷넷의 경우 jade 템플릿 엔진은 spark 템플릿 엔진에서 지원한다고 한다.

어쨌든 닷넷의 Razor 템플릿 엔진같이 간결한 맛이 없어서 아쉬워지다가 스칼렛에 jade 엔진에 눈맞아 사용하고 있다가 한가지 장벽에 부딪혔다.

바로 web.xml 에서

  <welcome-file-list>
    <welcome-file>index.jade</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
  </welcome-file-list>

이 부분 중 index.jade 파일을 먼저 불러오는데, 파일을 불러오긴 하지만 템플릿 파싱이 안된 쌩으로 출력된다는 것이다.

이 어이없지 아니할 수 없는 부분이 아니던가. 스칼렛 서블릿 세팅은 제공한 서블릿 필터로 세팅만 하면 끝난다.

  <!– START: Scalate config –>
  <filter>
    <filter-name>TemplateEngineFilter</filter-name>
    <filter-class>org.fusesource.scalate.servlet.TemplateEngineFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>TemplateEngineFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!– END: Scalate config –>

어쨌든 직접 jade 파일 요청시 템플릿 파싱은 되는데 폴더 요청(/)을 통한 템플릿 파싱이 전혀 지원되지 않아서 고심했으나,

해결 방법을 찾았기에 여기에 블로그에 기록한다.

  <!– START: Scalate config –>
  <filter>
    <filter-name>TemplateEngineFilter</filter-name>
    <filter-class>org.fusesource.scalate.servlet.TemplateEngineFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>TemplateEngineFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 

  </filter-mapping>
  <!– END: Scalate config –>

여기 굵은 부분을 추가하니 말끔하게 해결되었다. http://localhost/ 만 호출해도 jade 템플릿이 파싱되어 출력된다.

여기 관심있는 분들은 Scalate 홈페이지를 참고하시라. jade 템플릿 엔진은 실무에 써도 전혀 손색없다. 스프링 연동도 당연히 지원되니 관심있으면 직접 들어거 Getting Started 메뉴를 참고하시라.

composite / 2012년 12월 22일 / 미분류 / 0 Comments