Category: Spring

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 설정

0

Spring - Embeded Redis 사용하기

Spring Boot - Embeded Redis 사용하기보통 Redis를 사용하는 스프링 프로젝트를 Local에서 프로젝트 실행시 Redis를 선행적으로 설치해줘야 한다. 이 문제를 Embedded Redis를 사용해 프로젝트가 Local 환경에 의존적이지 않고 프로젝트 만으로 구동할 수 있도록 한다. 의존build.gradle implementation 'org.springframework.boot:spring-boot-starter-data-redis'//embedded-rediscompile group: 'it.ozimov', name: 'embedded-redis', version: '0.7.2'} application.yml spring: redis: host: localhost port: 6379 profiles: active: local local에서 프로젝트를 진행하기 위한 설정이다. Profile 어노테이션을 통해 -Dspring.profiles.active=local 옵션이 주어졌을 때 해당 설정을 사용할 수 있다 EmbeddedRedisConfig

0

Spring AOP Pointcut 표현식 - this, target

목차 Spring AOP Pointcut 표현식 - this, target Spring AOP Pointcut 표현식 - 매게변수 전달 Spring AOP Pointcut 표현식 - bean Spring AOP Pointcut 표현식 - @annotation, @args Spring AOP Pointcut 표현식 - @target, @within Spring AOP Pointcut 표현식 - args Spring AOP Pointcut 표현식 - within Spring AOP - Pointcut 표현식 execution Spring 핵심원리 고급편 - Pointcut Spring 핵심원리 고급편 - this, target