Skip to content

Commit fc678dc

Browse files
authored
Merge pull request #242 from teamterning/staging
[🔀 merge] [4차] 코드 리펙토링 사항 메인 서버에 적용
2 parents a59e0c3 + c2d80e0 commit fc678dc

File tree

209 files changed

+3355
-1350
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

209 files changed

+3355
-1350
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Temporary Items
190190
# application.yml
191191
src/main/resources/application.yml
192192
src/main/resources/application-dev.yml
193+
src/test/resources/application-test.yml
193194

194195
# Q-Class
195196
src/main/generated

build.gradle

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ dependencies {
3737
// 테스트 의존성
3838
testImplementation 'org.springframework.boot:spring-boot-starter-test'
3939
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
40+
testRuntimeOnly 'com.h2database:h2'
4041

4142
// PostgreSQL
4243
implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.3'
@@ -58,6 +59,17 @@ dependencies {
5859

5960
// Gson
6061
implementation 'com.google.code.gson:gson:2.8.6'
62+
63+
// Spring WebFlux
64+
implementation 'org.springframework.boot:spring-boot-starter-webflux'
65+
66+
// Resilience4j
67+
implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.1.0'
68+
implementation 'io.github.resilience4j:resilience4j-reactor:2.1.0'
69+
70+
// Spring Batch
71+
implementation 'org.springframework.boot:spring-boot-starter-batch'
72+
6173
}
6274

6375
//QueryDSL 초기 설정

src/main/java/org/terning/terningserver/TerningserverApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
6+
import org.springframework.scheduling.annotation.EnableScheduling;
67

78
@EnableJpaAuditing
89
@SpringBootApplication
10+
@EnableScheduling
911
public class TerningserverApplication {
1012

1113
public static void main(String[] args) {

src/main/java/org/terning/terningserver/controller/AuthController.java renamed to src/main/java/org/terning/terningserver/auth/api/AuthController.java

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
1-
package org.terning.terningserver.controller;
1+
package org.terning.terningserver.auth.api;
22

33
import lombok.RequiredArgsConstructor;
44
import lombok.val;
55
import org.springframework.http.ResponseEntity;
66
import org.springframework.security.core.annotation.AuthenticationPrincipal;
77
import org.springframework.web.bind.annotation.*;
8-
import org.terning.terningserver.controller.swagger.AuthSwagger;
9-
import org.terning.terningserver.domain.Filter;
10-
import org.terning.terningserver.dto.auth.request.SignInRequestDto;
11-
import org.terning.terningserver.dto.auth.request.SignUpFilterRequestDto;
12-
import org.terning.terningserver.dto.auth.request.SignUpRequestDto;
13-
import org.terning.terningserver.dto.auth.response.AccessTokenGetResponseDto;
14-
import org.terning.terningserver.dto.auth.response.SignInResponseDto;
15-
import org.terning.terningserver.dto.auth.response.SignUpFilterResponseDto;
16-
import org.terning.terningserver.dto.auth.response.SignUpResponseDto;
17-
import org.terning.terningserver.exception.dto.SuccessResponse;
18-
import org.terning.terningserver.service.AuthService;
19-
20-
import static org.terning.terningserver.exception.enums.SuccessMessage.*;
8+
import org.terning.terningserver.auth.application.AuthService;
9+
import org.terning.terningserver.auth.dto.request.SignInRequest;
10+
import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto;
11+
import org.terning.terningserver.auth.dto.request.SignUpRequestDto;
12+
import org.terning.terningserver.auth.dto.response.AccessTokenGetResponseDto;
13+
import org.terning.terningserver.auth.dto.response.SignInResponse;
14+
import org.terning.terningserver.auth.dto.response.SignUpResponseDto;
15+
import org.terning.terningserver.common.exception.dto.SuccessResponse;
16+
17+
import static org.terning.terningserver.auth.common.success.AuthSuccessCode.SUCCESS_SIGN_IN;
18+
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_REISSUE_TOKEN;
19+
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_OUT;
20+
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_UP;
21+
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_UP_FILTER;
22+
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_WITHDRAW;
2123

2224

2325
@RestController
@@ -28,13 +30,11 @@ public class AuthController implements AuthSwagger {
2830
private final AuthService authService;
2931

3032
@PostMapping("/sign-in")
31-
public ResponseEntity<SuccessResponse<SignInResponseDto>> signIn(
33+
public ResponseEntity<SuccessResponse<SignInResponse>> signIn(
3234
@RequestHeader("Authorization") String authAccessToken,
33-
@RequestBody SignInRequestDto request
35+
@RequestBody SignInRequest request
3436
) {
35-
val signInResponse = authService.signIn(authAccessToken, request);
36-
37-
return ResponseEntity.ok(SuccessResponse.of(SUCCESS_SIGN_IN, signInResponse));
37+
return ResponseEntity.ok(SuccessResponse.of(SUCCESS_SIGN_IN, authService.signIn(authAccessToken, request)));
3838
}
3939

4040
@PostMapping("/token-reissue")
@@ -51,20 +51,16 @@ public ResponseEntity<SuccessResponse<SignUpResponseDto>> signUp(
5151
@RequestHeader("Authorization") String authId,
5252
@RequestBody SignUpRequestDto request
5353
) {
54-
5554
SignUpResponseDto signUpResponseDto = authService.signUp(authId, request);
5655
return ResponseEntity.ok(SuccessResponse.of(SUCCESS_SIGN_UP, signUpResponseDto));
5756
}
5857

5958
@PostMapping("/sign-up/filter")
60-
public ResponseEntity<SuccessResponse<SignUpFilterResponseDto>> filter(
59+
public ResponseEntity<SuccessResponse> registerUserFilter(
6160
@RequestHeader("User-Id") Long userId,
6261
@RequestBody SignUpFilterRequestDto request
6362
) {
64-
Filter newFilter = authService.createAndSaveFilter(request);
65-
66-
authService.connectFilterToUser(userId, newFilter.getId());
67-
63+
authService.registerFilterWithUser(userId, request);
6864
return ResponseEntity.ok(SuccessResponse.of(SUCCESS_SIGN_UP_FILTER));
6965
}
7066

src/main/java/org/terning/terningserver/controller/swagger/AuthSwagger.java renamed to src/main/java/org/terning/terningserver/auth/api/AuthSwagger.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.terning.terningserver.controller.swagger;
1+
package org.terning.terningserver.auth.api;
22

33
import io.swagger.v3.oas.annotations.Operation;
44
import io.swagger.v3.oas.annotations.Parameter;
@@ -7,23 +7,22 @@
77
import org.springframework.security.core.annotation.AuthenticationPrincipal;
88
import org.springframework.web.bind.annotation.RequestBody;
99
import org.springframework.web.bind.annotation.RequestHeader;
10-
import org.terning.terningserver.dto.auth.request.SignInRequestDto;
11-
import org.terning.terningserver.dto.auth.request.SignUpFilterRequestDto;
12-
import org.terning.terningserver.dto.auth.request.SignUpRequestDto;
13-
import org.terning.terningserver.dto.auth.response.AccessTokenGetResponseDto;
14-
import org.terning.terningserver.dto.auth.response.SignInResponseDto;
15-
import org.terning.terningserver.dto.auth.response.SignUpFilterResponseDto;
16-
import org.terning.terningserver.dto.auth.response.SignUpResponseDto;
17-
import org.terning.terningserver.exception.dto.SuccessResponse;
10+
import org.terning.terningserver.auth.dto.request.SignInRequest;
11+
import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto;
12+
import org.terning.terningserver.auth.dto.request.SignUpRequestDto;
13+
import org.terning.terningserver.auth.dto.response.AccessTokenGetResponseDto;
14+
import org.terning.terningserver.auth.dto.response.SignInResponse;
15+
import org.terning.terningserver.auth.dto.response.SignUpResponseDto;
16+
import org.terning.terningserver.common.exception.dto.SuccessResponse;
1817

1918
@Tag(name = "Auth", description = "소셜 로그인 및 회원가입 API")
2019
public interface AuthSwagger {
2120

2221
@Operation(summary = "소셜 로그인", description = "AuthType에 맞는 소셜 로그인 API")
23-
ResponseEntity<SuccessResponse<SignInResponseDto>> signIn(
22+
ResponseEntity<SuccessResponse<SignInResponse>> signIn(
2423
@Parameter(name = "Authorization", description = "", example = "authAccessToken")
2524
@RequestHeader("Authorization") String authAccessToken,
26-
@RequestBody SignInRequestDto request
25+
@RequestBody SignInRequest request
2726
);
2827

2928
@Operation(summary = "토큰 재발급", description = "토큰 재발급 API")
@@ -33,7 +32,7 @@ ResponseEntity<SuccessResponse<AccessTokenGetResponseDto>> reissueToken(
3332
);
3433

3534
@Operation(summary = "사용자 필터링 정보 생성", description = "사용자 필터링 정보 생성 API")
36-
ResponseEntity<SuccessResponse<SignUpFilterResponseDto>> filter(
35+
ResponseEntity<SuccessResponse> registerUserFilter(
3736
@Parameter(name = "User-Id", description = "", example = "userId")
3837
@RequestHeader("User-Id") Long userId,
3938
@RequestBody SignUpFilterRequestDto request
@@ -53,6 +52,4 @@ ResponseEntity<SuccessResponse> signOut(
5352
@Operation(summary = "계정탈퇴", description = "계정탈퇴 API")
5453
ResponseEntity<SuccessResponse> withdraw(
5554
@AuthenticationPrincipal Long userId);
56-
57-
5855
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.terning.terningserver.auth.application;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Service;
5+
import org.springframework.transaction.annotation.Transactional;
6+
import org.terning.terningserver.auth.application.reissue.AuthReissueService;
7+
import org.terning.terningserver.auth.application.signin.AuthSignInService;
8+
import org.terning.terningserver.auth.application.signout.AuthSignOutService;
9+
import org.terning.terningserver.auth.application.signup.AuthSignUpService;
10+
import org.terning.terningserver.auth.application.withdraw.AuthWithdrawService;
11+
import org.terning.terningserver.auth.dto.request.SignInRequest;
12+
import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto;
13+
import org.terning.terningserver.auth.dto.request.SignUpRequestDto;
14+
import org.terning.terningserver.auth.dto.response.AccessTokenGetResponseDto;
15+
import org.terning.terningserver.auth.dto.response.SignInResponse;
16+
import org.terning.terningserver.auth.dto.response.SignUpResponseDto;
17+
18+
@Service
19+
@RequiredArgsConstructor
20+
@Transactional(readOnly = true)
21+
public class AuthService {
22+
23+
private final AuthSignInService authSignInService;
24+
private final AuthSignUpService authSignUpService;
25+
private final AuthSignOutService authSignOutService;
26+
private final AuthWithdrawService authWithdrawService;
27+
private final AuthReissueService authReissueService;
28+
29+
@Transactional
30+
public SignInResponse signIn(String authAccessToken, SignInRequest request) {
31+
SignInResponse signInResponse = authSignInService.signIn(authAccessToken, request);
32+
return signInResponse;
33+
}
34+
35+
@Transactional
36+
public SignUpResponseDto signUp(String authId, SignUpRequestDto request) {
37+
SignUpResponseDto signUpResponseDto = authSignUpService.signUp(authId, request);
38+
return signUpResponseDto;
39+
}
40+
41+
@Transactional
42+
public void registerFilterWithUser(Long userId, SignUpFilterRequestDto request) {
43+
authSignUpService.registerFilterWithUser(userId, request);
44+
}
45+
46+
@Transactional
47+
public void signOut(long userId) {
48+
authSignOutService.signOut(userId);
49+
}
50+
51+
@Transactional
52+
public void withdraw(long userId) {
53+
authWithdrawService.withdraw(userId);
54+
}
55+
56+
@Transactional
57+
public AccessTokenGetResponseDto reissueToken(String refreshToken) {
58+
AccessTokenGetResponseDto accessTokenGetResponseDto = authReissueService.reissueToken(refreshToken);
59+
return accessTokenGetResponseDto;
60+
}
61+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.terning.terningserver.auth.application.reissue;
2+
3+
import org.terning.terningserver.auth.dto.response.AccessTokenGetResponseDto;
4+
5+
public interface AuthReissueService {
6+
AccessTokenGetResponseDto reissueToken(String refreshToken);
7+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.terning.terningserver.auth.application.reissue;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Service;
5+
import org.springframework.transaction.annotation.Transactional;
6+
import org.terning.terningserver.common.security.jwt.application.JwtTokenManager;
7+
import org.terning.terningserver.user.domain.Token;
8+
import org.terning.terningserver.user.domain.User;
9+
import org.terning.terningserver.auth.dto.response.AccessTokenGetResponseDto;
10+
import org.terning.terningserver.common.exception.CustomException;
11+
import org.terning.terningserver.common.security.jwt.auth.TokenExtractor;
12+
import org.terning.terningserver.user.repository.UserRepository;
13+
14+
import static org.terning.terningserver.common.exception.enums.ErrorMessage.FAILED_TOKEN_REISSUE;
15+
16+
@Service
17+
@RequiredArgsConstructor
18+
@Transactional(readOnly = true)
19+
public class AuthReissueServiceImpl implements AuthReissueService {
20+
21+
private final JwtTokenManager jwtTokenManager;
22+
private final UserRepository userRepository;
23+
24+
@Override
25+
public AccessTokenGetResponseDto reissueToken(String refreshToken) {
26+
User user = findUserByRefreshToken(refreshToken);
27+
Token accessToken = jwtTokenManager.issueAccessToken(user);
28+
return AccessTokenGetResponseDto.of(accessToken);
29+
}
30+
31+
private User findUserByRefreshToken(String refreshToken) {
32+
return userRepository.findByRefreshToken(TokenExtractor.extractToken(refreshToken))
33+
.orElseThrow(() -> new CustomException(FAILED_TOKEN_REISSUE));
34+
}
35+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.terning.terningserver.auth.application.signin;
2+
3+
import org.terning.terningserver.auth.dto.response.SignInResponse;
4+
import org.terning.terningserver.auth.dto.request.SignInRequest;
5+
6+
public interface AuthSignInService {
7+
SignInResponse signIn(String authAccessToken, SignInRequest request);
8+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.terning.terningserver.auth.application.signin;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Service;
5+
import org.springframework.transaction.annotation.Transactional;
6+
import org.terning.terningserver.auth.application.social.SocialAuthProvider;
7+
import org.terning.terningserver.auth.application.social.SocialAuthServiceManager;
8+
import org.terning.terningserver.external.pushNotification.notification.NotificationUserClient;
9+
import org.terning.terningserver.common.security.jwt.application.JwtTokenManager;
10+
import org.terning.terningserver.user.domain.Token;
11+
import org.terning.terningserver.user.domain.User;
12+
import org.terning.terningserver.user.domain.AuthType;
13+
import org.terning.terningserver.auth.dto.request.SignInRequest;
14+
import org.terning.terningserver.auth.dto.response.SignInResponse;
15+
import org.terning.terningserver.user.repository.UserRepository;
16+
17+
@Service
18+
@RequiredArgsConstructor
19+
public class AuthSignInServiceImpl implements AuthSignInService {
20+
21+
private final SocialAuthServiceManager socialAuthServiceManager;
22+
private final JwtTokenManager jwtTokenManager;
23+
private final UserRepository userRepository;
24+
private final NotificationUserClient notificationUserClient;
25+
// private final FcmTokenValidationClient fcmTokenValidationClient;
26+
27+
@Transactional
28+
@Override
29+
public SignInResponse signIn(String authAccessToken, SignInRequest request) {
30+
String authId = getAuthId(request.authType(), authAccessToken);
31+
User user = findUserByAuthIdAndType(authId, request.authType());
32+
33+
if (user == null) {
34+
// return SignInResponse.of(null, authId, request.authType(), null, false);
35+
return SignInResponse.of(null, authId, request.authType(), null);
36+
}
37+
38+
Token token = jwtTokenManager.generateToken(user);
39+
user.updateRefreshToken(token.getRefreshToken());
40+
41+
// boolean fcmReissueRequired = fcmTokenValidationClient.requestFcmTokenValidation(user.getId());
42+
43+
if (request.fcmToken() != null && !request.fcmToken().trim().isEmpty()) {
44+
notificationUserClient.createOrUpdateUser(user, request.fcmToken());
45+
}
46+
47+
// return SignInResponse.of(token, authId, request.authType(), user.getId(), fcmReissueRequired);
48+
return SignInResponse.of(token, authId, request.authType(), user.getId());
49+
}
50+
51+
52+
private String getAuthId(AuthType authType, String authAccessToken) {
53+
SocialAuthProvider provider = socialAuthServiceManager.getAuthService(authType);
54+
return provider.getAuthId(authAccessToken);
55+
}
56+
57+
private User findUserByAuthIdAndType(String authId, AuthType authType) {
58+
return userRepository.findByAuthIdAndAuthType(authId, authType).orElse(null);
59+
}
60+
}

0 commit comments

Comments
 (0)