다음 디브온 2013 코드골프 문제 Ruby로 풀기 프로그래밍

     *     
     *     
    * *    
   *   *   
  *     *  
**       **
  *     *  
   *   *   
    * *    
     *     
     *  

r=-5..5;r.each{|i|r.each{|j|c=i.abs+j.abs==4||i%5==0&&(i-j).abs==5?'*':' ';print c};puts}
89자

중간지점(0,0)에서 가로,세로 합 4 만큼 떨어진 지점과 마름모 모서리 4군데를 *로, 나머지는 공백으로 마킹

Maven jetty plugin을 Eclipse에서 debug mode로 실행하기 프로그래밍

m2eclipse로 jetty 실행시 Debug mode로 실행하려면 다음과 같이 하면 된다.

Debug Configurations 에서 Maven Build > New한 후 
Goals 에 jetty:run , 
Environment탭에서 Variable : MAVEN_OPTS, value :  -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8080 (포트번호는 jetty 실행시 pom.xml에 설정된대로  세팅!) 로 설정한 후 실행한다.
이 첫번째 방법은 첫 설정 후 몇 번은 잘 되다가 별다른 이유없이 jetty 실행중 Hang이 걸리는 현상이 일어난다.

그래서 다른 방법을 물색해보니, MAVEN_OPTS를 별도 지정할 필요없이 Maven에서 mvnDebug.bat 를 이미 제공하고 있음을 확인했다.

일단 cmd창에서 web app project 경로로 이동해서 mvnDebug jetty:run을 실행한다.
(port번호를 수정하려면 mvndebug.bat파일에서 MAVEN_DEBUG_OPTS부분을 수정하면 된다.)

Preparing to Execute Maven in Debug Mode
Listening for transport dt_socket at address: 8080

와 같은 메세지가 나오면 준비완료.

Eclipse에서 Debug Configuration > Remote Java Application > New한 후 
Connect 탭의 Project에 web app project를 선택, 
Connection Type은 Standard (Socket Attach), 
Connection Properties : localhost, 8080(포트번호는 jetty 실행시 pom.xml에 설정된대로  세팅!) 
Allow termination of remote VM 에 체크한 후 Debug를 클릭하면 된다.

실용주의 사고와 학습 도미노의시작

Pragmatic Thinking and Learning

