728x90

개발자로서 많이 마주치는 상황 중 하나는 자바 특정폴더 파일을 읽어와서 다운로드 기능을 많이 마주칩니다.

저 또한 이러한 요청사항을 받아서 하다가 정리하면 좋을 것 같아서 해당 기능을 설명하려고 이 글을 쓰려고 합니다.

 

파일 경로에 있는 폴더에 있는 전체 파일을 갖고 와서 단순하게 파일 이름을 출력하는 알고리즘입니다.

 

 

 

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

String fileName = "";

 

/*파일 경로에 있는 파일 가져오기*/

File rw = new File(filePath);

 

/*파일 경로에 있는 파일 리스트 fileList[] 에 넣기*/

File []fileList = rw.listfiles();

 

/*fileList에 있는거 for 문 돌려서 출력*/

for(File file : fileList) {

      if(file.isFile()) {

         fileName = file.getName();

         System.out.println("fileName : " + fileName);

      }

}

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

 

이러한 구조로 파일 목록을 가져와서 API로 특정폴더에 쌓여있는 파일을 가져오거나 하는 작업들을 합니다.

반응형
728x90

SPRING을 공부하면서 많이 듣던 개념 중 하나는 의존성 주입입니다.

개발자들은 정말 많이 들었지만 이 개념에 대해서 정확하게 알지 못하고 연차가 쌓이는 경우가 대부분입니다.

연차가 쌓일수록 코딩은 기초가 가장 중요하다고 생각합니다. 그래서 저 또한 의존성 주입에 대해 정확하게 알고 가기 위해서 이렇게 포스팅으로 정리하고자 합니다.

의존성 주입 DI(Dependency Injection) 개념

DI는 디자인 패턴 중 하나입니다. 객체 간의 의존성을 단순하게 외부에서 주입해서 사용한다는 의미이다.

실생활에서 예를 들어 설명하자면 우리는 로봇에 팔을 만드는 공장이 있다고 예시를 들어보겠습니다.

 

A 로봇은 3m짜리 팔이 필요하고, B 로봇은 6m짜리 팔이 필요하다고 생각했을 때

우리는 팔을 만드는 공장에 "3m의 팔이 필요해"라고만 전달해주면 3m짜리 팔을 만들 수 있습니다.

 

하지만 전체 로봇 공정 자체가 5m짜리의 팔의 로봇만 만들어진다고 생각했을 때는 3m짜리 팔을 만들 때는 그 전체 로봇 팔을 만드는 공장 프로세스 자체를 바꿔버려야 합니다. 그러므로 각기 다른 팔 길이의 로봇을 생산할 수가 없습니다.

 

의존성 주입이란 로봇을 만드는 공장에 팔을 만드는 공정만 의존성 주입을 하여 각기 다른 팔 길이 (3m, 5m 등)을 생성하여 다양한 로봇의 팔을 만들 수 있게끔 해줍니다.


의존성 주입 DI(Dependency Injection) 주입 방법

  • 생성자 주입
  • 필드 주입
  • Setter 주입

1. 생성자 주입

생성자를 통한 의존관계 주입 예제

예제와 같이 생성자는 생성자를 처음 생성할 때 1회 주입만 가능합니다.

객체의 주입을 해야지만 사용되는 프로그램이라면 강제로 주입을 할 경우에 사용됩니다.

하지만 기본적으로 Spring은 Autowired가 없어도 주입이 가능하도록 편의를 제공하고 있습니다.

 

2. 필드 주입

필드 주입 예제

필드 주입을 통해 단순하게 코드를 짜면 간결하게 짤 수가 있습니다.

하지만 외부에서 변경을 하고 싶어도 불가능하기 때문에 테스트 코드를 할 때 불편함이 있고, 또한 무조건 DI 프레임워크가 존재해야 되므로 점차 사장되는 중입니다. 

3. Setter 주입

Setter를 통한 주입은 주입받은 객체가 변경이 필요할 때 사용이 됩니다.

 

맺은 말

