Spring
[Spring Batch] Chunk 아키텍처
[Spring Batch] Chunk 아키텍처
2024.08.24단일 Task 기반 처리로도 배치 작업을 수행할 수 있지만, Chunk 단위로 묶어서 배치 작업을 처리하면 여러 측면에서 이점을 얻을 수 있다. ItemReader가 설정된 Chunk 사이즈만큼 데이터를 읽고, ItemProcessor가 처리 작업을 수행한 후 ItemWriter가 기록하는 구조이다.ItemReader는 한 번에 하나의 아이템을 읽고 읽은 아이템은 Chunk의 일부로 저장된다.지정된 사이즈에 도달하면 ItemProcessor를 통해 비즈니스 로직을 적용하고, ItemWriter에게 넘겨 한 번에 기록한다. 트랜잭션은 Chunk 단위로 묶어서 처리돼 실패한 Chunk 단위로 재시도 로직을 적용할 수 있다. @Bean @JobScope public Step ste..
[Spring Batch] Flow 아키텍처
[Spring Batch] Flow 아키텍처
2024.07.21FlowJob은 FlowJobBuilder가 생성하고, Step을 특정 상태에 따라 흐름을 전환하도록 구성할 때 사용한다. (Step이 실패하더라도 Job은 성공하도록 설정하거나, Step이 성공한 후 다음 Step을 구분해서 실행하는 경우) 기존 SimpleJob은 순차적으로 Step을 수행했다면 FlowJob은 동적으로 Step을 제어한다. @Bean public Job job() { return new JobBuilder("job", jobRepository) .start(step1()) .on("COMPLETED").to(step3()) .from(step1()) .on("FAILED").t..
[Spring Batch] Job / Step 아키텍처
[Spring Batch] Job / Step 아키텍처
2024.07.07스프링배치 5 버전부터는 JobBuilderFactory와 StepBuilderFactory등 Factory 클래스가 Deprecate 됐고 Builder를 직접 사용하는 방식으로 변경됐다. JobRepository와 TransactionManager를 Builder에 직접 주입받아 설정을 좀 더 편하게 할 수 있다. JobBuilder는 실제 Job의 생성을 위임한다. // JobBuilderpublic class JobBuilder extends JobBuilderHelper { @Deprecated(since = "5.0", forRemoval = true) public JobBuilder(String name) { super(name); } public JobBuilder(String nam..
[Spring Batch] 배치 도메인 이해
[Spring Batch] 배치 도메인 이해
2024.06.30@SpringBootApplication@EnableBatchProcessing(dataSourceRef = "batchDataSource", transactionManagerRef = "batchTransactionManager")public class SpringBatchMasterApplication { public static void main(String[] args) { SpringApplication.run(SpringBatchMasterApplication.class, args); }} 스프링 배치 애플리케이션을 활성화하려면 @EnableBatchProcessing 애너테이션을 메인 클래스 위에 붙여줘야 한다. 애너테이션은 4개의 설정 클래스를 실행시켜 스프링 배치 초기 설정과 초기화를..
[Spring Security] 인가 프로세스
[Spring Security] 인가 프로세스
2024.06.22스프링 시큐리티는 요청과 메서드 단위로 권한을 부여해 보안을 관리한다. 요청 기반 권한 부여는 HttpServletRequest에 대한 권한 부여를 모델링해 HttpSecurity 인스턴스를 사용해 권한 규칙을 선언할 수 있다. http.authorizeHttpRequests(authorize -> authorize .requestMatchers("/user").hasAuthority("USER") .requestMatchers("/mypage/**").hasAuthority("USER") .requestMatchers(HttpMethod.GET, "/**").hasAuthority("read") .requestMatchers(RegexRequestMatcher.regexMatch..
[Spring Security] 예외 처리
[Spring Security] 예외 처리
2024.06.12스프링 시큐리티에서 발생하는 예외는 AuthenticationException과 AccessDeniedException으로 나뉘며, ExceptionTranslationFilter가 예외를 처리한다. AuthenticationException 발생 시 SecurityContext 에서 인증 정보를 삭제하고 Authentication을 초기화한다. 필터는 authenticationEntryPoint를 실행해 인증 실패를 공통적으로 처리하고 인증을 요청할 수 있는 화면으로 이동시킨다.인증 프로세스의 요청 정보는 RequestCache, SavedRequest에 저장해 사용자가 인증을 마친 후 재사용한다. AccessDeniedException 발생 시 필터는 사용자가 익명 사용자인지를 먼저 판단하고, 익명 ..
[Spring Security] 인증 상태 영속성
[Spring Security] 인증 상태 영속성
2024.06.10사용자가 인증을 마친 이후 인증을 유지하기 위해 SecurityContextRepository 클래스를 사용한다.인증 정보와 권한은 SecurityContext에 저장되고, SecurityContext는 다시 HttpSession에 저장돼 요청 간 영속이 이루어진다. SpringContextRepository 인터페이스를 구현한 구현체로는 두 가지가 있는데, 그 중 하나가 HttpSession에 인증 상태를 저장하는 역할을 수행한다. 인증을 마친 후 요청할 때는 SecurityCOntextHolderFilter에서 컨텍스트를 로드해 인증 상태가 저장되어있는지 확인한다. public interface SecurityContextRepository { @Deprecated SecurityCon..
[Spring Security] 인증 아키텍처
[Spring Security] 인증 아키텍처
2024.06.08사용자가 요청하면 서블릿 필터인 DelegatingFilterProxy가 요청을 받아 스프링 필터 쪽으로 요청을 넘긴다. AuthenticationFilter는 Authentication 객체를 만들어 AuthenticationManager에게 넘겨준다. Manager는Provider에게 인증을 위임해 사용자의 ID / PASSWORD를 검증시키는데, 이 때 UserDetailsService 객체로 사용자 정보를 가져온다. 인증에 성공했다면 UserDetailService는UserDeatils 타입의 객체를 만들고, 이 객체는 다시 Provider로 올라간 후 Authentication 객체를 만든다. 만들어진 Authentication 객체는 SecurityContextHolder를 통해 Securi..
[Spring Security] 인증 메커니즘
[Spring Security] 인증 메커니즘
2024.05.30기본적으로 HTTP 기반 form 로그인 인증을 사용한다. @Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) .formLogin((form) -> form .loginPage("/login") .loginProcessingUrl("/loginProcess") .defaultSuccessUrl("/", true) .failureUrl("/failed") ..
[Spring Security] 초기화 과정
[Spring Security] 초기화 과정
2024.05.27스프링 시큐리티는 애플리케이션 시작 시 수행되는 초기화 과정에서 인증이나 인가에 관련된 여러 작업을 수행한다. 스프링 시큐리티 의존성을 추가한 후 애플리케이션을 실행하면 의존성으로 내려받은 SpringBootWebSecurityConfiguration 클래스를 통해 초기 설정을 진행한다. @Configuration(proxyBeanMethods = false)@ConditionalOnDefaultWebSecuritystatic class SecurityFilterChainConfiguration { @Bean @Order(SecurityProperties.BASIC_AUTH_ORDER) SecurityFilterChain defaultSecurityFilterChain(HttpSecu..
[Spring Batch] ItemReader / ItemWriter
[Spring Batch] ItemReader / ItemWriter
2024.02.27Step에서 데이터를 읽어오는 역할을 담당하는 ItemReader를 구현할 때는 개발자가 직접 ItemReader 인터페이스를 구현해 read 메서드를 구현한 후 Step에 추가할 수도 있고, 스프링 배치가 기본적으로 제공하는 ItemReader를 사용할 수도 있다. @Bean @StepScope public FlatFileItemReader flatFileItemReader( @Value("#{jobParameters['inputFile']}") FileSystemResource fileSystemResource ) { FlatFileItemReader flatFileItemReader = new FlatFileItemReader(); // flatFileItemReader.setResource(new..
[Spring Batch] 스프링 배치 내부 흐름
[Spring Batch] 스프링 배치 내부 흐름
2024.02.25스프링 배치는 대용량 데이터를 효율적으로 처리하기 위해 설계된 프레임워크이다. 1. Chunk 단위로 나눠서 작업 데이터를 일정량의 Chunk 단위로 묶어서 처리한다. 각 Chunk는 여러 Item으로 구성되고 배치 작업은 Item을 하나씩 읽고 처리한 후 모든 Item이 처리되면 결과를 갱신한다. 대량의 데이터를 한 번에 처리할 때 발생할 수 있는 메모리 부하를 줄이고 로직 수행 중 오류가 발생한 경우 유연하게 복구할 수 있다. 2. 예외처리 스프링 배치는 Job을 여러 Step으로 구성하는 방식으로 사용한다. Step은 독립적인 작업 단위로, 특정 Step에서 예외가 발생했을 때 그 Step에 대해서만 예외를 처리할 수 있어 유연하다. 3. 트랜잭션 각 Chunk 처리 과정에서 트랜잭션을 시작하고 처..