Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
11 commits
Select commit Hold shift + click to select a range
cab3b0f
MapSy-BE ๋ฒ„์ „ ๊ด€๋ฆฌ : docs : v0.1.13 README ๋ฒ„์ „ ์ •๋ณด ์—…๋ฐ์ดํŠธ [skip ci]
actions-user Jan 19, 2026
84dddd0
ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ Spring init ๋ฐ ๊ธฐ๋ณธ workflow ๊ตฌํ˜„ ํ•„์š” : fix : ์ „์ฒด์ ์ธ ๋„๋ฉ”์ธ ๋กœ์ง ๋ณ€๊ฒฝ https:โ€ฆ
Cassiiopeia Jan 19, 2026
5e9fb9a
ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ Spring init ๋ฐ ๊ธฐ๋ณธ workflow ๊ตฌํ˜„ ํ•„์š” : feat : Projects ์— ์š”์†Œ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธโ€ฆ
Cassiiopeia Jan 19, 2026
c6c3728
Merge branch 'main' of https://github.com/MapSee-Lab/MapSy-BE
Cassiiopeia Jan 19, 2026
059cbf1
MapSy-BE ๋ฒ„์ „ ์ •๋ณด ๊ด€๋ฆฌ: chore: ๋ฒ„์ „ 0.1.14 [skip ci]
actions-user Jan 19, 2026
c418211
ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ Spring init ๋ฐ ๊ธฐ๋ณธ workflow ๊ตฌํ˜„ ํ•„์š” : feat : Projects ์— ์š”์†Œ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธโ€ฆ
Cassiiopeia Jan 19, 2026
927c023
Merge branch 'main' of https://github.com/MapSee-Lab/MapSy-BE
Cassiiopeia Jan 19, 2026
6831adf
MapSy-BE ๋ฒ„์ „ ์ •๋ณด ๊ด€๋ฆฌ: chore: ๋ฒ„์ „ 0.1.15 [skip ci]
actions-user Jan 19, 2026
5bdd35c
ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ Spring init ๋ฐ ๊ธฐ๋ณธ workflow ๊ตฌํ˜„ ํ•„์š” : feat : projects ๊ด€๋ฆฌ ๊ณ ๋„ํ™” httpโ€ฆ
Cassiiopeia Jan 19, 2026
dd17cff
MapSy-BE ๋ฒ„์ „ ์ •๋ณด ๊ด€๋ฆฌ: chore: ๋ฒ„์ „ 0.1.16 [skip ci]
actions-user Jan 19, 2026
8751b22
MapSy-BE ๋ฒ„์ „ ๊ด€๋ฆฌ : docs : v0.1.16 ๋ฆด๋ฆฌ์ฆˆ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ (PR #11)
actions-user Jan 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
526 changes: 526 additions & 0 deletions .github/workflows/PROJECT-COMMON-PROJECT-BACKLOG-MANAGER.yaml

Large diffs are not rendered by default.

37 changes: 34 additions & 3 deletions CHANGELOG.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,42 @@
{
"metadata": {
"lastUpdated": "2026-01-19T04:22:34Z",
"currentVersion": "0.1.13",
"lastUpdated": "2026-01-19T12:59:01Z",
"currentVersion": "0.1.16",
"projectType": "spring",
"totalReleases": 4
"totalReleases": 5
},
"releases": [
{
"version": "0.1.16",
"project_type": "spring",
"date": "2026-01-19",
"pr_number": 11,
"raw_summary": "## Summary by CodeRabbit\n\n## ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ\n\n* **New Features**\n * Firebase ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์œผ๋กœ ๋กœ๊ทธ์ธ ๋ฐฉ์‹ ๋ณ€๊ฒฝ\n * ์žฅ์†Œ ๋ถ๋งˆํฌ์— ํด๋”, ๋ฉ”๋ชจ, ๋ณ„์ , ๋ฐฉ๋ฌธ ๊ธฐ๋ก ๊ธฐ๋Šฅ ์ถ”๊ฐ€\n * ์ธ๊ธฐ ํ‚ค์›Œ๋“œ ๋ฐ ํŠธ๋ Œ๋”ฉ ํ‚ค์›Œ๋“œ ์‹œ์Šคํ…œ ๊ตฌํ˜„\n\n* **Bug Fixes**\n * Firebase ํ† ํฐ ๊ฒ€์ฆ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ฐœ์„ \n\n* **Chores**\n * ๊ด€์‹ฌ์‚ฌ ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ฑฐ ๋ฐ ์˜จ๋ณด๋”ฉ ํ”„๋กœ์„ธ์Šค ๋‹จ์ˆœํ™”\n * ํ”„๋กœ์ ํŠธ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ (v0.1.13 โ†’ v0.1.16)",
"parsed_changes": {
"new_features": {
"title": "New Features",
"items": [
"Firebase ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์œผ๋กœ ๋กœ๊ทธ์ธ ๋ฐฉ์‹ ๋ณ€๊ฒฝ",
"์žฅ์†Œ ๋ถ๋งˆํฌ์— ํด๋”, ๋ฉ”๋ชจ, ๋ณ„์ , ๋ฐฉ๋ฌธ ๊ธฐ๋ก ๊ธฐ๋Šฅ ์ถ”๊ฐ€",
"์ธ๊ธฐ ํ‚ค์›Œ๋“œ ๋ฐ ํŠธ๋ Œ๋”ฉ ํ‚ค์›Œ๋“œ ์‹œ์Šคํ…œ ๊ตฌํ˜„"
]
},
"bug_fixes": {
"title": "Bug Fixes",
"items": [
"Firebase ํ† ํฐ ๊ฒ€์ฆ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ฐœ์„ "
]
},
"chores": {
"title": "Chores",
"items": [
"๊ด€์‹ฌ์‚ฌ ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ฑฐ ๋ฐ ์˜จ๋ณด๋”ฉ ํ”„๋กœ์„ธ์Šค ๋‹จ์ˆœํ™”",
"ํ”„๋กœ์ ํŠธ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ (v0.1.13 โ†’ v0.1.16)"
]
}
},
"parse_method": "markdown"
},
{
"version": "0.1.13",
"project_type": "spring",
Expand Down
22 changes: 20 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,25 @@
# Changelog

**ํ˜„์žฌ ๋ฒ„์ „:** 0.1.13
**๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:** 2026-01-19T04:22:34Z
**ํ˜„์žฌ ๋ฒ„์ „:** 0.1.16
**๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:** 2026-01-19T12:59:01Z

---

## [0.1.16] - 2026-01-19

**PR:** #11

**New Features**
- Firebase ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์œผ๋กœ ๋กœ๊ทธ์ธ ๋ฐฉ์‹ ๋ณ€๊ฒฝ
- ์žฅ์†Œ ๋ถ๋งˆํฌ์— ํด๋”, ๋ฉ”๋ชจ, ๋ณ„์ , ๋ฐฉ๋ฌธ ๊ธฐ๋ก ๊ธฐ๋Šฅ ์ถ”๊ฐ€
- ์ธ๊ธฐ ํ‚ค์›Œ๋“œ ๋ฐ ํŠธ๋ Œ๋”ฉ ํ‚ค์›Œ๋“œ ์‹œ์Šคํ…œ ๊ตฌํ˜„

**Bug Fixes**
- Firebase ํ† ํฐ ๊ฒ€์ฆ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ฐœ์„ 

**Chores**
- ๊ด€์‹ฌ์‚ฌ ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ฑฐ ๋ฐ ์˜จ๋ณด๋”ฉ ํ”„๋กœ์„ธ์Šค ๋‹จ์ˆœํ™”
- ํ”„๋กœ์ ํŠธ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ (v0.1.13 โ†’ v0.1.16)

---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,26 @@ public static class PlaceInfo {
@NotNull(message = "address๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
private String address;

@Schema(description = "์œ„๋„", example = "37.563476", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "latitude๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
private Double latitude;

@Schema(description = "๊ฒฝ๋„", example = "126.983920", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "longitude๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
private Double longitude;

@Schema(description = "๊ตญ๊ฐ€ ์ฝ”๋“œ (ISO 3166-1 alpha-2)", example = "KR")
private String country;

@Schema(description = "์นดํ…Œ๊ณ ๋ฆฌ", example = "ํ•œ์‹ ์Œ์‹์ ")
private String category;

@Schema(description = "์ „ํ™”๋ฒˆํ˜ธ", example = "02-776-5348")
private String phone;

@Schema(description = "์˜์—…์‹œ๊ฐ„", example = "๋งค์ผ 10:30 - 21:30")
private String openingHours;

@Schema(description = "์žฅ์†Œ ์„ค๋ช…", example = "์นผ๊ตญ์ˆ˜์™€ ๋งŒ๋‘๋กœ ์œ ๋ช…ํ•œ ๋ง›์ง‘")
private String description;

Expand All @@ -102,5 +119,8 @@ public static class PlaceInfo {

@Schema(description = "์–ธ์–ด ์ฝ”๋“œ (ISO 639-1)", example = "ko", allowableValues = {"ko", "en", "ja", "zh"})
private String language = "ko";

@Schema(description = "ํ‚ค์›Œ๋“œ ๋ชฉ๋ก", example = "[\"#๋ช…๋™๋ง›์ง‘\", \"#์นผ๊ตญ์ˆ˜\", \"#๋งŒ๋‘\"]")
private List<String> keywords;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package kr.suhsaechan.mapsy.auth.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Schema(description = "Firebase ํ† ํฐ์—์„œ ์ถ”์ถœํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด")
public class FirebaseUserInfo {

@Schema(description = "Firebase UID", example = "cXcpyzYSX....")
private String uid;

@Schema(description = "์ด๋ฉ”์ผ", example = "user@example.com")
private String email;

@Schema(description = "Firebase displayName (์‚ฌ์šฉ ์•ˆ ํ•จ)", example = "์—˜๋ฆฌํŽ˜์–ด")
private String name;

@Schema(description = "ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ URL", example = "https://lh3.googleusercontent.com/a/...")
private String profileImageUrl;

@Schema(description = "๋กœ๊ทธ์ธ ์ œ๊ณต์ž", example = "google.com")
private String signInProvider;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package kr.suhsaechan.mapsy.auth.dto;

import kr.suhsaechan.mapsy.common.constant.DeviceType;
import kr.suhsaechan.mapsy.common.constant.SocialPlatform;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.*;

Expand All @@ -15,20 +13,10 @@
@NoArgsConstructor
public class SignInRequest {

@Schema(description = "๋กœ๊ทธ์ธ ํ”Œ๋žซํผ (KAKAO, GOOGLE ๋“ฑ)", example = "KAKAO")
private SocialPlatform socialPlatform;

@NotBlank(message = "์ด๋ฉ”์ผ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
@Email(message = "์˜ฌ๋ฐ”๋ฅธ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.")
@Schema(description = "์†Œ์…œ ๋กœ๊ทธ์ธ ํ›„ ๋ฐ˜ํ™˜๋œ ์ด๋ฉ”์ผ", example = "user@example.com")
private String email;

@NotBlank(message = "์ด๋ฆ„์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
@Schema(description = "์†Œ์…œ ๋กœ๊ทธ์ธ ํ›„ ๋ฐ˜ํ™˜๋œ ๋‹‰๋„ค์ž„", example = "ํ™๊ธธ๋™")
private String name;

@Schema(description = "์†Œ์…œ ๋กœ๊ทธ์ธ ํ›„ ๋ฐ˜ํ™˜๋œ ํ”„๋กœํ•„ URL", example = "https://example.com/profile.jpg")
private String profileUrl;
@NotBlank(message = "Firebase ID Token์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
@Schema(description = "Firebase ID Token (ํด๋ผ์ด์–ธํŠธ์—์„œ Firebase ์ธ์ฆ ํ›„ ์ „๋‹ฌ)",
example = "eyJhbGciOiJSUzI1NiIsImtpZCI6...")
private String firebaseIdToken;

@Schema(description = "FCM ํ‘ธ์‹œ ์•Œ๋ฆผ ํ† ํฐ (์„ ํƒ)", example = "dXQzM2k1N2RkZjM0OGE3YjczZGY5...")
private String fcmToken;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package kr.suhsaechan.mapsy.auth.service;

import com.google.firebase.auth.FirebaseToken;
import kr.suhsaechan.mapsy.auth.dto.AuthRequest;
import kr.suhsaechan.mapsy.auth.dto.AuthResponse;
import kr.suhsaechan.mapsy.auth.dto.CustomUserDetails;
import kr.suhsaechan.mapsy.auth.dto.FirebaseUserInfo;
import kr.suhsaechan.mapsy.auth.dto.ReissueRequest;
import kr.suhsaechan.mapsy.auth.dto.ReissueResponse;
import kr.suhsaechan.mapsy.auth.dto.SignInRequest;
Expand All @@ -14,14 +16,12 @@
import kr.suhsaechan.mapsy.member.constant.OnboardingStep;
import kr.suhsaechan.mapsy.member.entity.FcmToken;
import kr.suhsaechan.mapsy.member.entity.Member;
import kr.suhsaechan.mapsy.member.entity.MemberInterest;
import kr.suhsaechan.mapsy.member.repository.FcmTokenRepository;
import kr.suhsaechan.mapsy.member.repository.MemberInterestRepository;
import kr.suhsaechan.mapsy.member.repository.MemberRepository;
import kr.suhsaechan.mapsy.member.service.MemberService;
import kr.suhsaechan.mapsy.member.service.NicknameService;
import io.jsonwebtoken.ExpiredJwtException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -43,37 +43,48 @@ public class AuthService {
private final MemberService memberService;
private final JwtUtil jwtUtil;
private final RedisTemplate<String, Object> redisTemplate;
private final MemberInterestRepository memberInterestRepository;
private final FcmTokenRepository fcmTokenRepository;
private final FirebaseTokenService firebaseTokenService;
private final NicknameService nicknameService;

/**
* ๋กœ๊ทธ์ธ ๋กœ์ง ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ํ”Œ๋žซํผ, ๋‹‰๋„ค์ž„, ํ”„๋กœํ•„url, ์ด๋ฉ”์ผ์„ ์ž…๋ ฅ๋ฐ›์•„ JWT๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
* Firebase OAuth ๋กœ๊ทธ์ธ ๋กœ์ง
* ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ Firebase ID Token์„ ๋ฐ›์•„ ๊ฒ€์ฆ ํ›„ JWT๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
*/
@Transactional
public SignInResponse signIn(SignInRequest request) {
// FCM ํ† ํฐ ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ
// 1๋‹จ๊ณ„: FCM ํ† ํฐ ์š”์ฒญ ๊ฒ€์ฆ
validateFcmTokenRequest(request);

// ์š”์ฒญ ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ์ •๋ณด ํš๋“
String email = request.getEmail();
String name = request.getName();
// 2๋‹จ๊ณ„: Firebase ID Token ๊ฒ€์ฆ
FirebaseToken decodedToken = firebaseTokenService.verifyIdToken(request.getFirebaseIdToken());

//ํšŒ์› ์กฐํšŒ
// 3๋‹จ๊ณ„: ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”์ถœ
FirebaseUserInfo userInfo = firebaseTokenService.extractUserInfo(decodedToken);
String email = userInfo.getEmail();
String profileImageUrl = userInfo.getProfileImageUrl();

// 4๋‹จ๊ณ„: ํšŒ์› ์กฐํšŒ ๋˜๋Š” ์‹ ๊ทœ ์ƒ์„ฑ
Member member = memberRepository.findByEmail(email)
.orElseGet(() -> {
// ์‹ ๊ทœ ํšŒ์› ์ƒ์„ฑ ์‹œ ๊ธฐ๋ณธ๊ฐ’ ์ž๋™ ์„ค์ •
// ์‹ ๊ทœ ํšŒ์› ์ƒ์„ฑ ์‹œ ๋žœ๋ค ๋‹‰๋„ค์ž„ ์ž๋™ ์ƒ์„ฑ
String randomNickname = nicknameService.generateUniqueNickname();

Member newMember = Member.builder()
.email(email)
.name("name")
.name(randomNickname) // ์ž๋™ ์ƒ์„ฑ๋œ ๋žœ๋ค ๋‹‰๋„ค์ž„
.profileImageUrl(profileImageUrl) // Firebase ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
.build();

memberRepository.save(newMember);
log.debug("์‹ ๊ทœ ํšŒ์› ๊ฐ€์ž…: {}", email);
log.info("์‹ ๊ทœ ํšŒ์› ๊ฐ€์ž… - email={}, nickname={}", email, randomNickname);
return newMember;
});

// 5๋‹จ๊ณ„: ์ฒซ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํ™•์ธ
boolean isFirstLogin = member.getOnboardingStatus() == MemberOnboardingStatus.NOT_STARTED;

//์˜จ๋ณด๋”ฉ ์ƒํƒœ ๊ฐฑ์‹  (NOT_STARTED โ†’ IN_PROGRESS)
// 6๋‹จ๊ณ„: ์˜จ๋ณด๋”ฉ ์ƒํƒœ ๊ฐฑ์‹ 
if (isFirstLogin) {
member.setOnboardingStatus(MemberOnboardingStatus.IN_PROGRESS);
memberRepository.save(member);
Expand All @@ -82,41 +93,40 @@ public SignInResponse signIn(SignInRequest request) {
log.debug("๊ธฐ์กด ํšŒ์› ๋กœ๊ทธ์ธ: {}", email);
}

// FCM ํ† ํฐ ์ €์žฅ/์—…๋ฐ์ดํŠธ
// 7๋‹จ๊ณ„: FCM ํ† ํฐ ์ €์žฅ/์—…๋ฐ์ดํŠธ
saveFcmToken(member, request);

// JWT ํ† ํฐ ์ƒ์„ฑ
// 8๋‹จ๊ณ„: JWT ํ† ํฐ ์ƒ์„ฑ
CustomUserDetails customUserDetails = new CustomUserDetails(member);
String accessToken = jwtUtil.createAccessToken(customUserDetails);
String refreshToken = jwtUtil.createRefreshToken(customUserDetails);

log.debug("๋กœ๊ทธ์ธ ์„ฑ๊ณต: email={}, accessToken={}, refreshToken={}", email, accessToken, refreshToken);

// RefreshToken -> Redis ์ €์žฅ (ํ‚ค: "RT:{memberId}")
// 9๋‹จ๊ณ„: RefreshToken -> Redis ์ €์žฅ (ํ‚ค: "RT:{memberId}")
redisTemplate.opsForValue().set(
REFRESH_KEY_PREFIX + customUserDetails.getMemberId(),
refreshToken,
jwtUtil.getRefreshExpirationTime(),
TimeUnit.MILLISECONDS);

//์˜จ๋ณด๋”ฉ ํ•„์š” ์—ฌ๋ถ€ ํ™•์ธ
// 10๋‹จ๊ณ„: ์˜จ๋ณด๋”ฉ ํ•„์š” ์—ฌ๋ถ€ ํ™•์ธ
boolean requiresOnboarding = (member.getOnboardingStatus() != MemberOnboardingStatus.COMPLETED);

// ์˜จ๋ณด๋”ฉ ๋‹จ๊ณ„ ๊ณ„์‚ฐ ๋ฐ ์ €์žฅ
// COMPLETED ์ƒํƒœ๋ฉด ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ๋œ ๊ฐ’ ์‚ฌ์šฉ
// 11๋‹จ๊ณ„: ์˜จ๋ณด๋”ฉ ๋‹จ๊ณ„ ๊ณ„์‚ฐ ๋ฐ ์ €์žฅ
String onboardingStep;
if (member.getOnboardingStatus() == MemberOnboardingStatus.COMPLETED) {
// COMPLETED ์ƒํƒœ๋ฉด ์บ์‹œ๋œ ๊ฐ’ ์‚ฌ์šฉ (์—†์œผ๋ฉด COMPLETED ๋ฐ˜ํ™˜)
onboardingStep = member.getOnboardingStep() != null
? member.getOnboardingStep().name()
onboardingStep = member.getOnboardingStep() != null
? member.getOnboardingStep().name()
: OnboardingStep.COMPLETED.name();
} else {
// IN_PROGRESS ๋˜๋Š” NOT_STARTED ์ƒํƒœ๋ฉด ๊ณ„์‚ฐ ํ›„ ์ €์žฅ
OnboardingStep step = memberService.calculateAndSaveOnboardingStep(member);
onboardingStep = step.name();
}

//์‘๋‹ต ์ƒ์„ฑ
// 12๋‹จ๊ณ„: ์‘๋‹ต ์ƒ์„ฑ
return SignInResponse.builder()
.accessToken(accessToken)
.refreshToken(refreshToken)
Expand Down Expand Up @@ -230,10 +240,6 @@ public void withdrawMember(UUID memberId, String accessToken) {
// ํƒˆํ‡ด ์ฒ˜๋ฆฌ (email, name์— ํƒ€์ž„์Šคํƒฌํ”„ ์ž๋™ ์ถ”๊ฐ€)
String timestamp = member.withdraw(memberId.toString());

// ํšŒ์› ๊ด€์‹ฌ์‚ฌ ์†Œํ”„ํŠธ์‚ญ์ œ
List<MemberInterest> memberInterests = memberInterestRepository.findByMemberId(memberId);
memberInterests.forEach(interest -> interest.softDelete(memberId.toString()));

// FCM ํ† ํฐ ์‚ญ์ œ (ํ•˜๋“œ์‚ญ์ œ - ์†Œํ”„ํŠธ์‚ญ์ œ ์‹œ FK ์ œ์•ฝ์กฐ๊ฑด ์œ„๋ฐ˜ ๋ฐฉ์ง€)
fcmTokenRepository.deleteByMember(member);
log.info("[Auth] FCM ํ† ํฐ ์‚ญ์ œ ์™„๋ฃŒ - memberId={}", memberId);
Expand Down
Loading
Loading