실용주의 프로그래머, 실용주의 프로그래머를 위한 빌드자동화 같은 책들을 보고 실용주의 시리즈가 더 없을까 해서 검색하다가 우연히 발견했다. 일단 일독 후에 밀려오는 이 뿌듯함이란... 
Refactor your wetware : 원래 제목이었다지. 지금은 부제로 쓰여있다. 뇌를 단련해보자. 당신의 머리를 디버그하고 리팩토링해보자
Context matters...
드라이퍼스 모델: 초심자, 고급입문자, 중급자, 숙련자, 전문가 - 초심자는 컨텍스트에 상관없이 행동하고, 전문가는 항상 컨텍스트(상황, 맥락)을 고려하여 판단한다. 전문가는 자기자신을 소스코드와 마찬가지로 시스템의 일부로 생각한다. 
수修파破리離 - 일단은 그대로 따라해보고, 그 다음엔 그것을 깨트려보고, 자신도 모르게 파를 행하되 규칙을 벗어나지 않는 경지에 이른다.
L모드(선형적, 논리적) / R모드 (비선형적, 직관적) : R모드는 숲을 보고, L모드는 나무를 본다.
모닝페이지(아티스트 웨이에 나온 방법, 아침에 일어나자 마자 아무 말이나 마구 적어댄다. 3페이지정도... 그리고 절대로 다시 보지않는다. 평소에 쉽게 끄집어낼 수 없는 R모드를 끄집어내기 위한 방법)
이너게임(테니스에서의 이너게임. 20년 동안 아무 운동도 하지 않았던 50대 아줌마에게 20분만에 테니스를 가르치는 방법. 공이 튄다. 친다 만 반복해서 소리친다. 공이 맞을 때의 소리를 주의깊게 듣게 한다. 20분 후 아줌마는 코치와 함께 10여 차례 랠리를 한다. 외적 상황보다 내적 피드백이 중요하다. 탤런트 코드에도 나온 얘기)
명상을 하자. 어렸을적 단학을 공부하신 아버지의 영향으로 단전호흡을 주말 아침마다 했었다. 눈을 감고, 오로지 정수리만 생각하고, 들이쉬고 내쉬는 것만 느끼는. 테이프에서는 들이쉬고, 하나, 둘, 셋... 내쉬고, 하나, 둘, 셋... 셋에서 넷으로, 다섯, 여섯... 열다섯 까지... 하루 세번 하면 하루종일 명상의 효과를 볼 수 있다고 한다.
양세척 같은 주입식 일방적인 교육은 아무 쓸모없다. 결국 받아들이는 사람의 의지가 문제이다. 자발적인 학습이 진정한 학습이다. 
책을 읽는 방법 : SQ3R - Survey(목차를 주욱 훑어본다) - Question(떠오르는 질문들을 적어본다) - Read(책을 읽어본다) - Recite(되뇌어본다. 낭송해본다) - Review(다시 한번 본다. 마인드 맵을 그려보면서.)
마인드맵은 도구보다 손으로 해보는게 더 낫다.
위키 페이지를 이용해 아이디어를 정리한다.
가르치면서 배운다 : 잘 이해가 안 되거나 답을 찾지 못해서 누군가에게 물어보기 위해 말하고 적고 그림을 그려 설명하면서(외현화) 스스로 답을 찾아내기도 한다.
컨텍스트 스위칭을 조절하자 : 뇌는 스택을 관리하지 않는다. 한번 뺏긴 집중을 다시 찾는데 20분이 소요된다. Alt-tab은 최소화해야 한다. 가상 데스크탑(개인적으로 VirtuaWin을 추천)으로 주제별로 컨텍스트를 분리한다. 이메일 클라이언트는 정해진 시간에만 켜둔다.
전문가가 되는 것을 경계해야 한다(?). 자신이 그 분야의 전문가라고 느끼는 순간 더 이상 더 배우려고 하지 않는 것, 다른 분야를 무시하고 알려하지 않는 것을 경계해야 한다. 초심자의 자세가 필요한 순간이다.

선생과 학생의 딜레마 : 이해하기 쉬운 훌륭한 강의는 학생보다 선생의 뇌를 가장 많이 단련시킨다. 레고는 만든 사람의 뇌가 가장 많이 단련되었을 것이다.
가장 중요한 것은 이 책의 내용을 읽고 알았다는 것에서 그치지 말고, 내 나름의 실험과 실습을 거쳐 내용을 보태나가는 것. 이 책을 읽은 수많은 사람들보다 이 책이 쓰여지는데 기여한 김창준 씨나 앤디 헌트의 뇌가 가장 많이 훈련되었을 것이다.
(책을 읽다보면 애자일이야기 블로그에서 보아왔던 내용들이 여기저기 보인다.)

아는 사람은 많다. 하지만 실천가는 극히 적다.

블로그에 이런 내용을 적는 행위도 책의 내용을 실천해가는 행위 중 하나겠지. 

* 의도적으로 배우라에 SMART 한 목표를 세우라는 내용이 나오는데, 김창준 씨의 의견과는 다소 다른 내용이 들어간 모양이다. SMART한 목표는 간혹 변죽만 울릴 수도 있으니, EXACT(Exciting,
Assessable
Assessable, Challenging, Time-framed) 한 목표를 세우라는 다소 두루뭉술하고 명확하지는 않지만 좀더 인간적인 목표를 세우자는 의견에 나도 공감한다. 
음.. EXACT (정확한) 단어 자체의 의미와는 조금 안 맞지 않나 생각된다. EXACT는 SMART보다는 덜 자세하고, 덜 Exact 하니.. 

SpecializationIsForInsects Log

A programmer should be able to find a bug, market an application, refactor a spike, lead a team, architect an application, hack a kernel, schedule a project, build a database, route a network, give a reference, implement Wiki:UserStories, analyze Wiki:UserStories, work in a team, work alone, use patterns, innovate, write documentation, have a Wiki:RealLife, create a cool website, email efficiently, resign gracefully, Wiki:AdmitIgnorance, and keep on learning. Specialization is for recruiters. -- with large apology to RAH and his estate, Wiki:PeterMerel

