JWT에 대한 이론은 https://sh970901.tistory.com/85 포스팅했으니 참고하도록 하자. 1. build.gradle에 JWT와 Security 관련 라이브러리를 추가해준다. //JWT 관련 implementation 'io.jsonwebtoken:jjwt-api:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' //Security 관련 implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.thymeleaf.extras:thymeleaf-ex..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/IgmOR/btrQPDlBPcJ/yB2Emp5DkN59UWFrg48eI0/img.png)
레디스(Redis)는 "Remote Dictionary Server"의 약자로, Key-Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 비 관계형 데이터베이스 관리 시스템(DBMS)이다 장점 - 다양한 데이터 구조를 지원한다. (String, List, Set, Sorted Set, Hashes) - 메모리 + 디스크 활용을 통한 영속적인 데이터 보존 가능. - 서버 측 복제 및 샤딩 지원. - 다양한 API를 지원. 단점 - 메모리 사용량이 많다. 기본적으로 memcached 대비 데이터 용량을 지원하기 때문이기도 하지만, 동작 방식에서 오는 메모리 사용량이 많다. - 대규모 트래픽에 대한 응답속도 불안정. 대규모의 트래픽 발생에 따라 많은양의 데이터가 Update 되면 메모리..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/oQfTI/btrQlposq6L/AxqkMAp1kN1Ni00HWxs6tK/img.png)
Job은 여러가지 Step, Step은 여러가지 Tesklet 또는 Chunks(아이템처리자)로 나누어져서 실행된다. 아이템 처리자는 Reader(읽기), Processor(변환 작업), Writer(쓰기)를 구현하여 실행 할 수 있다. 아이템 처리자의 방법은 정산과 같은 여러 데이터를 받아오는 값을 나눠서 실행할 수 있다. 스프링 batch와 scheduler를 사용하여 기존 만들었던 쇼핑몰 시스템의 주문 목록을 정산하기 위해 활용해보려고 한다. 정산데이터는 매달 15일 새벽4시에 생성된다. 만약 정산하려는 품목이 수만개라면 DB에서 불러올 때 문제가 될 수 있지만 100개씩 받아오거나 할 수 있다. 따라서 필자는 아이템 처리자의 방법을 사용하였다. @Bean public Job makeRebateOr..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cYIVE9/btrM7DWYHIf/HFsTYTxwfjCsP6FOJWhksk/img.png)
attributes에 어떤 값을 가져오는지 알아야 사용자 값을 활용할 수 있을 것이다. 롬복의 @Slf4j를 추가하여 log를 찍어보고 결과를 출력해보자. **참고** System.out.println과 비슷하나 log.debug가 더 자세한 결과를 얻을 수 있고 debug는 지우지 않아도 상관없다. (*로그 레벨을 셋팅하면 운영모드에는 실행되지 않기 때문에) logging: level: com.ll.exam.appname: debug attributes 값을 출력해보면 properties에 nickname, profile_image, kakao_account등의 개인 정보를 포함하고 있다. attributesProperties를 활용하여 프로필 값을 변수에 넣어주어 활용하였다. 프로필 사진 url은 D..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/PFqCH/btrM3aPlmpV/ushmN1n1APBuTkkkETOHNK/img.png)
이전 포스팅할 때 OAuth2UserService 객체를 SecurityConfig에 등록하였다. 이번에는 OAuth2UserService를 구현하고 로그인 정보를 받을 OAuth2User를 상속받는 객체를 생성해보자. @Override public String getName() { return this.getAttribute(this.userNameAttributeName).toString(); } @Override public Set getAuthorities() { return super.getAuthorities().stream().collect(Collectors.toSet()); } @Override public Map getAttributes() { return this.attributes;..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/Ry2t5/btrM4R122U8/2eFGq7i2lRnQZ1Jy83ovw0/img.png)
스프링 시큐리티 config 파일에 .oauth2Login()만 추가해주면 활성화가 된다. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf( csrf-> csrf.disable() ) .authorizeRequests() .antMatchers("/**") .permitAll() .and() .formLogin() .loginPage("/member/login") //GET .loginProcessingUrl("/member/login") //POST .and() .oauth2Login() //oauth2 활성화 .and() .logout() .logoutUrl("/member/logout"); ..