블로그 이미지
Max.

calendar

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

Notice

2008.08.28 11:58 이전글(~2009)
이전 글에서 SpringJDBC 관련 기능들을 설명했는데, 최종적으로 어떤 방법으로 구현해야 할지 고민하게 된다. 일반적으로 가장 편리하다고 생각되는 SimpleJdbcTemplate를 이용한 예제가 좋을듯 하다. 이유는 JdbcTemplate 와 NamedParameterJdbcTemplate 를 포함하고 있기 때문에 가장 자주 쓰이게 된다.

아래는 내가 아는 가장 적합한(Best) SpringJDBC 예제코드를 화면 캡쳐한 것이다.

1. SELECT
사용자 삽입 이미지

2. INSERT(usingGeneratedKeyColumns()이 아닌 시퀀스로 KEY증가하는 경우)
사용자 삽입 이미지

3. BATCH UPDATE
사용자 삽입 이미지

4. SpringJDBC 기능 테스트
사용자 삽입 이미지

[참조]
- Spring2.5 Reference
- forum.springframework.org
- OSCON Simple JDBC with Spring2.5 - Thomas Risberg

신고

'이전글(~2009)' 카테고리의 다른 글

qooxdoo 0.8 released  (0) 2008.09.02
Open Flash Chart GWT(OFCGWT) Widget Library  (0) 2008.09.02
[SpringJDBC] SimpleJdbcTemplate 예제 코드  (0) 2008.08.28
진짜목적을 달성하기 위해서  (2) 2008.08.27
[서적] 부의 역사  (2) 2008.08.27
[SpringJDBC] SimpleJdbcCall  (0) 2008.08.26
posted by Max.
2008.08.26 22:06 이전글(~2009)
SimpleJdbcCall클래스는 스토어드프로시져나 메타데이터를 이용한 조회를 단순화 시켜준다.
다음과 같은 프로시져가 선언되어 있다고 하자.
CREATE PROCEDURE read_actor (
IN in_id INTEGER,
OUT out_first_name VARCHAR(100),
OUT out_last_name VARCHAR(100),
OUT out_birth_date DATE)
BEGIN
SELECT first_name, last_name, birth_date
INTO out_first_name, out_last_name, out_birth_date
FROM t_actor where id = in_id;
END;

이 프로시져를 SimpleJdbcCall를 이용해서 조회하는 예제는 아래와 같다. SimpleJdbcInsert와 같이 초기화시 withProcedureName()메서드를 통해서 프로시져 메다데이터를 읽어 온다. 결과값을 Map으로 받아서 직접 도메인 모델 객체에 set 하고 있다. 이것은 SimpleJdbcCall이 직접 도메인모델 객체에 매핑할수 없음을 말한다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcTemplate simpleJdbcTemplate;
  private SimpleJdbcCall procReadActor;
  public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    this.procReadActor =
    new SimpleJdbcCall(dataSource)
    .withProcedureName("read_actor");

  }
  public Actor readActor(Long id) {
    SqlParameterSource in = new MapSqlParameterSource()
    .addValue("in_id", id);
    Map out = procReadActor.execute(in);
    Actor actor = new Actor();
    actor.setId(id);
    actor.setFirstName((String) out.get("out_first_name"));
    actor.setLastName((String) out.get("out_last_name"));
    actor.setBirthDate((Date) out.get("out_birth_date"));
    return actor;
  }
  // ... additional methods
}

주의 할것은 프로시져 변수명화 out.get()파라메터명이 일치해야 하는것이다. DB 밴더에 따라서 대소문자가 구별될수 있다.

위에서 SimpleJdbcCall은 도메인모델 객체를 리턴하지 않는다고 언급하였는데, 외부 클래스를 이용하여 도메인모델 객체를 리턴할수 있다. 바로 CaseInsensitiveMap를 이용하는 것인데 이것은 Jakarta Commons project에서 Spring이 차용한것이다. 이용하는 방법은 setResultsMapCaseInsensitive() 메서드를  'ture'로 설정하고 사용하면 된다. (또한 commons-collections.jar를 classpath로 잡아야 한다.)

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcCall procReadActor;
  public void setDataSource(DataSource dataSource) {
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
     jdbcTemplate.setResultsMapCaseInsensitive(true);
     this.procReadActor =
     new SimpleJdbcCall(jdbcTemplate)
     .withProcedureName("read_actor");
  }
  // ... additional methods
}


또한 파라메터와 형식을 직접 설정할수도 있다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcCall procReadActor;
  public void setDataSource(DataSource dataSource) {
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
     jdbcTemplate.setResultsMapCaseInsensitive(true);
     this.procReadActor =
     new SimpleJdbcCall(jdbcTemplate)
     .withProcedureName("read_actor")
     .withoutProcedureColumnMetaDataAccess()
     .useInParameterNames("in_id")
     .declareParameters(
         new SqlParameter("in_id", Types.NUMERIC),
         new SqlOutParameter("out_first_name", Types.VARCHAR),
         new SqlOutParameter("out_last_name", Types.VARCHAR),
         new SqlOutParameter("out_birth_date", Types.DATE)
     ); 
  }
  // ... additional methods
}


