Stream Wrapper 라이브러리

본 모듈은 EIMS에서 파일을 업로드하는 API에서 사용되는 InputStream 전처리 기능을 제공합니다.

특정 사이트에서는 엑셀과 같은 민감한 파일에 DRM(Digital Rights Management)을 사용하는 경우가 있습니다. 이 경우 EIMS에서 파일을 바로 읽을 수 없기 때문에, 사용자가 직접 DRM 해제 로직 또는 기타 커스텀 전처리 로직을 작성할 수 있는 기능을 제공합니다.

본 모듈은 InputStream으로 전달된 파일 내용을 파라미터로 받아, DRM 해제 또는 기타 사용자 커스텀 조작이 적용된 InputStream을 반환하는 인터페이스를 제공합니다.

라이브러리 적용 API

본 모듈이 적용되는 파일 업로드 API는 다음과 같습니다.

API URL Method 설명

MessageFieldController#excelConvert

/v1/message-field/excel

POST

메시지 필드 엑셀 업로드

InterfaceTemplateController#read

/v1/interface-template

POST

인터페이스 템플릿 엑셀 업로드

패키지 구조

com.tmax.anyeims.external.stream
└── StreamIOWrapper.java    # InputStream 전처리 인터페이스

클래스

StreamIOWrapper

InputStream을 전처리하기 위한 인터페이스입니다.

public interface StreamIOWrapper {
    boolean supports(InputStream stream);
    InputStream process(InputStream inputStream);
}
메서드 반환 타입 설명

supports(InputStream stream)

Boolean

현재 InputStream이 본 구현체에서 처리 가능한지 판단

process(InputStream inputStream)

InputStream

InputStream을 읽어 전처리된 InputStream을 반환

구현 예시

다음은 DRM을 해제하는 경우의 예시입니다.

package com.example.stream;

import com.tmax.anyeims.external.stream.StreamIOWrapper;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class DrmStreamIOWrapperImpl implements StreamIOWrapper {

    @Override
    public boolean supports(InputStream stream) {
        // 1. InputStream이 DRM으로 암호화되어 있는지 판단
        // 예: 파일 헤더를 읽어 DRM 여부 확인
        try {
            byte[] header = new byte[4];
            stream.mark(4);
            stream.read(header);
            stream.reset();

            // DRM 파일 시그니처 확인 (예시)
            return isDrmEncrypted(header);
        } catch (Exception e) {
            return false;
        }
    }

    @Override
    public InputStream process(InputStream inputStream) {
        // 2. DRM 해제 로직 수행
        try {
            byte[] encryptedData = inputStream.readAllBytes();

            // DRM 해제 처리 (사이트별 DRM 라이브러리 사용)
            byte[] decryptedData = decryptDrm(encryptedData);

            return new ByteArrayInputStream(decryptedData);
        } catch (Exception e) {
            throw new RuntimeException("DRM 해제 실패", e);
        }
    }

    private boolean isDrmEncrypted(byte[] header) {
        // DRM 파일 시그니처 확인 로직
        // ...
        return true;
    }

    private byte[] decryptDrm(byte[] encryptedData) {
        // DRM 해제 로직
        // ...
        return encryptedData;
    }
}

배포 및 설정

JAR 파일 배포

StreamIOWrapper를 구현한 Java 프로젝트를 JAR로 빌드한 후, EIMS 설치 디렉토리 내 lib 디렉토리에 위치시킵니다.

EIMS_HOME/
└── lib/                          # EIMS 백엔드 JAR 의존성 디렉토리
    └── my-stream-wrapper.jar     # 커스텀 Stream Wrapper JAR 파일

설정 파일 등록

application-extensions.yml 파일에 Stream Wrapper 클래스를 등록합니다.

eims:
  stream-wrapper:
    class-name: com.example.stream.DrmStreamIOWrapperImpl
설정 항목 설명

class-name

StreamIOWrapper 구현 클래스의 전체 경로(FQCN)

의존성 추가

Stream Wrapper 프로젝트에서 이 라이브러리를 사용하려면 JAR 파일을 직접 프로젝트에 추가합니다.

필요 JAR 파일

파일명 설명

eims-stream-wrapper-{version}.jar

EIMS Stream Wrapper 라이브러리

Maven(로컬 JAR 참조)

<dependency>
    <groupId>com.tmax.anyeims</groupId>
    <artifactId>eims-stream-wrapper</artifactId>
    <version>{version}</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/eims-stream-wrapper-{version}.jar</systemPath>
</dependency>

Gradle(로컬 JAR 참조)

dependencies {
    implementation files('libs/eims-stream-wrapper-{version}.jar')
}