반응형

1. JUnit이란?

JUnit은 단위 테스트 도구입니다. 외부 테스트 프로그램(케이스)을 작성하여 System.out으로 번거롭게 디버깅하지 않아도 됩니다. 프로그램 테스트 시 걸릴 시간도 관리할 수 있게 해주며 오픈 소스이며, 플러그인 형태로 Eclipse에 포함되어 있습니다. 하나의 jar 파일이 전부이며 사용법도 간단합니다. 어느 정도 개발이 진행되면 프로그램에 대한 단위 테스트는 반드시 수행해야 합니다. JUnit은 보이지 않고 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위 테스트를 쉽게 해주는 테스트용 Framework 입니다. JDK 1.4에서 추가된 assertXXX를 사용하여 Test를 진행합니다. JUnit은 테스트 결과를 확인하는 것 이외 최적화된 코드를 유추해내는 기능도 제공합니다. 또한, 테스트 결과를 단순한 텍스트로 남기는 것이 아니라 Test클래스로 남깁니다. 그래서 개발자에게 테스트 방법 및 클래스의 History를 넘겨줄 수도 있습니다.



2. 특징

  • 단위 테스트 Framework 중 하나
  • 문자 혹은 GUI 기반으로 실행됨
  • 단정문으로 테스트 케이스의 수행 결과를 판별함(assertEquals(예상 값, 실제 값))
  • 어노테이션으로 간결하게 지원함
  • 결과는 성공(녹색), 실패(붉은색) 중 하나로 표시


3. Eclipse에 JUnit 설정하기

  • Java Project를 생성
  • Project 이름에서 오른쪽 마우스를 클릭하고 Properties를 선택
  • Java BuildPath를 선택
  • Libraries 탭을 선택하고, Add Library를 선택
  • < 그림 1 >

    JUnit을 선택하고, Next 버튼 선택

    < 그림 2 >

    버전을 선택하고, Finish 버튼 선택

    < 그림 3 >

    JUnit이 추가 된 사항을 확인 할 수 있습니다.

    < 그림 4 >

    그림 4까지 하셨으면 Eclipse에 JUnit이 설정되었습니다. 지금부터는 간단한 Calculator 클래스를 통해 Eclipse에서 어떻게 JUnit을 사용하는지 알아봅니다.


4. JUnit 사용하기

먼저 com.calculator 패키지를 만들고 Calculator 클래스를 만듭니다. 메소드는 int형 두 개의 파라미터를 받아 두 개의 합을 리턴 하는 간단한 sum 메소드 입니다. 소스는 다음과 같습니다.

package com.calculator;

public class Calculator {  
    public int sum(int num1, int num2){
        return num1 + num2;
    }
}

Calculator 클래스를 테스트하기 위한 테스트 클래스를 만들겠습니다. 먼저 com. Calculator.test 패키지를 만듭니다. 그리고 com. Calculator.test 패키지에서 마우스 오른쪽 버튼 -> New -> JUnit Test Case 선택

< 그림 5 >

아래 그림에서

①은 테스트 클래스 이름 입력 부분이고, 테스트 클래스 이름은 테스트할 클래스 이름에 Test를 추가해서 입력합니다.

②는 테스트 클래스가 테스트하게 될 클래스를 지정하는 부분입니다.

Next 버튼 선택,

< 그림 6 >

Calculator 클래스에서 테스트할 메소드를 선택하고 Finish 버튼을 선택,

< 그림 7 >

다음과 같은 테스트 코드가 생성됩니다.

package com.calculator.test;  
import static org.junit.Assert.*;  
import org.junit.Test;  
public class CalculatorTest {  
    @Test
    public void testSum() {
        fail("Not yet implemented");
    }
}

위 testSum 메소드를 보면 어노테이션으로 @Test가 선언된 것을 볼 수 있습니다. 이 의미는 testSum 메소드가 단위 테스트 메소드임을 지정한다는 것입니다. 그리고 이 testSum 메소드 안에서 Calculator 클래스의 Sum메소드를 테스트합니다.