지원하는 타입은 거의 모든 RDMS는 지원한다.
(Derby, DB2, MySQL, Microsoft SQL Server, Oracle, Sybase)

스토어드평션을 호출할때는 withFunctionName로 설정하고, executeFunction로 호출하면 된다.

CREATE FUNCTION get_actor_name (in_id INTEGER)
RETURNS VARCHAR(200) READS SQL DATA
BEGIN
DECLARE out_name VARCHAR(200);
SELECT concat(first_name, ' ', last_name)
INTO out_name
FROM t_actor where id = in_id;
RETURN out_name;
END;

소스는 아래와 같다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcTemplate simpleJdbcTemplate;
  private SimpleJdbcCall funcGetActorName;

  public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setResultsMapCaseInsensitive(true);
    this.funcGetActorName =
    new SimpleJdbcCall(jdbcTemplate)
    .withFunctionName("get_actor_name");
  }

  public String getActorName(Long id) {
    SqlParameterSource in = new MapSqlParameterSource()
    .addValue("in_id", id);
    String name = funcGetActorName.executeFunction(String.class, in);
    return name;
  }
  // ... additional methods
}

프로시져를 이용해서 ResultSet를 리턴하고 싶다면 returningResultSet()메서드에 RowMapper로 도메인모델 객체를 넘겨주고 Map으로 받을수 있다.

CREATE PROCEDURE read_all_actors()
BEGIN
SELECT a.id, a.first_name, a.last_name, a.birth_date FROM t_actor a;
END;

만약 결과값이 없으면 어떠 파라메터값도 가지지 않는다.

public class JdbcActorDao implements ActorDao {
private SimpleJdbcTemplate simpleJdbcTemplate;
private SimpleJdbcCall procReadAllActors;

  public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setResultsMapCaseInsensitive(true);
    this.procReadAllActors =
    new SimpleJdbcCall(jdbcTemplate)
    .withProcedureName("read_all_actors")
    .returningResultSet("actors",
    ParameterizedBeanPropertyRowMapper.newInstance(Actor.class));

  }

  public List getActorsList() {
    Map m = procReadAllActors.execute(new HashMap<String, Object>(0));
    return (List) m.get("actors");

  }
  // ... additional methods
}

Map의 파라메터가 callee와 caller가  "actors"로 동일하다.

이후 언급되는 것은 고급기법으로 여기서는 생략하다.
11.6 Modeling JDBC operations as Java objects
11.7 Common issues with parameter and data value handling(BLOB,CLOB)
나중에 기회가 되면 실예제로 설명한다.


이상 11장 Data access using JDBC 개념적인 것은 끝났고, Demo Project를 통해서 다루기로 한다. (다음에 계속...)

'요즘은 거의 안쓰는 SpringJDBC라 그런지 별로 재미가 없다....ㅡㅡ;'
신고

'이전글(~2009)' 카테고리의 다른 글

진짜목적을 달성하기 위해서  (2) 2008.08.27
[서적] 부의 역사  (2) 2008.08.27
[SpringJDBC] SimpleJdbcCall  (0) 2008.08.26
[SpringJDBC] SimpleJdbcInsert  (0) 2008.08.26
[SpringJDBC] SimpleJdbcTemplate  (0) 2008.08.26
[SpringJDBC] Batch  (0) 2008.08.26
posted by Max.
2008.08.26 22:05 이전글(~2009)
SimpleJdbcInsert 와 SimpleJdbcCall는 메타데이타를 이용해서 해당 작업을 단순화시킨 클래스이다. 먼저 SimpleJdbcInsert 를 보자.

SimpleJdbcInsert 는 먼저 클래스가 초기화 될때 withTableName 메서드를 이용하여 테이블명을 지정하고 입력할 데이터를 Map으로 매핑하면 된다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcTemplate simpleJdbcTemplate;
  private SimpleJdbcInsert insertActor;
 
public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    this.insertActor = new SimpleJdbcInsert(dataSource).withTableName("t_actor");
  }

  public void add(Actor actor) {
    Map<String, Object> parameters = new HashMap<String, Object>(3);
    parameters.put("id", actor.getId());
    parameters.put("first_name", actor.getFirstName());
    parameters.put("last_name", actor.getLastName());
    insertActor.execute(parameters);
  }
  // ... additional methods
}


또한 자동증가값 필드가 필요하다면 usingGeneratedKeyColumns()메서드를 이용하면 된다.

public class JdbcActorDao implements ActorDao {
private SimpleJdbcTemplate simpleJdbcTemplate;
private SimpleJdbcInsert insertActor;

    public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    this.insertActor =
        new SimpleJdbcInsert(dataSource)
        .withTableName("t_actor")
        .usingGeneratedKeyColumns("id");
    }

    public void add(Actor actor) {
    Map<String, Object> parameters = new HashMap<String, Object>(2);
    parameters.put("first_name", actor.getFirstName());
    parameters.put("last_name", actor.getLastName());
    Number newId = insertActor.executeAndReturnKey(parameters);
    actor.setId(newId.longValue());
    }
    // ... additional methods
}


