UserService refactoring

권희·2025년 9월 5일

졸업작품

목록 보기
1/7

방학 기간이 끝나고 졸작을 진행하기로 했다.
이전 프로젝트에서 배운 모듈화와 의존성관리를 위해서 가장 많이 사용되고 제일 오래된 UserServuce 부분 부터 refactoring을 진행하였다.

목차

  1. LoginService, UserService 병합
  2. TestCode 작성
  3. 추가 수정 부분

1. UserService, LoginService 병합

진행 이유

가장 많은 service에서 의존성을 가질 UserService의 경량화와 db참조를 줄이기 위해 프로젝트 설계 과정에서 UserService와 LoginService 분리, UserEntity와 UserDetailEntity를 분리했었다.
하지만 UserDetailsEntity와 UserService를 혼용하게 되었고 중복된 코드(repo에서 정보를 가져오는 코드 중복)가 존재해서 병합을 고려하게되었다.

이전 상황


login, 회원가입 부분에서만 UserDetailEntity와 LoginService에 의존하고 나머지 기능들에서는 UserEntity와 UserService에만 의존하기 위함이였다.

LoginService

	social login(RequestUserCreateDto)
    register(RequestUserCreateDto, ArrayList<Path> imgPath)
    login(RequestUserLoginDto)
    checkEmailAndNickNameElseThrow(String email, String nickName)
    checkEmailIsNotExist(String eamil)
    checkNickNameIsNotExist(String nickName)

UserService

	updateUserInfo
    updateUserPassword
    updateUserImg

목표 : Service 코드 병합

UserService

	login(RequestEmailLoginDto)
    register(RequestUserCreateDto, ArrayList<Path> imgPath)

    socialLogin(RequestUserCreateDto)

    updateUserInfo
    updateUserPassword
    updateUserImg

    checkEmailIsNotExist
    checkNickNameIsNotExist

    private checkEmailAndNickName (미정)

결과 : 병합하지 않음, UserDao 생성

다른 Service 부분에서 빈번하게 사용할 UserService를 무겁게 만들면서 까지 병합할 이유가 없었다. 또한 함수들을 정리해서 보니 생각보다 잘 구분되어있고 Login과 User부분을 구분한 의도가 잘 지켜진 것 같다.

가장 큰 이유였던 LoginService와 UserService의 중복 코드들만 따로 UserDao class를 만들어 따로 분리하고 LoginService와 UserService가 UserDao를 의존하는 구조가 제일 좋을 것 같았다.

UserDao

	UserEntity getUserInfo(Long userId)
    Optional<UserDetailEntity> findBySocialProviderAndSocialId(String socialProvider, String socialId)
    void checkEmailAndNickNameElseThrow(String email, String nickName)
    boolean checkEmailIsNotExist(String email)
    boolean checkNickNameIsNotExist(String nickName)

결론

LoginService와 UserService가 더 이상 서로를 의존하지 않고 UserService가 충분히 경령화되어있음으로 refactoring을 종료한다.

2. TestCode 작성

UserService

	UserEntity updateUserInfo(RequestUpdateUserInfoDto dto, HttpServletRequest request, HttpServletResponse response)
    void updateUserPassword(RequestUpdatePasswordDto dto)
    UserEntity updateUserImg(Long userId, MultipartFile img, ArrayList<Path> imgPaths)

위 3가지 함수에 대해서 Test Code를 작성하였다(TestCode 작성방법은 나중에 다시 정리)
각 함수당 TestCode 함수가 여러개 필요했고 한개의 UserServiceTest.class에 몰아두기에는 많다고 판단했다.

UserService(package)를 두고 UpdateUserInfoTest.class, UpdateUserPasswordTest.class, UpdateUserImgTest.class 3개를 두었다가 비교적 적은 2개를 병합했다

다음 LoginService TestCode를 작성해야한다.

3. 추가 수정 부분

이후에 추가로 refactoring을 할일이 발생했을 때 고려사항들

1. UserDao를 통해 UserEntity, UserDetailEntity crud기능 통합

위의 refactoring을 통해 UserDao를 만들었고 UserService와 LoginService에서 UserEntity, UserDetailEntity를 조회하는 함수를 통일화했다. 조회말고 save, update, delete 함수들 또한 통합할 필요학 아직 남아있다.

profile
나의 개발 기록

1개의 댓글

comment-user-thumbnail
2025년 9월 5일

멍청한 이권희

답글 달기