From 74ae8552449d56897db8bfbbb3266339e2f77324 Mon Sep 17 00:00:00 2001 From: imjuyongp Date: Wed, 4 Feb 2026 00:59:47 +0900 Subject: [PATCH 1/3] =?UTF-8?q?:sparkles:Feat:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EC=8B=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/dto/request/SignUpRequest.java | 10 +++++++++- .../com/be/sportizebe/domain/user/entity/Gender.java | 6 ++++++ .../com/be/sportizebe/domain/user/entity/User.java | 12 ++++++++++++ .../sportizebe/domain/user/service/UserService.java | 1 + .../domain/user/service/UserServiceImpl.java | 3 +++ 5 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/be/sportizebe/domain/user/entity/Gender.java diff --git a/src/main/java/com/be/sportizebe/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/be/sportizebe/domain/user/dto/request/SignUpRequest.java index 9e606e9..b393eae 100644 --- a/src/main/java/com/be/sportizebe/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/be/sportizebe/domain/user/dto/request/SignUpRequest.java @@ -1,5 +1,6 @@ package com.be.sportizebe.domain.user.dto.request; +import com.be.sportizebe.domain.user.entity.Gender; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; @@ -18,6 +19,13 @@ public record SignUpRequest( @Schema(description = "닉네임", example = "스포티") @NotBlank(message = "사용할 닉네임을 입력해주세요.") - String nickName + String nickName, + + @Schema(description = "성별", example = "MALE") + Gender gender, + + @Schema(description = "전화번호", example = "010-xxxx-xxxx") + @NotBlank(message = "전화번호를 입력해주세요") + String phoneNumber ) { } \ No newline at end of file diff --git a/src/main/java/com/be/sportizebe/domain/user/entity/Gender.java b/src/main/java/com/be/sportizebe/domain/user/entity/Gender.java new file mode 100644 index 0000000..29a473a --- /dev/null +++ b/src/main/java/com/be/sportizebe/domain/user/entity/Gender.java @@ -0,0 +1,6 @@ +package com.be.sportizebe.domain.user.entity; + +public enum Gender { + MALE, + FEMALE +} diff --git a/src/main/java/com/be/sportizebe/domain/user/entity/User.java b/src/main/java/com/be/sportizebe/domain/user/entity/User.java index 6cc26a0..c105a95 100644 --- a/src/main/java/com/be/sportizebe/domain/user/entity/User.java +++ b/src/main/java/com/be/sportizebe/domain/user/entity/User.java @@ -46,6 +46,18 @@ public class User extends BaseTimeEntity { private String profileImage; // 프로필 사진 URL + private String introduce; // 한줄 소개 + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private Gender gender; // 성별 + + @Column(nullable = false, unique = true) + private String phoneNumber; // 전화번호 + + /*@Column(nullable = false) + private String address; // 주소*/ + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) @Builder.Default private List posts = new ArrayList<>(); // 작성한 게시글 목록 diff --git a/src/main/java/com/be/sportizebe/domain/user/service/UserService.java b/src/main/java/com/be/sportizebe/domain/user/service/UserService.java index 691fc28..af26dd4 100644 --- a/src/main/java/com/be/sportizebe/domain/user/service/UserService.java +++ b/src/main/java/com/be/sportizebe/domain/user/service/UserService.java @@ -3,6 +3,7 @@ import com.be.sportizebe.domain.user.dto.request.SignUpRequest; import com.be.sportizebe.domain.user.dto.response.ProfileImageResponse; import com.be.sportizebe.domain.user.dto.response.SignUpResponse; +import com.be.sportizebe.domain.user.entity.Gender; import org.springframework.web.multipart.MultipartFile; public interface UserService { diff --git a/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java b/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java index c25180e..5806399 100644 --- a/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java +++ b/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java @@ -3,6 +3,7 @@ import com.be.sportizebe.domain.user.dto.request.SignUpRequest; import com.be.sportizebe.domain.user.dto.response.ProfileImageResponse; import com.be.sportizebe.domain.user.dto.response.SignUpResponse; +import com.be.sportizebe.domain.user.entity.Gender; import com.be.sportizebe.domain.user.entity.Role; import com.be.sportizebe.domain.user.entity.User; import com.be.sportizebe.domain.user.exception.UserErrorCode; @@ -46,6 +47,8 @@ public SignUpResponse signUp(SignUpRequest request) { .username(request.username()) .password(encodedPassword) .nickname(request.nickName()) + .phoneNumber(request.phoneNumber()) + .gender(request.gender()) .role(Role.USER) .build(); From cfd286e520e2f9b69813b814b54ab3c2e0b027c2 Mon Sep 17 00:00:00 2001 From: imjuyongp Date: Wed, 4 Feb 2026 01:15:52 +0900 Subject: [PATCH 2/3] =?UTF-8?q?:sparkles:Feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserController.java | 12 +++++++++ .../dto/request/UpdateProfileRequest.java | 17 ++++++++++++ .../dto/response/UpdateProfileResponse.java | 26 ++++++++++++++++++ .../sportizebe/domain/user/entity/User.java | 5 ++++ .../domain/user/service/UserService.java | 6 ++++- .../domain/user/service/UserServiceImpl.java | 27 ++++++++++++++++++- 6 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/be/sportizebe/domain/user/dto/request/UpdateProfileRequest.java create mode 100644 src/main/java/com/be/sportizebe/domain/user/dto/response/UpdateProfileResponse.java diff --git a/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java b/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java index 414c5ab..aa6d0cc 100644 --- a/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java +++ b/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java @@ -1,8 +1,10 @@ package com.be.sportizebe.domain.user.controller; import com.be.sportizebe.domain.user.dto.request.SignUpRequest; +import com.be.sportizebe.domain.user.dto.request.UpdateProfileRequest; import com.be.sportizebe.domain.user.dto.response.ProfileImageResponse; import com.be.sportizebe.domain.user.dto.response.SignUpResponse; +import com.be.sportizebe.domain.user.dto.response.UpdateProfileResponse; import com.be.sportizebe.domain.user.service.UserServiceImpl; import com.be.sportizebe.global.response.BaseResponse; import com.be.sportizebe.global.cache.dto.UserAuthInfo; @@ -42,4 +44,14 @@ public ResponseEntity> uploadProfileImage( ProfileImageResponse response = userService.uploadProfileImage(userAuthInfo.getId(), file); return ResponseEntity.ok(BaseResponse.success("프로필 사진 업로드 성공", response)); } + + @PutMapping("/profile") + @Operation(summary = "프로필 수정", description = "닉네임, 한줄소개를 수정합니다.") + public ResponseEntity> updateProfile( + @AuthenticationPrincipal UserAuthInfo userAuthInfo, + @RequestBody @Valid UpdateProfileRequest request + ) { + UpdateProfileResponse response = userService.updateProfile(userAuthInfo.getId(), request); + return ResponseEntity.ok(BaseResponse.success("프로필 수정 성공", response)); + } } \ No newline at end of file diff --git a/src/main/java/com/be/sportizebe/domain/user/dto/request/UpdateProfileRequest.java b/src/main/java/com/be/sportizebe/domain/user/dto/request/UpdateProfileRequest.java new file mode 100644 index 0000000..8cd0be4 --- /dev/null +++ b/src/main/java/com/be/sportizebe/domain/user/dto/request/UpdateProfileRequest.java @@ -0,0 +1,17 @@ +package com.be.sportizebe.domain.user.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +@Schema(title = "UpdateProfileRequest DTO", description = "프로필 수정 요청") +public record UpdateProfileRequest( + @Schema(description = "닉네임", example = "새로운닉네임") + @NotBlank(message = "닉네임은 필수입니다") + @Size(min = 2, max = 20, message = "닉네임은 2~20자 사이여야 합니다") + String nickname, + + @Schema(description = "한줄 소개", example = "안녕하세요! 축구를 좋아합니다.") + @Size(max = 100, message = "한줄 소개는 100자 이내여야 합니다") + String introduce +) {} \ No newline at end of file diff --git a/src/main/java/com/be/sportizebe/domain/user/dto/response/UpdateProfileResponse.java b/src/main/java/com/be/sportizebe/domain/user/dto/response/UpdateProfileResponse.java new file mode 100644 index 0000000..8fa97e4 --- /dev/null +++ b/src/main/java/com/be/sportizebe/domain/user/dto/response/UpdateProfileResponse.java @@ -0,0 +1,26 @@ +package com.be.sportizebe.domain.user.dto.response; + +import com.be.sportizebe.domain.user.entity.User; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +@Schema(title = "UpdateProfileResponse DTO", description = "프로필 수정 응답") +public record UpdateProfileResponse( + @Schema(description = "사용자 ID", example = "1") + Long userId, + + @Schema(description = "닉네임", example = "새로운닉네임") + String nickname, + + @Schema(description = "한줄 소개", example = "안녕하세요! 축구를 좋아합니다.") + String introduce +) { + public static UpdateProfileResponse from(User user) { + return UpdateProfileResponse.builder() + .userId(user.getId()) + .nickname(user.getNickname()) + .introduce(user.getIntroduce()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/be/sportizebe/domain/user/entity/User.java b/src/main/java/com/be/sportizebe/domain/user/entity/User.java index c105a95..4d72df5 100644 --- a/src/main/java/com/be/sportizebe/domain/user/entity/User.java +++ b/src/main/java/com/be/sportizebe/domain/user/entity/User.java @@ -69,4 +69,9 @@ public void updateRefreshToken(String refreshToken) { public void updateProfileImage(String profileImage) { this.profileImage = profileImage; } + + public void updateProfile(String nickname, String introduce) { + this.nickname = nickname; + this.introduce = introduce; + } } diff --git a/src/main/java/com/be/sportizebe/domain/user/service/UserService.java b/src/main/java/com/be/sportizebe/domain/user/service/UserService.java index af26dd4..524ae84 100644 --- a/src/main/java/com/be/sportizebe/domain/user/service/UserService.java +++ b/src/main/java/com/be/sportizebe/domain/user/service/UserService.java @@ -1,9 +1,10 @@ package com.be.sportizebe.domain.user.service; import com.be.sportizebe.domain.user.dto.request.SignUpRequest; +import com.be.sportizebe.domain.user.dto.request.UpdateProfileRequest; import com.be.sportizebe.domain.user.dto.response.ProfileImageResponse; import com.be.sportizebe.domain.user.dto.response.SignUpResponse; -import com.be.sportizebe.domain.user.entity.Gender; +import com.be.sportizebe.domain.user.dto.response.UpdateProfileResponse; import org.springframework.web.multipart.MultipartFile; public interface UserService { @@ -13,4 +14,7 @@ public interface UserService { // 프로필 사진 업로드 ProfileImageResponse uploadProfileImage(Long userId, MultipartFile file); + + // 프로필 수정 (닉네임, 한줄소개) + UpdateProfileResponse updateProfile(Long userId, UpdateProfileRequest request); } diff --git a/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java b/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java index 5806399..a996bf2 100644 --- a/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java +++ b/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java @@ -1,13 +1,15 @@ package com.be.sportizebe.domain.user.service; import com.be.sportizebe.domain.user.dto.request.SignUpRequest; +import com.be.sportizebe.domain.user.dto.request.UpdateProfileRequest; import com.be.sportizebe.domain.user.dto.response.ProfileImageResponse; import com.be.sportizebe.domain.user.dto.response.SignUpResponse; -import com.be.sportizebe.domain.user.entity.Gender; +import com.be.sportizebe.domain.user.dto.response.UpdateProfileResponse; import com.be.sportizebe.domain.user.entity.Role; import com.be.sportizebe.domain.user.entity.User; import com.be.sportizebe.domain.user.exception.UserErrorCode; import com.be.sportizebe.domain.user.repository.UserRepository; +import com.be.sportizebe.global.cache.service.UserCacheService; import com.be.sportizebe.global.exception.CustomException; import com.be.sportizebe.global.s3.enums.PathName; import com.be.sportizebe.global.s3.service.S3Service; @@ -25,6 +27,7 @@ public class UserServiceImpl implements UserService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; + private final UserCacheService userCacheService; private final S3Service s3Service; @Override @@ -79,4 +82,26 @@ public ProfileImageResponse uploadProfileImage(Long userId, MultipartFile file) return ProfileImageResponse.from(profileImageUrl); } + + @Override + @Transactional + public UpdateProfileResponse updateProfile(Long userId, UpdateProfileRequest request) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new CustomException(UserErrorCode.USER_NOT_FOUND)); + + // 닉네임 중복 체크 (자신의 닉네임이 아닌 경우만) + if (!user.getNickname().equals(request.nickname()) + && userRepository.existsByNickname(request.nickname())) { + throw new CustomException(UserErrorCode.DUPLICATE_NICKNAME); + } + + user.updateProfile(request.nickname(), request.introduce()); + + // 닉네임이 UserAuthInfo에 포함되어 있으므로 캐시 무효화 + userCacheService.evictUserAuthInfo(userId); + + log.info("사용자 프로필 수정 완료: userId={}", userId); + + return UpdateProfileResponse.from(user); + } } \ No newline at end of file From 6c392e75f3533be09243d2fea78fb4a9d9535b6d Mon Sep 17 00:00:00 2001 From: imjuyongp Date: Wed, 4 Feb 2026 01:40:53 +0900 Subject: [PATCH 3/3] =?UTF-8?q?:recycle:Refactor:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20=EC=BA=90=EC=8B=9C=20=EB=AC=B4=ED=9A=A8?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserController.java | 10 +++ .../user/dto/response/UserInfoResponse.java | 64 +++++++++++++++++++ .../domain/user/service/UserService.java | 4 ++ .../domain/user/service/UserServiceImpl.java | 15 +++++ .../global/cache/dto/UserAuthInfo.java | 30 +++++++-- 5 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/be/sportizebe/domain/user/dto/response/UserInfoResponse.java diff --git a/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java b/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java index aa6d0cc..16cb060 100644 --- a/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java +++ b/src/main/java/com/be/sportizebe/domain/user/controller/UserController.java @@ -5,6 +5,7 @@ import com.be.sportizebe.domain.user.dto.response.ProfileImageResponse; import com.be.sportizebe.domain.user.dto.response.SignUpResponse; import com.be.sportizebe.domain.user.dto.response.UpdateProfileResponse; +import com.be.sportizebe.domain.user.dto.response.UserInfoResponse; import com.be.sportizebe.domain.user.service.UserServiceImpl; import com.be.sportizebe.global.response.BaseResponse; import com.be.sportizebe.global.cache.dto.UserAuthInfo; @@ -54,4 +55,13 @@ public ResponseEntity> updateProfile( UpdateProfileResponse response = userService.updateProfile(userAuthInfo.getId(), request); return ResponseEntity.ok(BaseResponse.success("프로필 수정 성공", response)); } + + @GetMapping("/me") + @Operation(summary = "내 정보 조회", description = "현재 로그인한 사용자의 정보를 조회합니다.") + public ResponseEntity> getMyInfo( + @AuthenticationPrincipal UserAuthInfo userAuthInfo + ) { + UserInfoResponse response = userService.getUserInfo(userAuthInfo.getId()); + return ResponseEntity.ok(BaseResponse.success("사용자 정보 조회 성공", response)); + } } \ No newline at end of file diff --git a/src/main/java/com/be/sportizebe/domain/user/dto/response/UserInfoResponse.java b/src/main/java/com/be/sportizebe/domain/user/dto/response/UserInfoResponse.java new file mode 100644 index 0000000..010921d --- /dev/null +++ b/src/main/java/com/be/sportizebe/domain/user/dto/response/UserInfoResponse.java @@ -0,0 +1,64 @@ +package com.be.sportizebe.domain.user.dto.response; + +import com.be.sportizebe.domain.user.entity.Gender; +import com.be.sportizebe.domain.user.entity.SportType; +import com.be.sportizebe.domain.user.entity.User; +import com.be.sportizebe.global.cache.dto.UserAuthInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +@Builder +@Schema(title = "UserInfoResponse DTO", description = "사용자 정보 조회 응답") +public record UserInfoResponse( + @Schema(description = "사용자 ID", example = "1") + Long userId, + + @Schema(description = "이메일(아이디)", example = "test@example.com") + String username, + + @Schema(description = "닉네임", example = "축구왕") + String nickname, + + @Schema(description = "한줄 소개", example = "안녕하세요!") + String introduce, + + @Schema(description = "프로필 이미지 URL") + String profileImage, + + @Schema(description = "성별", example = "MALE") + Gender gender, + + @Schema(description = "전화번호", example = "010-1234-5678") + String phoneNumber, + + @Schema(description = "관심 종목") + List interestType +) { + public static UserInfoResponse from(User user) { // DB 조회 + return UserInfoResponse.builder() + .userId(user.getId()) + .username(user.getUsername()) + .nickname(user.getNickname()) + .introduce(user.getIntroduce()) + .profileImage(user.getProfileImage()) + .gender(user.getGender()) + .phoneNumber(user.getPhoneNumber()) + .interestType(user.getInterestType()) + .build(); + } + + public static UserInfoResponse from(UserAuthInfo userAuthInfo) { // 캐시메모리 조회 + return UserInfoResponse.builder() + .userId(userAuthInfo.getId()) + .username(userAuthInfo.getUsername()) + .nickname(userAuthInfo.getNickname()) + .introduce(userAuthInfo.getIntroduce()) + .profileImage(userAuthInfo.getProfileImage()) + .gender(userAuthInfo.getGender()) + .phoneNumber(userAuthInfo.getPhoneNumber()) + .interestType(userAuthInfo.getInterestType()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/be/sportizebe/domain/user/service/UserService.java b/src/main/java/com/be/sportizebe/domain/user/service/UserService.java index 524ae84..d5fbf79 100644 --- a/src/main/java/com/be/sportizebe/domain/user/service/UserService.java +++ b/src/main/java/com/be/sportizebe/domain/user/service/UserService.java @@ -5,6 +5,7 @@ import com.be.sportizebe.domain.user.dto.response.ProfileImageResponse; import com.be.sportizebe.domain.user.dto.response.SignUpResponse; import com.be.sportizebe.domain.user.dto.response.UpdateProfileResponse; +import com.be.sportizebe.domain.user.dto.response.UserInfoResponse; import org.springframework.web.multipart.MultipartFile; public interface UserService { @@ -17,4 +18,7 @@ public interface UserService { // 프로필 수정 (닉네임, 한줄소개) UpdateProfileResponse updateProfile(Long userId, UpdateProfileRequest request); + + // 사용자 정보 조회 + UserInfoResponse getUserInfo(Long userId); } diff --git a/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java b/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java index a996bf2..7053208 100644 --- a/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java +++ b/src/main/java/com/be/sportizebe/domain/user/service/UserServiceImpl.java @@ -5,6 +5,7 @@ import com.be.sportizebe.domain.user.dto.response.ProfileImageResponse; import com.be.sportizebe.domain.user.dto.response.SignUpResponse; import com.be.sportizebe.domain.user.dto.response.UpdateProfileResponse; +import com.be.sportizebe.domain.user.dto.response.UserInfoResponse; import com.be.sportizebe.domain.user.entity.Role; import com.be.sportizebe.domain.user.entity.User; import com.be.sportizebe.domain.user.exception.UserErrorCode; @@ -78,6 +79,9 @@ public ProfileImageResponse uploadProfileImage(Long userId, MultipartFile file) // 사용자 프로필 이미지 URL 업데이트 user.updateProfileImage(profileImageUrl); + // 프로필 이미지가 캐시에 포함되어 있으므로 캐시 무효화 + userCacheService.evictUserAuthInfo(userId); + log.info("사용자 프로필 이미지 업로드 완료: userId={}, url={}", userId, profileImageUrl); return ProfileImageResponse.from(profileImageUrl); @@ -104,4 +108,15 @@ public UpdateProfileResponse updateProfile(Long userId, UpdateProfileRequest req return UpdateProfileResponse.from(user); } + + @Override + public UserInfoResponse getUserInfo(Long userId) { + // 캐시에서 사용자 정보 조회 (캐시 미스 시 DB 조회 후 캐싱) + var userAuthInfo = userCacheService.findUserAuthInfoById(userId); + if (userAuthInfo == null) { + throw new CustomException(UserErrorCode.USER_NOT_FOUND); + } + + return UserInfoResponse.from(userAuthInfo); + } } \ No newline at end of file diff --git a/src/main/java/com/be/sportizebe/global/cache/dto/UserAuthInfo.java b/src/main/java/com/be/sportizebe/global/cache/dto/UserAuthInfo.java index 249434e..37f2599 100644 --- a/src/main/java/com/be/sportizebe/global/cache/dto/UserAuthInfo.java +++ b/src/main/java/com/be/sportizebe/global/cache/dto/UserAuthInfo.java @@ -1,32 +1,48 @@ package com.be.sportizebe.global.cache.dto; +import com.be.sportizebe.domain.user.entity.Gender; import com.be.sportizebe.domain.user.entity.Role; +import com.be.sportizebe.domain.user.entity.SportType; import com.be.sportizebe.domain.user.entity.User; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import java.io.Serializable; +import java.util.List; /** * JWT 인증 필터에서 사용할 캐시용 사용자 정보 DTO * User 엔티티의 연관관계(posts 등)로 인한 직렬화 문제를 방지 + * 민감정보(password, refreshToken) 제외 */ @Getter +@Builder @NoArgsConstructor @AllArgsConstructor -public class UserAuthInfo implements Serializable { // Serializable : 직렬화 가능하다라는 마커 표시 +public class UserAuthInfo implements Serializable { private Long id; private String username; private String nickname; private Role role; + private String profileImage; + private String introduce; + private Gender gender; + private String phoneNumber; + private List interestType; public static UserAuthInfo from(User user) { - return new UserAuthInfo( - user.getId(), - user.getUsername(), - user.getNickname(), - user.getRole() - ); + return UserAuthInfo.builder() + .id(user.getId()) + .username(user.getUsername()) + .nickname(user.getNickname()) + .role(user.getRole()) + .profileImage(user.getProfileImage()) + .introduce(user.getIntroduce()) + .gender(user.getGender()) + .phoneNumber(user.getPhoneNumber()) + .interestType(user.getInterestType()) + .build(); } } \ No newline at end of file