출처 : http://no-smok.net/nsmk/SpecializationIsForInsects

Oracle Error Code 모음 프로그래밍


six thinking hats Log

여섯 색깔 생각의 모자

흰색 : 중립, 객관적 사실
빨간색 : 감정적
검은색 : 부정적, 비판적
노란색 : 긍정적, 발전적, 이상제시
녹색 : 창조적
파란색 : 각 색깔의 모자를 제어, 총괄

이부분에서는 흰색 모자를 쓰고 얘기해보자.
이런 경우엔 녹색모자를 쓰고....
한번에 한가지씩만 생각하기

수평적사고 : 기존에 해왔던 방식과 다른 방식으로 생각해보기

생각의 모자를 널리널리 퍼뜨려보면... 대학새내기 들이나 신입사원 교육에 활용해보면 괜찮지 않을까..

회의진행시 활용하면 좋을 듯...

Quartz tutorial

Quartz - Trigger, Job, JobDetail
SchedulerFactoryBean : Trigger 생성
SimpleTriggerBean : 언제 어떻게 job을 실행할지 정의(CronTriggerBean 도 제공)
MethodInvokingJobDetailFactoryBean : scheduler에 맞춰서 객체의 메소드 호출

Instantiation : SchedulerFactory schedFact = new SchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();

JobDetail jobDetail = new JobDetail("myJob", "myGroup", DumbJob.class);

스케줄러가 한번 셧다운되면, 다시 instantiation하지 않고 재시작할 수 없다. 트리거는 스케줄러가 시작할때까지 fire하지 않는다. pause 상태에 있는 동안에(Job이 실행되지 않는다.)

Trigger trigger = TriggerUtils.makeHourlyTrigger(); // fire every hour
trigger.setStartTime(TriggerUtils.getEveryHourDate(new Date())); //start on the next every hour
trigger.setName("myTrigger");

sched.scheduleJob(jobDetail, trigger); // 앞에서 트리거를 설정한대로 job의실행을 스케줄한다

트리거가 fire하면 스케줄러에 의해 Job 인터페이스의 execute메서드가 호출된다.
이 메서드에 던져진 JobExecutionContext 객체는 런타임 환경 정보를 가진 job 인스턴스를 제공한다.

JobDetail 객체는 Quartz 클라이언트(당신의 프로그램)에 의해 스케줄러에 job이 더해지는 시간에 생성된다. JobDataMap(당신의 job클래스의 인스턴스를 위해 상태 정보를 저장할 수 있는...) 과 같은 Job에 대한 다양한 프로퍼티 세팅을 포함한다.

Trigger 객체는 job들의 실행을 트리거하기 위해 사용된다. job을 스케줄하려고 할때, 당신은 트리거를 초기화하고, 그것의 프로퍼티들을 당신이 원하는 스케줄링을 제공하도록 튜닝한다. 트리거는 또한 그것과 관련된 JobDataMap도 가지고 있다 - 이것은 트리거를 fire하는데 특정화된 Job에게 파라미터를 던지는데 유용하다. Quartz 는 다양한 트리거 타입을 지원하지만, 대표적으로 SimpleTrigger와 CronTrigger를 사용한다.

SimpleTrigger는 원샷 실행을 원할 때 (단지 주어진 시간에 job이 한번만 실행될때) 편하다. 주어진 시간에 job을 fire할 필요가 있을 때, 실행간 T시간만큼 딜레이를 두고 그것을 N번 반복할 때 좋다.
CronTrigger는 달력같은 스케줄을 기반으로 하는 트리거링에 좋다( 매달 10일 정오 같이..)

Job과 Trigger를 분리한 이유 :
- 스케줄과 스케줄상에서 일어나는 일 을 분리함
- Job은 Job스케줄러 안에서 트리거와 독립적으로 생성되고 저장될 수 있고, 트리거들은 같은 job에 연관될 수 있다. 이런 느슨한 결합으로 연관된 트리거가 만료된 뒤에도 스케줄러에 남아있는 job을 구성할 수 있다. 그래서 그 후에 그것을 재정의하지 않고 다시 스케줄할 수 있다. 그것과 관련된 job을 재정의하지 않고 트리거를 수정하거나 재배치 할 수 있다.

