ec2 instance에 mvn 설치를 했는데 java version이 1.7로 잡힌다...
pom.xml에 target설정도 했는데 package를 하면 계속 에러가...하..
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.61.amzn1.x86_64/jre
를 통해서 mvn의 java version을 바꿔주니까 제대로 된다^^;;;;
ec2 instance에 mvn 설치를 했는데 java version이 1.7로 잡힌다...
pom.xml에 target설정도 했는데 package를 하면 계속 에러가...하..
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.61.amzn1.x86_64/jre
를 통해서 mvn의 java version을 바꿔주니까 제대로 된다^^;;;;
run을 해보면..
-- Autogenerated: do not edit this file
CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY ,
VERSION BIGINT ,
JOB_NAME VARCHAR(100) NOT NULL,
JOB_KEY VARCHAR(32) NOT NULL,
constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) ;
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY ,
VERSION BIGINT ,
JOB_INSTANCE_ID BIGINT NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL,
START_TIME TIMESTAMP DEFAULT NULL ,
END_TIME TIMESTAMP DEFAULT NULL ,
STATUS VARCHAR(10) ,
EXIT_CODE VARCHAR(2500) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
CREATE TABLE BATCH_JOB_EXECUTION_PARAMS (
JOB_EXECUTION_ID BIGINT NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
DATE_VAL TIMESTAMP DEFAULT NULL ,
LONG_VAL BIGINT ,
DOUBLE_VAL DOUBLE PRECISION ,
IDENTIFYING CHAR(1) NOT NULL ,
constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_STEP_EXECUTION (
STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY ,
VERSION BIGINT NOT NULL,
STEP_NAME VARCHAR(100) NOT NULL,
JOB_EXECUTION_ID BIGINT NOT NULL,
START_TIME TIMESTAMP NOT NULL ,
END_TIME TIMESTAMP DEFAULT NULL ,
STATUS VARCHAR(10) ,
COMMIT_COUNT BIGINT ,
READ_COUNT BIGINT ,
FILTER_COUNT BIGINT ,
WRITE_COUNT BIGINT ,
READ_SKIP_COUNT BIGINT ,
WRITE_SKIP_COUNT BIGINT ,
PROCESS_SKIP_COUNT BIGINT ,
ROLLBACK_COUNT BIGINT ,
EXIT_CODE VARCHAR(2500) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT (
STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT TEXT ,
constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID)
references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID)
) ;
CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT (
JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT TEXT ,
constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE;
CREATE SEQUENCE BATCH_JOB_SEQ MAXVALUE 9223372036854775807 NO CYCLE;
위의 쿼리문을 이용해 table을 생성해준다. 나는 AWS RDS를 이용해 PostgreSQL을 설치해 주었다.
참조
Spring Batch, 처음부터 시작하기
커머스 서비스 개발자를 위한 Spring Batch 입문
medium.com
jojoldu.tistory.com/325?category=902551
2. Spring Batch 가이드 - Batch Job 실행해보기
이번 시간에는 간단한 Spring Batch Job을 생성 & 실행하면서 전반적인 내용을 공부해보겠습니다. 작업한 모든 코드는 Github에 있으니 참고하시면 됩니다. 2-1. Spring Batch 프로젝트 생성하기 기본적인
jojoldu.tistory.com
Spring Cloud Data Flow & Spring Batch 사용 (실패), docker-compose 파일 (0) | 2023.03.22 |
---|---|
Spring Batch를 사용하며 맞닥뜨린 상황 기록 02 (0) | 2023.02.28 |
Spring Batch를 사용하며 맞닥뜨린 상황 기록 01 (0) | 2023.02.14 |
스프링배치 핵심 개념 체크를 위한 Questions (메타데이터 테이블, skip&retry, chunk oriented, cursor & paging 등) (0) | 2022.11.16 |
Spring Batch - @JobScope, @StepScope / LocalDate 사용법 (0) | 2022.10.25 |
medium.com/swlh/from-java-8-to-java-15-in-ten-minutes-f42d422a581e
From Java 8 to Java 15 in Ten Minutes
This blog will give you samples of awesome new feature added since Java 7. I’ll showcase at least one major improvement for each Java…
medium.com
좋은 자료인 것 같아 저장해두고 하나씩 적용해봐야지
Java Singleton 의 7가지 패턴 (0) | 2021.05.17 |
---|---|
자바 '변수' - 변수 별 차이 및 메모리 내 저장 위치 / static에 대한 심화 학습 (0) | 2021.04.29 |
모던자바 데이터 처리와 성능 향상 (JVM메모리/Thread/Stream/병렬스트림/CompletableFuture) (0) | 2020.11.19 |
Java Volatile & Atomic & Synchronized (0) | 2020.05.04 |
제네릭 (Generic) - 간단하게 정리해보자. (0) | 2020.03.12 |
예를 들어 Example Corp이라는 타사를 고용해 AWS 계정을 모니터링하고 비용을 최적화하기로 했다고 가정해봅시다. 일일 경비를 추적하기 위해 Example Corp은 AWS 리소스에 접근해야 합니다. Example Corp 역시 다른 고객을 위해 다른 많은 AWS 계정을 모니터링합니다.
IAM 사용자 및 AWS 계정의 장기 자격 증명에 대한 액세스 권한을 Example Corp에게 제공하지 마십시오. 대신 IAM 역할과 임시 보안 자격 증명을 사용합니다. IAM 역할은 장기 자격 증명(예: IAM 사용자의 액세스 키)을 공유하지 않고도 AWS 리소스에 액세스할 수 있도록 허용하는 메커니즘을 타사에게 제공합니다.
IAM 역할을 사용하여 AWS 계정과 Example Corp 계정 사이에 신뢰 받는 관계를 설정할 수 있습니다. 이 관계가 설정된 후 Example Corp 계정의 멤버는 AWS STS AssumeRole API를 호출하여 임시 보안 자격 증명을 얻을 수 있습니다. Example Corp 멤버는 자격 증명을 사용하여 계정의 AWS 리소스에 액세스할 수 있습니다.
Example Corp을 고용해 고유한 사용자 지정 식별자를 생성하도록 합니다. 이 고유 고객 ID와 AWS 계정 번호를 제공합니다. 이 정보는 다음 단계에서 IAM 역할을 생성하는 데 필요합니다.
참고
이 식별자가 Example Corp의 각 고객에게 고유한 것이라면 Example Corp는 ExternalId에 대해 그들이 원하는 어떤 문자열 값이라도 사용할 수 있습니다. 두 고객이 같은 값을 갖지 않는 한, 고객 계정 번호 또는 임의 문자열이 될 수 있습니다. 이는 '보안 유지'를 위한 것은 아닙니다. Example Corp은 각 고객에게 ExternalId 값을 제공해야 합니다. 가장 중요한 것은 그들의 고객이 아닌 Example Corp이 그것을 생성해야 한다는 것입니다.
AWS에 로그인해 Example Corp에 리소스에 대한 액세스 권한을 부여하는 IAM 역할을 생성합니다. IAM 역할과 마찬가지로 해당 역할에도 권한 정책과 신뢰 정책이라는 2가지 정책이 있습니다. 그 역할의 신뢰 정책은 역할을 위임할 사용자를 지정합니다. 이 예시 시나리오에서 정책은 Example Corp의 AWS 계정 번호를 Principal로 지정합니다. 이렇게 하면 계정의 자격 증명이 그 역할을 수임하도록 허용합니다. 또한, Condition 요소를 신뢰 정책에 추가합니다. 이 Condition은 Example Corp의 고유 고객 ID와 일치하는지 확인하기 위해 ExternalId 컨텍스트 키를 테스트합니다. 예를 들면 다음과 같습니다.
"Principal": {"AWS": "Example Corp's AWS Account ID"}, "Condition": {"StringEquals": {"sts:ExternalId": "Unique ID Assigned by Example Corp"}}
역할에 대한 권한 정책은 해당 역할이 누군가가 수행하도록 허용할 수 있는 작업을 지정합니다. 예를 들어 그 역할은 누군가에게 IAM 사용자나 그룹이 아닌 Amazon EC2 또는 Amazon RDS 리소스만을 관리할 수 있게 허용하도록 지정할 수 있습니다. 이 예시 시나리오에서는 권한 정책을 사용하여 Example Corp에게 계정의 리소스 전체에 대한 읽기 전용 액세스 권한을 부여합니다.
역할을 정의한 후에는 역할의 Amazon 리소스 이름(ARN)을 Example Corp에 제공합니다.
Example Corp이 AWS 리소스에 액세스해야 할 때는 그 회사의 누군가가 AWSsts:AssumeRole API를 호출합니다. 이 호출에는 수임할 역할의 ARN과 사용자 지정 ID에 해당하는 ExternalId 파라미터가 포함되어 있습니다.
docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html
AWS 리소스에 대한 액세스를 서드 파티에 부여할 때 외부 ID를 사용하는 방법 - AWS Identity and Access M
이 식별자가 Example Corp의 각 고객에게 고유한 것이라면 Example Corp는 ExternalId에 대해 그들이 원하는 어떤 문자열 값이라도 사용할 수 있습니다. 두 고객이 같은 값을 갖지 않는 한, 고객 계정 번호
docs.aws.amazon.com
현재 진행하고 있는 프로젝트에서 데이터 처리하는 데 시간이 많이 소요되는 부분이 있어
이것을 개선하고자 관련해서 공부를 해보려 한다.
우선 내가 처한 상황은,
AWS ComputeOptimizer 서비스 API를 사용하려는데 모든 Region에 대한 데이터가 필요함.
그런데 각 Region별로 Client를 생성해서 API 호출 및 데이터 변환에 많은 시간이 소요.
따라서, 해당 부분의 성능을 향상시켜 페이지 로딩시 데이터를 최대한 빨리 가져오도록 하려 한다.
먼저 기초부터 알고 가자!
출처 : asfirstalways.tistory.com/158
출처 : hongsii.github.io/2018/12/20/jvm-memory-structure/
이제 본격적으로 자바 8 API에 추가된 Stream부터 알아보도록 하자.
ExecutorService executor = Executors.newCachedThreadPool();
Future<Double> future = executor.submit(new Callable<Double>() {
public Double call() {
return 시간이 오래걸리는 작업();
}
});
doSomthingElse();
try {
Double result = future.get(1, TimeUnit.SECONDS);
} catch (ExecutionException ee) {
//계산 중 예외 발생
} catch (InterruptedException ie) {
//현재 스레드에서 대기 중 인터럽트 발생
} catch (TimeoutException te) {
//Future완성되기 전에 타임아웃 발생
}
public Future<Double> getPriceAsync(String product) {
CompletableFuture<Double> futurePrice = new CompletableFuture<>();
new Thread(() -> {
try {
double price = 오래 걸리는 작업 메소드();
futurePrice.complete();
} catch (Exception ex) {
futurePrice.completeExceptionally(ex); // Future에 에러 포함해서 종료
}
}).start();
return futurePrice;
}
Future 사용 Example
Future<Double> futurePrice = shop.getPriceAsync("dd");
다른 작업 메소드 (); // 가격 가져오게 하고 다른 작업 하기
try {
double price = futurePrice.get();
} catch (Exception e) {
throw RuntimeException(e);
}
비동기 메소드 구현 및 사용
public Future<Double> getPriceAsync(String product) {
return CompletableFuture.supplyAsync(() -> 오래 걸리는 작업 메소드(product));
}
CompletableFuture를 직접 만들지 않고 간단하게 만드는 방법
private final Executor executor =
Executors.newFixedThreadPool(Math.min(shops.size(), 100), new ThreadFactory() {
public Thread newThread(Runnable r){
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
}
});
애플리케이션에 맞는 커스텀 Executor
public List<String> findPrices(String product) {
List<CompletableFuture<String>> priceFutures =
shop.stream()
.map(shop -> CompletableFuture.supplayAsync(() -> shop.getPrice(product), executor))
.map(future -> future.thenApply(Quote::parse))
.map(future -> future.thenCompose(quote ->
CompletableFuture.supplyAsync(()-> Discount.applyDiscount(quote), executor)))
.collect(toList());
return priceFutures.stream().map(CompletableFuture::join).collect(toList());
}
동기 작업과 비동기 작업 조합하기
Future<Double> futurePriceInUSD =
CompletableFuture.supplyAsync(() -> shop.getPrice(product))
.thenCombine(CompletableFuture.supplyAsync(() -> 메소드())
.completeOnTimeout(DEFAULT_RATE, 1, TimeUnit.SECONDS),
(price, rate) -> price * rate ))
.orTimeout(3, TimeUnit.SECONDS);
타임아웃 사용하기
출처 2 모던 자바 인 액션 (라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트 지음 / 한빛미디어)
나의 결론,
우선 나는 AWS에서 Region 별로 API를 호출해야 하고, 각각의 결과를 바탕으로 또 한번 API를 각각 호출해야 한다.
따라서 단순 계산식이 아니기에 CompleteFuture를 사용하고, ThreadPool크기를 Region숫자로 fix할 예정이다.
또한 map을 활용하여 비동기 작업과 조합하는 방법으로 개발하겠다.
자바 '변수' - 변수 별 차이 및 메모리 내 저장 위치 / static에 대한 심화 학습 (0) | 2021.04.29 |
---|---|
From Java 8 to Java 15 in Ten Minutes (0) | 2021.01.27 |
Java Volatile & Atomic & Synchronized (0) | 2020.05.04 |
제네릭 (Generic) - 간단하게 정리해보자. (0) | 2020.03.12 |
for문, enhanced for문, Collection.stream().forEach(), Collection.forEach() 차이 (0) | 2020.03.11 |