Skip to content

Commit c462d9d

Browse files
authored
Merge pull request #245 from teamterning/develop
[🔀 merge] [4차] 코드 리펙토링 사항 스테이징 서버에 적용 (7)
2 parents c2d80e0 + 8d8230a commit c462d9d

File tree

9 files changed

+97
-27
lines changed

9 files changed

+97
-27
lines changed

README.md

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -121,31 +121,28 @@ ex) feat/#20
121121
<br/><br/>
122122

123123
## 📂 Structure
124+
124125
```text
125-
├── build.gradle
126-
├── 📂 src/main/java/org/terning/terningserver
127-
│ ├── 📂 config
128-
│ ├── 📂 controller
129-
│ │ └── 📂 swagger // Swagger 설정 파일 분리
130-
│ ├── 📂 repository
131-
│ ├── 📂 domain
132-
│ │ ├── 📂 common // ex) BaseEntity.java
133-
│ │ ├── 📂 enums
134-
│ │ └── 📂 mapping // 매핑 테이블 구현
135-
│ ├── 📂 service // 인터페이스와 구현체(Impl) 구분
136-
│ ├── 📂 dto // 도메인 별로 dto 구분
137-
│ │ ├── 📂 user // 도메인(1)
138-
│ │ │ ├── 📂 request
139-
│ │ │ └── 📂 response
140-
│ │ │
141-
│ │ └── 📂 post // 도메인(2)
142-
│ │ ├── 📂 request
143-
│ │ └── 📂 response
144-
│ ├── 📂 exception
145-
│ │ ├── 📂 dto // ex) ErrorResponse, SuccessResponse
146-
│ │ ├── 📂 enums // ex) ErrorMessage, SuccessMessage
147-
│ │ └── CustomException.java, GlobalExceptionHandler.java
148-
│ ├── 📂 jwt
149-
│ └── 📂 util
150-
└── ServerApplication.java
126+
- 📁 common
127+
- 🛡️ security // 보안 관련 설정 및 로직
128+
- 🔐 jwt // JWT 기반 인증/인가 처리 모듈
129+
- ❗ exception // 전역 공통 예외 처리 및 예외 클래스 정의
130+
- 🧰 util // 프로젝트 전반에서 사용되는 유틸리티 함수 및 클래스 모음
131+
- ⚙️ config // Spring 설정 클래스 및 환경 설정 파일 관리
132+
- 📝 logging // 요청/응답, 예외 등의 로깅 처리를 위한 설정 및 도구
133+
134+
- 🔐 auth // 로그인, 회원가입, 인증 관련 로직을 담당
135+
- 🖼️ banner // 배너 및 홈 상단에 표시되는 홍보 영역을 담당
136+
- 📆 calendar // 유저가 스크랩한 일정(공고)을 캘린더 형태로 관리
137+
- 🧾 filter // 공고 필터링 기능 및 필터 조건 관리
138+
- 🏠 home // 홈 화면에서 보여지는 주요 콘텐츠 로직을 담당
139+
- 💼 internshipAnnouncement // 인턴십 공고 등록, 조회, 관리 기능
140+
- 📌 scrap // 유저가 공고를 스크랩하고 관리하는 기능
141+
- 🔍 search // 공고 및 관련 항목에 대한 검색 기능
142+
143+
- 🌐 external // 외부 서비스 연동을 담당
144+
- 📲 pushNotification // FCM 기반 푸시 알림 전송 및 설정 로직
145+
- 🧵 discord // Discord Webhook 연동을 위한 기능을 담당
146+
147+
- 👤 user // 유저 정보, 온보딩, 설정 등 사용자 도메인 전반을 관리
151148
```

src/main/java/org/terning/terningserver/auth/api/AuthController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.security.core.annotation.AuthenticationPrincipal;
77
import org.springframework.web.bind.annotation.*;
88
import org.terning.terningserver.auth.application.AuthService;
9+
import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest;
910
import org.terning.terningserver.auth.dto.request.SignInRequest;
1011
import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto;
1112
import org.terning.terningserver.auth.dto.request.SignUpRequestDto;
@@ -19,6 +20,7 @@
1920
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_OUT;
2021
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_UP;
2122
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_UP_FILTER;
23+
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_USER_SYNC;
2224
import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_WITHDRAW;
2325

2426

@@ -78,4 +80,13 @@ public ResponseEntity<SuccessResponse> withdraw(@AuthenticationPrincipal Long us
7880

7981
return ResponseEntity.ok(SuccessResponse.of(SUCCESS_WITHDRAW));
8082
}
83+
84+
@PostMapping("/sync-user")
85+
public ResponseEntity<SuccessResponse> syncUser(
86+
@AuthenticationPrincipal Long userId,
87+
@RequestBody FcmTokenSyncRequest request
88+
) {
89+
authService.syncUser(userId, request);
90+
return ResponseEntity.ok(SuccessResponse.of(SUCCESS_USER_SYNC));
91+
}
8192
}