Job과 트리거는 나중의 유지보수를 위해 당신의 job과 트리거들을 카테고리안에 조직화하는데 유용한 groups에 위치할 수 있다.
만약에 Job이나 트리거의 group을 'null'로 남겨두면, Scheduler.DEFAULT_GROUP 이 설정된 것과 동일하다.


JSP 기초

JSP syntax
HTML 같은 static data
include같은 JSP directives
JSP scripting elements and variables
JSP actions
custom tags with correct library

JSP directive 는 JSP compiler가 servlet을 어떻게 생성할지 조정한다
include : <%@ include file="somefile.jspf" %>
page :
import  - Results in a Java import statement being inserted into the resulting file.
contentType  - specifies the content that is generated. This should be used if HTML is not used or if the character set is not the default character set.
errorPage  - Indicates the page that will be shown if an exception occurs while processing the HTTP request.
isErrorPage - If set to true, it indicates that this is the error page. Default value is false.
isThreadSafe - Indicates if the resulting servlet is thread safe.
autoFlush - To autoflush the contents.A value of true, the default, indicates that the buffer should be flushed when it is full. A value of false, rarely used, indicates that an exception should be thrown when the buffer overflows. A value of false is illegal when also using buffer="none".
session - To maintain session. A value of true (the default) indicates that the predefined variable session (of type HttpSession) should be bound to the existing session if one exists, otherwise a new session should be created and bound to it. A value of false indicates that no sessions will be used, and attempts to access the variable session will result in errors at the time the JSP page is translated into a servlet.
buffer - To set Buffer Size. The default is 8k and it is advisable that you increase it.
isELIgnored - Defines whether EL expressions are ignored when the JSP is translated.
language - Defines the scripting language used in scriptlets, expressions and declarations. Right now, the only possible value is "java".
extends - Defines the superclass of the class this JSP will become. You won't use this unless you REALLY know what you're doing - it overrides the class hierarchy provided by the Container.
info - Defines a String that gets put into the translated page, just so that you can get it using the generated servlet's inherited getServletInfo() method.
pageEncoding - Defines the character encoding for the JSP. The default is "ISO-8859-1"(unless the contentType attribute already defines a character encoding, or the page uses XML document syntax).

<%@ page import="java.util.*" %> <%-- example import --%>
<%@ page contentType="text/html" %> <%-- example contentType --%>
<%@ page isErrorPage="false" %> <%-- example for non error page --%>
<%@ page isThreadSafe="true" %> <%-- example for a thread safe JSP --%>
<%@ page session="true" %> <%-- example for using session binding --%>
<%@ page autoFlush="true" %> <%-- example for setting autoFlush --%>
<%@ page buffer="20kb" %> <%-- example for setting Buffer Size --%>

JSP scripting elements and objects
JSP내부객체
out - The JspWriter used to write the data to the response stream(output page).
page - The servlet itself.
pageContext  - A PageContext instance that contains data associated with the whole page. A given HTML page may be passed among multiple JSPs.
request  - The HttpServletRequest object that provides HTTP request information.
response - The HttpServletResponse object that can be used to send data back to the client.
session  - The HttpSession object that can be used to track information about a user from one request to another.
config  - Provides servlet configuration data.
application - Data shared by all JSPs and servlets in the application.
exception  - Exceptions not caught by application code .

Scripting elements(3 types)
1. declaration tag : <%! int serverInstanceVariable = 1; %>  변수선언, Static data members, inner classes, methods
2. scriptlet tag : <% int localStackBasedVariable = 1;
out.println(localStackBasedVariable); %> _jspService() 내부 위치
3. expression tag : <%= "expanded inline data " + 1 %>   servlet 내부에서 evaluate되는 표현들. semi-colon있으면 안 됨
* comments tag : <%-- give your comments here --%>