만약 특별한 필드명으로 바꾸고 싶다면, usingColumns()를 이용해서 바꿀수도 있다.

this.insertActor =
new SimpleJdbcInsert(dataSource)
.withTableName("t_actor")
.usingColumns("first_name", "last_name")
.usingGeneratedKeyColumns("id");

SimpleJdbcInsert 역시 Map 대신 도메인 모델 객체를 파라메터로 넘길수 있다.
...
public void add(Actor actor) {
  SqlParameterSource parameters = new BeanPropertySqlParameterSource(actor);
  Number newId = insertActor.executeAndReturnKey(parameters);
  actor.setId(newId.longValue());
}
...


이 경우 도메인 모델 객체가 은닉화되어 어떻게 매핑되는지 알수 없다. 그래서 더욱 편리한 방법을 또 제공하고 있다.
...
public void add(Actor actor) {
   SqlParameterSource parameters = new MapSqlParameterSource()
    .addValue("first_name", actor.getFirstName())
    .addValue("last_name", actor.getLastName());
   Number newId = insertActor.executeAndReturnKey(parameters);
   actor.setId(newId.longValue());
}
...

이런 방법들은 JdbcTemplate 시리즈가 거의 비슷하게 적용되고 있다.
신고

'이전글(~2009)' 카테고리의 다른 글

[서적] 부의 역사  (2) 2008.08.27
[SpringJDBC] SimpleJdbcCall  (0) 2008.08.26
[SpringJDBC] SimpleJdbcInsert  (0) 2008.08.26
[SpringJDBC] SimpleJdbcTemplate  (0) 2008.08.26
[SpringJDBC] Batch  (0) 2008.08.26
[SpringJDBC] NamedParameterJdbcTemplate  (0) 2008.08.26
posted by Max.
2008.08.26 22:02 이전글(~2009)

Statement 쿼리에 매핑할 파라메터는 보통 '?'를 인자로 하는데 이는 직관적이지 못해서 의미있는 매핑을 위해 이름을 사용할수 있게한 JdbcTemplate 래퍼 클래스이다.

public int countOfActorsByFirstName(String firstName) {
    String sql = "select count(0) from T_ACTOR where first_name = :first_name";
    SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);
    return namedParameterJdbcTemplate.queryForInt(sql, namedParameters);
}

예제에서 처럼 쿼리문 변수(sql)에 간단히 ':변수명' 형식으로 정의한후 MapSqlParameterSource로 해당 변수를 매핑하여 쿼리를 실행한다. 여기서 SqlParameterSource  대신 Map을 이용할수도 있다.

Map namedParameters = Collections.singletonMap("first_name", firstName);

또한 Map 대신에 Bean 객체를 이용할수도 있다.

public int countOfActorsByFirstName(String firstName) {
    String sql = "select count(0) from T_ACTOR where first_name = :first_name";
    Actor exampleActor = new Actor(firstName);
    SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(exampleActor);
    return this.namedParameterJdbcTemplate.queryForInt(sql, namedParameters);
}

기억해 둘것은 NamedParameterJdbcTemplate 클래스는 JdbcTemplate클래스를 완전이 감싸고 있기 때문에 NamedParameterJdbcTemplate에서 언제든지 JdbcTemplate의 기능을 사용할수 있다.

신고

'이전글(~2009)' 카테고리의 다른 글

[SpringJDBC] SimpleJdbcTemplate  (0) 2008.08.26
[SpringJDBC] Batch  (0) 2008.08.26
[SpringJDBC] NamedParameterJdbcTemplate  (0) 2008.08.26
[SpringJDBC] JdbcTemplate  (0) 2008.08.26
[SpringJDBC] 개요  (0) 2008.08.26
가고싶은 일주일간의 독서여행  (2) 2008.08.26
posted by Max.
2008.08.26 22:01 이전글(~2009)
JdbcTemplate 클래스는 SpringJDBC 패키지에서 가장 기본이되는 클래스로 SQL를 질의하거나, update, 스토어드프로시져 콜, Resultset 을 실행한다. 이 클래스는 단순히 콜백 인터페이스만 구현하면 사용할수 있는데 보통 DAO의 구현체에서 사용된다.

이 클래스를 사용하기 위해서는 Datasource를 Spring IoC로 참조하고 해당 DAO 구현체에서 확장하거나 참조로 사용할수 있다.

1. SELECT 쿼리 예제
// 숫자형을 리턴할때
int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt(
"select count(0) from t_actors where first_name = ?", new Object[]{"Joe"});

// 도메인 객체와 매핑할때
public Collection findAllActors() {
return this.jdbcTemplate.query( "select first_name, surname from t_actor", new ActorMapper());
}
private static final class ActorMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name"));
actor.setSurname(rs.getString("surname"));
return actor;
}
}

2. INSERT, UPDATE, DELETE 쿼리 예제
this.jdbcTemplate.update(
"insert into t_actor (first_name, surname) values (?, ?)",
new Object[] {"Leonor", "Watling"});

SQL문만 다를뿐 모두 update 메서드를 사용하면 된다.
또한 간단한 스토어드프로시져도 update메서드를 이용할수 있다.
this.jdbcTemplate.update(
"call SUPPORT.REFRESH_ACTORS_SUMMARY(?)",
new Object[]{Long.valueOf(unionId)});


