Category: Spring

0

Spring Batch - 03. Job

출처 해당 포스트는 정수원 강사님의 스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch 강의를 바탕으로 작성 됐습니다. 목차 Spring Batch - 14. 배치 초기화 설정 (application.properties) Spring Batch - 13. JobLauncher Spring Batch - 12. JobRepository Spring Batch - 11. ExecutionContext Spring Batch - 10. StepContribution Spring Batch - 09. StepExecution 와 STEP_EXECUTION 테이블 Spring Batch - 08. Step Spring Batch - 07. JobExecution 와 JOB_EXECUTION 테이블 Spring Batch - 06. JobParameter 와 JOB_EXECUTION_PARAM 테이블 Spring Batch - 05. JobInstance 와 JOB_INSTANCE 테이블 Spring Batch - 04. JobLauncher Spring Batch - 03. Job Spring Batch - 02. Batch 에서 사용하는 Table Spring Batch - 01. @EnableBatchProcessing Job 이란 Batch 계층 구조에서 가장 상위에 있는 개념으로 하나의 Batch 작업 자체를 의미한다. Job Configuration 을 통해 생성되는 객체 단위로서 Batch 작업을 어떻게 구성하고 실행할지를 명세해 놓은 객체 Batch Job 을 구성하기 위한 최상위 인터페이스며 Spring Batch 가 기본 구현체를 제공한다. 여러 Step 을 포함하는 컨테이너로서 반드시 한개 이상의 Step 으로 구성돼야 한다. Spring Batch에서 Job은 하나 이상의 Step으로 구성된 일련의 작업 흐름을 정의하는 개념입니다. Job은 일괄 처리 작업의 논리적인 단위이며, 배치 작업을 실행하는데 필요한 모든 정보를 포함합니다. Job은 일괄 처리 작업을 실행하는데 필요한 다양한 설정을 제공합니다. 예를 들어, Job은 어떤 Step이 실행되어야 하는지, 어떤 파라미터를 사용해야 하는지, 어떤 예외 상황에 대처해야 하는지 등의 정보를 포함합니다. 또한 Job은 실행 순서, 종료 조건, 중지/재시작 가능 여부 등의 작업 흐름을 제어하는 데 사용됩니다. Spring Batch에서 Job은 JobBuilderFactory를 사용하여 생성됩니다. JobBuilderFactory는 JobBuilder 객체를 생성하고, 이를 사용하여 Job을 구성합니다. JobBuilder 객체를 사용하여 Job의 이름, 작업 수행에 필요한 Step, 파라미터 등을 정의할 수 있습니다.

0

Spring Batch - 02. Batch 에서 사용하는 Table

출처 해당 포스트는 정수원 강사님의 스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch 강의를 바탕으로 작성 됐습니다. 목차 Spring Batch - 14. 배치 초기화 설정 (application.properties) Spring Batch - 13. JobLauncher Spring Batch - 12. JobRepository Spring Batch - 11. ExecutionContext Spring Batch - 10. StepContribution Spring Batch - 09. StepExecution 와 STEP_EXECUTION 테이블 Spring Batch - 08. Step Spring Batch - 07. JobExecution 와 JOB_EXECUTION 테이블 Spring Batch - 06. JobParameter 와 JOB_EXECUTION_PARAM 테이블 Spring Batch - 05. JobInstance 와 JOB_INSTANCE 테이블 Spring Batch - 04. JobLauncher Spring Batch - 03. Job Spring Batch - 02. Batch 에서 사용하는 Table Spring Batch - 01. @EnableBatchProcessing Spring Batch 메타 데이터 스프링 배치의 실행 및 관리를 위한 목적으로 여러 도메인들(Job, Step, JobParameters 등) 의 정보들을 저장, 업데이트, 조회할 수 있는 스키마 를 제공한다. 과거, 현재의 실행에 대한 세세한 정보, 실행에 대한 성공과 실패 여부등을 일목요연하게 관리함으로서 배치운용에 있어 리스크 발생시 빠른 대처 가능 DB 와 연동할 경우 필수적으로 메타 테이블이 생성 돼야 함 스키마 생성 설정 수동 생성 : 쿼리 복사 후 직접 실행 자동 생성 - spring.batch.jdbc.initialize-schema 설정 ALWAYS 스크립트 항상 실행 RDBMS 설정이 돼 있을 경우 내장 DB 보다 우선적으로 실행 EMBEDDED (기본 값) 내장 DB 일 때만 실행되며 스키마가 자동 생성됨 NEBER 스크립트가 항상 실행 안된다. 내장 DB 일 경우 스크립트가 생성이 안되기 때문에 오류가 발생 운영에서는 수동으로 스크립트 생성 후 설정하는 것을 권장 # ALWAYS 로 설정spring.batch.jdbc.initialize-schema: always# EMBEDED 로 설정spring.batch.jdbc.initialize-schema: embedded# NEVER 로 설정spring.batch.jdbc.initialize-schema: never