의존성 주입 DI(Dependency Injection)을 통해 우리는 코드를 간결하게 하여 직관성과 편리성을 얻을 수 있습니다. 또한 간단히 DI를 통해 테스트 코드 작성도 쉽게 할 수 있습니다.

우리가 많이 쓰는 spring에서 잘 지원하고 있기 때문에 생성자 주입을 적시적소에 사용한다면 좋은 코딩 편리한 코딩을 하시는데 도움이 되실 겁니다.

반응형
728x90

자바(JAVA)란 무엇인가?

자바는 선마이크로시스템즈라는 회사에서 최초 발표한 객체지향 프로그래밍 언어입니다.

티오베 프로그래밍 순위에 따르면 아직도 자바는 2위에 랭크하며 건재함을 가지고 있는 언어입니다.

자바 순위

자바 공식사이트에서는 아래 사진과 같이 자바 기술과 필요한 이유에 대해서 정리합니다.

JAVA 기술

자바의 특징은 무엇인가?

1. 객체지향언어

자바는 객체지향 언어로 하나하나의 재료들을 가지고 객체를 만들고 그 객체들을 모으고 연결하여 객체지향 프로그래밍(OOP) 개념으로 프로그램을 완성할 수 있게 합니다.

객체지향의 특징으로는 캡슐화, 상속 성 다형성을 지원합니다.

 

 

2. 이식성

어떠한 환경에서도 이식성이 뛰어나 프로그램 실행이 가능합니다.

예를 들어 자바 프로그램을 Window OS에서 실행하던 프로그램을 리눅스에서 실행해도 정상적으로 작동합니다.

즉 자바 실행환경(JRE)만 설치가 되어 있으면 어떠한 운영체제에서도 실행 가능합니다.

 

3. 메모리 자동관리(Garbage Collector)

다른 언어는 메모리를 사용하게 되면 해제를 시켜주는 명령어를 실행시켜주어야 메모리에 과부하가 걸리지 않는다.

하지만 자바는 메모리에 직접 접근할 수 없으므로 해제 명령어를 사용할 수 없습니다.

그렇다면 자바는 어떻게 메모리를 관리할 것 인지에 대해 의문이 생기실겁니다.

그렇게 나타난 것이 Garbage Collector 줄여서 GC라고 부릅니다. GC를 실행하여 메모리 사용을 마친 것들을 찾아 자바에서 메모리를 해제를 시켜줍니다.

그러므로 따로 메모리에 대해서 신경 쓰지 않고 관리를 안 해도 되어서 다른 언어보다 편리하게 사용하실 수 있습니다.

 

4. 함수적 스타일 코딩 지원

JAVA 8 함수적 프로그래밍이 가능한 람다식을 지원합니다.

 

람다식 장점

  • 코드를 간결하게 작성
  • 개발자의 의도가 명확해져 가독성이 향상
  • 함수를 따로 구현 없이 처리 가능

5. 멀티스레드 빠르게 구현

하나의 프로그램이 동시에 여러 작업을 처리해야 하는 경우, 병렬 처리가 가능한 멀티스레드를 구현해야 합니다.

자바는 멀티쓰레드 구현에 필요한 API를 제공해주어 멀티쓰레드를 빠르게 구현이 가능합니다.

 

6. 동적 로딩 지원

 

프로그램을 실행할 때 필요할 때마다 동적으로 메모리를 생성하고 필요 없는 메모리를 자동으로 해제시킵니다.

그러므로 큰 프로그램도 작은 메모리에서 실행이 가능합니다.

 

 

자바란 무엇이며 자바의 특징은 무엇인지에 대해서 정리를 해보았습니다.

코딩을 하면서 중요한 것은 제일 기초가 튼튼해야 한다고 생각합니다.

자바를 시작하시는 분들 또는 아직 자바를 정확히 모르셨던 분들은 자바에 대해서 정확하게 알고 가시길 바랍니다.

반응형
728x90