testSum 메소드를 다음과 같이 수정하였습니다.

    @Test
    public void testSum() {
        Calculator calculator = new Calculator();
        assertEquals(30, calculator.sum(10, 20));
    }

위 소스를 보시면 Calculator 클래스 객체를 생성한 후 assertEquals 메소드를 사용하여 sum 메소드의 리턴 값이 제대로 반환되는지 확인합니다. 반환 값이 지정한 결과와 같으면 테스트는 성공입니다. 하지만 반환 값이 생각한 결과와 같지 않으면 실패입니다.

테스트 클래스를 실행하는 방법은 테스트 클래스에서 마우스 오른쪽 버튼 -> RunAs -> JUnit Test를 선택

< 그림 8 >

테스트 메소드가 아무런 문제 없이 성공되면 그림 9와 같습니다.

< 그림 9 >

테스트 메소드에 문제가 있어 실패하면 그림 10과 같습니다.

< 그림 10 >

지금까지 간단한 Calculator 클래스를 통해 JUnit에 대해 알아보았습니다. 예제 소스에서 assertEquals 메소드를 보셨을 겁니다. 이 메소드는 JUnit에서 가장 많이 사용되는 메소드입니다. 이외에도 유용한 메소드가 있으며 이러한 메소드를 단정문 이라고도 합니다. 단정문에 해당하는 메소드는 많이 있으며 대표적인 것에 대해 알아보겠습니다.

5. 대표적인 단정문

assertArrayEquals(a,b) : 배열 a와b가 일치함을 확인 
assertEquals(a,b) : 객체 a와b의 값이 같은지 확인 
assertSame(a,b) : 객체 a와b가 같은 객체임을 확인 
assertTrue(a) : a가 참인지 확인 
assertNotNull(a) : a객체가 null이 아님을 확인 
이외에도 다양한 단정문이 존재합니다. 자세한 내용은 아래 링크를 가시면 확인하실 수 있습니다.http://junit.sourceforge.net/javadoc/org/junit/Assert.html

6. 어노테이션 활용하기

Java 언어 자체가 좀 더 넓게 확장하고 다양하게 발전할 수 있도록 도와준 어노테이션을 JUnit에서 활용할 수 있습니다.

(1) 테스트 메소드 지정하기

@Test가 메소드 위에 선언되면 이 메소드는 테스트 대상 메소드임을 의미합니다.

    @Test
    public void testSum() { 

    }

(2) 테스트 메소드 수행시간 제한하기

@Test(timeout=5000)를 메소드 위에 선언합니다. 시간단위는 밀리 초 입니다. 이 테스트 메소드가 결과를 반환하는데 5,000밀리 초를 넘긴다면 이 테스트는 실패입니다.

    @Test(timeout=5000)
    public void testSum() { 

    }

(3) 테스트 메소드 Exception 지정하기

@Test(expected=RuntimeException.class)가 메소드 위에 선언되면 이 테스트 메소드는 RuntimeException이 발생해야 테스트가 성공, 그렇지 않으면 실패입니다.

    @Test(expected=RuntimeException.class)
    public void testSum() { 

    }

(4) 초기화 및 해제

