Spring
Spring에 관한 내용을 공유합니다.
-
공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다.GraphQL 이란? Graph QL(이하 gql)은 Structed Query Language(이하 sql)와 마찬가지로 쿼리 언어입니다. 하지만 gql과 sql의 언어적 구조 차이는 매우 큽니다. 또한 gql과 sql이 실전에서 쓰이는 방식의 차이도 매우 큽니다. gql과 sql의 언어적 구조 차이가 활용 측면에서의 차이를 가져왔습니다. 이 둘은 애초에 탄생 시기도 다르고 배경도 다릅니다. sql은 데이터베이스 시스템에 저장된 데이터를 효율적으로 가져오는 것이 목적이고, gql은 웹 클라이언트가 데이터를 서버로부터 효율적으로 가져오는 것이 목적입니다. sql의 문장(statement)은 주로 백앤드 시스템에서 작성하고 호출하..
Spring - GraphQL 서버 구축하기공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다.GraphQL 이란? Graph QL(이하 gql)은 Structed Query Language(이하 sql)와 마찬가지로 쿼리 언어입니다. 하지만 gql과 sql의 언어적 구조 차이는 매우 큽니다. 또한 gql과 sql이 실전에서 쓰이는 방식의 차이도 매우 큽니다. gql과 sql의 언어적 구조 차이가 활용 측면에서의 차이를 가져왔습니다. 이 둘은 애초에 탄생 시기도 다르고 배경도 다릅니다. sql은 데이터베이스 시스템에 저장된 데이터를 효율적으로 가져오는 것이 목적이고, gql은 웹 클라이언트가 데이터를 서버로부터 효율적으로 가져오는 것이 목적입니다. sql의 문장(statement)은 주로 백앤드 시스템에서 작성하고 호출하..
2024.05.20 -
CircuitBreaker란? CircuitBreaker는 문제가 발생한 지점을 감지하고 실패하는 요청을 계속하지 않도록 방지하며, 이를 통해 시스템의 장애 확산을 막고 장애 복구를 도와주는 기능을 제공합니다. 위 그림과 같이 A가 B를 호출할 때, B가 반복적으로 실패한다면 CircuitBreaker를 Open 하여 B에 대한 흐름을 차단하는 기능을 제공합니다. CircuitBreaker를 지원하는 라이브러리 Netflix Hystrix (deprecated) Netflix 에서 개발한 라이브러리로 MSA 환경에서 서비스 간 통신이 원활하지 않을 경우 각 서비스가 장애 내성과 지연 내성을 갖게 하는 라이브러리 Resilience4j Netflix Hystrix로 부터 영감을 받아 개발된 Fault To..
Spring - CircuitBreakerCircuitBreaker란? CircuitBreaker는 문제가 발생한 지점을 감지하고 실패하는 요청을 계속하지 않도록 방지하며, 이를 통해 시스템의 장애 확산을 막고 장애 복구를 도와주는 기능을 제공합니다. 위 그림과 같이 A가 B를 호출할 때, B가 반복적으로 실패한다면 CircuitBreaker를 Open 하여 B에 대한 흐름을 차단하는 기능을 제공합니다. CircuitBreaker를 지원하는 라이브러리 Netflix Hystrix (deprecated) Netflix 에서 개발한 라이브러리로 MSA 환경에서 서비스 간 통신이 원활하지 않을 경우 각 서비스가 장애 내성과 지연 내성을 갖게 하는 라이브러리 Resilience4j Netflix Hystrix로 부터 영감을 받아 개발된 Fault To..
2024.04.07 -
본 포스팅은 spring boot 3.2.2 버전을 기준으로 작성되었습니다. 공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다. open feign이란? feign은 Netflix에서 개발된 Http client binder로 REST Call을 위해 호출하는 클라이언트를 보다 쉽게 작성할 수 있도록 도와주는 라이브러리입니다. spring의 경우 spring-cloud-starter-openfeign 라이브러리 추가로 사용할 수 있습니다. spring cloud는 spring mvc annotation에 대한 지원과 sprinb web에서 사용되는 것과 동일한 HttpMessageConverters를 지원합니다. 의존성 및 client build.gradle.kts depend..
Spring - OpenFeign본 포스팅은 spring boot 3.2.2 버전을 기준으로 작성되었습니다. 공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다. open feign이란? feign은 Netflix에서 개발된 Http client binder로 REST Call을 위해 호출하는 클라이언트를 보다 쉽게 작성할 수 있도록 도와주는 라이브러리입니다. spring의 경우 spring-cloud-starter-openfeign 라이브러리 추가로 사용할 수 있습니다. spring cloud는 spring mvc annotation에 대한 지원과 sprinb web에서 사용되는 것과 동일한 HttpMessageConverters를 지원합니다. 의존성 및 client build.gradle.kts depend..
2024.02.04 -
단일 스레드 vs 멀티 스레드 프로세스 내 특정 작업을 처리하는 스레드가 하나일 경우 단일 스레드, 여러 개일 경우 멀티 스레드라고 합니다. 작업 처리에 있어서 단일 스레드와 멀티 스레드의 선택 기준은 어떤 방식이 자원을 효율적으로 사용하고 성능 처리에 유리한가 하는 점입니다. 일반적으로 복잡한 처리나 대용량 데이터를 다루는 작업일 경우 전체 소요 시간 및 성능상의 이점을 가져오기 위해 멀티 스레드 방식을 사용합니다. 하지만 멀티 스레드 처리 방식은 데이터 동기화 이슈가 존재하기 때문에 주의해야 합니다. 스프링 배치 스레드 모델 스프링 배치에서 멀티스레드 환경을 구성하기 위해서 가장 먼저 해야 할 일은 사용하고자 하는 Reader와 Writer가 멀티스레드를 지원하는지 확인하는 것입니다. 스프링 배치 모..
Spring Batch - 병럴 처리단일 스레드 vs 멀티 스레드 프로세스 내 특정 작업을 처리하는 스레드가 하나일 경우 단일 스레드, 여러 개일 경우 멀티 스레드라고 합니다. 작업 처리에 있어서 단일 스레드와 멀티 스레드의 선택 기준은 어떤 방식이 자원을 효율적으로 사용하고 성능 처리에 유리한가 하는 점입니다. 일반적으로 복잡한 처리나 대용량 데이터를 다루는 작업일 경우 전체 소요 시간 및 성능상의 이점을 가져오기 위해 멀티 스레드 방식을 사용합니다. 하지만 멀티 스레드 처리 방식은 데이터 동기화 이슈가 존재하기 때문에 주의해야 합니다. 스프링 배치 스레드 모델 스프링 배치에서 멀티스레드 환경을 구성하기 위해서 가장 먼저 해야 할 일은 사용하고자 하는 Reader와 Writer가 멀티스레드를 지원하는지 확인하는 것입니다. 스프링 배치 모..
2024.02.04 -
@JobScope와 @StepScope Scope는 스프링 컨테이너에서 빈이 관리되는 범위를 의미합니다. JobScope와 StepScope는 Job과 Step의 빈 생성과 실행에 관여하는 스코프입니다. 프록시 모드를 기본값으로 하기 때문에 애플리케이션 구동 시점에는 프록시 빈이 생성되고 실행 시점에 실제 빈 생성이 이뤄집니다. 이를 통해 빈의 실행 시점에 값을 참조할 수 있는 일종의 Lazy Binding이 가능해집니다. 스코프를 사용하게 되면 @Value를 사용하여 아래와 같이 인자로 주입받을 수 있게 됩니다. @Value("#{jobParameters[파라미터명]}") @Value("#{jobExecutionContext[파라미터명]}") @Value("#{stepExecutionContext[파라..
Spring Batch - Scope@JobScope와 @StepScope Scope는 스프링 컨테이너에서 빈이 관리되는 범위를 의미합니다. JobScope와 StepScope는 Job과 Step의 빈 생성과 실행에 관여하는 스코프입니다. 프록시 모드를 기본값으로 하기 때문에 애플리케이션 구동 시점에는 프록시 빈이 생성되고 실행 시점에 실제 빈 생성이 이뤄집니다. 이를 통해 빈의 실행 시점에 값을 참조할 수 있는 일종의 Lazy Binding이 가능해집니다. 스코프를 사용하게 되면 @Value를 사용하여 아래와 같이 인자로 주입받을 수 있게 됩니다. @Value("#{jobParameters[파라미터명]}") @Value("#{jobExecutionContext[파라미터명]}") @Value("#{stepExecutionContext[파라..
2024.02.04 -
Listener 배치 흐름 중에 Job, Step, Chunk 단계의 실행 전후에 발생하는 이벤트를 받아 용도에 맞게 활용할 수 있도록 제공하는 인터셉터 개념의 클래스입니다. 각 단계별로 로그기록을 남기거나 소요된 시간을 계산하거나 실행상태 정보들을 참조 및 조회할 수 있습니다. Job JobExecutionListener : Job 실행 전후 Step StepExecutionListener : Step 실행 전후 ChunkListener : Chunk 실행 전후(Tasklet 실행 전후), 오류 시점 ItemReaderListener : ItemReader 실행 전후, 오류 시점, 단, item이 null일 경우에는 호출 X ItemProcessorListener : ItemProcessor 실행 전후..
Spring Batch - 리스너Listener 배치 흐름 중에 Job, Step, Chunk 단계의 실행 전후에 발생하는 이벤트를 받아 용도에 맞게 활용할 수 있도록 제공하는 인터셉터 개념의 클래스입니다. 각 단계별로 로그기록을 남기거나 소요된 시간을 계산하거나 실행상태 정보들을 참조 및 조회할 수 있습니다. Job JobExecutionListener : Job 실행 전후 Step StepExecutionListener : Step 실행 전후 ChunkListener : Chunk 실행 전후(Tasklet 실행 전후), 오류 시점 ItemReaderListener : ItemReader 실행 전후, 오류 시점, 단, item이 null일 경우에는 호출 X ItemProcessorListener : ItemProcessor 실행 전후..
2024.02.01 -
Repeat 스프링 배치는 특정 조건이 충족될 때까지 Job 또는 Step을 반복하도록 배치 애플리케이션을 구성할 수 있습니다. 스프링 배치에서는 Step과 Chunk의 반복을 RepeatOperation을 사용해 처리하고 있습니다. 기본 구현체로 RepeatTemplate을 제공합니다. 구조 Step은 RepeatTemplate을 사용해 Tasklet을 반복적으로 실행합니다. ChunkOrientedTasklet은 내부적으로 ChunkProvider를 통해 ItemReader로 데이터를 읽어올 것을 지시합니다. ChunkProvider는 내부적으로 RepeatTemplate을 갖고 있고 이를 이용해 반복적으로 ItemReader에게 반복적으로 데이터를 읽어오도록 처리합니다. FaultTolerant 스..
Spring Batch - 반복 및 오류 제어Repeat 스프링 배치는 특정 조건이 충족될 때까지 Job 또는 Step을 반복하도록 배치 애플리케이션을 구성할 수 있습니다. 스프링 배치에서는 Step과 Chunk의 반복을 RepeatOperation을 사용해 처리하고 있습니다. 기본 구현체로 RepeatTemplate을 제공합니다. 구조 Step은 RepeatTemplate을 사용해 Tasklet을 반복적으로 실행합니다. ChunkOrientedTasklet은 내부적으로 ChunkProvider를 통해 ItemReader로 데이터를 읽어올 것을 지시합니다. ChunkProvider는 내부적으로 RepeatTemplate을 갖고 있고 이를 이용해 반복적으로 ItemReader에게 반복적으로 데이터를 읽어오도록 처리합니다. FaultTolerant 스..
2024.01.31 -
ItemProcessor 데이터를 출력하기 전에 데이터를 가공 및 필터링 역할을 하는 인터페이스입니다. ItemReader 및 ItemWriter와 분리되어 비즈니스 로직을 구현할 수 있습니다. ItemReader로부터 받은 아이템을 특정 타입으로 변환해서 ItemWriter에 넘겨줄 수 있습니다. Itemreader로부터 받은 아이템들 중 필터과정을 거쳐서 원하는 아이템들만 ItemWriter로 넘겨줄 수 있습니다. ChunkOrientedTasklet 실행 시 선택적 요소기 때문에 필수 요소는 아닙니다. O process() I 제네릭은 ItemReader에서 받을 데이터 타입 O 제네릭은 ItemWriter에게 보낼 데이터 타입 아이템을 하나씩 가공 처리하며 null을 리턴할 경우 해당 아이템은 C..
Spring Batch - ItemProcessorItemProcessor 데이터를 출력하기 전에 데이터를 가공 및 필터링 역할을 하는 인터페이스입니다. ItemReader 및 ItemWriter와 분리되어 비즈니스 로직을 구현할 수 있습니다. ItemReader로부터 받은 아이템을 특정 타입으로 변환해서 ItemWriter에 넘겨줄 수 있습니다. Itemreader로부터 받은 아이템들 중 필터과정을 거쳐서 원하는 아이템들만 ItemWriter로 넘겨줄 수 있습니다. ChunkOrientedTasklet 실행 시 선택적 요소기 때문에 필수 요소는 아닙니다. O process() I 제네릭은 ItemReader에서 받을 데이터 타입 O 제네릭은 ItemWriter에게 보낼 데이터 타입 아이템을 하나씩 가공 처리하며 null을 리턴할 경우 해당 아이템은 C..
2024.01.28 -
ItemWriter Chunk 단위로 데이터를 받아 일괄 출력 작업을 위한 인터페이스입니다. 플랫 파일 - csv, txt XML, Jsono Database Message Queuing 서비스 Mail Service Custom reader 다수의 구현체들이 itemReader와 같은 맥락으로 itemWriter와 ItemStream을 동시에 구현하고 있습니다. 하나의 아이템이 아닌 아이템 리스트를 전달받아 수행합니다. ChunkOrientedTasklet 실행 시 필수적 요소로 설정해야 합니다. void write() 출력 데이터를 아이템 리스트로 받아서 처리합니다. 출력이 완료되고 트랜잭션이 종료되면 새로운 Chunk 단위 프로세스로 이동합니다. 위와 같이 다양한 구현체들을 제공하고 있습니다. Jd..
Spring Batch - ItemWriterItemWriter Chunk 단위로 데이터를 받아 일괄 출력 작업을 위한 인터페이스입니다. 플랫 파일 - csv, txt XML, Jsono Database Message Queuing 서비스 Mail Service Custom reader 다수의 구현체들이 itemReader와 같은 맥락으로 itemWriter와 ItemStream을 동시에 구현하고 있습니다. 하나의 아이템이 아닌 아이템 리스트를 전달받아 수행합니다. ChunkOrientedTasklet 실행 시 필수적 요소로 설정해야 합니다. void write() 출력 데이터를 아이템 리스트로 받아서 처리합니다. 출력이 완료되고 트랜잭션이 종료되면 새로운 Chunk 단위 프로세스로 이동합니다. 위와 같이 다양한 구현체들을 제공하고 있습니다. Jd..
2024.01.28 -
ItemReader itemReader는 다양한 입력으로부터 데이터를 읽어서 제공하는 인터페이스입니다. 플랫 파일 - csv, txt XML, Json Database Message Queuing 서비스 Custom reader 다수의 구현체들이 ItemReader와 ItemStream 인터페이스를 동시에 구현하고 있습니다. ItemStream은 파일 스트림 연결 종료, DB 커넥션 연결 종료 등의 장치 초기화 등의 작업에 사용됩니다. ExecutionContext에 read와 관련된 여러 가지 상태 정보를 저장해 두고 재시작 시 참조됩니다. ChunkOrientedTasklet 실행 시 필수적 요소로 설정해야 합니다. T read() 입력 데이터를 읽고 다음 데이터로 이동합니다. 아이템 하나를 리턴하며..
Spring Batch - ItemReaderItemReader itemReader는 다양한 입력으로부터 데이터를 읽어서 제공하는 인터페이스입니다. 플랫 파일 - csv, txt XML, Json Database Message Queuing 서비스 Custom reader 다수의 구현체들이 ItemReader와 ItemStream 인터페이스를 동시에 구현하고 있습니다. ItemStream은 파일 스트림 연결 종료, DB 커넥션 연결 종료 등의 장치 초기화 등의 작업에 사용됩니다. ExecutionContext에 read와 관련된 여러 가지 상태 정보를 저장해 두고 재시작 시 참조됩니다. ChunkOrientedTasklet 실행 시 필수적 요소로 설정해야 합니다. T read() 입력 데이터를 읽고 다음 데이터로 이동합니다. 아이템 하나를 리턴하며..
2024.01.28 -
Chunk 여러 개의 아이템을 묶은 하나의 덩어리를 의미합니다. 한 번에 하나씩 아이템을 입력받아 Chunk 단위의 덩어리로 만든 후 Chunk 단위로 트랜잭션을 처리합니다. Chunk 단위로 Commit과 Rollback Chunk Chunk, Chunk Chunk ItemReader로 읽은 하나의 아이템을 Chunk 크기만큼 반복해서 저장하는 타입 Chunk ItemReader로부터 전달받은 Chunk 를 참조해서 ItemProcessor에서 적절하게 가공한 뒤 ItemWriter로 전달되는 타입 여기서 O는 Processor가 없다면 ItemReader로부터 전달받는 타입, Processor가 있다면 Processor로부터 전달받는 타입입니다. 아키텍처 ItemReader가 Source를 한 건씩 ..
Spring Batch - 청크 기반 프로세스Chunk 여러 개의 아이템을 묶은 하나의 덩어리를 의미합니다. 한 번에 하나씩 아이템을 입력받아 Chunk 단위의 덩어리로 만든 후 Chunk 단위로 트랜잭션을 처리합니다. Chunk 단위로 Commit과 Rollback Chunk Chunk, Chunk Chunk ItemReader로 읽은 하나의 아이템을 Chunk 크기만큼 반복해서 저장하는 타입 Chunk ItemReader로부터 전달받은 Chunk 를 참조해서 ItemProcessor에서 적절하게 가공한 뒤 ItemWriter로 전달되는 타입 여기서 O는 Processor가 없다면 ItemReader로부터 전달받는 타입, Processor가 있다면 Processor로부터 전달받는 타입입니다. 아키텍처 ItemReader가 Source를 한 건씩 ..
2024.01.25 -
배치 애플리케이션이란? 배치(Batch)는 일괄처리란 뜻을 갖고 있습니다. 쇼핑몰에서 매일 전날의 매출 데이터를 집계해야 한다고 가정해 보겠습니다. 매출 데이터가 대용량이라면 하루 매출 데이터를 읽고, 가공하고, 저장한다면 해당 서버는 순식간에 CPU, I/O 등의 자원을 다 써버려서 다른 작업을 할 수 없게 됩니다. 집계 기능은 하루에 1번만 수행된다면 이를 위해 API를 구성하는 것은 낭비가 될 수 있고, 데이터 처리 중에 실패했다면 처음부터가 아니라 실패시점부터 다시 처리하고 싶을 수 있습니다. 이런 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 배치 애플리케이션 이라고 합니다. 배치 애플리케이션은 다음 조건을 만족해야 합니다. 대용량 데이터 - 배치 애플리케이션은 대량의 데이터를 가져오거나,..
Spring Batch - DB 스키마와 도메인배치 애플리케이션이란? 배치(Batch)는 일괄처리란 뜻을 갖고 있습니다. 쇼핑몰에서 매일 전날의 매출 데이터를 집계해야 한다고 가정해 보겠습니다. 매출 데이터가 대용량이라면 하루 매출 데이터를 읽고, 가공하고, 저장한다면 해당 서버는 순식간에 CPU, I/O 등의 자원을 다 써버려서 다른 작업을 할 수 없게 됩니다. 집계 기능은 하루에 1번만 수행된다면 이를 위해 API를 구성하는 것은 낭비가 될 수 있고, 데이터 처리 중에 실패했다면 처음부터가 아니라 실패시점부터 다시 처리하고 싶을 수 있습니다. 이런 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 배치 애플리케이션 이라고 합니다. 배치 애플리케이션은 다음 조건을 만족해야 합니다. 대용량 데이터 - 배치 애플리케이션은 대량의 데이터를 가져오거나,..
2024.01.24