'디자인 패턴' 개발자를 살아가면서 많이 들어봤던 단어이지만 그에 따라서 이해하기가 정말 어려운 단어이기도 합니다. 

 

'디자인 패턴' 단순하게 이야기 하자면 '패턴' 이라는 말에 주목하면 된다. 지금까지 개발을 해왔던 사람들이 고심고심하여 만들어지고 만들어졌던 몇가지 일정한 패턴 중에 하나를 선택/개발하여 올바른 설계를 해라 라는 의도로 만들어진 패턴들을 '디자인 패턴' 이라고 합니다.

 

그렇다면 디자인 패턴에서는 3가지 구조로 나뉩니다.

 

1. Context

    문제발생 상황 기술 > 패턴이 적용될 상황 기술

     패턴은 상황에 맞게 써야 됨. 항상 유효하지 않는다.

2. Problem

    패턴 적용으로 해결되어야 할 디자인 이슈들을 기술

    여러 제약사항과 영향력도 문제 해결을 위해 고려

3. Solution

   문제를 해결하도록 설계를 구성하는 요소들과 그 요소들 사이의 관계, 책임, 협력 기술

   Solution은 구체적인 구현 방법 및 다양한 상황에 적용할 수 있는 템플릿

디자인 패턴

솔루션사업에서도 기존 솔루션을 가지며 그걸 토대로 커스터마이징으로 개발을 진행합니다. 마찬가지로 이미 오랜시간동안 여러 프로젝트에서 재사용 및 유효성은 입증이 되었으며 신뢰할 수 있는 솔루션 패턴이라고 생각하시면 됩니다.

 

디자인 패턴에는 총 3가지의 카테고리가 있습니다.

이들은 인스터스에 관한 생성, 구조화, 행동과 관련이 있습니다.

 

1. 생성 패턴 (Creational Pattern)

    - 객체 생성 Pattern으로 객체의 생성 및 조합을 캡슐화해 객체가 생성되거나 변경되어도 프로그램에 영향을 미치지 않게 하는 유연성을 제공하는 패턴

 

2. 구조 패턴 (Structural Pattern)

    - 클래스나 객체를 합성에 관해 더 큰 구조로 만드는 패턴입니다.

 

3. 행동 패턴 (Behavioral Pattern)

    - 객체나 클래스 사이에서 상호작용하는 방법과 책임을 분산하는 방법을 정의하는 패턴입니다.

 

생성 패턴 (Creational Pattern) 구조 패턴 (Structural Pattern) 행동 패턴 (Behavioral Pattern)
Singleton Adapter Command
Abstarct Factory Composite Interpreter
Factroy Method Decorator iterator
Builder Facade Mediator
protoType Flyweight Memento
  proxy Observer
    State
    Strategy
    Template Method

 

위에 표는 3가지 디자인 패턴의 카테고리에 종류에 대해서 정리한 표 입니다.

반응형
728x90

자바를 사용하시다 보면 우리가 모르는 많은 freamwork를 사용하게 될 것입니다.

알아야 보인다는 것 처럼 어떠한 장점이 있고 연차가 쌓였을 때 정확한 오더를 할 수 있을 것 입니다.

지금부터 알아볼 자바에서 제공하는 Collection Framework는 우리가 많이 사용하지만 정확한 개념을 모르는 것들을 소개하고자 합니다.

Collection framework 란?

DATA를 더 쉽게 더 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 즉 인터페이스의 집합을 의미합니다.

 

자 그렇다면 인터페이스에는 무엇이 있는지 살펴보도록 하겠습니다.

 

컬렉션 framework

위에 그림과 같이 인터페이스는 총개에서 파생됩니다.

 

1. List 인터페이스

2. Set 인터페이스

3. Map 인터페이스

 

위에 3가지 인터페이스는 아래 표로 간단히 정리를 해보았습니다.

 