3.기타
그밖에 DDL 같은 특수한 쿼리를 실행할때는 execute()메서드를 사용하기도 한다.
this.jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");

JdbcTemplate를 사용하기 위해서 위와 같은 기본기능이 있고, 사용하기 위한 Spring 환경 설정은 다음과 같다.

환경설정에서...
<bean id="corporateEventDao" class="com.example.JdbcCorporateEventDao">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
Class에서...
public class JdbcCorporateEventDao implements CorporateEventDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// JDBC-backed implementations of the methods on the CorporateEventDao follow...
}


기억할것은 Spring은 다양한 방법을 제공하고 또 만들수 있다. 따라서 이것은 Best가 아닌 선택이라는것을 앞으로 다른 JDBC 관련 클래스를 보면서 알수 있다.
(계속...)
신고

'이전글(~2009)' 카테고리의 다른 글

[SpringJDBC] Batch  (0) 2008.08.26
[SpringJDBC] NamedParameterJdbcTemplate  (0) 2008.08.26
[SpringJDBC] JdbcTemplate  (0) 2008.08.26
[SpringJDBC] 개요  (0) 2008.08.26
가고싶은 일주일간의 독서여행  (2) 2008.08.26
책을 사서(buy) 봐야 하는 이유  (0) 2008.08.25
posted by Max.
2008.08.26 22:00 이전글(~2009)

소개
스프링 2.5 에서는 JDBC 데이터 접근에 대한 편리한 클래스를 제공하고 있는데 그 종류와 특징은 아래와 같다.

  • JdbcTemplate 클래스는 가장 기본이 되는 클래스로 스프링 초기부터 제공하는 클래스이다.
  • NamedParameterJdbcTemplate 클래스는 JdbcTemplate클래스를 완전히 포함한 클래스로 클래스명에서 눈치챌수 있듯이 "?" 대신 "이름"으로 파라메터를 지정할수 있다.
  • SimpleJdbcTemplate 클래스는 위의 두개의 클래스 기능을 포함할 뿐아니라, java5의 특징까지 포함한 편리한 클래스이다.
  • SimpleJdbcInsert 와 SimpleJdbcCall 클래스는 질의를 좀더 단순화 하기 위해서 새로 추가된 극도(?)로 편리한 클래스이다.
  • 이밖에 MappingSqlQuery, SqlUpdate, StoredProcedure가 있다.

패키지 구조

사용자 삽입 이미지

위 그림은 Spring CVS jdbc 패키지 구조이며, 여러 폴더(패키지)가 있지만 실제 클래스가 있는 폴더는 core, datasource, object, support 만 있다. core 폴더는 Spring JDBC에서 가장 많이 쓰는 대부분의 클래스들이 포함되어 있는 패키지로 잘 알려진 JdbcDaoSupport나 JdbcTemplate등도 여기에 속해 있다. datasource폴더는 데이터자원 관리(획득,운용,소멸)를 쉽게 해주는 클래스와 JEE 컨테이너 밖에서 테스트가 가능하거나 JNDI로 자원획득도 가능하게 여러가지 유틸클래스를 제공한다.  object폴더는 재사용가능한 객체, 프로시져, 질의 등의 RDMS와 관련된 클래스를 제공한다.(JDO를 모델로했다.) 마지막으로 support폴더는 예외처리와 외부지원관련 유틸클래스를 제공하고 있다.



신고
posted by Max.
2008.08.19 17:54 이전글(~2009)

Terracotta사에서는 다른 opensource에 비해 교육자료로 webcast를 자주 이용한다. 이는 사용자 접근성을 고려하기 위함이다. 왜 그럴까? Terracotta 비지니스 영역의 특성 때문이다. Terracotta를 이용하면 비교적 저렴하게 시스템을 구축할수 있음에도 불구하고, 현업에서는 하드웨어 벤더를 더 선호하는 탓에 시장의 입지가 약함을 간접적으로 알수 있다. (어쨌든 나같은 빈민스러운 업체들에게는 좋은일이다.)

Terracotta Video Podcasts 라는 feed페이지에 교육용 동영상 정보를 제공하고 있는데 대략 하나의 동영상 파일을 보는데 한시간 남짓 걸린다. 이런 동영상을 제작하고 배포하는데는 그만큼 Terracotta를 널리 알리는데 신경쓰고 있다는 뜻인데 최근 2007년부터인걸 보니 시작한지는 얼마 안된듯 하다.

사용자 삽입 이미지

주로 내용은 Terracotta 소개와 특징인 Cluster, Cache등 응용가능한 분야에 대해서 설명하고 있다. - 자세히 보면 정말 중요한 부분은 빠져있다.의도된건지...너무많이 공유하면 재미 없어서 인지...-

iPhone또는 Mac에서도 접속해서 볼수 있게 퀵타임 형식의 동영상으로 제공하고 있는것이 상당히 사용자측을 고려한듯 하다.