@BeforeClass, @AfterClass가 메소드 위에 선언되면 해당 테스트 클래스에서 딱 한 번씩만 수행되도록 지정하는 어노테이션 입니다.

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {

    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {

    }

@Before, @After가 메소드 위에 선언되면 해당 테스트 클래스 안에 메소드들이 테스트 되기 전과 후에 각각 실행되게 지정하는 어노테이션 입니다.

    @Before
    public void setUp() throws Exception {

    }

    @After
    public void tearDown() throws Exception {

    }

아래 그림과 같이 표현할 수 있습니다.

< 그림 11 >

@BeforeClass 어노테이션은 테스트 클래스 수행 시 단위 테스트 메소드 보다 먼저 딱 한 번 수행되어야 할 경우 지정합니다. 예를 들어 DB 연결 시 드라이버 로딩 부분을 @BeforeClass로 지정한 메소드에 작성합니다. 반대로 @AfterClass 어노테이션은 단위 테스트 함수들이 다 수행되고 맨 마지막에 수행되어야 할 경우 지정합니다. 예를 들어 DB 연결 후 마지막에 드라이버를 반납하는 부분을 @AfterClass로 지정한 메소드에 작성합니다.

@Before와@After는 @Test로 지정된 단위 테스트 메소드가 실행되기 전 한 번씩 수행하거나 실행되고 난 후 수행되어야 하는 부분을 작성합니다. 예를 들어 공통으로 객체를 생성하는 코드를 @Test로 지정된 단위 테스트 메소드 안에 있다면 그 부분을 @Before에 지정된 메소드에 작성합니다.

7. 마치며...

지금까지 단위 테스트 Framework인 JUnit에 대해 알아보았습니다. JUnit을 사용하여 테스트 클래스를 작성하는 데 있어 깊은 내용은 아니지만, Eclipse에서 설치 방법과 어떻게 사용하는지를 살펴 보았습니다. JUnit을 처음 접하시는 분들께 작은 도움이나마 되었으면 하는 바램입니다.

감사합니다.

참고 도서 및 사이트



반응형
반응형

깃 주소


https://github.com/shuhei/Rectify



반응형

'JAVA/SPRING > JAVA' 카테고리의 다른 글

[JUnit] 단위 테스트 도구 시작하기 1  (0) 2018.07.20
[펌]Java로 OTP 구현하기  (0) 2018.01.16
Maven으로 javadoc API 문서 만들기  (0) 2017.12.04
Eclipse 한글화  (0) 2017.12.01
[SFTP] jsch Pipe closed 익셉션 관련  (0) 2017.12.01
반응형

단 50줄이면 Java에서 OTP를 구현할 수 있습니다.


제가 OTP를 구현해야겠다고 생각한 계기는,
'클라이언트와 서버 간 REST 통신시, 해커로부터 데이터 변조 공격을 막기 위해서 일회용 비밀번호(OTP)를 사용하면 어떨까?' 라는 생각에서 출발했습니다.
(적용은 안했지만, 누군가에게 도움이 되길 바라며...)

OTP (One Time Password)
고정된 패스워드 대신 무작위로 생성되는 일회용 패스워드를 이용하는 사용자 인증 방식.


은행에서 OTP 단말기나, OTP 카드를 사용해보신 분이라면 한 번쯤 생각해보셨을 겁니다.

'서버랑 통신하는건가..?'

사실, OTP는 단말기와 서버가 통신하는게 아닙니다.

미리 정의된 비밀키와 시간 정보를 토대로 Hash 처리하여 비밀번호를 만들어냅니다.

핵심은 시간입니다. 시간은 변하므로, 일정 시간(정하기 나름) 마다 비밀번호가 바뀌죠.

그리고, 똑같은 알고리즘으로 단말기에서 비밀번호를 생성하고, 서버에서 검증합니다.

같은 시간대에 만들어졌으므로 단말기와 서버에서 만든 패스워드는 동일합니다.


그럼 이제 OTP를 만들고 검증하는 클래스를 생성하고, 아래와 같이 상수를 정의합니다.

 private static final long DISTANCE = 30000; // 30 sec
 private static final String ALGORITHM = "HmacSHA1";
 private static final byte[] SECRET_KEY = "define your secret key here".getBytes();


그리고 비밀키와 시간에 따라 Hash 처리하여 패스워드를 생성하는 메소드를 아래와 같이 정의합니다.

 private static long create(long time) throws Exception {
  byte[] data = new byte[8];
  
  long value = time;
  for (int i=8; i-- > 0; value >>>= 8) {
   data[i] = (byte) value;
  }
  
  Mac mac = Mac.getInstance(ALGORITHM);
  mac.init(new SecretKeySpec(SECRET_KEY, ALGORITHM));
  
  byte[] hash = mac.doFinal(data);
  int offset = hash[20-1] & 0xF;
  
  long truncatedHash = 0;
  for (int i=0; i<4; ++i) {
   truncatedHash <<= 8;
   truncatedHash |= hash[offset+i] & 0xFF;
  }
  
  truncatedHash &= 0x7FFFFFFF;
  truncatedHash %= 1000000;
  
  return truncatedHash;
 }


마지막으로, OTP 클래스를 외부에서 사용할 수 있도록 public으로 create(), vertify() 메소드를 아래와 같이 정의합니다.

 public static String create() throws Exception {
  return String.format("%06d", create(new Date().getTime() / DISTANCE));
 }
 
 public static boolean vertify(String code) throws Exception {
  return create().equals(code);
 }

 

테스트 코드는 다음과 같습니다.

  String code = OTP.create();
  
  System.out.println("Created OTP : " + code);
  
  System.out.println("Vertify OTP : " + OTP.vertify(code));


30초(DISTANCE)마다 비밀번호가 변경되는 것을 확인할 수 있습니다.

 

참조 글

http://terms.naver.com/entry.nhn?docId=1380773&cid=40942&categoryId=32854

http://zero-gravity.tistory.com/m/post/221

http://www.javacodegeeks.com/2011/12/google-authenticator-using-it-with-your.html/comment-page-1/#comment-14663



출처: http://silentsoft.tistory.com/9

반응형
반응형

<plugin>

    <groupId>org.apache.maven.plugins</groupId>

    <artifactId>maven-javadoc-plugin</artifactId>

    <version>2.9.1</version>

</plugin> 


이렇게 쓴 후 프로젝트를 오른쪽 클릭 > Run As > Maven build를 클릭하게 됩니다.


클릭하면, 아래와같이 Run Configurations 이 보여지게 되고 여기 내용에서 Goals: 이라는 설정 칸에 다음과 같이 작성을 합니다 "javadoc:javadoc"



그런 후 Run을 하게되면 maven 프로젝트의 target > site > apidocs 안에 웹페이지 형태로 자바문서가 만들어지게 됩니다 ^^






이걸 원하는 곳에 본사하여 index.html을 웹브라우저로 실행하게되면 자신이 만든 자바 프로젝트의 패키지, 클래스, 멤버 함수들을 문서로 확인할 수 있게 되겠습니다~



출처: http://intruder.tistory.com/117 [I.K.Picture & IT Info.]

반응형
반응형

오늘은 바로 "이클립스 한글화"에 대한 글입니다.

다들 이클립스를 영어로 쓰시길래

나 : 한글패치 안해?
친구 : 그런게 있어?

네. 그런게 있습니다.

바로 "Babel"이라는 이름으로 진행되고 있는 프로젝트입니다.

[Eclipse Babel Project : 다운로드]

위의 사이트로 들어가시면

자신에게 맞는 버전을 선택합니다.

선택을 하고

Korean을 선택합니다.

그리고 eclipse-ko를 선택합니다.

1MB정도밖에 안되기 때문에 그냥 일본서버에서 다운받습니다.

압축을 풀면

두개의 폴더가 나오게 되는데 이걸 이클립스가 설치된 폴더에 그대로
덮어씌우면 끝!!!
따로 설정할것도 없습니다.

덮어씌우고 이클립스를 실행시키면?!

한글화 완성!!

아직 80퍼센트정도 번역이기에 전체가 번역되어 있지는 않지만

주 기능들은 전부 번역되어 있습니다.



출처 : https://m.blog.naver.com/PostView.nhn?blogId=skyvvv624&logNo=220727945231&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

반응형
반응형

com.jcraft.jsch.JSchException: java.io.IOException: Pipe closed

        at com.jcraft.jsch.ChannelSftp.start(ChannelSftp.java:242)

        at com.jcraft.jsch.Channel.connect(Channel.java:200)

        at com.jcraft.jsch.Channel.connect(Channel.java:144)

        at net.ib.paperless.common.SFTPHandler.init(SFTPHandler.java:61)

        at net.ib.paperless.service.AttachService.putFileUpload(AttachService.java:275)

        at net.ib.paperless.service.AttachService.eFormAttachFileSave(AttachService.java:72)

        at net.ib.paperless.controller.AttachFileController.attachFile(AttachFileController.java:68)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:498)

        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)

        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)

        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)

        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)

        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)

        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)

        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)

        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)

        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)

        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)

        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

        at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

        at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

        at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:117)

        at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:61)

        at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:92)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

        at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:110)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