JSP actions
웹서버 기능을 호출하기 위한 XML tags. runtime에 실행.
jsp:include  - Similar to a subroutine, the Java servlet temporarily hands the request and response off to the specified JavaServer Page. Control will then return to the current JSP, once the other JSP has finished. Using this, JSP code will be shared between multiple other JSPs, rather than duplicated.
jsp:param  - Can be used inside a jsp:include, jsp:forward or jsp:params block. Specifies a parameter that will be added to the request's current parameters.
jsp:forward  - Used to hand off the request and response to another JSP or servlet. Control will never return to the current JSP.
jsp:plugin  - Older versions of Netscape Navigator and Internet Explorer used different tags to embed an applet. This action generates the browser specific tag needed to include an applet.
jsp:fallback - The content to show if the browser does not support applets.
jsp:getProperty  - Gets a property from the specified JavaBean.
jsp:setProperty - Sets a property in the specified JavaBean.
jsp:useBean - Creates or re-uses a JavaBean available to the JSP page.

JSP Tag Libraries
<%@ taglib uri="mytaglib.tld" prefix="myprefix" %>
...
<myprefix:myaction> <%-- the start tag %>
...
</myprefix:myaction> <%-- the end tag %>
...

public class MyActionTag extends TagSupport {
   //Releases all instance variables.
   public void release() {...}
 
   public MyActionTag() { ... }
 
   //called for the start tag
   public int doStartTag() { ... }
 
   //called at the end tag
   public int doEndTag(){ ... }
 }

JSP Standard Tag Library (JSTL)
Java EE 5의 포커스는 자바 어노테이션 사용을 쉽게하는 것이다. JSP2.1은 JSP tags handler와 context listener에 Dependency Injection을 위한 어노테이션을 정의함으로써 이를 지원한다.
JSP2.0과 JSF1.1에 의해 정의된 expression language를 통합하여  Unified Expression Language가 나왔다.
JSP2.1은 web semantic을 위한 Servlet2.5 스펙에 영향을 미친다.

JSP 2.0
EL은 Velocity 스타일의 템플릿을 생성하게 한다.
Hello, ${param.visitor} <%-- same as: Hello, <%=request.getParameter("visitor")%> --%>

// consider some beans.
 class Person {
   String name;
   // person nests an organization bean.
   Organization organization;

   public String getName() { return this.name; }
   public Organization getOrganization() { return this.organization; }
 }

 class Organization {
   String name;
   public String getName() { return this.name; }
 }


// then if an instance of Person was to be placed onto a request attribute under the name "person"
<!-- the JSP would have -->
 Hello, ${person.name}, of company ${person.organization.name} 
 <%-- second expression same as
      <% Person p = (Person) request.getAttribute("person");
         if (p != null) {
           Organization o = p.getOrganization();
           if (o != null) {
             out.print(o.getName());
           }
         }
      %>
  --%>

@출처 : Wikipedia - JavaServer Page


Spring Framework 2.5 : New and Notable 프로그래밍

Spring 2.5 정리
- java6 지원 : jdbc 4.0, JMX MXBeans, JDK ServiceLoader API
jdk1.3 지원 안 함
- JDBC 지원 개선 : Native connections(java.sql.Wrapper), LOB Handling(setBlob/setClob), SQLException 하위클래스 추가
- 그 외 JDBC 개선된 점 : SimpleJdbcTemplate, SimpleJdbcCall, SimpleJdbcInsert, MSSQL, MySQL, PostgreSQL, Oracle 에러 코드 매핑 추가

