Skip to content

Commit 89e9572

Browse files
authored
Merge pull request #363 from agree0002/refactor/#350
[refactor/#350] 스프링부트3 마이그레이션
2 parents 9aa0ea4 + 707ada4 commit 89e9572

File tree

22 files changed

+258
-564
lines changed

22 files changed

+258
-564
lines changed

build.gradle

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
plugins {
2-
id 'org.springframework.boot' version '3.3.5'
2+
id 'org.springframework.boot' version '3.5.7'
33
id 'io.spring.dependency-management' version '1.1.6'
44
id 'java-library'
5-
id 'com.diffplug.spotless' version '6.25.0'
5+
id 'com.diffplug.spotless' version '6.23.3'
6+
}
7+
8+
ext {
9+
set('springCloudVersion', "2025.0.0")
10+
set('querydslVersion', "5.1.0")
611
}
712

813
spotless {
@@ -64,11 +69,9 @@ subprojects {
6469
}
6570
}
6671

67-
testing {
68-
suites {
69-
test {
70-
useJUnitJupiter()
71-
}
72+
dependencyManagement {
73+
imports {
74+
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
7275
}
7376
}
7477

@@ -78,19 +81,20 @@ subprojects {
7881
'org.springframework.boot:spring-boot-configuration-processor',
7982
'jakarta.persistence:jakarta.persistence-api',
8083
'jakarta.annotation:jakarta.annotation-api',
81-
'com.querydsl:querydsl-apt:5.0.0:jakarta'
84+
"com.querydsl:querydsl-apt:${querydslVersion}:jakarta"
8285
)
8386

8487
implementation (
8588
'org.springframework.boot:spring-boot-starter-web',
8689
'org.springframework.boot:spring-boot-starter-validation',
87-
'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0',
90+
'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0',
8891
'com.google.code.findbugs:jsr305:3.0.2',
92+
'io.awspring.cloud:spring-cloud-starter-aws:2.4.4',
8993

9094
// cloud config
91-
'org.springframework.cloud:spring-cloud-starter-config:4.1.4',
95+
'org.springframework.cloud:spring-cloud-starter-config',
9296
'org.springframework.boot:spring-boot-starter-actuator',
93-
'org.springframework.cloud:spring-cloud-starter-bootstrap:4.1.4',
97+
'org.springframework.cloud:spring-cloud-starter-bootstrap',
9498

9599
// mail
96100
'org.springframework.boot:spring-boot-starter-mail',
@@ -111,6 +115,10 @@ subprojects {
111115
)
112116
}
113117

118+
test {
119+
useJUnitPlatform()
120+
}
121+
114122
}
115123

116124
project(':module-jpa') {
@@ -120,8 +128,8 @@ project(':module-jpa') {
120128
dependencies {
121129
api (
122130
'org.springframework.boot:spring-boot-starter-data-jpa',
123-
'com.querydsl:querydsl-jpa:5.0.0:jakarta',
124-
'com.jcraft:jsch:0.1.55',
131+
"com.querydsl:querydsl-jpa:${querydslVersion}:jakarta",
132+
'com.jcraft:jsch:0.1.55', // 로컬 개발용 db ssh tunneling, https://mavenlibs.com/maven/dependency/com.jcraft/jsch
125133
// 'org.mariadb.jdbc:mariadb-java-client',
126134
'com.mysql:mysql-connector-j',
127135
'com.h2database:h2'
@@ -136,18 +144,17 @@ project(':module-auth') {
136144
dependencies {
137145
api project(':module-jpa')
138146
// jwt
139-
api 'io.jsonwebtoken:jjwt-api:0.11.5'
140-
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5',
147+
api 'io.jsonwebtoken:jjwt-api:0.11.2'
148+
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2',
141149
// Uncomment the next line if you want to use RSASSA-PSS (PS256, PS384, PS512) algorithms:
142150
//'org.bouncycastle:bcprov-jdk15on:1.60',
143-
'io.jsonwebtoken:jjwt-jackson:0.11.5'
151+
'io.jsonwebtoken:jjwt-jackson:0.11.2' // or 'io.jsonwebtoken:jjwt-gson:0.11.2' for gson
144152

145153
// security
146154
api 'org.springframework.boot:spring-boot-starter-security'
147155
api 'org.springframework.boot:spring-boot-starter-oauth2-client'
148-
api 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.2'
149156
testImplementation 'org.springframework.security:spring-security-test'
150-
testImplementation 'org.mockito:mockito-inline:5.2.0'
157+
testImplementation 'org.mockito:mockito-inline:2.13.0'
151158
}
152159
}
153160

@@ -158,10 +165,8 @@ project(':module-fileStorage') {
158165
dependencies {
159166
api project(':module-jpa')
160167

161-
api 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.2'
162-
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.188'
163168
testImplementation 'org.springframework.security:spring-security-test'
164-
testImplementation 'org.mockito:mockito-inline:5.2.0'
169+
testImplementation 'org.mockito:mockito-inline:2.13.0'
165170
}
166171
}
167172

@@ -171,15 +176,14 @@ project(':resource-server') {
171176
api project(':module-auth')
172177
api project(':module-fileStorage')
173178
api 'org.springframework.boot:spring-boot-starter-security'
174-
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.188'
175179
testImplementation 'org.springframework.security:spring-security-test'
176180
}
177181

178182
clean {
179183
delete file('src/main/generated')
180184
}
181185

182-
tasks.register('cleanGeneratedDir', Delete) {
186+
task cleanGeneratedDir(type: Delete) {
183187
delete file('src/main/generated')
184188
}
185189
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

module-auth/src/main/java/com/inhabas/api/auth/config/AuthBeansConfig.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import lombok.RequiredArgsConstructor;
66

7-
import org.springframework.boot.ApplicationRunner;
87
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
98
import org.springframework.context.annotation.Bean;
109
import org.springframework.context.annotation.Configuration;
@@ -36,11 +35,6 @@ public class AuthBeansConfig {
3635
private final AuthProperties authProperties;
3736
private final RefreshTokenRepository refreshTokenRepository;
3837

39-
@Bean
40-
public ApplicationRunner jwtSecretKeyStrengthChecker(JwtTokenUtil jwtTokenUtil) {
41-
return args -> jwtTokenUtil.validateSecretKeyStrength();
42-
}
43-
4438
@Bean
4539
public HttpCookieOAuth2AuthorizationRequestRepository
4640
httpCookieOAuth2AuthorizationRequestRepository() {

module-auth/src/main/java/com/inhabas/api/auth/config/AuthSecurityConfig.java

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import org.springframework.core.annotation.Order;
99
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1010
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
11-
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
1211
import org.springframework.security.config.http.SessionCreationPolicy;
1312
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
1413
import org.springframework.security.web.SecurityFilterChain;
@@ -20,8 +19,8 @@
2019
import com.inhabas.api.auth.domain.oauth2.handler.Oauth2AuthenticationSuccessHandler;
2120

2221
@Order(0) // 인증 관련 security filter chain 은 우선순위가 가장 높아야 함.
23-
@EnableWebSecurity
2422
@Configuration
23+
@EnableWebSecurity
2524
@RequiredArgsConstructor
2625
@Profile({"dev1", "dev2", "local", "prod1", "prod2"}) // 테스트에는 포함시키지 않음.
2726
public class AuthSecurityConfig {
@@ -33,25 +32,44 @@ public class AuthSecurityConfig {
3332
private final HttpCookieOAuth2AuthorizationRequestRepository
3433
httpCookieOAuth2AuthorizationRequestRepository;
3534

35+
/**
36+
* 소셜 로그인 api <br>
37+
* <br>
38+
* 진행과정은 아래와 같다.<br>
39+
*
40+
* <ol>
41+
* <li>사용자가 소셜로그인 시작. (프론트에서 redirect_url 보내줘야함.)
42+
* <li>OAuth2 인증 진행 -> 기존 회원인지 검사
43+
* <ol style="list-style-type:lower-alpha">
44+
* <li>성공 -> OAuth2AuthenticationSuccessHandler
45+
* <ol>
46+
* <li>프론트에서 보내준 redirect_url 검증 (-> 실패하면 failure handler 에서 처리)
47+
* <li>jwt 토큰 발급 및 로그인 처리
48+
* <li>리다이렉트
49+
* </ol>
50+
* <li>실패 -> OAuth2AuthenticationFailureHandler
51+
* </ol>
52+
* </ol>
53+
*
54+
* 회원가입이나, jwt 토큰 발급을 위한 url 로 함부로 접근할 수 없게 하기 위해 jwt 토근이 발급되기 이전까지는 OAuth2 인증 결과를 세션을 통해서 유지함.
55+
* 따라서 critical 한 url 에 대해서 OAuth2 인증이 완료된 세션에 한해서만 허용.
56+
*/
3657
@Bean
37-
@Order(0)
38-
public SecurityFilterChain authSecurityFilterChain(HttpSecurity http) throws Exception {
58+
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
3959

40-
http
41-
// /login/** 경로에만 이 보안 체인 적용
42-
.securityMatcher("/login/**")
60+
http.securityMatcher("/login/**")
4361
// 세션 생성 금지
4462
.sessionManagement(
4563
session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
46-
.cors(cors -> {})
47-
.csrf(AbstractHttpConfigurer::disable)
64+
.cors(cors -> cors.disable())
4865
.authorizeHttpRequests(
4966
authorize ->
5067
authorize
51-
.requestMatchers(request -> CorsUtils.isPreFlightRequest(request))
68+
.requestMatchers(CorsUtils::isPreFlightRequest)
5269
.permitAll()
5370
.anyRequest()
5471
.permitAll())
72+
.csrf(csrf -> csrf.disable())
5573
// Oauth 로그인 설정
5674
.oauth2Login(
5775
oauth2 ->
@@ -63,6 +81,7 @@ public SecurityFilterChain authSecurityFilterChain(HttpSecurity http) throws Exc
6381
.baseUri("/login/oauth2/authorization")
6482
.authorizationRequestRepository(
6583
httpCookieOAuth2AuthorizationRequestRepository))
84+
// 사용자 정보를 가져오는 엔드포인트에 대한 설정
6685
.userInfoEndpoint(userInfo -> userInfo.userService(customOAuth2UserService))
6786
.failureHandler(oauth2AuthenticationFailureHandler)
6887
.successHandler(oauth2AuthenticationSuccessHandler));

0 commit comments

Comments
 (0)