Caused by: java.io.IOException: Pipe closed

        at java.io.PipedInputStream.read(PipedInputStream.java:307)

        at java.io.PipedInputStream.read(PipedInputStream.java:377)

        at com.jcraft.jsch.ChannelSftp.fill(ChannelSftp.java:2325)

        at com.jcraft.jsch.ChannelSftp.header(ChannelSftp.java:2351)

        at com.jcraft.jsch.ChannelSftp.start(ChannelSftp.java:211)







확인해야 할것.

1. jsch 라이브러리 버전을 최신버전인 0.1.54를 사용했었는데.. 0.1.42 버전으로 낮춰서 사용

2. sftp 접속 정보를 정확히 확인해봐야함

etc. 필자는 spring-boot를 사용하는데, properties가 개발용하고 상용이 있어 톰캣에서 올릴때 뭔가 꼬여서 올라가 났던 에러로 추정

3. /etc/ssh/sshd_config 에서 경로 확인 및 틀리다면 수정
# override default of no subsystems 
Subsystem sftp /usr/libexec/openssh/sftp-server


반응형

'JAVA/SPRING > JAVA' 카테고리의 다른 글

Maven으로 javadoc API 문서 만들기  (0) 2017.12.04
Eclipse 한글화  (0) 2017.12.01
[logback] 로그백 로그파일 롤링 커스터마이징  (0) 2017.11.29
SFTP 사용방법 (jsch 라이브러리 사용)  (1) 2017.11.29
OOP 개념  (0) 2017.11.28
반응형