- Java EE 5 지원
  - Java EE 5 API 통합 : Servlet2.5, JSP2.1, JSF1.2, JTA1.1, JAX-WS2.0, JavaMail1.4
  - BEA WebLogic 8.1이상, IBM WebSphere 5.1이상 지원(J2EE 1.4, 1.3 계속 지원...)
  - 스프링 Component model은 Java EE 5에 핵심적인 어노테이션을 가공처리한다(?)
    JSR-250 인젝션, 라이프사이클 어노테이션 : 자바 플랫폼상의 통상적인 어노테이션
    EJB 3.0 어노테이션 : 트랜잭션, @EJB, 기타 인젝션 어노테이션
  - 통합된 EL지원
    JSF 1.2 : SpringBeanFacesELResolver
    JTA 1.1 : 신규 TransactionsSynchronizationRegistry 지원
  - RAR 파일 지원(스프링 애플리케이션을 RAR파일로 디플로이 할 수 있음)
     J2EE 1.4, Java EE 5(JCA1.5)
     메시지나 스케쥴링잡 등에 의한 비-웹디플로이 유닛(headless WAR 대체, 스프링 ApplicationContext.xml파일을 참조하기 위해 META-INF/ra.xml 추가, JTA TransactionManager와 MBeanServer와 같은 애플리케이션 서버 서비스에 액세스 할 수 있음)
    - 공식적으로 IBM WAS 6.x 지원(transaction suspension포함, WebSphere 6.0.x, 6.1.x)
      - WebSphereUOWTransactionManager사용(애플리케이션 코드를 오염시키지 않고 IBM API를 사용할 수 있도록 스프링 JtaTransactionManager을 대신함)

