Spring Boot OAuth2를 이용한 Google 로그인 + redis session storage 에제
/src/main/java/me/siwony/sbaouth2google
├── SbOauth2GoogleApplication.java // application 진입점
├── domain
│ ├── auth
│ │ ├── dto
│ │ │ ├── OAuthAttributes.java // OAuth 속성을 가지고 있는 DTO
│ │ │ └── SessionMember.java // 로그인 된 사용자의 정보를 세션에 저장할 DTO
│ │ └── service
│ │ ├── AuthService.java
│ │ └── CustomOAuth2UserService.java // OAuth 구현체
│ └── member
│ ├── controller
│ │ └── MemberController.java
│ ├── entity
│ │ ├── Member.java
│ │ └── MemberRepository.java
│ └── service
│ └── MemberService.java
└── global
└── security
└── SecurityConfig.java
/src/main/resources
├── application.yml
└── application-google-oauth.yml
google oauth 인증에 필요한 정보들을 담고있는 에플리케이션 구성 파일입니다.
spring:
security:
oauth2:
client:
registration:
google:
client-id: GCP에서 발급받은 client-id
client-secret: client-secret
scope:
- profile
- email
client-id와 client-secret은
GCP 콘솔 → 대시보드 → API 및 서비스 → 사용자 인증 정보
에서 확인할 수 있다.
- spring boot starter web
- spring boot data jpa
- spring boot starter security
- spring boot starter oauth2 client
- spring boot starter data redis
- spring session data redis
spring session data redis
의존성 사용시 spring boot starter data redis
의존성이 반드시 필요합니다.
없다면 Spring Boot Application 시작 시점에 org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException
이 발생하여 결과적으로
org.springframework.beans.factory.BeanCreationException
이 발생하며 종료됩니다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.session.SessionAutoConfiguration$ServletSessionRepositoryValidator': Invocation of init method failed; nested exception is org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException: No session repository could be auto-configured, check your configuration (session store type is 'redis')
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.16.jar:5.3.16]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.16.jar:5.3.16]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.4.jar:2.6.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.4.jar:2.6.4]
at me.siwony.sboauth2google.SbOauth2GoogleApplication.main(SbOauth2GoogleApplication.java:10) ~[main/:na]
Caused by: org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException: No session repository could be auto-configured, check your configuration (session store type is 'redis')
at org.springframework.boot.autoconfigure.session.SessionAutoConfiguration$AbstractSessionRepositoryValidator.afterPropertiesSet(SessionAutoConfiguration.java:315) ~[spring-boot-autoconfigure-2.6.4.jar:2.6.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.16.jar:5.3.16]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.16.jar:5.3.16]
... 16 common frames omitted