(logback using java file time rolling)


#로그백 타임롤링은 1초단위, 1분단위, 1시간단위, 1일단위, 1달단위, 1년단위로는 로그파일을 자유롭게 생성 할 수 있지만 내가 원하는 시간에 맞추어서 할 수는 없다. 그래서 구글링을 해보니 자바를 불러와서 어느정도 내 마음대로 할 수 있도록 구현을 하는 방법이 있었음.

아래 예제는 10분단위로 로그파일 생성되도록 구현한 내용임.  내가 기억하려고 블로그에 남김 ㅋㅋ


1.logback.xml 에 어펜더 추가. 굵은 글씨의 클래스 적용

    <appender name="test-appender" class="com.test.TestAppender">
        <file>/test/test.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>

               /test/%d{yyyyMMdd,aux}/%d{yyyyMMddHHmm}.log

            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{5} - %msg%n
            </pattern>
        </encoder>
    </appender>




2. TestAppender.java  생성


package com.test;

import java.text.SimpleDateFormat;
import java.util.Date;

import ch.qos.logback.core.rolling.RollingFileAppender;


public class TestAppender<E> extends RollingFileAppender<E>{

 
 private static long start = System.currentTimeMillis(); // minutes
 private int rollOverTimeInMinutes = 10; // 여기에 설정한 10분마다 롤링됨
 
  @Override
 public void rollover(){
  
  try{
   
   int maxIntervalSinceLastLoggingInMillis = rollOverTimeInMinutes * 60 * 1000;
   long currentTime = System.currentTimeMillis();
   long start_rtn_str = getProc(start);
   

   if ((currentTime - start_rtn_str) >= maxIntervalSinceLastLoggingInMillis){
    super.rollover();
    start = System.currentTimeMillis();
   }
   
  }catch(Exception e){
   
  }
  

 }
 
 
 // currentTimeMillis 를 받아서 yyyyMMddHHmm 으로 변환 후에 분단위를 0으로 만든 후에 다시 currentTimeMillis 형태로 리턴(분단위 절삭).
 public static long getProc(long in_str) throws Exception {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
  String fmt1 = sdf.format(new Date(in_str));
  String fmt2 = fmt1.substring(0, 11)+"0";
  long rtn_str = cast_sdf_ctm(fmt2);
  return rtn_str;
 }
 
