Ehcache 란

* EhCache는 경량의 빠른 캐시 엔진으로 확장/분산 기능을 지원하며 높은 품질을 제공.

* xml 설정
<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <cache name="simpleBeanCache"
              maxElementsInMemory="10000"
              eternal="false"
              timeToIdleSeconds="120"
              timeToLiveSeconds="120"
              overflowToDisk="true"
              maxElementsOnDisk="10000000"
              diskPersistent="false"
              diskExpiryThreadIntervalSeconds="120"
              memoryStoreEvictionPolicy="LRU"

    />
</ehcache>


* Cache 조회하기
CacheManager cacheManager = CacheManager.create();
Cache cache = cacheManager.getCache("simpleCacheBean");


* Cache 생성/수정하기
CacheManager cacheManager = CacheManager.create();
Cache cache = cacheManager.getCache("simpleCacheBean");
cache.put(newElement);


* Cache 삭제하기
CacheManager cacheManager = CacheManager.create();
cache.remove("SimpleCacheBean");

Java - 문자열로된 숫자 자리수 채우기

* String.format 을 사용하여 빈 자리를 0으로 채울 수 있다.
 


* 사용예
System.out.pringln( String.format("%03d", 3) ); => 003
System.out.pringln( String.format("%02d", 2) ); => 02
System.out.pringln( String.format("%02d", 10) ); => 10

Oracle - 테이블 락 확인하기

* 현재 테이블에 락이 걸려있는지 조회할 수 있다.


* 락 테이블 조회하기
SELECT
      B.OBJECT_NAME, B.OWNER, B.OBJECT_TYPE

      , A.XIDUSN, A.SESSION_ID, A.LOCKED_MODE
FROM V$LOCKED_OBJECT A, DBA_OBJECTS B
WHERE A.OBJECT_ID = B.OBJECT_ID
;
 

* 특정 테이블 락 여부 확인하기
SELECT
     A.SID, A.SERIAL#

     , B.TYPE, C.OBJECT_NAME
FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
WHERE A.SID=B.SID

  AND B.ID1=C.OBJECT_ID
  AND B.TYPE='TM'
  AND C.OBJECT_NAME = '테이블명'
;

Oracle - 한 쿼리로 INSERT 혹은 UPDATE 하기

* 테이블에 데이터 추가시 조건에 해당하는 값이 존재하면 해당 행을 UPDATE하고,
없으면 INSERT 하는 경우 사용


* 사용법
MERGE INTO [ schema. ] { table | view } [ t_alias ]
   USING { [ schema. ] { table | view } | subquery } [ t_alias ]
   ON ( condition )
WHEN MATCHED THEN
UPDATE SET column = { expr | DEFAULT }
              [, column = { expr | DEFAULT } ]...
[ DELETE where_clause ]
WHEN NOT MATCHED THEN
INSERT [ (column [, column ]...) ]
VALUES ({ expr [, expr ]... | DEFAULT })



- INTO : DATA가 UPDATE되거나 INSERT 될 테이블
- USING : 비교할 SOURCE 테이블 혹은 서브쿼리.

              INTO절의 테이블과 동일하거나 다를 수 있음.
- ON : UPDATE나 INSERT를 하게 될 조건.

         해당 조건을 만족하는 DATA가 있으면 WHEN MATCHED 절 실행
              , 없으면 WHEN NOT MATCHED 절 실행.
- WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용.

                            (UPDATE, DELETE 포함 될 수 있음)
- WHEN NOT MATCHED : ON 조건절에 맞는 ROW가 없을 때 수행할 내용.

                                   (INSERT)

Java - JSch를 사용하여 SFTP 파일 업로드 하기

* JSch 라이브러리를 사용하여 SFTP 접속 및 파일 업로드
  (http://www.jcraft.com/jsch/)


import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;


JSch jsch = new JSch();
Session session = null;
ChannelSftp channelSftp = null;
   
/**
 * SFTP 접속
 * @param ip 아이피
 * @param port 포트
 * @param id 로그인아이디
 * @param pw 로그인비밀번호
 */
public void connect(String ip, int port, String id, String pw)
{
    // 연결 시도
    session = jsch.getSession(id, ip, port);
    session.setPassword(pw);
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.connect(); 
   
    // 방식 설정
    Channel channel = session.openChannel("sftp");
    channel.connect();
    channelSftp = (ChannelSftp)channel;
}

/**
 * SFTP 접속 종료
 */
public void disconnect()
{
    if (channelSftp != null)
        channelSftp.disconnect();

    if (session != null)
        session.disconnect();
}
   
/**
 * 폴더 확인 및 생성
 * @param dir 폴더명(경로포함)
 */
public void checkDir(String dir)
{
    SftpATTRS attrs = null;

    // 폴더 체크
    try
    {
        attrs = channelSftp.stat(dir);
    }
    catch(Exception e)
    {
        attrs = null;
    }
   
    // attrs가 널이면 폴더 존재 X
    if (attrs == null)
    {
        channelSftp.mkdir(dir); // 폴더 생성
    }
}
   
   
/**
 * 폴더 이동
 * @param dir 폴더명(경로포함)
 */
public void moveDir(String dir)
{
    // 폴더 이동..
    channelSftp.cd(dir);
}   
   
/**
 * 파일 업로드.
 * @param fileName 파일명(경로포함)
 * @param fileData 파일내용
 * @return
 */
public boolean fileUpload(String fileName, byte[] fileData)
{
    OutputStream os = channelSftp.put(fileName);
    os.write(fileData);
    os.flush();
    os.close();
}

Java - 문자열로된 날짜 유효성 체크하기

* java.text.DateFormat.setLenient(boolean lenient)를 활용하여 체크.
  lenient를 false로 설정하면 유효한 날짜가 아닐 경우 ParseException이 발생.




import java.text.SimpleDateFormat;

/**
 * 문자열로 된 날짜 형식이 유효한지 체크
 * @param dateStr
 * @return 유효하면 true, 아니면 false
 */
public static boolean checkDateYYYYMMDD(String dateStr)
{
    try {
        SimpleDateFormat sdfYYYYMMDD = new SimpleDateFormat("yyyyMMdd");
        sdfYYYYMMDD .setLenient(false);
        sdfYYYYMMDD .parse(dateStr); //ex) dateStr="20201232"이면 ParseException 발생
        return true;
    } catch(ParseException e) {
        return false;
    } catch(Exception e) {
        return false;
    }
}

스프링 프레임워크에서 HttpServletRequest, HttpSession 객체 직접 가져오기


import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;

ServletRequestAttributes sra = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();


// HttpServletReqeust 객체
HttpServletReqeust httpServletReqeust = sra.getRequest();

// HttpSession 객체
HttpSession httpSession = sra.getRequest().getSession();