0

Spring Batch - 01. @EnableBatchProcessing

출처 해당 포스트는 정수원 강사님의 스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch 강의를 바탕으로 작성 됐습니다. 목차 Spring Batch - 14. 배치 초기화 설정 (application.properties) Spring Batch - 13. JobLauncher Spring Batch - 12. JobRepository Spring Batch - 11. ExecutionContext Spring Batch - 10. StepContribution Spring Batch - 09. StepExecution 와 STEP_EXECUTION 테이블 Spring Batch - 08. Step Spring Batch - 07. JobExecution 와 JOB_EXECUTION 테이블 Spring Batch - 06. JobParameter 와 JOB_EXECUTION_PARAM 테이블 Spring Batch - 05. JobInstance 와 JOB_INSTANCE 테이블 Spring Batch - 04. JobLauncher Spring Batch - 03. Job Spring Batch - 02. Batch 에서 사용하는 Table Spring Batch - 01. @EnableBatchProcessing @EnableBatchProcessing @EnableBatchProcessing 을 이용해 어플리케이션이 Spring Batch 로 실행될 수 있도록 자동으로 설정해준다. @SpringBootApplication@EnableBatchProcessing // Spring Batch 활성화public class SpringBatchApplication { public static void main(String[] args) { SpringApplication.run(SpringBatchApplication.class, args); }} Spring Batch 초기화 과정@EnableBatchProcessing 을 명시해주면 Batch 관련 설정 클래스 SimpleBatchConfiguration, BatchConfigurerConfiguration, BatchAutoConfiguration 를 실행시켜 Spring Batch 초기화 및 실행 구성이 이뤄진다.

0

Spring Data JPA - Convertor

목차 Spring Data JPA - 벌크성 수정 쿼리 Spring Data JPA - Convertor Spring Data JPA - Auditing Spring Data JPA - Paging Request Paramater Spring Data JPA - 페이징과 정렬 Post not found: spring/spring-data-jpa/07-spring-data-jpa Spring Data JPA - 반환 타입 Spring Data JPA - Query 파라미터 바인딩 Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기 Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기 Spring Data JPA - 메소드 이름으로 쿼리 생성하기 Spring Data JPA - 시작하기 BooleanToYNConverterBoolean 으로 저장 되는 값을 True, false 로 변경해 값을 저장하기 위한 Convertor @Converterpublic class BooleanToYNConverter implements AttributeConverter<Boolean, String> { @Override public String convertToDatabaseColumn(Boolean attribute){ return (attribute != null && attribute) ? "Y" : "N"; } @Override public Boolean convertToEntityAttribute(String dbData){ return "Y".equals(dbData); }} @Entity@Getter@Builder@NoArgsConstructor@AllArgsConstructor@EntityListeners(AuditingEntityListener.class)public class Post extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column private Long id; @Column(name = "POST_TITLE", length = 100, nullable = false) private String title; @Column(name = "POST_SUBTITLE") private String subTitle; @Lob private String content; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "username", nullable = false, referencedColumnName = "username") @CreatedBy private UserInfo author; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "CATEGORY", nullable = true, referencedColumnName = "CATEGORY_NAME") private Category category; @Column(name = "isDeleted") @ColumnDefault("false") @Convert(converter = BooleanToYNConverter.class) private boolean isDeleted; // ==== 연관관계 편의 메서드 ==== // public void changeCategory(Category category){ this.category = category; // 새로운 카테고리에 해당 포스트 추가 category.getPosts().add(this); } public void setAuthor(UserInfo author){ this.author = author; author.getPosts().add(this); } public Post updatePost(Post post) { this.title = post.title; this.subTitle = post.subTitle; this.content = post.content; changeCategory(post.getCategory()); return this; }}