 // SimpleDateFormat 형태의 스트링을 받아서 currentTimeMillis 형태로 변환. ex) cast_sdf_ctm("20151008165215");
 public static long cast_sdf_ctm(String str) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
        Date date = sdf.parse(str);
        long rtn_str = date.getTime();
  return rtn_str;
 }
 
 // currentTimeMillis 형태의 스트링을 받아서  SimpleDateFormat 형태로 변환. ex) cast_ctm_sdf( 1444300680353, "yyyyMMddHHmmss")
 public static String cast_ctm_sdf(long str, String fmt) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat(fmt);
        String rtn_str = sdf.format(new Date(str));
  return rtn_str;
 }
 

}


반응형

'JAVA/SPRING > JAVA' 카테고리의 다른 글

Maven으로 javadoc API 문서 만들기  (0) 2017.12.04
Eclipse 한글화  (0) 2017.12.01
[SFTP] jsch Pipe closed 익셉션 관련  (0) 2017.12.01
SFTP 사용방법 (jsch 라이브러리 사용)  (1) 2017.11.29
OOP 개념  (0) 2017.11.28
반응형

SFTPHandler.java



  /**

     * 서버와 연결에 필요한 값들을 가져와 초기화 시킴

     *

     * @param host

     *            서버 주소

     * @param userName

     *            접속에 사용될 아이디

     * @param password

     *            비밀번호

     * @param port

     *            포트번호

     */

    public void init(String host, String userName, String password, int port) {

        JSch jsch = new JSch();

        try {

            session = jsch.getSession(userName, host, port);

            session.setPassword(password);


            java.util.Properties config = new java.util.Properties();

            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);

            session.connect();


            channel = session.openChannel("sftp");

            channel.connect();


            channelSftp = (ChannelSftp) channel;            

        } catch (JSchException e) {

            e.printStackTrace();

        }

    }



 /** create by Junho

     * 헤당 경로가 없으면 mkdir 하는 함수 리턴값 : fullpath

     * @param path

     * @return

     * @throws SftpException

     */

    

    public String mkdirDir(String path) throws SftpException {

    String[] pathArray = path.split("/");

    String currentDirectory = channelSftp.pwd();


    String totPathArray = "";

    for(int i =0; i< pathArray.length; i++) {

    totPathArray += pathArray[i] + "/";

String currentPath = currentDirectory+ "/" + totPathArray;

    try {

channelSftp.mkdir(currentPath);

channelSftp.cd(currentPath);

} catch (Exception e) {

channelSftp.cd(currentPath);

}

    }

   

    return currentDirectory+ "/" + totPathArray;

}