최근들어 사이트가 자주 업데이트되고, 컨텐츠도 보강 되는데 Spring2.5 지원 관련 소식은 조용하다.(테라코타 제품에서 Spring 이슈는 그리 큰 영역이 아닐수도 있겠다는 생각이 든다.)

최근 인도 델리에 지사를 낸것이 뉴스로 등록되어 있는데 아시아 시장을 공략하기 위해서 란다. 이미 중국과 인도엔 시장을 형성하고 있는듯 하다. 그런데 IT하면 아시아에서는 우리나라가 테스트벤드 아니였던가? 우리나라에 대한 언급이 없는걸 보니 이양반(CEO-Amit Pandey) 우리내 IT시장구조를 보고 놀랜건 아닌지 모르겠다. 앞으로 아시아 시장이 활발해 지면 우리나라에도 이제품이 먹힐지 기대된다.

그런데 당췌 우리나라는 오픈소스에 대한 컨설팅을 받는 곳이 있는가? 다들 컨설팅이 가능한 실력을 보유하고 있는것인가? 아니면 오픈소스라서 컨설팅을 받는것이 미친짓이라 여기는것일까? 알수없다... Spring도 Terracotta도 중대한 시스템에서는 하부구조까지 검증된 구조를 가지고 가야 한다. 대충알고 짜붙이기 해서 Spring이니까 Terracotta니까 괜찮겠지 하면.... 나중에 피똥싼다....
신고
posted by Max.
2008.08.01 11:46 이전글(~2009)

테라코타에서는 아직도 Spring2.5를 지원 안한다. 열심히 만들고 있다고 하는데, OSGi까지 포함해서 가능하게 할려면 시간이 많이 걸릴듯 하다. 낼모래 Spring 3.0 이 나올텐데.... 테라코타사가 스프링 발전속도를 맞추기가 버거워 보인다.

사용자 삽입 이미지

신고
posted by Max.
2008.02.29 09:30 이전글(~2009)

Spring framework 2.5에 관한 책은 아직 아마존에서도 찾아 볼수 없다.
(출간예정인 책은 있지만. Pro Spring 2.5 , Spring 2.5 Recipes)
그런데 국내에서 오늘 발간된것을 확인했다.(2.0을 기준으로 집필하다가 2.5가 나와서 포함하느라 좀더 늦춰질줄 알았는데 예상보다 빨리 나왔다.) 글 제목의 '스프링 2.5 프로그래밍-저자 최범균' 이라는 책이다.

기술서적에 관한 소식은 잘 언급하지 않지만, 이번 책은 그동안 Spring 1.2 이후로 번역되거나, 새로나온 국내서적이 없는 상태에서 영어가 두려운 개발자들에게 희망적인 소식이라 할수 있다.(물론 영어를 잘 한다고 하더라도 의미가 있다. 2.5기반으로 나온책이 없으니...)

'중요한건 얼마나 양질의 정보를 담고 있느냐'에 초점을 맞출수도 있겠지만, 현재로써는 나와준것만으로도 고마운것 아닌가싶다. 앞으로도 관련서적이 더 많이 나오길 기다려 본다.

사용자 삽입 이미지

이미지출처 : Yes24.com

목차
Part 01 스프링의 기초
Chapter 01 스프링 프레임워크 소개
1. 스프링이란 무엇인가?
2. 스프링 프레임워크 설치와 모듈 구성
2.1 모듈 구성
2.2 외부 라이브러리
3. Dependency Injection과 스프링 프레임워크
3.1 Dependency Injection
3.2 스프링에서의 DI
4. AOP와 스프링
4.1 AOP 소개
4.2 스프링에서의 AOP

Chapter 02 스프링 DI
1. 스프링 컨테이너
1.1 BeanFactory 인터페이스
1.2 ApplicationContext 인터페이스와 WebApplicationContext 인터페이스
1.3 DTD와 XML 스키마 기반의 설정 파일 작성
2. 빈(bean) 생성과 의존 관계 설정
2.1 빈 생성 및 사용
2.2 의존 관계 설정
2.3 컬렉션 타입 프로퍼티 설정
2.4 의존 관계 자동 설정
2.5 부모 빈을 통한 설정 재사용
3. 빈 객체 범위
4. 라이프 사이클
4.1 빈 객체의 라이프 사이클
4.2 BeanNameAware 인터페이스
4.3 BeanFactoryAware 인터페이스와 ApplicationContextAware 인터페이스
4.4 InitializingBean 인터페이스
4.5 DisposableBean 인터페이스
4.6 커스텀 초기화 및 소멸 메서드
5. 외부 설정 프로퍼티
6. MessageSource를 이용한 텍스트 메시지 처리
6.1 빈 객체에서 메시지 이용하기
7. 스프링 컨텍스트 이벤트
8. 어노테이션을 이용한 설정
8.1 @Required 어노테이션을 이용한 필수 프로퍼티 검사
8.2 @Autowired 어노테이션을 이용한 자동 설정
8.3 @Resource 어노테이션을 이용한 프로퍼티 설정
8.4 @PostConstruct 어노테이션 및 @PreDestroy 어노테이션과 라이프 사이클
9. 빈 객체 스캔
9.1 어노테이션을 이용한 자동 스캔
9.2 자동 검색된 빈의 이름과 범위
9.3 스캔 대상 클래스 범위 지정하기