인터페이스 설명 예시
List<E> - 순서가 있는 데이터의 집합.
- 데이터의 중복을 허용.
Vector, ArrayList, LinkedList, Stack, Queue 등
ex) 대기자 명단
Set<E> - 순서가 없는 데이터의 집합.
- 데이터의 중복을 허용하지 않음.
HashSet, TreeSet 등
ex) 양의 정수 집합, 소수의 집합
Map<K, V>

- 키(key)와 값(value)의 한 쌍(Pair)으로 이루어지는 데이터의 집합
- 순서가 없음.
- 키는 중복을 허용하지 않음
- 값은 중복 허용.

HashMap, TreeMap, Hashtable, Properties 등
ex) 우편번호, 지역번호(전화번호)

List

배열과 같이 순서가 있는 List 인터페이스는 객체들을 일렬로 늘어놓는 구조를 가지고 있습니다.

객체를 인덱스(순번을 매긴다)를 매겨 객체를 저장하여 검색/삭제 등을 할 수 있는 기능을 가지고 있습니다.

 

이 인덱스를 기준으로 각각의 객체는 Array를 가지고 있습니다. 그리하여 동일한(중복) 값을 참조하더라도 객체들은 값을 참조하는 게 아닌 그것에 있는 Array를 참조하여 값을 가지고 옵니다.

 

그러므로 다수의 사용자들이 동일한 값을 변경하려고 할 때 문제가 생기기도 합니다.

그래서 ArrayList의 경우는 Thread Safety하지 않다라고도 합니다.

 

하지만 여기서 Vertor는 Thread에서도 Safety 합니다.

이유는 Vertor는 synchronized가 되어 있어 들어온 순서대로 값을 변경하기에 Thread Safety 합니다.

 

그러므로 싱글 스레드 환경에서는 Vertor는 쓸데없이 synchronizd를 하기 때문에 성능면에서는 좋지 않아 쓰지 않는 것을 추천합니다.

Set

순서가 없는 데이터의 집합이고 데이터의 중복을 허용하지 않습니다.

Set은 ArrayList 대신에 iterator를 사용합니다.

LinkedList도 순서는 있지만 인데스가 없으므로 iterator를 사용합니다.

 

- HashSet

      빠른 접근 속도를 가지고 있음.

      순서를 모름.

      객체 중복 허용하지 않음.

 

Set <E> = new HashSet<E>();

      

- LinkedHashSet 

      추가된 순서대로 접근 가능

 

Set<E> = new LinkedHashSet<E>();

 

- TreeSet

      정렬방법을 지정하지 않음.

 

Set<E> = new TreeSet<E>();

Map

키(Key) 값(Value)의 한 쌍(Pair)으로 구성된 객체를 저장하는 구조를 가지고 있다.

키는 중복이 허용되지 않지만 값은 중복을 허용할 수가 있다.

기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 Replace 된다.

 

- HashMap

Map 인터페이스를 대표하는 Map Collection.

주로 Key는 String 타입을 사용하며, String이 문자열이 같을 경우 동등 객체로 사용되게 한다.

 

HashMap<String, String> hashMap = new HashMap<String, String>();

 

- TreeMap

이진트리를 기반으로 한 Map Collection

키와 값을 저장하는 동시에 키를 정렬합니다.

 

* 정렬되는 순서

1. 숫자

2. 알파벳 대문자

3. 알파벳 소문자

4. 한글

 

정렬을 해야 될 필요가 있다면 HashMap 보다는 TreeMap으로 사용하면 성능면에서 좋습니다.

 

TreeMap<String, String> treeMap = new TreeMap<String, String>();

 

 

 

반응형
728x90

최근에는 비대면 문화가 만연해지면서 파일을 전송할 일이 많아서 우리의 개발자들은 파일 전송 코딩을 많이 하게 됩니다.

파일 전송은 편리한 여러 라이브러리가 많이 사용됩니다.

그중 하나인 REST API로 보낼 수 있는 OKHTTPClient를 소개해 드리고자 합니다.

 

OKHttp 라이브러리는 REST API, HTTP 통신을 간편하게 구현할 수 있는 JAVA 라이브러리입니다.