/**

     * 단일 파일을 업로드

     *

     * @param file

     *            저장시킬 파일

     * @param dir

     *            저장시킬 주소(서버)

     */

    public boolean uploadFile(MultipartFile file, String fileName, String dir) {

    boolean result = true;

        InputStream in = null;

        try {

            //fileName = URLEncoder.encode(fileName,"EUC-KR");

       

            in = file.getInputStream();

            channelSftp.cd(dir);

            channelSftp.put(in, fileName);

            

        } catch (Exception e) {

            e.printStackTrace();

            result = false;

        } finally {

            try {

                in.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        

        return result;

    }



 /**

     * 단일 파일 다운로드

     *

     * @param dir

     *            저장할 경로(서버)

     * @param downloadFileName

     *            다운로드할 파일

     * @param path

     *            저장될 공간

     */

    public boolean download(String dir, String downloadFileName, String path) {

    boolean result = true;

   

        InputStream in = null;

        FileOutputStream out = null;

        try {

            channelSftp.cd(dir);

            

            in = channelSftp.get(downloadFileName);

        } catch (SftpException e) {

            e.printStackTrace();

            result = false;

        }


        try {

            out = new FileOutputStream(new File(path));

            int data; 

byte b[] = new byte[2048];

while((data = in.read(b, 0, 2048)) != -1) { 

out.write(b, 0, data); 

out.flush();

}

        } catch (IOException e) {

            e.printStackTrace();

            result = false;

        } finally {

            try {

                out.close();

                in.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        

        return result;

    }


  /**

     * 서버와의 연결을 끊는다.

     */

    public void disconnection() {

        channelSftp.quit();


    }

반응형

'JAVA/SPRING > JAVA' 카테고리의 다른 글

Maven으로 javadoc API 문서 만들기  (0) 2017.12.04
Eclipse 한글화  (0) 2017.12.01
[SFTP] jsch Pipe closed 익셉션 관련  (0) 2017.12.01
[logback] 로그백 로그파일 롤링 커스터마이징  (0) 2017.11.29
OOP 개념  (0) 2017.11.28
반응형
객체지향개발(Object Oriented Programming)의 특성은 크게 추상화, 캡슐화, 상속성, 다형성이 있다.

1) 추상화(Abstraciton)
공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 객체 지향적 관점에서 클래스를 정의하는 것을 바로 추상화라고 정의 내릴 수 있겠다.
- 좀 더 살펴보면 물고기, 사자, 토끼, 뱀이 있을 때 우리는 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할 때,
  만약 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의한다고 하자. 이때 동물 또는 생물이라고 묶는 것을 추상화라고 한다.

2) 캡슐화(Encapsulation)
데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것. 다시 한번 말하자면 변수와 함수를 하나로 묶는것을 말한다.
- ex)
public String test() {
          string aa = "aaa";
      }
- 하지만 무작정 한대 묶으면 되는 것이 아니라
  객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다고 생각해야한다. 이것이 많이 들어본 의미로는 은닉화라고 한다.
- 또한 데이터를 절대로 외부에서 직접 접근을 하면 안되고 오로지 함수를 통해서만 접근해야하는데 이를 가능하게 해주는 것이 바로 캡슐화이다.
- 따라서 캡슐화에 성공하면 당연히 은닉화도 자연스럽게 효력이 나타난다.

3) 상속성, 재사용(Inheritance)
상위 개념의 특징을 하위 개념이 물려받는 것
- 객체지향의 하이라이트 부분이라고 생각한다. 상속이란 개념이 없으면 객체지향이나 절차지향이나 도진개진
- 간단히 예를 들자면, 자동차라는 부모클래스가 있다.
  기름을 먹거나 달리는 기능을 하는 자동차인데,
  만약 지붕뚜껑이 열리는 특수한 기능을 추가하고 싶다면 기존의 자동차에서 스포차카를 생성한다.
  그러면 스포츠카는 기름도 먹고 달리면서 지붕두껑이 열리는 기능도 갖춘 자동차가 되는 것

4) 다형성(Polymorphism)
부모클레스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩 되어 사용되는 것
- 간단히 예를 들자면
  군대에서 나는 K2 소총을 잡았고 동기는 K1 소총을 잡았다. 사격 훈련이 있을 때 중대장이 '준비된 사수부터 발사!'라고 외치면
  나와 내친구는 명령을 받고 앞의 사로를 향해 총을 쏜다. 이때 중대장은 추상적 객체를 상속받은 모든 객체들에게 명령을 내린것이고
  그 병사가 총이 뭐든간에 그냥 발사를 하라는 명령을 한것이다.
  즉, 다형성이 없다면 K1 소총을 든 병사 발사, K2 소총을 든 병사 발사 라며 명령을 하나하나 내려야 할 것이다



출처: http://88240.tistory.com/228 [shaking blog]

반응형

+ Recent posts