0

Spring Boot - 메시지 국제화 MessageSource

목차 Post not found: spring-boot/spring-framework/springboot-actuator Post not found: spring-boot/spring-framework/springboot-messageresource Post not found: spring-boot/spring-framework/configuration/springboot-WebMvcConfigurer Post not found: spring-boot/spring-framework/configuration/springboot-autoconfiguration 참고 https://gist.github.com/dlxotn216/cb9fe1e40c7961da9d7147d9ebc876d6 메시지 관리를 위한 MessageSource어플리케이션 개발을 진행하다가 보면 메시지를 보낼때 하드 코딩으로 넣다 보면 같은 맥략으로 쓰인 메시지들이 서로 상이하게 관리되는 것을 느낄 수 있었고 무엇보다 가장 큰 문제는 메시지를 변경하게 될 경우 해당 메시지가 사용된 소스를 전부 찾아 변경해 줘야 하는 문제점이 있다. 이런 메시지 파편화를 막고 한 곳에서 모든 메시지를 관리할 수 있도록 Spring 에서는 MessageSource 를 제공한다. MessageSource 메시지를 한 파일 message.properties 에서 관리할 수 있다. 경로 : main/resource/message.properties 메시지에 대한 다국어 처리 를 지원한다. 사용법 : message_[언어코드].properties 영어 : message_en.properties 한국어 : message_ko.properties 메시지 등록 경로 : main/resource/message.properties

0

Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기

목차 Spring Security OAuth2 - Handler Spring Security OAuth2 - Login 페이지 Customizing 하기 Spring Security OAuth2를 이용한 로그인 구현 - 사용자 정보 가져오기 Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기 Spring Security OAuth2를 이용한 로그인 구현 - OAuth2를 이용한 인증 사용하기 Google OAuth2 인증 방식 이해하기 OAuth2를 이용한 로그인 구현 이해하기 참고 https://www.baeldung.com/spring-security-5-oauth2-login https://www.docs4dev.com/docs/en/spring-security/5.1.2.RELEASE/reference/jc.html#oauth2client OAuth2LoginAuthenticationFilter OAuth2 인증을 진행하기 위한 Filter OAuth2 인증 방식도 UsernamePassword 인증과 같이 인증을 진행하기 위한 Filter 가 존재한다. OAuth2LoginAuthenticationFilter 에서는 Authentication Server 로부터 Authorization Code 를 받은 후 Acess Token 과 Reflesh Token 을 받기 위한 과정을 진행한다. ClientRegistrationRepository ClientRegistration 정보를 저장 및 가져오기 위한 Class OAuth2AuthorizedClient 인증된 Client 정보를 관리하기 위한 Class Access Token, Reflesh Token, ClientRegistration 정보를 관리하는 Class OAuth2AuthorizedClientRepository OAuth2AuthorizedClient 정보를 저장 및 가져오기 위한 Class 인증이 진행중인 Client 정보를 가져온다. 기본 구현체는 HttpSessionOAuth2AuthorizedClientRepository OAuth2AuthorizedClientService Application Level 에서 OAuth2AuthorizedClient 정보를 가져오기 위한 Class 인증이 완료된 Client 정보를 저장소 에서 가져올 때 사용한다. 메모리에 OAuth2AuthorizedClient 객체를 저장하는 InMemoryOAuth2AuthorizedClientService 데이터 베이스에 OAuth2AuthorizedClient 객체를 저장하는 JdbcOAuth2AuthorizedClientService AuthorizationRequestRepository 인증 요청에서 인증 응답을 받을때 까지 OAuth2AuthorizationRequest 의 지속성을 보장하기 위한 Class 기본 구현체는 Session 에 저장하는 HttpSessionOAuth2AuthorizationRequestRepository OAuth2AuthorizationRequestResolver registrationId 와 HttpServletRequest 를 OAuth2AuthorizationRequest 객체를 생성하기 위한 Class 기본 구현체는 DefaultOAuth2AuthorizationRequestResolver OAuth2AccessTokenResponseClient Authorization Code 를 Access Token 으로 교환하는데 사용하는 Class 기본 구현체는 DefaultAuthorizationCodeTokenResponseClient 인증 과정