Chapter 03 스프링 AOP
1. AOP 소개
1.1 AOP 용어
1.2 세 가지 Weaving 방식
2. 스프링에서의 AOP
2.1 프록시를 이용한 AOP 구현
3. 스프링 API를 이용한 AOP
3.1 Advice 작성
3.2 Pointcut 및 Advisor 설정
3.3 ProxyFactoryBean을 이용한 Advice 적용
3.4 DefaultAdvisorAutoProxyCreator를 이용한 자동 프록시 생성
4. POJO 클래스를 이용한 AOP
4.1 XML 스키마를 이용한 AOP 설정
4.2 POJO 기반의 Advice 작성
4.3 스프링 API를 이용한 Advice 설정
5. @Aspect 어노테이션을 이용한 AOP
6. AspectJ의 Pointcut 표현식
6.1 프록시 구현 방식에 따른 execution 적용 차이

Part 02 스프링 MVC
Chapter 04 스프링 MVC를 이용한 웹 요청 처리
1. 스프링 MVC의 주요 구성 요소 및 처리 흐름
2. 스프링 MVC Hello World
2.1 단계1, DispatcherServlet 설정 및 스프링 컨텍스트 설정
2.2 단계2, 설정 파일에 HandlerMapping 설정 추가
2.3 단계3, 컨트롤러 구현 및 설정
2.4 단계4, 설정 파일에 ViewResolver 설정 추가
2.5 단계5, 뷰 코드 구현
2.6 실행 흐름 정리
3. DispatcherServlet 설정과 ApplicationContext의 관계
3.1 DispatcherServlet 설정
3.2 웹 어플리케이션을 위한 ApplicationContext 설정
4. 캐릭터 인코딩 처리를 위한 필터 설정
5. 웹 요청과 컨트롤러 매핑:HandlerMapping
5.1 AbstractUrlHandlerMapping 클래스와 서블릿 URL
5.2 BeanNameUrlHandlerMapping을 이용한 컨트롤러 매핑
5.3 SimpleUrlHandlerMapping을 이용한 컨트롤러 매핑
5.4 다수의 HandlerMapping 동시 설정
6. 컨트롤러 구현
6.1 컨트롤러의 종류
6.2 AbstractController를 이용한 컨트롤러 구현
6.3 AbstractCommandController를 이용한 파라미터 처리
6.4 SimpleFormController를 이용한 폼 처리
6.5 formBackingObject() 메서드를 이용한 커맨드 객체 기본 값 처리
6.6 sessionForm 프로퍼티와 HttpSession을 이용한 커맨드 객체 저장
6.7 AbstractWizardFormController를 이용한 단계별 입력 폼 처리
6.8 MultiActionController를 이용한 컨트롤러 구현
6.9 ParameterizableViewController와 UrlFilenameView Controller를 이용한 정적 뷰 매핑
6.10 ModelAndView 클래스
6.11 뷰 이름을 지정하지 않는 경우의 처리
7. 입력 값 검증 및 BindException 클래스
7.1 Validator를 이용한 값 검증
7.2 Errors 인터페이스와 BindException 클래스
7.3 DefaultMessageCodesResolver와 에러 메시지
8. 파일 업로드(multipart/form-data) 처리
9. 어노테이션을 이용한 컨트롤러 구현
9.1 어노테이션 지원을 위한 HandlerMapping과 HandlerAdapter 설정
9.2 @Controller 어노테이션을 이용한 컨트롤러 작성
9.3 @RequestMapping 어노테이션을 이용한 요청 매핑 설정
9.4 컨트롤러 메서드의 파라미터 타입
9.5 컨트롤러 메서드의 리턴 타입
9.6 @ModelAttribute 어노테이션을 이용한 모델 데이터 처리
9.7 @SessionAttributes 어노테이션과 SessionStatus를 이용한 세션 사용
9.8 @InitBinder 어노테이션을 이용한 데이터 바인딩 설정
10. HandlerInterceptor를 통한 요청 가로채기
10.1 HandlerInterceptor 인터페이스의 구현
10.2 HandlerMapping에 HandlerInterceptor 설정하기
10.3 HandlerInterceptor의 실행 순서
11. 예외 처리

