Release History

Data format is : YYYY-MM-DD

Version format is : major.minor.patch

4.2.4 Released ( 2014-12-08 )

  • dependency 변경

    1. license-api 변경 : 1.1.0 -> 1.1.2으로 up.
      JBoss EAP 6 환경에서 Global module 로 library를 사용할 경우 "invalid license!!".
  • glue-core 모듈 수정

    1. MessageCreate(Activity)수정
      charset, charset-name property 추가
      • com.poscoict.glueframework.biz.activity.GlueMessageCreate
      • 사용법
        <service ...>
            <activity name="MessageCreate" class="com.poscoict.glueframework.biz.activity.GlueMessageCreate">
                . . .
                <property name="charset" value="UTF-8"/>
            </activity>
            . . .
        </service>
        
    2. Layout Mananger(Bean) 수정
      GlueMessage 를 String 으로 변환시 Layout Manager 의 msgParsingType이 byte 일경우 charset 를 사용하도록 수정
      • com.poscoict.glueframework.message.layout.GlueAbstractFixedLengthMessageLayout 수정
        com.poscoict.glueframework.message.layout.GlueMessageUtil 에 메소드 추가
        public static String getByteMsgString( GlueMessageAttributeDefinition attrDef, GlueMessage message, int index, Charset charset ) 추가
      • 사용법
        <beans ...>
            <bean id="layoutManager" class=". . .">
                . . .
                <property name="msgParsingType" value="byte"/>
            </bean>
        </beans>
        
        <service ...>
            <activity name="MessageCreate" class="com.poscoict.glueframework.biz.activity.GlueMessageCreate">
                . . .
                <property name="charset" value="UTF-8"/>
        
        <msgs>
          <msg ...>
            . . . 
            <attribute type="E" seq="1" id="ATTR1" name="항목1" datatype="STRING" length="9" />
        
        /* java code */
        GlueMessage msg = . . .
        msg.set("ATTR1", "포스코ICT");
        
      • charset 이 UTF-8 이므로 "포스코ICT"는 12 byte로 인식함
        ______포스코_________
        
      • charset 이 EUC-KR 일경우 "포스코ICT"는 9 byte로 인식함
        ______포스코ICT_________
        
    3. GlueJdbcDao 수정 : resultType 클래스 로딩 변경   query 의 resultType 로 정의된 Class 로딩 오류 보완
      ClassT c = (ClassT) Class.forName( resultType ) 대신에
      ClassT c = (ClassT) Thread.currentThread().getContextClassLoader().loadClass( resultType ) 으로 변경함
      • com.poscoict.glueframework.dao.jdbc.GlueJdbcDao
      • 예제
        <queryMap ...>
            <query id="sample.emp.select.vo" desc="EMP 조회" resultType="sample.vo.EmpVO" isNamed="false">
                <![CDATA[
                    select EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO
                    from EMP
                    where DEPTNO=?
                ]]>
            </query>
            . . .
        </queryMap>
        
    4. GlueJdbcDao 수정 : PageSet 기능   query 에 binding이 없는 경우 findForNavigationPage(), findForNavigationPageByQuery() 오류 발생
      • com.poscoict.glueframework.dao.jdbc.GlueJdbcDao
        com.poscoict.glueframework.dao.jdbc.GlueJdbcTemplate
      • 예제
        <queryMap ...>
            <query id="sample.emp" desc="EMP 조회(PageSet)" resultType="" isNamed="false">
                <![CDATA[
                    select EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO
                    from EMP
                ]]>
            </query>
            . . .
        </queryMap>
        
    5. GlueJdbcDao 수정 : LobHandler 설정   LobHandler 를 org.springframework.jdbc.support.lob.DefaultLobHandler 으로 통합
      OracleLobHandler 는 deprecated 되었으며, api내용에 따라 JDBC Driver는 상위 버전를 사용하도록 함.
      상위 버전 사용이 불가능 할 경우에는 LobHandler를 property로 설정하면 됨.(Oracle 사용시)
      • com.poscoict.glueframework.dao.jdbc.GlueJdbcDao
      • 사용법 : Oracle에 한함.
        <beans ...>
            <bean id="dao" class="com.poscoict.glueframework.dao.jdbc.GlueJdbcDao">
                <property name="dataSource"><ref local="dataSource"/></property>
                <property name="queryManager"><ref local="queryManager"/></property>
                <property name="lobHandler"><ref local="lobHandler"/></property>
            </bean>
            <bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler"/>
            . . .
        </beans>
        
    6. GlueJdbcDao 수정 : GlueSequence 설정   GlueSequence 구현 Class를 Dao에 설정 가능하도록 함.
      • com.poscoict.glueframework.dao.jdbc.GlueJdbcDao
        com.poscoict.glueframework.dao.sequence.GlueSequenceFactory
      • 사용법
        /* java code * /
        GlueGenericDao dao = ...;
        GlueSequence sequence = dao.getSequence()
        sequence.getNextLongValue("SQ_BIZ_TABLE1");
        
      • 예제 (MariaDB 일 경우)
        - 순서대로 applicationContext.xml 의 dao 설정 예제
        - GlueSequence 구현 예제
        - MariaDB 에 nextval() function 생성 예제
        - nextval() function 에서 사용할 table 생성 예제
        - GlueSequence의 getNextLongValue()의 인자와 관련된 업무 table 예제
        <beans ...>
            <bean id="dao" class="com.poscoict.glueframework.dao.jdbc.GlueJdbcDao">
                <property name="dataSource"><ref local="dataSource"/></property>
                <property name="queryManager"><ref local="queryManager"/></property>
                <property name="sequence"><ref local="sequence"/></property>
            </bean>
            <bean id="sequence" class="MySQLSequence">
                <constructor-arg><ref local="dataSource"/></constructor-arg>
            </bean>
        </beans>
        
        import javax.sql.DataSource;
        import java.sql.Connection;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.sql.Statement;
        public class MySQLSequence implements GlueSequence{
            private DataSource dataSource;
        
            public MySQLSequence( DataSource ds ){
                this.dataSource = ds;
            }
        
            @Override
            public long getNextLongValue( String sequenceName ) {
                return getNextKey( sequenceName );
            }
        
            @Override
            public int getNextIntValue( String sequenceName ) {
                return return (int)getNextKey();;
            }
        
            @Override
            public String getNextStringValue( String sequenceName ) {
                return Long.toString(getNextKey());
            }
        
            private String getSequenceQuery( String sequenceName ){
                return "select nextval('" + sequenceName + "')";
            }
        
            private long getNextKey( String sequenceName ) throws DataAccessException {
                Connection con = dataSource.getConnection();
                Statement stmt = null;
                ResultSet rs = null;
                try {
                    stmt = con.createStatement();
                    rs = stmt.executeQuery( getSequenceQuery(sequenceName) );
                    long l;
                    if (rs.next()) {
                        return rs.getLong(1);
                    }
                }catch (SQLException ex){
                }finally{
                    rs.close();
                    stmt.close();
                    con.close();
                }
            }
        }
        
        DELIMITER //
        
        CREATE FUNCTION 'nextval'( p_seq_nm varchar(50)) RETURNS bigint(20)
        begin
            declare nLast_val int;
         
            set nLast_val =  (select last_cached_val
                              from mysql_seq_table
                              where seq_nm = p_seq_nm);
            if nLast_val is null then
                set nLast_val = 0;
                insert into mysql_seq_table (seq_nm,seq_val)
                values (p_seq_nm,nLast_Val);
            else
                set nLast_val = nLast_val + 1;
                update mysql_seq_table set last_cached_val = nLast_val
                where seq_nm = p_seq_nm;
            end if;
        
            return nLast_val;
        end
        
        //
        DELIMITER ;
        
        create table mysql_seq_table (
            seq_nm  varchar(50)   not null,
            last_cached_val  bigint   not null )
        engine=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 
        
        alter table seq2 add constraint mysql_seq_table primary key ( 'seq_nm' );
        
        create table biz_table1 (
            biz_column1 bigint not null,
            ...
        )
        
        alter table SQ_BIZ_TABLE1 add constraint mysql_seq_table primary key ( 'biz_column1' );
        
    7. GlueMultipartRequest 수정
      2개 인자를 갖는 생성자는 삭제함. 2번째 인자가 사용되지 않으므로 1개 인자를 갖는 생성자를 쓰는 것으로 함.
      • com.poscoict.glueframework.web.control.GlueMultipartRequest
        public GlueMultipartRequest( ServletRequest request, int maxLength ) 삭제
  • glue-hibernate 모듈 수정

    1. entity 클래스 로딩 변경
      Class<T> c = (Class<T>) Class.forName( nm ) 대신에
      Class<T> c = (Class<T>) Thread.currentThread().getContextClassLoader().loadClass( nm ) 으로 변경
      • com.poscoict.glueframework.dao.hibernate.GlueHibernateTemplate
  • glue-mongodb 모듈 수정

    1. entity 클래스 로딩 변경
      Class<T> c = (Class<T>) Class.forName( nm ) 대신에
      Class<T> c = (Class<T>) Thread.currentThread().getContextClassLoader().loadClass( nm ) 으로 변경
      • com.poscoict.glueframework.biz.activity.mongodb.GlueMongoSave