- Spring & OSGi
    Open Services Gateway initiative
    자바 동적 모듈 - 엔터프라이즈 자바의 미래를 위한 핵심
    서브시스템의 깨끗한 isolation, Versioning, Hot deployment

    Bundle(중심적인 패키징 유닛) : Versioned JAR, 노출될 타입 전달, 임포트될 타입 구체화, 런타임에 시작, 정지, 갱신될 수 있음
    Spring 2.5 jar는 OSGi Bundle임(MANIFEST.MF의 headers, 프레임웍을 위한 궁극의 모듈화(필요할 때만 로드)
    Spring Dynamic Modules for OSGi Service Platforms프로젝트로 통합
    각 번들당 한 개의 ApplicationContext
    OSGi 서비스 레지스트리와 통합
    입증된 스프링 컴포넌트 모델을 입증된 OSGi 모듈 시스템과 결합
    SpringSource 애플리케이션 플랫폼은 OSGi의 generic 미들웨어 커널에 기초함
- Spring on OSGi vs Spring on Java EE
스프링은 양쪽 케이스에 양립적인 프로그래밍 모델 제공(환경에 종속적이지 않은 POJO, 스프링의 주요 장점으로 가트너에 의해 분류된 환경들 간 이식가능)

Annotations
  - java 5.0에 소개, 소스코드에 메타데이타 추가
  - 스프링은 엔터프라이즈 서비스를 위한 어노테이션 제공(트랜잭션 관리와 JMX) - Spring 1.2때부터..
  - DI 지원을 위한 포괄적인 어노테이션 소개

- DI를 위한 어노테이션의 목적
어노테이션은 클래스, 메서드, 필드에 적용
인젝션 포인트 표시, 어느 Value가 인젝트 될지 결정
메서드위의 어노테이션은 어떤 argument가 인젝트될 지 표시함(다중 arguments 가질수 있음)
필드위의 어노테이션은 인젝트될 Value를 표시함
메서드 argument상의 선택적인 어노테이션은 의존성을 결정하는 방법에 대한 정보를 제공함
클래스 위의 어노테이션은 스프링에 의해 관리될 컴포넌트를 표시함
- 장점 : 외부설정을 제거하거나 감소시킴. 보다 간결한 메카니즘(어떤 것이 인젝트되고, 어디에 어노테이션의 위치로 어디에 인젝트할 것인지를 표시할 수 있음)
- 단점 : per-type not per-instance. 어노테이션이 없는 레거시 코드에서 동작하지 않음. 설정을 변경할 경우 자바코드를 재컴파일 필요. 내부 간단한 타입을 객관화하는 데는 적합하지 않음(?)

- 스프링2.5의 어노테이션 기반 DI를 위한 선택들
@Autowired : 스프링 어노테이션 syntax, 어노테이션 기반 모델을 사용한 경험으로 입증된 스프링 모델 통합
@Resource : JSR-250 / EJB3 model

- 의존성 결정하기 : @Autowired
  생성자/필드/메서드 레벨에 인젝션
  파라미터 여러개 가진 메서드도 지원(간결하게..)
  기본적으로 autowire by type 실행
  autowiring을 좀더 유용하게 함

- @Qualifier 어노테이션
autowiring by type은 너무 많은 후보자를 가질수 있음
qualifier(제한하는 것)를 사용하여 힌트 제공 : 필드/파라미터/커스텀 어노테이션 위에 사용될 수 있음

- name에 의한 의존성 결정 : @Qualifier("myDataSource")
- 어노테이션에 의한 의존성 결정
public class JdbcOrderRepositoryImpl implements OrderRepository {
@Autowired
public void setOrderServices(
 @Emea OrderService emea,
 @Apac OrderService apac) {
 // ...
}
- 어노테이션으로 인젝션 타겟 연결
@Emea
public class EmeaOrderService implements OrderService {
...
}
@Apac
public class ApacOrderService implements OrderService {
...
}

@Qualifier
@Component
public @interface Emea {
}
@Qualifier
@Component
public @interface Apac{
}

- XML로 인젝션 타겟 연결
<bean class="example.EmeaOrderService">
<qualifier type=“example.Emea“/>
<!–
...
EmeaOrderService need not be annotated
-->
</bean>
<bean class="example.ApacOrderService">
<qualifier type=“example.Apac“/>
t h<i!s- -b eiannj e-c-t> any dependencies required by
</bean>

- @Autowired장점 : 간단, 간결, 하지만 여전히 강력한.. , 의존성 주입대상에게 스프링 종속적인 어노테이션을 강요하지 않음
- @Autowired단점 : injectees에게 스프링 종속적임(하지만 스프링에서 런타임 의존성은 없음)

- @Resource : 의존성 주입 포인트 표시, 하나의 컴포넌트에 표시, 스프링이 JNDI 참조를 투명하게 표시할 수 있다고 하더라도 컴포넌트가 JNDI로부터 와야한다고 강요하지 않음
- 장점 : Java EE 5 설정 형식 지원. 이식성 지원가능할수도...
- 단점 : 제한된 힘(@Resource 형식은 스프링 @Autowired 접근처럼 강력하지 않음, 오직 하나의 참조만 결정할 수 있고, qualifiers나 그 외 어노테이션 결정은 지원하지 않음)

JSR-250 라이프사이클 어노테이션
  - @PostConstruct : InitializingBean#afterPropertiesSet()과 비슷
  - @PreDestroy : DisposableBean#destroy()와 비슷
  스프링 종속적이지 않고, 간단하지만 표준화된 중요한 기능
  스프링 init-method나 InitializingBean 인터페이스의 위치에 이 어노테이션들을 사용하길 추천함

- @Component
     Meta-annotations : 확장성(자바 상속같은..), 다른 어노테이션을 어노테이트할 수 있음
     Spring stereotypes : 특정목적으로 클래스 정의할 수 있음. 어플리케이션의 강력한semantic모델 빌드하는데 도움. 스프링-종속적이지 않음. AspectJ pointcuts의 중요한 타겟.
- Out-of-the-box stereotype annotations
@Service : 무상태 서비스 정의
@Repository : DAO같은 레포지토리 정의
@Aspect : AspectJ 애스펙트
@Controller : MVC 콘트롤러
- can define your own annotations....with @Component

 - Component Scanning
annotated 클래스들의 클래스패스를 스캔
XML정의 할 필요없음(어노테이션으로 할 수 없는 걸 제외하고..)

- Component Scan Usage
스프링 코어의 context 네임스페이스 사용. 픽업할 패키지 구체화(base-package="")
XML빈설정과 양립할 수 있음
- More advanced component scanning usage
어노테이션에 국한되지 않고 type 이나 다른 체크도 사용할 수 있음
매우 커스터마이저블해서 어노테이션을 사용하지 않고서도 작동한다
  - 장점 : 허용하는 한에서 더 구체화시킬 필요없으면 굳이 XML이 필요치 않음. 자동으로 변화가 감지됨. 어노테이션 위주의 인젝션에 굉장히 잘 작동함.
  - 단점 : 모든 걸 다 할 수는 없다. 어노테이트될 클래스가 필요하다. 스프링 필터링 메카니즘을 사용하여 너무 과도한 클래스들이 스캔되지 않도록 주의할 필요가 있다. XML설정으로 가치있는 애플리케이션 스트럭쳐 블루프린트를 얻을 수 없다. (Spring IDE가 모든 스프링 컴포넌트 정의를 통합한다해도...)

- 믹스 앤 매치(XML or  Annotations)
결국 모두 스프링 메타데이타
스프링 컴포넌트 모델은 독립적인 메타데이타
어느 한 접근이 다른 식의 접근을 배척하지 않음
어느 한 컨텍스트에 다양한 기여를 할 수 있음

  - 명명관습
빈클래스의 짧은 이름으로 XML 빈 정의 제공
좀더 복잡한 시나리오에서는, @Component어노테이션에 "name"제공
  - 두 방식 복합
절대 헛되지 않아..
어느테이션의 한계에 부딪히면 강력하고 입증된 스프링XML모델을 사용할 수 있다.
(니가 한 걸 똑같이 다시 할 필요없이...)


- Spring MVC annotations
항상 유연한 모델 제공해 왔음
프레임웍의 어느 부분에서의 커스터마이징도 허용하는 확장포인트
HandlerMappings
HandlerAdapters
ViewResolvers

전형적인 활용에 의한 고착화된 상속과 관련된 단점
SimpleFormController와 수많은 템플릿 메서드를 포함한 다른 Base 클래스들

- Anotation-driven Controllers
  - MultiActionController 자바5로 진화(form 핸들링 능력을 갖춘...)
  - POJO기반 - 그냥 니 클래스 어노테이트해..서블릿컨테이너와 포틀릿 컨테이너에서 작동
  - 훌륭한 프로그래밍모델을 제공하는 어노테이션
    @Controller
    @RequestMapping
    @RequestMethod
    @RequestParam
    @ModelAttribute
    @SessionAttribute
    @InitBinder
- 개선된 어노테이션 기반 MVC
세션 어트리뷰트, 데이터 바인더 초기화, 폼 lifecycle을 위한 어노테이션

-스프링 포트폴리오(Enterprise Java의 요구사항에 맞춰 점점더 완벽한 솔루션을 제공하기 위해 스프링 프레임웍을 넘어 확장되고 있는...)
Spring Security 2.0
Spring Batch : SpringSource와 Accenture 공동개발
Spring Web Flow
Spring Web Services
Spring Integration
Spring Dynamic Modules for OSGi

- Spring Ecosystem
스프링 에코시스템은 상업적인 프로젝트와 그 외 오픈소스 프로젝트로 확장되고 있음
SpringSource Application Platform
WebLogic Server
WebLogic Event Server
Gigaspaces
SpringSource Tool Suite
SpringSource Advaned Management Suite(AMS)
SpringSource Advanced Pack for Oracle Database
...

- Spring 3.0
Spring MVC와 Spring Web Flow간에 통합된 프로그래밍 모델을 제시하여 웹프로그래밍계 전반적인 요구사항을 핸들할 수 있도록 할 것임
Spring MVC와 Spring Web Services를 통한 포괄적인 REST 지원

@출처 : JavaOne2008 Spring Framework 2.5 : New and Notable (by Rod Johnson)


get pearls of wisdom from granny

Any fool can write code that a computer can understand. Good programmers write code that humans can understand. (Fowler)

Debug only code - comments can lie.

If you have too many special cases, you are doing it wrong.

Get your data structures correct first, and the rest of the program will write itself.

Testing can show the presence of bugs, but not their absence.

The first step in fixing a broken program is getting it to fail repeatedly.

The fastest algorithm can frequently be replaced by one that is almost as fast and much easier to understand.

The cheapest, fastest, and most reliable components of a computer system are those that aren't there.

Good judgement comes from experience, and experience comes from bad judgement.

Don't use the computer to do things that can be done efficiently by hand.

[Thompson's Rule for first-time telescope makers] It is faster to make a four-inch mirror then a six-inch mirror than to make a six-inch mirror.

If you lie to the computer, it will get you.

Inside of every large program is a small program struggling to get out.

출처: http://www.javaranch.com/granny.jsp


1 2 3