"Square"라는 회사에서 만든 것으로 간편하게 파라미터만 세팅해주면 파일 전송할 수 있는 괜찮은 라이브러리입니다.

 

파일 전송(OK파일 전송 (OKHttpClient REST API) 예제

자 다음은 OKHttp 라이브러리로 만든 파일 전송의 간단한 예제입니다.

 

api접속하기 위한 변수들

위에 사진에 대한 설명입니다.

 

FILENAME : 파일 이름

APIURL     : 접속할 API URL

FILEPATH  : 내가 가져올 파일 경로

APIKEY     : API URL에 접속하기 위한 API key(고객에게 받은 key)

 

파일 가져오기

csvfile 변수에 위에 지정한 filePath와 fileName으로 내가 보낼 파일을 가져옵니다.

 

OkHttpClient 객체 생성

그리고 파일을 보내기 위해서는 꼭 필요한 OKHTTPClient의 파일 전송 객체를 만듭니다.

 

아래 사진들은 Request.Builder를 이용하여

전송방식 put 이용하여 만든 Request 객체 예시입니다.

 

Rest API put 예시

위에 예시를 설명드리면,

addHeader를 메서드로 header 정보를 포함해야 됩니다.

그러므로 우리가 위에 지정한 apiKey를 넣어줍니다. 그 이외에 다른 Header정보가 필요하다면 넣어주시면 됩니다.

url 메서드는 당연히 접속할 URL apiURl을 넣어줍니다.

 

RestUrl 중 put 전송방식을 통해 파일을 보냅니다.

RequestBody 객체 create 메서드를 통해 csvFile을 넣어줍니다.

첫 번째 매개변수에는 MediaType Class에 parse메서드에서 파일 형식을 보내고, 두 번째 매개변수에서는 내가 보낼 파일을 넣어줍니다. 저는 csvfile을 보내야 하기 때문에 csvfile을 넣어주고 build메서드를 통해 Request 객체를 생성했습니다.

 

이후, 위에서 생성된 OKHttpClient 객체를 통해 execute 메서드를 사용하면 전송을 실행하게 됩니다.

정말 단순하게 파라미터만 넘겨도 파일이 전송이 되는 OKHttp 라이브러리는 직접 사용해보니 편하고 좋더라고요.

혹시 파일을 전송할 일이 있으신 분들은 사용하시면 좋을 것 같습니다~

 

수고하세요~!

반응형
728x90

JPA를 접하게 되면서

왜 JPA를 공부해야되는지 ??
왜 기업들은 JPA을 쓰고 있는지 ??

의문점을 가졌는데 그러한 의문점에 대해서 설명하려고 글을 작성했습니다.

 

1) JPA가 나오게 된 배경

 

현재 나와있는 다양한 에플리케이션을 개발하면서 개발자들은 CRUD용 SQL을 반복해서 작성해야 했고 이런 과정은 비 생산적이었습니다. 그래서  CRUD를 자동으로 생성해주는 도구를 만들어서 사용하기도 했지만 애플리케이션의 요구사항이 추가되는 것 까지는 해결해주지 못했습니다.

객체 모델링을 SQL로 풀어내는 데 너무 많은 코드와 노력이 필요했고, 객체 모델은 점점 데이터 중심의 모델로 변해갔습니다. 많은 개발자들이 이러한 부분을 많이 고민하게 되면서 ORM 프레임워크를 알게 되었고, JPA는 자바 진영의 ORM 기술 표준입니다.

 

 