Chapter 05 뷰 영역 구현
1. ViewResolver 설정
1.1 ViewResolver 인터페이스
1.2 View 객체
1.3 InternalResourceViewResolver 설정
1.4 BeanNameViewResolver 설정
1.5 XmlViewResolver 설정
1.6 ResourceBundleViewResolver 설정
1.7 다수의 ViewResolver 설정하기
2. HTML 특수 문자 처리 방식 설정
3. JSP를 이용한 뷰 구현
3.1 스프링이 제공하는 커스텀 태그
3.2 메시지 출력을 위한 커스텀 태그
3.3 스프링이 제공하는 폼 관련 커스텀 태그
3.4 스프링이 제공하는 에러 관련 커스텀 태그
3.5 커스텀 태그와 htmlEscape 속성
4. Tiles 연동을 이용한 레이아웃 템플릿 처리
4.1 Tiles 2 연동
4.2 Tiles 1 연동
5. Velocity를 이용한 뷰 구현
5.1 VelocityViewResolver와 VelocityConfigurer를 이용한 Velocity 연동
5.2 스프링이 제공하는 Velocity 매크로
5.3 VelocityLayoutViewResolver를 이용한 Velocity 레이아웃 템플릿 사용
6. HTML 이외의 뷰 구현
6.1 파일 다운로드 구현을 위한 커스텀 View
6.2 AbstractExcelView 클래스를 이용한 엑셀 다운로드 구현
6.3 AbstractPdfView 클래스를 이용한 PDF 다운로드 구현
7. Locale 처리
7.1 LocaleResolver 인터페이스
7.2 LocaleResolver의 종류
7.3 LocaleResolver를 이용한 Locale 변경
7.4 LocaleChangeInterceptor를 이용한 Locale 변경

Part 03 데이터베이스 연동과 엔터프라이즈 서비스
Chapter 06 데이터베이스 연동 지원
1. 스프링의 데이터베이스 연동 지원
1.1 데이터베이스 연동을 위한 템플릿 클래스
1.2 DAO 클래스를 위한 DaoSupport 클래스
1.3 스프링의 예외 지원
2. DataSource 설정
2.1 커넥션 풀을 이용한 DataSource 설정
2.2 JNDI를 이용한 DataSource 설정
2.3 DriverManager를 이용한 DataSource 설정
2.4 DataSource로부터 Connection 구하기
3. 스프링의 JDBC 지원
3.1 JdbcTemplate 클래스를 이용한 JDBC 프로그래밍
3.2 NamedParameterJdbcTemplate 클래스를 이용한 JDBC 프로그래밍
3.3 SimpleJdbcTemplate 클래스를 이용한 JDBC 프로그래밍
3.4 DaoSupport 클래스를 이용한 JDBC 기반의 DAO 구현
4. 스프링의 IBATIS 연동 지원
4.1 SqlMapClient를 위한 스프링 설정
4.2 SqlMapClientTemplate을 이용한 DAO 구현
4.3 SqlMapClientDaoSupport 클래스를 이용한 DAO 구현
5. 스프링의 하이버네이트 연동 지원
5.1 SessionFactory를 위한 스프링 설정
5.2 HibernateTemplate을 이용한 DAO 구현
5.3 HibernateDaoSupport 클래스를 이용한 DAO 구현
5.4 SessionFactory를 직접 이용한 구현
6. 스프링의 JPA 연동 지원
6.1 EntityManagerFactory를 위한 스프링 설정
6.2 JpaTemplate를 이용한 DAO 구현
6.3 JpaDaoSupport 클래스를 이용한 DAO 구현
6.4 JPA 연동을 위한 LoadTimeWeaver 설정

Chapter 07 스프링의 트랜잭션 관리
1. 트랜잭션이란
1.1 ACID
2. 스프링의 트랜잭션 지원
2.1 스프링의 PlatformTransactionManager 설정
2.2 JDBC 기반 트랜잭션 관리자 설정
2.3 하이버네이트 트랜잭션 관리자 설정
2.4 JPA 트랜잭션 관리자 설정
2.5 JTA 트랜잭션 관리자 설정
3. TransactionTemplate을 이용한 트랜잭션 처리
4. 선언적 트랜잭션 처리
4.1 태그를 이용한 트랜잭션 처리
4.2 TransactionProxyFactoryBean을 이용한 트랜잭션 처리
4.3 어노테이션 기반 트랜잭션 설정
5. JOTM을 이용한 분산 트랜잭션 처리

Chapter 08 엔터프라이즈 서비스
1. 스프링을 이용한 메일 발송
1.1 MailSender 설정
1.2 SimpleMailMessage를 이용한 메일 메시지 생성
1.3 Java Mail API의 MimeMessage를 이용한 메일 메시지 생성
1.4 MimeMessageHelper를 이용한 메일 메시지 생성 및 파일 첨부
2. Quartz를 이용한 스케줄링 처리
2.1 작업을 수행할 클래스 생성
2.2 주기적으로 실행될 JobDetailBean 설정
2.3 TriggerBean을 이용한 스케줄링 설정
2.4 SchedulerFactoryBean 클래스로 TriggerBean 시작
3. JMS를 이용한 메시징
3.1 JMS 연동을 위한 ConnectionFactory 및 메시지 목적지 설정
3.2 JmsTemplate 클래스를 이용한 메시지 송수신
3.3 MessageConverter를 이용한 Message와 객체 매핑 처리
3.4 JmsGatewaySupport 클래스를 이용한 JMS 연동 클래스 구현하기
3.5 POJO 기반의 Message-Driven 빈
3.6 JMS 트랜잭션 처리
4. JMX 연동 지원
4.1 스프링 빈을 MBean으로 등록하기
4.2 MBeanServer 설정
4.3 MBean 인터페이스 결정
4.4 MBeanServer 원격으로 제공
4.5 원격지 MBeanServer 접근 및 사용

