아파치 서버 시작시에 wrong ELF class: ELFCLASS32 와 같은 오류 메시지가 보인다면..
관련 모듈을 서버에 맞게 32비트 혹은 64비트로 갖다놓아야한다.
리눅스 서버 정보 확인하려면 uanme -a 명령어 사용하면 된다.
Monthly Archives: 4월 2016
SiteMesh 메뉴얼 번역본
SiteMesh는 Decorator Tag, Page Tag 2개의 tag 라이브러리를 제공한다. Decorator Tag는 decorator page를 생성할 때 사용되는 tag이고, Page Tag는 decorator 페이지 내에서 다른 decorator를 포함할 때 사용된다.
Decorator Tags
<decorator:head />
원래 웹페이지의 HTML <head> 태그의 내용을 추가한다. 속성은 없다.
<decorator:body />
원래 웹페이지의 HTML <body> 태그의 내용을 추가한다. body의 onload, onunload 이벤트의 바디 속성은 body.onload 와 body.onunload decorator에 의해 포함되어 쓰일 수 있다.
<body onload="<decorator:getProperty property="body.onload" />">
<body onload="alert('1');" bottommargin=5>
좀더 자세히 알기 위해서는 getProperty를 참조할 것. 속성은 없다.
<decorator:title [ default=”…” ] />
Insert title of 원래 HTML 페이지의 title 태그로부터 얻은 title을 추가한다. title을 찾을 수 없다면, value값을 default로 지정할 수 있다.
<decorator:getProperty property=”…” [ default=”…” ] [ writeEntireProperty=”…” ]/>
원래 페이지의 속성을 추가한다. HTMLPage interface를 이용하여 해당 페이지의 속성들을 얻어낼 수 있다.
property : 추가할 속성의 이름 (key)
default : 속성을 발견하지 못헀을 때, default로 지정되는 값
writeEntireProperty : 1, yes, true, t, y 로 지정했을 때, 이름을 포함한 속성값(propertyName=”propertyValue”)이 그대로 쓰여진다.
예)
decorator: <body bgcolor="White"<decorator:getProperty property="body.
onload" writeEntireProperty="true" />> undecorated page: <body onload="document.someform.somefield.focus();"> decorated page: <body bgcolor="White" onload="document.someform.
somefield.focus();">
<decorator:usePage id=”…” />
decorator jsp에서 사용할 수 있는 Page Object id를 지정한다.
id : 지정할 ID
예1)
<decorator:usePage id="myPage" /> <% if ( myPage.getIntProperty("rating") == 10 ) { %> <b>10 out of 10!</b> <% } %>
예2)
<decorator:usePage id="p" /> <% HttpServletRequest req = p.getRequest(); StringBuffer printUrl = new StringBuffer(); printUrl.append( req.getRequestURI() ); printUrl.append("?printable=true"); if (request.getQueryString()!=null) { printUrl.append('&'); printUrl.append(request.getQueryString()); } %> <p align="right">[ <a href="<%= printUrl %>">printable version</a> ]</p>
Page 태그
page 태그는 현재 페이지
The page tags, are used to apply decorators to inline or external content from within the current page.
<page:applyDecorator name=”…” [ page=”…” title=”…” ] > …..body…. </page:applyDecorator>
특정 컨텐츠에 decorator를 적용한다. 해당 컨텐츠는 tag를 통해 body를 지정함으로서, 또는 page 속성을 지정하여 다른 page의 결과를 사용함으로서 인라인(inline)되게 할 수 있다.
name : 포함될 페이지에 적용될 decorator
page : 전체 page에서 쓸 수 있는 외부 자원을 상대적(relative), 절대적(absolute) 패쓰를 이용하여 지정한다.
title : Page.getTitle() 메소드 또는 decorator안에서 <decorator:title/> 를 사용하여 page의 title을 다시 지정(override)할 수 있다. <page:param name=”title”>…<page:param>에서 지정하여 식별이 가능하도록 한다.
Body : decorator가 적용될 내용.
<page:param name=”…”> … </page:param>
파라미터를 decorator로 넘긴다. 이 값은 Page.getProperty() 또는 <decorator:getProperty/>로부터 얻어온 값을 오버라이드할 수 있다.
name : 오버라이드될 파라미터의 이름
Body: 파라미터의 값.
DecoratorMappers
어떤 한 웹 페이지가 파싱이 될 때, 그것은 decorator에 매핑이 된다. 이 매핑은 DecoratorMappers의 체인에 의해 수행된다.
각 요청이 들어올 때마다 체인의 가장 첫번째 mapper는 어느 decorator가 쓰여져야 하는 지를 물어본다. 그래서 Page Object와 HttpServletRequest 객체를 reference로 받고, 해당 decorator가 쓰여지는지 알게 되면 그 decorator를 리턴하고, 모르면 null을 리턴한다.. 만약 null이 리턴 되면, 체인의 다음번 mapper에게 또다시 decorator 찾는 쿼리를 하게 된다.
이런 전체적인 프로세스는 체인에 더이상 mapper이 없거나, 체인에 있는 decorator가 valid한 decorator를 리턴할 때까지 반복된다. 만약 어떠한 mapper가 decorator를 리턴할 수 없는 상태면, 그 page는 전혀 장식이 되지 않고, 원래상태에 따라 화면이 표출될 것이다.
이런 체인의 mapper 호출 방식은 Chain of Responsibility 패턴으로 유명하다.
mapper의 예
- 요청된 페이지의 path를 바탕으로 decorator를 결정한다.
- 로케일, 시간 또는 브라우져에 따라 다른 decroator를 사용한다.
- 검색 엔진 로봇에 맞은 간단한 decorator를 사용한다.
- URL 파라미터, Request 속성 또는 meta-tag에 따라 decorator를 달리 사용한다.
- 미리 저장된 사용자의 셋팅에 맞게 커스트마이즈된 decorator를 사용한다.
DecoratorMapper의 주요 구현은 ConfigDecoratorMapper이다. 이 클래스는 /WEB-INF/decorators.xml 파일을 읽어 mapping과 decorator를 읽는다. 적절한 decorator는 URL 패턴에 따라 적용되어 진다.
Mapper의 종류
Mapper 종류 | 내용 |
---|---|
AgentDecoratorMapper | browser에 따른 decorator를 선택할 수 있도록 한다. browser 타입은 일반적인 경우와 같이 request.getHeader(“User-Agent”)를 통해 구해온다. 다른 mapper들이 특정 decorator를 지칭하여 반환하는 것과 달리 AgentDecoratorMapper는 적용될 decorator의 decorator page이름을 browser에 따라 수정한다. 예를 들어 decorator mapper가 main decorator를 선정했다면 decorator 페이지는 /decorators/main.jsp가 적용될 것이다. 하지만 http 클라이언트가 익스플러라면 main decorator에 /decorators/main-ie.jsp 장식자 페이지를 적용하게 된다. 모질라 기반 browser라면 /decorators/main-ns.jsp가 decorator page로 결정된다. 만약 선정된 decorator page를 찾는데 실패하면 기본 decorator page인 main.jsp가 적용될 것이다. <mapper class="com.opensymphony.module.sitemesh. |
ConfigDecoratorMapper | DecoratorMapper의 디폴트 구현으로서, decorators.xml 파일을 읽어 decorator와 mapping된 데이터들을 읽는다. <mapper class="com.opensymphony.module. |
CookieDecoratorMapper | 쿠키값을 바탕으로 하는 decorator를 선정할 수 있다. |
EnvEntryDecoratorMapper | decorator 이름으로 web-app 환경 entry에 대한 레퍼런스를 허락한다. |
FileDecoratorMapper | 파일 이름을 주어 decorator의 이름을 취급한다.
<mapper class="com.opensymphony.module. |
FrameSetDecoratorMapper | page가 HTMLPage나 isFrameSet()의 리턴값이 true일 때, 특정 decorator를 선정할 수 있도록 해준다. 그 decorator의 이름은 주어진 property에서 지정할 수 있다. <mapper class="com.opensymphony.module. |
InlineDecoratorMapper | inline decorator를 사용할 때, 올바른 decoraotor가 무엇인지 사용할 때 선정할 수 있다. |
LanguageDecoratorMapper | browser에서 page 요청에 대해 “Accept-Language” HTTP 헤더를 이용하여 language 페이지를 결정할 때 선정할 수 있다. locale에 따라서 decorator의 파일의 이름에 ‘-en’에 붙여져서 사용될 수 있도록 지정할 수 있다. <mapper class="com.opensymphony.module. |
PageDecoratorMapper | 메타 태그에 decorator 항목이 있을 때 장식자를 리턴한다. PageDecoratorMapper는 여러 파라미터를 받는다. 밑의 예를 보면, PageDecoratorMapper는 첫번째 파라미터로 meta.decorator 프로퍼티를 받는다. 이 의미는 decorator의 META 프로퍼티의 값이 decorator 이름으로 쓰여질 수 있다는 것을 의미한다. decorator_test라는 이름의 장식자를 특정페이지에 적용하고 싶다면 <META name=”decorator” content=”decorator_test”> 와 같이 페이지에 메타 태그를 추가하거나 또는 <HTML decorator=”decorator_test”>와 같이 <HTML> 태그를 수정하여 사용한다. <mapper class="com.opensymphony.module. decorators.xml에서 decorator_test decoration을
미리 정의 <decorator name="decorator" page="tv.jsp"> </decorator> |
ParameterDecoratorMapper | 설정에 정의된 파라미터와 동일한 스트링이 URL 쿼리 스트링에 존재할 때 정의해 놓은 decorator를 선정하도록 되어 있다. <mapper class="com.opensymphony.module. 이 mapper는 3개의 parameter가 존재한다. help.jsp
help.jsp?decorator=test&confirm=true |
SessionDecoratorMapper | session 어트리부트에서 지정한 decorator를 선정하도록 되어 있다. 디폴트로 decorator를 session 속성에서 찾지만, decorator.parameter 속성을 통해서 오버라이드 될 수 있다. |
PrintableDecoratorMapper | URL 쿼리 스트링의 printable=true라는 문자열에 반응한다. decorators.xml에 정의된 decorator중 printable decorator를 리턴할 것이다. 아래의 예는 다음을 의미한다. printable로 정의된 decoraotr는 printable=true 라는 리쿼스트가 들어올 때 해당 jsp가 적용된다. <mapper class="com.opensymphony.module. |
RobotDecoratorMapper | 검색엔진 로봇에서 식별되어 지는 특정 decorator를 선정하도록 되어 있다. <mapper class="com.opensymphony.module. |
사용자 정의 mapper 환경 설정
sitemesh.xml
요청에 따라 적용될수 있는 mapper를 정의하기 위해서는 sitemesh.xml파일을 생성한다.
<sitemesh> <property name="decorators-file" value="/WEB-INF/decorators.xml" /> <excludes file="${decorators-file}" /> <page-parsers> <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.
HTMLPageParser" /> <parser content-type="text/html;charset=ISO-8859-1" class="com.opensymphony.module.sitemesh.parser.
HTMLPageParser" /> </page-parsers> <decorator-mappers> <mapper class="com.opensymphony.module.sitemesh.mapper.
ConfigDecoratorMapper"> <param name="config" value="${decorators-file}" /> </mapper> </decorator-mappers> </sitemesh>
이 예에서 유일하게 적용된 mapper는 ConfigDecoratorMapper이다. 이 mapper는 웹페이지의 content-type이 text/html 이거나 text/html;charset=ISO-8859-1인 경우일때만 적용될 것이다. 다른 content-type(예, image/gif)의 page는 적용되지 않는다.
decorators.xml
부가적으로 패턴 매치를 이용하여 특정 파일들을 exclude하여 Sitemesh가 처리하지 않게 할 수 있다.
<excludes /> block을 이용하여 exlcude해야할 파일을 설정할 수 있다.
<decorators> <excludes> <pattern>/plainPage.jsp</pattern> <pattern>/plain/*.jsp</pattern> </excludes> </decorators>
/plainPage.jps와 /plain 디렉토리의 jsp 페이지는 장식이 전혀 되지 않는다. (패턴 매칭은 ConfigDecoratorMapper에서 사용되는 decorator 매핑처럼 정확하게 같은 룰을 따른다. )
일반적으로 <excludes /> 블럭은 decorators.xml 파일의 시작에서 추가되지만, 다른 XML 파일에서 정의할 수 있다.
디폴트 mapper 환경설정
만약 WEB-INF 디렉토리에서 sitemesh.xml이 발견되지 않으면, 디폴트 mapper 설정 화일이 사용되어 질 수 있다. 디폴트 mapper 환경설정파일의 정의는 sitemesh.jar안에 있는 sitemesh-default.xml의 설정파일이 적용된다. 그리고, 다음의 mapper들로 구성되어 진다.
- PageDecoratorMapper
- FrameSetDecoratorMapper
- PrintableDecoratorMapper
- FileDecoratorMapper
- ConfigDecoratorMapper
디폴트로 오직 text/html 컨텐트 타입만 Sitemesh에 의해 decoration된다.
Freemarker 예제
Freemarker와 연동하여 decoration을 사용할 수 있다.
Freemarker lib
Freemarker lib을 사용한다.
web.xml 수정
WEB-INF/web.xml에 <web-app> 태그에 다음의 코드를 추가한다.
<servlet> <servlet-name>sitemesh-freemarker</servlet-name> <servlet-class>com.opensymphony.module.sitemesh.freemarker.
FreemarkerDecoratorServlet</servlet-class> <init-param> <param-name>TemplatePath</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>default_encoding</param-name> <param-value>ISO-8859-1</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>sitemesh-freemarker</servlet-name> <url-pattern>*.dec</url-pattern> </servlet-mapping>
decorators.xml 수정
\.dec 파일을 레퍼런스하여 decorators.xml을 수정한다.
<#include "/includes/decorators/header.dec"> <h2>${title}</h2> ${head} <img src="${base}/images/logo.gif" border="0"> <td valign="top" class="body"> <div class="header"> <span class="pagetitle">${title}</span> </div> ${body} </td> <#include "/includes/decorators/footer.dec">
Context
FreemarkerDecoratorServlet은 당신이 필요로 하게될 정보, 즉 Context object들을 저장한다.
기본 context 속성
모든 리쿼스트, 리쿼스트 파라미터, 세션, 서블릿 context 속성 그리고 어플리케이션 변수를 얻을 수 있다.
예)
${Session["user"]}
어플리케이션안에서, 세션안에서, 리쿼스트안에서 변수를 찾아낼 수 있고, 지정할 수 있다.
<#assign ww=JspTaglibs["/WEB-INF/webwork.tld"]>
JspTaglibs라고 하는 변수를 생성하고, JSP 태그 라이브러리에서 로드할 수 있도록 쓸 수 있다.
<#assign ww=JspTaglibs["/WEB-INF/webwork.tld"]> ... <@ww.property value="myVar"/>
Sitemesh context 속성
base | request.getContextPath() |
title | page title을 파싱한다. (<title>…<title>) |
head | page head를 파싱한다. |
body | page body를 파싱한다. |
page | SiteMesh의 내부 Page object |
맥에서 nodejs 삭제하기 (osx node.js delete)
최근 io.js 와 node.js 위원회가 코드를 통합하기로 결정한 후 드디어 노드는 다시 하나가 되었습니다.
(2015년 9월 정식 발표) 0.12 버전에서 4.0 으로 판올림을 했습니다.
node.js 4.0 은 기존의 io.js 에 반영되었던 새로운 기술들을 모두 포함하고 있습니다.
현재 시점에서 (작지만 큰 :wink: ) 변경된 사항들을 수용할 수 있다면 4.4.2 을 사용하는 것이 어떨까 고민하고 생각됩니다.
그렇지 않다면 0.12 를 사용하는 것이 안정되어 보입니다.
하지만 저는 4.4.2 최신버전을 사용해보기위해 ㅋ
맥에서 node 제거 방법을 알아봅시다
sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm sudo rm /usr/local/bin/node sudo rm /usr/local/share/man/man1/node.1 sudo rm /usr/local/lib/dtrace/node.d brew install node
스스슥 지우고 난뒤
https://nodejs.org/en/download/
다시 다운받아서 설치 합니다.
D3.js 공부 자료 모음
대부분의 공부자료는 https://github.com/mbostock/d3/wiki/Tutorials 에 잘 나열되어 있으나 그 중에서 괜찮은 넘으로 아래와 같이 추려본다. (계속 추가 예정)
- 깔끔한 d3.js 소개 자료
http://macwright.org/presentations/dcjq/
- d3.js 샘플 코드로 무작정 이것저것 해보다가 헤메게 되면 봐야할 자료1 – d3의 Selection에 대한 자료
http://bost.ocks.org/mike/selection/
- d3.js 샘플 코드로 무작정 이것저것 해보다가 헤메게 되면 봐야할 자료2 – d3의 Join[또는 .data()]에 대한 자료
http://bost.ocks.org/mike/join/
- Selection과 Join에 대해 가장 좋은 복습 거리
http://mbostock.github.io/d3/tutorial/circle.html
- d3에서 사용되는 데이타에 관한 이해
http://www.jeromecukier.net/blog/2012/05/28/manipulating-data-like-a-boss-with-d3/
Jerome Cukier가 쉬운 영어로 잘 정리하는 선수같다.
- d3의 Animation과 Transition
http://blog.visual.ly/creating-animations-and-transitions-with-d3-js/
Jerome Cukier가 작성한 또 하나의 좋은 자료.
- d3 Realtime 차트 – 1. 좌측으로 이동하는 Bar 차트
http://mbostock.github.io/d3/tutorial/bar-2.html
- d3 Realtime 차트 – 2. 축도 함께 이동하는 Line 차트
http://bost.ocks.org/mike/path/
에러 org.springframework.jdbc.BadSqlGrammarException
org.springframework.jdbc.BadSqlGrammarException
칼럼명을 잘못 기술 하였을 경우 나타나는 에러
삽질의 끝은 어딜까요…흐흑 ㅠㅠ
정규 표현식 – 앵커(anchor)
- \b <-> \B
- ^
- $
- 문자열의 시작 위치 : ^(캐럿)
- 문자열의 마지막 위치 : $(달러)
- < 을 표현하기 위한 \< (이스케이프)
- ? 을 표현하기 위한 \? (이스케이프)
- xml
- 없거나 하나 이상의 문자를 위한 게으른 수량자 .*?
- ? 을 표현하기 위한 \? (이스케이프)
- > 을 표현하기 위한 \> (이스케이프)
- XML 문서의 첫 라인에 헤더가 위치할 것
- 헤더 시작 이전에 공백이 포함될 수 있음
- \b는 단어 경계를 지정할 때 사용한다.
- \B는 \b의 완전히 반대되는 의미이다.
- ^(캐럿)과 $(달러)는 문자열 경계(시작과 끝 위치)를 나타낸다.
- (?m)은 정규 표현식을 멀티라인 모드로 변경해, ^(캐럿)과 $(달러)가 라인 단위로 시작과 끝을 나타내게 해 준다.
여러 개의 row를 한 줄로 가져오기 (GROUP_CONCAT)
문제:
게시판 전체 목록의 태그들을 각각 가져와 한 줄로 뿌려주려고 한다.
각 게시물에 해당하는 태그 목록을 각각 조회해 가져오자니 너무 비효율적이라서,
게시물에 해당하는 태그(여러 개의 row)의 값을 공백으로 구분으로 넣으려고 한다.
데이터베이스는 mysql을 사용한다.
해결책:
mysql의 GROUP_CONCAT 함수를 사용하면 된다.
GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ‘ ‘)
와 같이 사용한다.
mysql reference에 잘 설명되어 있다. 참고하자.
스프링 어노테이션 annotation 정리
관련 문서
목차
- @Component
- @Required
- @Autowired
- @Qualifier
- @Resource
- @Scope
- @PostConstruct
- @PreDestroy
- @Inject
- @Service
- @Repository
- @Controller
- @RequestMapping
- @RequestParam
- @SessionAttributes
- @InitBinder
- @ModelAttribute
- @RequestBody
- @ResponseBody
- @PathVariable
개발단계에서 사용빈도가 높은 어노테이션 위주로 정리.
목차에 없는 항목은 API 문서를 참고할 것. 구글링하는게속편한건함정
@Component
패키지: org.springframework.stereotype
버전: spring 2.5
설정 위치: 클래스 선언부 앞
<context:component-scan> 태그를 설정파일에 추가하면 해당 어노테이션이 적용된 클래스를 빈으로 등록하게 된다. 범위는 디폴트로 singleton이며 @Scope를 사용하여 지정할 수 있다.
사용하려면 XML 설정파일에 <context:component-scan>을 정의하고 적용할 기본 패키지를 base-package 속성으로 등록한다.
context:annotation-config 태그는 어노테이션과 관련해서 다음의 BeanPostProcessor를 함께 등록 한다.
- @Required(RequiedAnnotationBeanPostProcessor)
- @Autowired(AutowiredAnnotationBeanPostProcessor)
- @Resource, @PostConstruct, @PreDestory(CommonAnnotationBeanPostProcessor)
- @Configuration(ConfigurationClassPostProcessor)
- 그 외 Repository, Service, Controller 포함
예를 들어 다음처럼 설정하면:
<context:component-scan base-package=”xxx”/>
|
cs |
xxx 패키지 하위에 @Component로 선언된 클래스를 bean으로 자동 등록한다. bean의 이름은 해당 클래스명(첫글자는 소문자)이 사용된다.
<context:component-scan /> 요소에는 scoped-proxy 속성이 존재 한다. scoped-proxy는 <aop:scoped-poxy/>처럼 WebApplicationContext 에서만 유효하며 “session”, “globalSession”, “request” 이외의 scope는 무시 되며 아래의 3가지 값을 설정 할 수 있다.
- no: proxy를 생성하지 않는다.(기본값)
- interfaces: JDK Dynamic Proxy를 이용한 Proxy 생성
- targetClass: 클래스에 대해 프록시를 생성(CGLIB를 이용한 Proxy 생성)
@Component
@Scope(“prototype”) // 생략하면 싱글톤
public class Test {
…..
}
|
cs |
CGLIB
기존의 자바 클래스파일로부터 자바의 소스코드를 동적으로 생성하는 라이브러리(자바 소스 변경)
http://sourceforge.net/projects/cglib/
스캔 대상 클래스 범위 지정하기
<context:include-filter> 태그와 <context:exclude-filter> 태그를 사용하면 자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스를 구체적으로 명시할 수 있다.
<context:component-scan base-package=”spring.demo” scoped-proxy=”no”>
<context:include-filter type=”regex” expression=”*HibernateRepository”/>
<context:exclude-filter type=”aspectj” expression=”..*IBatisRepository”/>
</context:component-scan>
|
cs |
위와 같이 <context:include-filter> 태그와 <context:exclude-filter> 태그는 각각 type 속성과 expresseion 속성을 갖는데, type 속성에 따라 expression 속성에 올 수 있는 값이 달라진다. type 속성에 입력가능한 값은 다음과 같다:
- annotation: 클랙스에 지정한 어노테이션이 적용됐는지의 여부. expression 속성에서는 “org.example.SomeAnnotation”와 같은 어노테이션 이름을 입력한다.
- assignable: 클래스가 지정한 타입으로 할당 가능한지의 여부. expression 속성에는 “org.exampleSomeClass” 와 같은 타입 이름을 입력한다.
- regex: 클래스 이름이 정규 표현식에 매칭되는 지의 여부. expression 속성에는 “org\.example\.Default.*” 와 같이 정규표현식을 입력한다.
- aspectj: 클래스 이름이 AspectJ 의 표현식에 매칭되는 지의 여부. expression 속성에는 “org.example..*Service+” 와 같이 AspectJ 의 표현식을 입력한다.
@Required
패키지: org.springframework.beans.factory.annotation
버전: spring 2.0
설정 위치: setter 메서드 앞
Required 어노테이션은 필수 프로퍼티임을 명시하는 것으로 필수 프로퍼티를 설정하지 않을 경우 빈 생성시 예외를 발생시킨다.
import org.springframework.beans.factory.annotation.Required
public class TestBean {
@Required
private TestDao testDao;
public void setTestDao(TestDao testDao) {
this.testDao = testDao;
}
}
|
cs |
<bean class=”org.springframework.beans.factory.annotation.RequiredAnnotationBeanpostProcessor”/>
<bean name=”testBean” class=”han.test.TestBean”>
<property name=”testDao” ref=”testDao”/>
<!– @Required 어노테이션을 적용하였으므로 설정하지 않으면 예외를 발생시킨다. –>
</bean>
|
cs |
RequiredAnnotationBeanPostProcessor 클래스는 스프링 컨테이너에 등록된 bean 객체를 조사하여 @Required 어노테이션으로 설정되어 있는 프로퍼티의 값이 설정되어 있는지 검사한다.
사용하려면 <bean class=”org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor” /> 클래스를 빈으로 등록시켜줘야 하지만 이를 대신하여 <context:annotation-config> 태그를 사용해도 된다:
<beans xmlns=”http://www.springframework.org/schema/beans”
xmlns:context=”http://www.springframework.org/schema/context”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd”>
<context:annotation-config/>
</beans>
|
cs |
@Autowired
패키지: org.springframework.beans.factory.annotation
버전: spring 2.5
설정 위치: 생성자, 필드, 메서드(setter메서드가 아니여도 된다) 앞
의존관계를 자동설정할 때 사용하며 타입을 이용하여 의존하는 객체를 삽입해 준다. 그러므로 해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시키게 된다.
options:
- required: Autowired 어노테이션을 적용한 프로퍼티 중 반드시 설정할 필요가 없는 경우에 false값을 주어 프로퍼티가 존재하지 않더라도 스프링이 예외를 발생하지 않도록 한다. 기본값은 TRUE. ex) @Autowired(required=false)
사용하려면 <bean class=”org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor” /> 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
@Autowired를 적용할 때 같은 타입의 빈이 2개 이상 존재하게 되면 예외가 발생하는데, Autowired도 이러한 문제가 발생한다. 이럴 때 @Qualifier를 사용하면 동일한 타입의 빈 중 특정 빈을 사용하도록 하여 문제를 해결할 수 있다.
@Autowired
@Qualifier(“test”)
private Test test;
|
cs |
@Qualifier
패키지: org.springframework.beans.factory.annotation
버전: spring 2.5
설정 위치: @Autowired 어노테이션과 함께 사용된다.
qualifier 어노테이션은 @Autowired의 목적에서 동일 타입의 빈객체가 존재시 특정빈을 삽입할 수 있게 설정한다. @Qualifier(“mainBean”)의 형태로 @Autowired와 같이 사용하며 해당 <bean>태그에 <qualifire value=”mainBean” /> 태그를 선언해주어야 한다. 메서드에서 두개이상의 파라미터를 사용할 경우는 파라미터 앞에 선언해야한다.
options:
- name: alias명
사용하려면 동일타입의 빈객체 설정에서 <qualifier value=”[alias명]” />를 추가해 준다.
<bean id=”user2″ class=”com.sp4.UserImpl”>
<property name=”name” value=”스프링”/>
<property name=”age” value=”20″/>
<property name=”tel” value=”000-0000-0000″/>
</bean>
<bean id=”userService1″ class=”com.sp4.UserService”/>
|
cs |
public class UserService {
@Autowired
@Qualifier(“user2”)
private User user;
public String result() {
return user.getData();
}
}
|
cs |
@Resource
자바 6 및 JEE5에 추가된 것으로 어플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용 한다. 스프링 2.5 부터 지원하는 어노테이션으로 스프링에서는 의존하는 빈 객체를 전달할 때 사용한다.
@Autowired와 흡사하지만 @Autowired는 타입으로(by type), @Resource는 이름으로(by name)으로 연결한다는 점이 다르다.
options:
- name: 자동으로 연결될 빈객체의 이름을 입력한다. ex) @Resource(name=”testDao”)
사용하려면 <bean class=”org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor”/> 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
<beans>
<!– 기타 설정 생략 –>
<context:annotation-config/>
<bean id=”user2″ class=”com.test.UserImpl” p:data=”65536″/>
</beans>
|
cs |
public class UserService {
@Resource(name=”user2″)
private User user;
//UserImpl user2 = new UserImpl();
//User user = user2;
public void setUser(User user) {
this.user = user;
}
public String result() {
return user.getData();
}
}
|
cs |
@Scope
패키지: org.springframework.beans.factory.annotation
설정: prototype, singleton, request, session, globalSession
스프링은 기본적으로 빈의 범위를 “singleton” 으로 설정한다. “singleton” 이 아닌 다른범위를 지정하고 싶다면 @Scope 어노테이션을 이용하여 범위를 지정한다.
@Component
@Scope(value=”prototype”)
public class Worker { }
|
cs |
@Component
@Scope(value=”prototype”, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Worker { }
|
cs |
@PostConstruct
패키지: javax.annotation
버전: jdk1.6, spring 2.5
설정 위치: 초기화 작업 수행 메서드 앞
의존하는 객체를 설정한 이후에 초기화 작업을 수행하기 위해 사용한다.
사용하려면 CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. <context:annotation-config> 태그로 대신할 수 있다.
@PostConstruct
public void init() {
System.out.println(“객체 생성 후 내가 먼저 실행된다.”);
}
|
cs |
@PreDestroy
패키지: javax.annotation
버전: jdk1.6, spring 2.5
설정 위치: 해당 작업 메서드 앞
컨테이너에서 객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용한다.
사용하려면 CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. <context:annotation-config> 태그로 대신할 수 있다.
@Inject
SR-330 표준 Annotation으로 Spring 3 부터 지원하는 Annotation이다. 특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다. @Inject를 사용하기 위해서는 클래스 패스 내에 JSR-330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 함에 유의해야 한다.
@Service
@Service를 적용한 Class는 비지니스 로직이 들어가는 Service로 등록이 된다. Controller에 있는 @Autowired는 @Service(“xxxService”)에 등록된 xxxService와 변수명이 같아야 하며 Service에 있는 @Autowired는 @Repository(“xxxDao”)에 등록된 xxDao와 변수명이 같아야 한다.
@Service(“helloService”)
public class HelloServiceImpl implements HelloService {
@Autowired
private HelloDao helloDao;
public void hello() {
System.out.println(“HelloServiceImpl :: hello()”);
helloDao.selectHello();
}
}
|
cs |
helloDao.selectHello(); 와 같이 @Autowired를 이용한 객체를 이용하여 Dao 객체를 호출한다:
@Service(“test2.testService”)
//괄호 속 문자열은 식별자를 의미한다.
//괄호를 생략할 경우 클래스명 그대로 사용한다.
//따라서 ,같은 클래스명이 존재 할 시 같은 식별자가 생성되기때문에 에러가 발생한다.
public class TestService {
public String result(int num1, int num2, String oper) {
String str = null;
if (oper.equals(“+”)) {
//…
return str;
}
}
}
|
cs |
@Resouce로 연결
@Resource(name=”test2.testService”)
//name에 필요한 것은 @Service(“test2.testService”) <- 여기서 괄호 속 문자열, 즉 식별자
private TestService service;
//TestService service = new TestService(); 라고 하는것과 같은 식
@RequestMapping(value=”/test2/oper.action”, method={RequestMethod.GET})
public String form() throws Exception {
return “test2/write”;
}
|
cs |
@Repository
패키지: org.springframework.stereotype
버전: spring 2.0
@Repository는 일반적으로 DAO에 사용되며 DB Exception을 DataAccessException으로 변환한다.
@Repository(“bbs.boardDAO”)
public class BoardDAO {
private SqlSession sqlSession;
public int insertBoard(Board dto) throws Exception {
…
}
}
|
cs |
public class BoardServiceImpl implements BoardService {
@Resource(name=”bbs.boardDAO”)
private BoardDAO dao;
public int insertBoard(Board dto){}
}
|
cs |
@Controller
http://noritersand.tistory.com/474
@RequestMapping
http://noritersand.tistory.com/475
@RequestParam
http://noritersand.tistory.com/357
@SessionAttributes
SessionAttribute annotation은 세션상에서 model의 정보를 유지하고 싶을 경우 사용한다.
@Controller
@SessionAttributes(“blog”)
public class BlogController {
// 중간생략
@RequestMapping(“/createBlog”)
public ModelMap createBlogHandler() {
blog = new Blog();
blog.setRegDate(new Date());
return new ModelMap(blog);
}
// 중간생략
}
|
cs |
@InitBinder
WebDataBinder를 초기화하는 method를 지정 할 수 있는 설정을 제공한다.
일반적으로 WebDataBinder는 annotation handler 메서드의 command 와 form 객체 인자를 조작하는데 사용된다.
InitBinder 메서드가 필수적으로 반환값을 가질 필요는 없으며, 일반적으로 이런 경우에 void를 선언한다. 특별한 인자는 WebdataBinder와 WebRequest또는 Locale의 조합으로 이루어지며, 이러한 조건이 만족되면 context-specific editors를 등록하는것이 허용된다.
WebdataBinder: WebDataBinder는 web request parameter를 javaBean 객체에 바인딩하는 특정한 DataBinder이다. WebDataBinder는 웹 환경이 필요하지만, Servlet API에 의존적이지 않다. servlet API에 의존적인 ServletRequestDataBinder와 같이 특정한 DaraBinder를 위한 더많은 base class를 제공한다.
RequestMapping: RequestMapping annotation은 web request를 특정한 handler class와 handler method에 mapping하는 역활을 수행한다. 대응하는 handlerMapping(for type level annotation)과 HandlerAdapter(for method level annotation)가 dispatch에 존재한다면, @RequestMapping이 처리된다.
WebRequest: WebRequest는 웹 요청에 대한 Generic interface이다. 주로 일반 request metadata에 generic web request interceptors의 접근을 허용하여 metadata에 대한 처리를 하기 위한 것이지 request 자체를 처리하기 위한 것은 아니다.
Annotation 기반 Controller 에서 ServletContext 구하기:
@Controller
@RequestMapping(“/common/download”)
public class DownloadController {
@Autowired
private ServletContext sc;
@RequestMapping
public ModelAndView download(@RequestParam(“filePath”) String filePath) throws Exception {
String path = sc.getRealPath(filePath);
return new ModelAndView(“common.download”, “downloadFile”, new File(path));
}
}
|
cs |
@ModelAttribute
http://noritersand.tistory.com/365
@RequestBody
@RequestBody 어노테이션이 적용된 파라미터는 HTTP Request body의 내용이 전달된다.
참고: http://java.ihoney.pe.kr/283
@RequestMapping(value=”/test”)
public void penaltyInfoDtlUpdate(@RequestBody String body,
HttpServletRequest req, HttpServletResponse res,
Model model, HttpSession session) throws Exception {
System.out.println(body);
}
|
cs |
@ResponseBody
서버가 응답할 값 혹은 객체를 HTTP Response body에 쓴다.
참고: http://ismydream.tistory.com/140
클라이언트에 JSON 형식의 값을 응답할 때 유용하다. 메서드에 @ResponseBody를 적용한 후 객체를 리턴하면 그 값은 아니라 HTTP ResponseBody에 직접 쓰여진다.
@RequestMapping(“/getVocTypeList”)
@ResponseBody
public ArrayList<Object> getVocTypeList() throws Exception {
HashMap<String, Object> vocData = gvocInf.searchVocTypeList();
return (ArrayList<Object>) vocData.get(“data”);
}
|
cs |
@ResponseBody가 적용된 컨트롤러 메서드는 설정된 resolver를 통하지 않고 값을 그대로 전달한다.
@PathVariable
URL의 일부를 파라미터 혹은 변수로 사용한다.
package com.sp.ex;
@Controller(“ex.exController”)
public class ExController{
@RequestMapping(value=”/blog/{userId}/main.action”, method=RequestMethod.GET)
public String main(HttpServletRequest req
, @PathVariable String userId) throws Exception {
req.setAttribute(“userId”, userId);
return “restful/result”;
}
}
|
cs |
프로그래밍 위키 정리 잘되있는 사이트
우연히 웹서핑하다가 위키 정리가 될있는 사이트가 있어 공유합니다 ㅋㅋ
프로그래밍 언어별로 잘되있고..
훔.. 정리 잘됬네요 (정리 부럽…)
https://github.com/vhf/free-programming-books/blob/master/free-programming-books-ko.md
[Mac]wget 설치하기
기본적으로 Mac에서는 wget이 설치되어 있지 않습니다. 따라서 wget을 다운받고 설치를 해야합니다.
- 최신 wget 소스를 다운받습니다.
curl -O http://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz
- wget 소스 압축을 풉니다.
tar -xzf wget-1.15.tar.gz
- 디렉토리를 이동합니다.
cd wget-1.15
- Configure하며 “GNUTLS not available” 에러를 방지하기 위해 –with-ssl을 적용시킵니다.
./configure –with-ssl=openssl
- 소스를 빌드하고 /usr/local/bin/ 경로에 설치합니다.
make && make install
- wget 명령어가 정상적으로 되는지 help 옵션으로 실행합니다.
wget –help