2) 왜 JPA를 사용해야 하는가?

 

  ● 생산성

    - 위에서 설명했듯이 귀찮고, 비생산적인 CRUD 반복적인 SQL 쿼리를 JPA가 대신 처리해주므로 개발자가 직접 SQL을 작성하지 않게 되었습니다. 이에 따라 생산성이 올라가고 데이터중심의 설계에서 객체 중심의 설계로 변화시킬 수가 있게 되었습니다.

   

      기존

             각 테이블마다 SELECT, INSERT, UPDATE, DELETE 쿼리를 작성해놓고 변경 될때마다 수정해야 됨.

             그리고 이를 갖고오기 위해 mybatis 등으로 갖고오고 binding 처리를 해야됨.

        

      JPA

       em.persist(); 저장
        , em.find(); 조회 등

     

     Entity만 제대로 설계되어 있다면

     이러한 단순한 명령어 하나로 저장, 조회 등 CRUD의 전반적인 작업을 가능하게 됨.

 

  ● 유지보수

   - SQL에 의존적인 개발에서는 엔티티에 필드 하나만 추가해도 CRUD 쿼리에 결과를 매핑하기 위해 전체 SQL을 수정해야만 했습니다. 하지만 JPA에서는 자바 엔티티 클래스에 필드만 추가해도 자동으로 생성되고 매핑이 되므로 유지보수하기에 편리합니다.

 

* 예시로 USER테이블에 직무코드 컬럼 추가

 

      ▶ 기존

         INSERT, UPDATE, SELECT SQL를 쿼리를 수정해야되고, USER테이블에 관련된 모든 테이블에 직무코드 컬럼을 추           가해야됨

 

       JPA

         해당 USER 테이블에 ENTITY를 추가하면 끝!

 

  ● 관계형데이터베이스 객체 사이의 불일치 문제 해결

  - 애플리케이션은 발전하게 되면서 내부의 복잡성은 증가하고 있습니다. 복잡성을 제어하지 못하면 유지보수는 어려워지기 마련입니다. 하지만 객체구조를 테이블 구조에 저장하는데에는 한계가 있습니다. 애플리케이션 자바는 객체지향 언어로 개발하고 데이터는 관계형 데이터베이스로 저장해야 한다면 개발자가 중간에서 해결해야 되는 상황이 벌어집니다. 이러한 과정에서 많은 개발자들의 시간낭비와 비용낭비가 발생하게 됩니다.

 

         ▶ 상속

           - 객체는 상속이라는 기능이 있지만 테이블은 상속이 없다.

               그래서 만약 Human 와 Student 을 저장하려면 INSERT문을 두번 써야되는 문제가 있습니다.

                 EX ) INSERT Human

                       INSERT Student

 

              하지만 JPA는 이러한 점을 Persist메소드로 해결했습니다.

                EX ) Entity로 Student에서 Human을 상속하고

                       jpa.persist(MEMBER) 만 넣으면 간단하게 해결됩니다.

              

              이러한 예시 처럼 간단하게 JPA는 상속에 있어서 객체지향으로 변경하여 해결했습니다.

 

        ▶ 연관관계

            - 객체는 참조를 통해 관계를 맺는다.

               그러므로 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 맺는다.

               마찬가지로 두 Entity를 각각 연결시켜 jpa.find();로 해결합니다.

 

3) JPA 단점

    ● 통계쿼리 등 복잡한 쿼리는 구현하기 어려움

      - 단순한 명령어 하나로 CRUD 구현이 가능하기 때문에 복잡한 관계의 쿼리를

        구현하기는 어려움이 있습니다.

        대처방법으로는 mybatis로 따로 쿼리를 작성하여 구현하면 됩니다.

 

● 학습하기가 어려움

       - 기존의 자바 개발자들이 JPA를 공부하기 위해서는 ORM 개념으로 개념 자체를 바꿔야 하기 때문에

         생각보다 학습하기 어려운 부분이 있습니다.

 

    ● 최적화가 필요

        - 자동으로 생성되는 쿼리가 많고, 쓰이지도 않는 불필요한 것들이 생성되어지기 때문에

          성능향상을 위해서는 최적화가 필요합니다.

4) 정리

전세계 기업들이 추구하는 것은 이윤입니다. 이윤을 위해서는 비용절감, 상품의 퀄리티를 높이는 방법 등이 있습니다. 이러한 기업 이윤추구와 발전과정에서 저는 동일한 시간에 양질의 퀄리티와 비용절감 효과를 이룰 수 있는 JPA가 나오는 것은 다양한 수순이라고 생각합니다.