Part 04 테스트
Chapter 09 테스트 지원
1. 스프링 MVC 컨트롤러 단위 테스트
1.1 MockHttpServletRequest 객체를 이용한 컨트롤러 테스트
1.2 ModelAndView 테스트 기능을 제공하는 AbstractModelAndViewTests 클래스
2. Unit 3.8에서의 스프링 통합 테스트
2.1 스프링 통합 테스트
2.2 데이터베이스 연동 테스트의 트랜잭션 처리
2.3 AbstractTransactionalDataSourceSpringContextTests를 이용한 테스트 데이터 초기화
2.4 스프링 컨텍스트 리로딩 설정
3. JUnit 4에서의 스프링 통합 테스트
3.1 SpringJUnit4ClassRunner를 사용한 JUnit 4 기반 테스트
3.2 트랜잭션 처리를 위한 설정
3.3 스프링 컨텍스트 참조 및 컨텍스트 리로딩 처리
3.4 AbstractTransactionalJUnit4SpringContextTests를 이용한 데이터 초기화 구현

Part 05 부 록
Appendix A XML 스키마 확장
1. XML 스키마 작성하기
2. NamespaceHandler 구현 클래스 작성하기
3. BeanDefinitionParser 구현 클래스 작성하기
4. 스프링에 스키마 및 핸들러 등록하기
4.1 META-INF/spring.handlers에 NamespaceHandler 명시하기
4.2 META-INF/spring.schemas에 스키마 URL 명시하기
5. 개발한 커스텀 태그 사용하기
Appendix B 스프링 프레임워크 소개
Appendix C DWR 2와 스프링 MVC 연동
Appendix D 참고 자료
Index 찾아보기
신고
posted by Max.
TAG Spring2.5,
2007.12.24 09:54 이전글(~2009)

KSUG 모임(세미나)에 다녀왔다.
이번 세미나에 참석하기가 힘든 환경이였는데 약간 무리를 해서 다녀왔다.
올해 마지막 세미나이고, 1년동안 변해온  Spring에 대한 정리를 들을수 있을것 같아서
끝까지 세미나를 못들어도 갔다오는게 좋을것 같아서 였다.
결국 가길 잘했다.
약간 지각한 2시쯤 도착하여 기선씨의 카운터 써비스를 받고 강의실에 들어섰다.
영회씨의 KSUG의 1년간 활동과 앞으로의 계획을 듣고 고무된 느낌을 받았다.
내년엔 TSE처럼 더욱 발전되고 알찬 KSUG이 될꺼라 믿어의심치 않는다.

이번 세미나에 참석의 목적은 크게  세가지였다.
하나는 Spring2.5에 대한 변화된 기술내용, 둘째는 ROO 소식, 셋째는 온라인 동료(?)들과의 잡담(?)이였다.

첫번째 주제인 Spring2.5와 미래로 그 첫번째 목적을 달성하였다. 사실 Spring2.5는 어노테이션이 가장큰 변화라고 생각하고 있었고, 그것은 환경적인 제약이 있으므로 (나의)실무와는 약간의 거리가 있다고 생각했다. JDK5 이상의 환경을 요하는 기술이라는 것에는 변화가 없었다. 그러나 상상하는것 이상의 변화여서 한동안 강의하는데 감탄만 하고 있었다.

'중간중간에 청자들의 반응을 살펴보는 Toby님에 겉으로 표현한 박수를 치는건
나 뿐이였지만, 여기 저기서 작은 감탄의 탄성을 들을수 있었다. 특히 MVC 강의에서 말이다.
우리나라 개발자들 역시 과묵하다. -_-; '

이 하나만으로도 세미나에 오길 잘했다는 생각이 들었다. 앞으로 해야할것들이 좀더 구체적으로 생겼다. 특히 Spring2.5 레퍼런스를 꼭 읽어 봐야 겠고 MVC 부분은 경이롭기까지 했다.

중간 쉬는 시간에 영회님과 찬욱님과 짧은 인사후 얼떨결에 로드존슨 포즈로 사진을 찍었다.

사용자 삽입 이미지

 ( 윤걸(?)님이 찍어주신 로드존슨 포즈 사진...-_-;; )

중요한 약속 때문에 5시 이전에 세미나실에서 나와야만 했다.
찬욱님 강의도 꼭 듣고 싶었는데 올려주실 자료로 아쉬움을 달래야 겠다.
5시가 넘었는데도 나올수가 없었다. 강의 내용도 좋았거니와 열강하시는 중간에 나오기가 민망했다.
결국 Toby님 강의가 끝나고야 나올수 있었고, 허겁지겁 지하철로 향했다.

이후 듣지 못한 강의가 아쉬웠고, 다른 지인들과도 인사와 충분한 대화를 하지 못하는게 아쉬웠다.
거의 뭐 달랑 강의만 듣고 나왔으니 원하는 목적 중 한가지만 달성하고 나온셈이다.
그러나 그 한가지만으로도 참석한 충분한 가치가 있어서
내년에는 좀더 충실히(?) KSUG모임에 참석해야 겠다는 생각을 한다.

모두들 수고 하셨고 내년에는 더욱 멋진 모습을 기대하겠습니다.

신고
posted by Max.
prev 1 2 next

티스토리 툴바