0

Spring Security OAuth2 - Handler

목차 Spring Security OAuth2 - Handler Spring Security OAuth2 - Login 페이지 Customizing 하기 Spring Security OAuth2를 이용한 로그인 구현 - 사용자 정보 가져오기 Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기 Spring Security OAuth2를 이용한 로그인 구현 - OAuth2를 이용한 인증 사용하기 Google OAuth2 인증 방식 이해하기 OAuth2를 이용한 로그인 구현 이해하기 참고Success Handler 만들기Oauth2 인증 후 특정 작업을 진행하기 위해서는 SuccessHandler 가 필요하다. AuthenticationSuccessHandler 를 구현해 인증 후 사용자 정보를 로그로 출력하는 Handler 를 만들어 보려고 한다. 인증 후 Authentication 객체 내 Principal 에는 OAuth2User 객체 정보가 들어가게 된다. (OAuth2LoginAuthenticationProvider 에서 확인) @Slf4jpublic class Oauth2AuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal(); log.info("oAuth2User name = {}", (String) oAuth2User.getAttribute("email")); log.info("oAuth2User name = {}", (String) oAuth2User.getAttribute("name")); }} Security Config 추가oauth2AuthenticationSuccessHandler Bean 을 생성 후 successHandler 에 추가한다.

0

Spring Security OAuth2 - Login 페이지 Customizing 하기

목차 Spring Security OAuth2 - Handler Spring Security OAuth2 - Login 페이지 Customizing 하기 Spring Security OAuth2를 이용한 로그인 구현 - 사용자 정보 가져오기 Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기 Spring Security OAuth2를 이용한 로그인 구현 - OAuth2를 이용한 인증 사용하기 Google OAuth2 인증 방식 이해하기 OAuth2를 이용한 로그인 구현 이해하기 참고 https://www.baeldung.com/spring-security-5-oauth2-login Security Config@EnableWebSecurity@Slf4jpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/oauth_login") .permitAll() .anyRequest() .authenticated() .and() .oauth2Login() .loginPage("/oauth_login"); }} Controller@Controllerpublic class LoginController { private static String authorizationRequestBaseUri = "oauth2/authorization"; Map<String, String> oauth2AuthenticationUrls = new HashMap<>(); @Autowired private ClientRegistrationRepository clientRegistrationRepository; @GetMapping("/oauth_login") public String getLoginPage(Model model) { Iterable<ClientRegistration> clientRegistrations = null; ResolvableType type = ResolvableType.forInstance(clientRegistrationRepository) .as(Iterable.class); if (type != ResolvableType.NONE && ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) { clientRegistrations = (Iterable<ClientRegistration>) clientRegistrationRepository; } clientRegistrations .forEach(registration -> oauth2AuthenticationUrls .put(registration.getClientName(), authorizationRequestBaseUri + "/" + registration.getRegistrationId()) ); model.addAttribute("urls", oauth2AuthenticationUrls); return "oauth_login"; }} 로그인 페이지