JPA는 많은 관계형 데이터베이스와 객체지향의 불일치의 문제를 해결했고, 반복적이고 불 필요한 시간낭비 코드를 줄였습니다. JPA 이러한 점들은 기업들이 추구하는 이윤추구와도 많은 부분에서 일맥상통하다고 생각합니다. 그리하여 최근 기업들은 기존 SQL의존의 JAVA 기술들을 JPA로 업그레이드 하는 추세이며 JPA를 배우는 것은 JAVA 개발자로서 가져야 할 소양이라 생각합니다. 앞으로 JPA를 익힌 부분을 꾸준히 업로드 할 것이며 저의 블로그를 통해 조금이나마 JPA를 알아가셨으면 좋겠습니다.

반응형

'java > jpa' 카테고리의 다른 글

2. JPA 시작하기  (0) 2020.06.24
728x90

자바로 FTP 파일 전송(File Upload)

FTP tool(파일질라 등)로 우리들은 많은 파일들을 업로드를 해보았을 것 입니다.

하지만 저는 FTP를 통해 업로드를 많이 했지만 실제로 자바로 구현해본적은 많지 않았기에 공부를 위해 한 번 해보기로 결심했습니다.

 

저는 NAS장비가 있어 연결했고, 다른분들은 다른 것으로 연결하셔도 됩니다.

 

Commons Net API

Apache 에서 제공하는 API로 다양한 프로토콜에 대한 지원을 할 수 있는 구조를 갖고 있습니다.

 

FTP 업로드 코드에서 핵심이 되는 클래스는 org.apache.commons.net.ftp.FTPClient 입니다.

FTP 프로토콜 처리를 서버 연결, 로그인, 파일 목록, 송수신 등의 기능을 제공합니다.

 

아래부터는 파일 업로드 예제로 코딩을 시작하도록 하겠습니다.

 

 

코딩 시작

1. POM.XML 추가

2. FTP import

 

3. FTPclient를 생성

 

* ftp Client common-net api로 생성

 

4. 호스트 연결 & 응답코드 체크

 

  * ftp.connect로 연결 후 응답코드 체크

5. 서버 응답코드 정상인지 확인

 

  * FTPReply.isPositiveCompletion을 통해 응답코드로 정상인지 확인

  * 정상이 아니면 disConnect

 

 

 6. showServerReply 함수 생성

server응답 확인 하는 함수

7. 로그인 후 폴더 생성 및 작업디렉터리 변경

 

  * 폴더 생성을 위해서 date로 현재 날짜와 시간을 날짜를 받음.

  * ftp.login(유저아이디, 비번) 으로 로그인

  * showServerReply 함수로 서버 응답 로그 확인

  * ftp.changeWorkingDirectory로 작업디렉터리로 변경

7. 파일 저장

 

  * Active Mode -> PassvieMode로 변경

             FTP의 active Mode, Passive Mode
  
                  Active Mode : Server가 client의 해당 포트 접속해 데이터를 보내줌.
                  Passive Mode : Server에서 클라이언트에 port 전달 , 그 Port로 server는 보내줌.

                                      방화벽, 네트워크 구조 신경쓸 필요 없음. 

    이러한 이유로 방화벽 및 네트워크 구조에 신경 안쓰기 위해 Passive Mode로 변경

    

  * FTP.setFileType FTP.BINARY_FILE_TYPE으로 변경

  * storeFile 함수로 파일 저장

  * 업로드 성공 로그 남기기

 

전체코드

결론

apache 에서 제공하는 commons-net FTPClient 클래스를 통해 FTP를 구현해봤습니다.

commons-net API는 FTP 이외에도 SMTP, Telnet 등 다양한 프로토콜을 처리를 할 수 있다고 합니다.

이 API를 사용해서 다양한 기능 등을 빠르게 개발할 수 있을 것 입니다.

반응형

+ Recent posts