diff --git a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/auth/service/AuthServiceImpl.java b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/auth/service/AuthServiceImpl.java index 7595999..db74caa 100644 --- a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/auth/service/AuthServiceImpl.java +++ b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/auth/service/AuthServiceImpl.java @@ -14,6 +14,7 @@ import com.tico.pomoro_do.domain.user.repository.SocialLoginRepository; import com.tico.pomoro_do.domain.user.repository.UserRepository; import com.tico.pomoro_do.domain.user.service.ImageService; +import com.tico.pomoro_do.domain.user.service.UserService; import com.tico.pomoro_do.global.auth.jwt.JWTUtil; import com.tico.pomoro_do.global.code.ErrorCode; import com.tico.pomoro_do.global.common.constants.CategoryConstants; @@ -46,6 +47,7 @@ public class AuthServiceImpl implements AuthService { private final JWTUtil jwtUtil; private final UserRepository userRepository; private final SocialLoginRepository socialLoginRepository; + private final UserService userService; private final TokenService tokenService; private final ImageService imageService; private final CategoryService categoryService; @@ -86,7 +88,7 @@ public TokenResponse googleLogin(String idTokenHeader, String deviceId) throws G // 구글 토큰 유효성 검증 GoogleUserInfo userInfo = verifyGoogleIdToken(idToken); // 회원 가입 여부 판단 -> 회원 가입 x -> 에러 발생 - validateUserExists(userInfo.getEmail()); + userService.validateEmailExists(userInfo.getEmail()); // 회원 가입되어 있으면 토큰 발급 return tokenService.createAuthTokens(userInfo.getEmail(), String.valueOf(UserRole.USER), deviceId); } @@ -104,7 +106,7 @@ public TokenResponse googleJoin(String idTokenHeader, String deviceId, String ni // 구글 id 토큰 검증 GoogleUserInfo userInfo = verifyGoogleIdToken(idToken); // 사용자의 이메일 중복 체크 - checkIfUserAlreadyRegistered(userInfo.getEmail()); + userService.isEmailRegistered(userInfo.getEmail()); // 알맞는 profileImage url 가져오기 (null 가능) String profileImageUrl = determineProfileImageUrl(imageType, profileImage, userInfo); @@ -138,30 +140,6 @@ private void joinValidateInputs(String deviceId, String nickname) { ValidationUtils.validateNickname(nickname); } - /** - * 사용자 등록 여부 확인 메서드 - * - * @param email 사용자 이메일 - */ - private void validateUserExists(String email) { - if (!userRepository.existsByEmail(email)) { - log.error("사용자 등록되지 않음: 이메일 = {}", email); - throw new CustomException(ErrorCode.USER_NOT_FOUND); - } - } - - /** - * 사용자가 이미 등록되어 있는지 확인합니다. - * - * @param email 사용자의 이메일 - */ - private void checkIfUserAlreadyRegistered(String email) { - if (userRepository.existsByEmail(email)) { - log.error("이미 등록된 사용자: 이메일 = {}", email); - throw new CustomException(ErrorCode.USER_ALREADY_REGISTERED); - } - } - /** * 프로필 이미지 URL을 결정합니다. * diff --git a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/entity/User.java b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/entity/User.java index 51e3627..53140d0 100644 --- a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/entity/User.java +++ b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/entity/User.java @@ -21,7 +21,7 @@ public class User extends BaseTimeEntity { private Long id; @Column(nullable = false, unique = true) - private String email; + private String email; // 소셜 로그인 제공자의 이메일 @Column(nullable = false, length = 10) private String nickname; diff --git a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/AdminService.java b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/AdminService.java index 17b121c..d204a0a 100644 --- a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/AdminService.java +++ b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/AdminService.java @@ -2,13 +2,27 @@ import com.tico.pomoro_do.domain.auth.dto.response.TokenResponse; import com.tico.pomoro_do.domain.user.dto.request.AdminRequest; +import com.tico.pomoro_do.global.exception.CustomException; import org.springframework.web.multipart.MultipartFile; public interface AdminService { - // 관리자 회원가입 + /** + * 관리자 회원가입 + * + * @param adminRequest AdminRequest 객체 + * @param profileImage 프로필 이미지 + * @return 성공 시 새 Access, Refresh 토큰을 포함하는 TokenResponse + * @throws CustomException 이메일 도메인이 유효하지 않거나 이미 등록된 사용자인 경우 예외를 던집니다. + */ TokenResponse adminJoin(AdminRequest adminRequest, MultipartFile profileImage); - // 관리자 로그인 + /** + * 관리자 로그인 + * + * @param adminRequest AdminRequest 객체 + * @return 성공 시 새 Access, Refresh 토큰을 포함하는 TokenResponse + * @throws CustomException 이메일 도메인이 유효하지 않거나 관리자가 아닌 경우 예외를 던집니다. + */ TokenResponse adminLogin(AdminRequest adminRequest); } diff --git a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/AdminServiceImpl.java b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/AdminServiceImpl.java index bf2ebcd..7780dba 100644 --- a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/AdminServiceImpl.java +++ b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/AdminServiceImpl.java @@ -25,21 +25,14 @@ @Slf4j public class AdminServiceImpl implements AdminService { - private final UserRepository userRepository; + private final UserService userService; private final AuthService authService; private final TokenService tokenService; private final ImageService imageService; private static final String ADMIN_EMAIL_DOMAIN = "pomorodo.shop"; - /** - * 관리자 회원가입 처리 - * - * @param adminRequest AdminRequest 객체 - * @param profileImage 프로필 이미지 - * @return 성공 시 새 Access, Refresh 토큰을 포함하는 TokenDTO - * @throws CustomException 이메일 도메인이 유효하지 않거나 이미 등록된 사용자인 경우 예외를 던집니다. - */ + // 관리자 회원가입 @Override @Transactional public TokenResponse adminJoin(AdminRequest adminRequest, MultipartFile profileImage) { @@ -51,7 +44,7 @@ public TokenResponse adminJoin(AdminRequest adminRequest, MultipartFile profileI // 관리자 회원가입 이메일 도메인 검증 validateAdminEmailDomain(domain); // 관리자 이메일 가입 여부 검증 - checkUserExistence(email); + userService.isEmailRegistered(email); // profileImage URL 가져오기 String profileImageUrl; @@ -72,13 +65,7 @@ public TokenResponse adminJoin(AdminRequest adminRequest, MultipartFile profileI return tokenService.createAuthTokens(email, String.valueOf(UserRole.ADMIN), deviceId); } - /** - * 관리자 로그인 처리 - * - * @param adminRequest AdminRequest 객체 - * @return 성공 시 새 Access, Refresh 토큰을 포함하는 TokenDTO - * @throws CustomException 이메일 도메인이 유효하지 않거나 관리자가 아닌 경우 예외를 던집니다. - */ + // 관리자 로그인 @Override @Transactional public TokenResponse adminLogin(AdminRequest adminRequest){ @@ -121,19 +108,6 @@ private void validateAdminEmailDomain(String domain) { } } - /** - * 사용자가 이미 존재하는지 확인 - * - * @param email 사용자 이메일 - * @throws CustomException 이미 등록된 사용자인 경우 예외 발생 - */ - private void checkUserExistence(String email) { - if (userRepository.existsByEmail(email)) { - log.error("이미 등록된 사용자: {}", email); - throw new CustomException(ErrorCode.USER_ALREADY_REGISTERED); - } - } - /** * 관리자 검증 * @@ -142,12 +116,8 @@ private void checkUserExistence(String email) { * @throws CustomException 사용자가 존재하지 않거나 관리자가 아닌 경우 예외 발생 */ private void validateAdminUser(String email, String nickname) { - Optional userData = userRepository.findByEmail(email); - if (userData.isEmpty()) { - log.error("사용자를 찾을 수 없음: {}", email); - throw new CustomException(ErrorCode.USER_NOT_FOUND); - } - User admin = userData.get(); + User admin = userService.findByEmail(email); + if (!admin.getRole().equals(UserRole.ADMIN)) { log.error("관리자 권한 없음: {}", email); throw new CustomException(ErrorCode.NOT_AN_ADMIN); diff --git a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/UserService.java b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/UserService.java index e6e6ca3..c2d8120 100644 --- a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/UserService.java +++ b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/UserService.java @@ -3,22 +3,38 @@ import com.tico.pomoro_do.domain.user.dto.response.FollowResponse; import com.tico.pomoro_do.domain.user.dto.response.UserDetailResponse; import com.tico.pomoro_do.domain.user.entity.User; +import com.tico.pomoro_do.global.exception.CustomException; public interface UserService { - // 내 정보 조회 - UserDetailResponse getMyDetail(String email); + // 사용자 아이디로 조회 + User findByUserId(Long userId); - // 유저 이름으로 조회 + // 사용자 이메일로 조회 User findByEmail(String email); - // 유저 아이디로 조회 - User findByUserId(Long userId); + // 내 정보 조회 + UserDetailResponse getMyDetail(String email); - // 특정 유저 조회 + // 특정 사용자 정보 조회 FollowResponse getUserDetail(String email, Long userId); // 유저 삭제 void deleteUser(String email, String deviceId, String refreshHeader); + /** + * 이메일을 통해 사용자가 이미 등록되어 있는지 확인 + * + * @param email 사용자 이메일 + * @throws CustomException 이미 등록된 사용자인 경우 예외를 던짐 + */ + void isEmailRegistered(String email); + + /** + * 이메일을 통해 사용자가 등록되어 있는지 검증 + * + * @param email 사용자 이메일 + * @throws CustomException 등록되지 않은 사용자일 경우 예외를 던짐 + */ + void validateEmailExists(String email); } diff --git a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/UserServiceImpl.java b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/UserServiceImpl.java index d97fc24..2df8353 100644 --- a/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/UserServiceImpl.java +++ b/backend/pomoro-do/src/main/java/com/tico/pomoro_do/domain/user/service/UserServiceImpl.java @@ -23,6 +23,24 @@ public class UserServiceImpl implements UserService{ final private FollowRepository followRepository; final private TokenService tokenService; + @Override + public User findByUserId(Long userId) { + return userRepository.findById(userId) + .orElseThrow(() -> { + log.error("사용자를 찾을 수 없음: {}", userId); + return new CustomException(ErrorCode.USER_NOT_FOUND); + }); + } + + @Override + public User findByEmail(String email) { + return userRepository.findByEmail(email) + .orElseThrow(() -> { + log.error("사용자를 찾을 수 없음: {}", email); + return new CustomException(ErrorCode.USER_NOT_FOUND); + }); + } + @Override public UserDetailResponse getMyDetail(String email) { User user = findByEmail(email); @@ -73,22 +91,21 @@ public void deleteUser(String email, String deviceId, String refreshHeader) { userRepository.deleteByEmail(email); } + // 이메일이 등록되어 있는 지 검증 @Override - public User findByEmail(String email) { - return userRepository.findByEmail(email) - .orElseThrow(() -> { - log.error("사용자를 찾을 수 없음: {}", email); - return new CustomException(ErrorCode.USER_NOT_FOUND); - }); + public void isEmailRegistered(String email) { + if (userRepository.existsByEmail(email)) { + log.error("이미 등록된 사용자: {}", email); + throw new CustomException(ErrorCode.USER_ALREADY_REGISTERED); + } } + // 이메일이 사용 가능한 지 검증 @Override - public User findByUserId(Long userId) { - return userRepository.findById(userId) - .orElseThrow(() -> { - log.error("사용자를 찾을 수 없음: {}", userId); - return new CustomException(ErrorCode.USER_NOT_FOUND); - }); + public void validateEmailExists(String email) { + if (!userRepository.existsByEmail(email)) { + log.error("등록되지 않은 사용자: 이메일 = {}", email); + throw new CustomException(ErrorCode.USER_NOT_FOUND); + } } - }