0

Spring Test - @WithMockUser, @WithAnonymousUser

목차 Spring Test - @WebMvcTest Spring Test - @DataJpaTest Spring Test - @WithMockUser, @WithAnonymousUser Controller@RestControllerpublic class HelloController { @GetMapping("/hello") public String hello(){ return new String("hello"); }} @WithMockUser@WithMockUser 는 Security Test 를 진행할 때 인증된 Authentication 객체를 만들어 인증된 상태로 Test 를 진행할 수 있게 도와준다. 속성 username : Authentication 객체에서 사용할 username 을 설정 password : Authentication 객체에서 사용할 password 을 설정 roles : Authentication 객체에서 사용할 role 을 설정 authorities : Authentication 객체에서 사용할 authorities 을 설정 @WebMvcTest@AutoConfigureMockMvcclass HelloControllerTest { @Autowired MockMvc mockMvc; @Test @WithMockUser(username = "user", password = "1234") void mockUserTest() throws Exception { mockMvc.perform(get("/hello")) .andDo(print()) .andExpect(status().isOk()); }} @WithMockUser 권한 사용 하기

0

Spring Test - @DataJpaTest

목차 Spring Test - @WebMvcTest Spring Test - @DataJpaTest Spring Test - @WithMockUser, @WithAnonymousUser @DataJpaTest JPA 테스트를 진행하기 위해 사용하는 어노테이션, JPA component 들만 관리하기 때문에 JPA test 시 관련된 Configuration 들만이 적용된다. 각 Test 를 진행할때마다 하나의 Transaction 에서 수행되고 Test 가 끝나면 Roll-back 을 진행한다. @Transactional 기능이 필요하지 않으면 @Transactional(propagation = Propagation.NOT_SUPPORTED) 설정 Test 진행시 Embedded In Memory Database 로 진행한다. @AutoConfigureTestDatabase 을 이용하면 Test 시 특정 Database 를 사용할 수 있다. @DataJpaTest 를 이용한 Test 코드 작성@DataJpaTestclass PostTest { @Autowired private PostRepository postRepository; @Test void createPostTest(){ String title = "title"; String subTitle = "subTitle"; String categoryName = "test"; String content = "content"; Category category = Category.builder() .name(categoryName) .build(); Post post = Post.builder() .title(title) .subTitle(subTitle) .category(category) .content(content) .build(); Post savedPost = postRepository.save(post); assertThat(savedPost.getTitle()).isEqualTo(title); assertThat(savedPost.getSubTitle()).isEqualTo(subTitle); assertThat(savedPost.getContent()).isEqualTo(content); }}

0

Spring Test - @WebMvcTest

목차 Spring Test - @WebMvcTest Spring Test - @DataJpaTest Spring Test - @WithMockUser, @WithAnonymousUser @WebMvcTest Spring MVC 를 테스트하기 위해 사용되는 어노테이션, MVC 테스트와 관련된 Configuration 이 적용된다. @Controller, @ControllerAdvice, @JsonComponent, Converter/GenericConverter, Filter, HandlerMethodArgumentResolver, WebMvcConfigurer 를 Scan 한다. @Component, @Service, @Repository Bean은 적용되지 않는다. MVC 테스트시 Spring Security 설정도 자동적으로 추가해준다. controllers 속성을 이용해 특정 Controller 를 지정함으로써 해당 Controller 만 테스트 진행할 수 있다. includeFilters 속성과 excludeFilters 속성을 이용해 특정 Filter 를 추가하거나 제외할 수 있다. 장점 @SpringBootTest 에 비해 MVC 에 필요한 구성만 불러옴으로 훨씬 가볍고 빠르다. 단점 Mock 기반 테스트를 진행하기 때문에 운영에서는 제대로 동작하지 않을 수 있다.