src/main/java/org/terning/terningserver/auth/api/AuthSwagger.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
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.auth.dto.request.FcmTokenSyncRequest;
1011
import org.terning.terningserver.auth.dto.request.SignInRequest;
1112
import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto;
1213
import org.terning.terningserver.auth.dto.request.SignUpRequestDto;
@@ -52,4 +53,10 @@ ResponseEntity<SuccessResponse> signOut(
5253
@Operation(summary = "계정탈퇴", description = "계정탈퇴 API")
5354
ResponseEntity<SuccessResponse> withdraw(
5455
@AuthenticationPrincipal Long userId);
56+
57+
@Operation(summary = "유저동기화", description = "유저동기화 API")
58+
ResponseEntity<SuccessResponse> syncUser(
59+
@AuthenticationPrincipal Long userId,
60+
@RequestBody FcmTokenSyncRequest request
61+
);
5562
}

src/main/java/org/terning/terningserver/auth/application/AuthService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import org.terning.terningserver.auth.application.signin.AuthSignInService;
88
import org.terning.terningserver.auth.application.signout.AuthSignOutService;
99
import org.terning.terningserver.auth.application.signup.AuthSignUpService;
10+
import org.terning.terningserver.auth.application.syncUser.AuthSyncUserService;
1011
import org.terning.terningserver.auth.application.withdraw.AuthWithdrawService;
12+
import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest;
1113
import org.terning.terningserver.auth.dto.request.SignInRequest;
1214
import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto;
1315
import org.terning.terningserver.auth.dto.request.SignUpRequestDto;
@@ -25,6 +27,7 @@ public class AuthService {
2527
private final AuthSignOutService authSignOutService;
2628
private final AuthWithdrawService authWithdrawService;
2729
private final AuthReissueService authReissueService;
30+
private final AuthSyncUserService authSyncUserService;
2831

2932
@Transactional
3033
public SignInResponse signIn(String authAccessToken, SignInRequest request) {
@@ -58,4 +61,9 @@ public AccessTokenGetResponseDto reissueToken(String refreshToken) {
5861
AccessTokenGetResponseDto accessTokenGetResponseDto = authReissueService.reissueToken(refreshToken);
5962
return accessTokenGetResponseDto;
6063
}
64+
65+
@Transactional
66+
public void syncUser(long userId, FcmTokenSyncRequest request) {
67+
authSyncUserService.syncUser(userId, request);
68+
}
6169
}
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.syncUser;
2+
3+
import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest;
4+
5+
public interface AuthSyncUserService {
6+
7+
void syncUser(long userId, FcmTokenSyncRequest request);
8+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.terning.terningserver.auth.application.syncUser;
2+
3+
import static org.terning.terningserver.common.exception.enums.ErrorMessage.NOT_FOUND_USER_EXCEPTION;
4+
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.transaction.annotation.Transactional;
8+
import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest;
9+
import org.terning.terningserver.common.exception.CustomException;
10+
import org.terning.terningserver.external.pushNotification.notification.NotificationUserClient;
11+
import org.terning.terningserver.user.domain.User;
12+
import org.terning.terningserver.user.repository.UserRepository;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
public class AuthSyncUserServiceImpl implements AuthSyncUserService {
17+
18+
private final UserRepository userRepository;
19+
private final NotificationUserClient notificationUserClient;
20+
21+
@Transactional
22+
@Override
23+
public void syncUser(long userId, FcmTokenSyncRequest request) {
24+
User user = userRepository.findById(userId)
25+
.orElseThrow(() -> new CustomException(NOT_FOUND_USER_EXCEPTION));
26+
27+
notificationUserClient.createOrUpdateUser(user, request.fcmToken());
28+
}
29+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.terning.terningserver.auth.dto.request;
2+
3+
public record FcmTokenSyncRequest(
4+
String fcmToken
5+
) {
6+
}

src/main/java/org/terning/terningserver/common/config/SecurityConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44
import org.springframework.context.annotation.Bean;
55
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
67
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
78
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
89
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
@@ -15,6 +16,7 @@
1516
@Configuration
1617
@EnableWebSecurity
1718
@RequiredArgsConstructor
19+
@EnableMethodSecurity
1820
public class SecurityConfig {
1921

2022
private final JwtAuthenticationFilter jwtAuthenticationFilter;

src/main/java/org/terning/terningserver/common/exception/enums/SuccessMessage.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,10 @@ public enum SuccessMessage {
5555
// My page (마이페이지 화면)
5656
SUCCESS_GET_PROFILE(200, "마이페이지 > 프로필 정보 불러오기를 성공했습니다"),
5757
SUCCESS_UPDATE_PROFILE(200, "프로필 수정에 성공했습니다"),
58-
PUSH_STATUS_UPDATED(200, "사용자 푸시알림 여부 변경을 완료했습니다.");
58+
PUSH_STATUS_UPDATED(200, "사용자 푸시알림 여부 변경을 완료했습니다."),
5959

60+
// 유저 동기화
61+
SUCCESS_USER_SYNC(201, "유저 동기화를 성공했습니다.");
6062

6163
private final int status;
6264
private final String message;

0 commit comments

Comments
 (0)