Skip to content

Commit

Permalink
[REFACTOR] AuthService 중복 함수 제거
Browse files Browse the repository at this point in the history
Related to: TICO-372, TICO-378
  • Loading branch information
bu119 committed Feb 6, 2025
1 parent fba2c31 commit cfe1456
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand All @@ -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);
Expand Down Expand Up @@ -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을 결정합니다.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -51,7 +44,7 @@ public TokenResponse adminJoin(AdminRequest adminRequest, MultipartFile profileI
// 관리자 회원가입 이메일 도메인 검증
validateAdminEmailDomain(domain);
// 관리자 이메일 가입 여부 검증
checkUserExistence(email);
userService.isEmailRegistered(email);

// profileImage URL 가져오기
String profileImageUrl;
Expand All @@ -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){
Expand Down Expand Up @@ -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);
}
}

/**
* 관리자 검증
*
Expand All @@ -142,12 +116,8 @@ private void checkUserExistence(String email) {
* @throws CustomException 사용자가 존재하지 않거나 관리자가 아닌 경우 예외 발생
*/
private void validateAdminUser(String email, String nickname) {
Optional<User> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
}

}

0 comments on commit cfe1456

Please sign in to comment.