0

Spring - Embedded Kafka 사용하기

목자 Spring - Kafka Spring - Kafka Java Config 사용하기 Spring - Embedded Kafka 사용하기 스프링 부트 카프카 사용하기참고https://www.baeldung.com/spring-boot-kafka-testing 의존성testImplementation 'org.springframework.boot:spring-boot-starter-test'testImplementation 'org.springframework.kafka:spring-kafka-test'// https://mvnrepository.com/artifact/org.testcontainers/kafkatestImplementation group: 'org.testcontainers', name: 'kafka', version: '1.16.3' Spring Propertiesspring: kafka: consumer: auto-offset-reset: earliest group-id: baeldungtest: topic: embedded-test-topic

0

Spring - Kafka Java Config 사용하기

목자 Spring - Kafka Spring - Kafka Java Config 사용하기 Spring - Embedded Kafka 사용하기 스프링 부트 카프카 사용하기참고https://www.baeldung.com/spring-kafka 목자 Post not found: spring-boot/spring-kafka/springboot-kafka Post not found: spring-boot/spring-kafka/springboot-kafka-javaconfig 의존성 추가implementation 'org.springframework.kafka:spring-kafka'testImplementation 'org.springframework.kafka:spring-kafka-test'

0

Spring Web Socket - Chat 프로그램 만들기 1

Spring boot Web Socket - Chat 프로그램 만들기 1참고 https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/html/websocket.html https://daddyprogrammer.org/post/4731/spring-websocket-chatting-server-redis-pub-sub/ Message BrokerMessage Broker 는 Publisher 로부터 전달 받은 Message 를 Subscriber 로 전달하는 중간 역할을 하며 응용 소프트웨어 간에 메시지를 교환할 수 있게 한다. 이때, 메시지가 적재되는 공간은 Message Queue 라고 하며 메시지 그룹을 Topic 이라고 한다. Message Broker 는 데이터를 보내고 처리하고 삭제한다. Message Interceptor 정의하기 ChannelInterceptor 는 Message 를 MessageChannel 로 보내기 전과 Message 가 MessageChannel 로 보낸 후 추가적일 로직을 수행할 수 있게 도와주는 Interface 다. ChannelInterceptor 인터페이스를 구현해 Socket 통신 상태를 로그로 찍어 확인한다.

0

Spring - Kafka

스프링 부트 카프카 사용하기목자 Spring - Kafka Spring - Kafka Java Config 사용하기 Spring - Embedded Kafka 사용하기 의존성 추가implementation 'org.springframework.kafka:spring-kafka'testImplementation 'org.springframework.kafka:spring-kafka-test' 카프카에 접속하기 위한 설정Consumer 설정 spring.kafka.consumer.bootstrap-servers 카프카에 연결을 하기 위한 접속 주소 spring.kafka.consumer.group-id kafka Consumer 그룹에 대한 정보 spring.kafka.consumer.auto-offset-reset topic에 붙은 consumer의 offset 정보가 존재하지 않거나 오류가 발생해 offset을 사용할 수 없는 경우 처리하기 위한 옵션 latest : 가장 마지막 offset부터 earliest : 가장 처음 offset부터 none : offset 정보가 없으면 Exception 발생 spring.kafka.consumer.key-deserializer 카프카에서 전달받은 key 를 역질렬화 할때 사용하는 역질렬화 클래스 StringDeserializer 는 문자열 데이터만 사용 가능한 역직렬화 도구 spring.kafka.consumer.value-deserializer 카프카에서 전달받은 value 를 역질렬화 할때 사용하는 역질렬화 클래스 StringDeserializer 는 문자열 데이터만 사용 가능한 역직렬화 도구 Producer 설정