[24.06.21] 내일배움캠프 46일차 JAVA TIL - 관심사 분리

2024. 6. 24. 10:00T.I.L

오늘 한 일

  • Web 강의 수강 - 스탠다드 실습반 (캐쉬)

 

 


오늘 팀 프로젝트를 진행하며, 튜터님의 피드백을 받았다.

기존의 회원가입은 authService에서 중복회원 여부를 체크하고, 어드민인지 유저인지 확인한 후 response body에 메시지까지 처리하도록 구현했다. 그 결과, 가독성이 매우 떨어지는 코드가 되었고 관심사 분리로 리팩토링 과정을 거치게 됐다.

기존 코드

public ResponseEntity<String> signup(SignupRequestDto request) {
        String userId = request.getUserId();
        String userName = request.getUserName();
        String password = passwordEncoder.encode(request.getPassword());
        String email = request.getEmail();
        String description = request.getDescription();
        String adminPassword = request.getAdminPassword();

        // 회원 아이디 중복 확인
        Optional<User> existingUser = userRepository.findByUserId(userId);
        if (existingUser.isPresent()) {
            throw new CustomException(USER_NOT_UNIQUE);
        }

        // 사용자 ROLE 기본 USER로 설정
        UserRoleEnum role = UserRoleEnum.USER;

        // adminPassword와 adminToken 비교하여 ADMIN 권한 설정
        if (adminPassword != null && adminPassword.equals(adminToken)) {
            role = UserRoleEnum.ADMIN;
        }

        // 사용자 등록
        User user = User.builder()
                .userId(userId)
                .userName(userName)
                .userPassword(password)
                .userEmail(email)
                .description(description)
                .authority(role)
                .build();

        // 유저 DB 생성
        userRepository.save(user);

        // 회원가입 성공 메시지 반환
        if (role == UserRoleEnum.ADMIN) {
            return ResponseEntity.status(HttpStatus.OK)
                    .body("어드민으로 회원가입이 성공적으로 완료되었습니다.");
        } else {
            return ResponseEntity.status(HttpStatus.OK)
                    .body("일반 사용자로 회원가입이 성공적으로 완료되었습니다.");
        }
    }

... 수정하고 보니 문제가 많은 코드인건 확실하다

 

깃허브 기록을 기반으로 설명하는거라, 코드를이미지로 대체한다.

빨간색이 빠진 코드, 초록색이 추가된 코드이다.

AuthController

기존에는 return값을 authService.signup으로 보내주었는데, service에서 생성된 유저의 권한을 반환받아 메시지를 컨트롤러에서 처리하도록 수정했다.

 

SignupResponseDto

 

authService -signup

기존 방식에서는 authService에서 UserRepository에 접근하여 바로 쿼리문을 사용했었는데, 해당 작업을 하는 메소드를

UserService에 public으로 만들어두고 UserService에 접근해서 가져오도록 수정했다.

 

UserService 일부

사용자 등록과 관련된 코드는 모두 UserService의 createUser에서 처리하도록 이동해줬다.

그 결과 44줄의 긴 코드가 18줄로 줄어들었다!

물론 코드의 길이만이 중요한건 아니지만, 관심사 분리로 가독성이 좋은 코드 탈바꿈했다.

수정 후 코드

public SignupResponseDto signup(SignupRequestDto request) {
        String userId = request.getUserId();
        String userName = request.getUserName();
        String password = encodePassword(request.getPassword());
        String email = request.getEmail();
        String description = request.getDescription();
        String adminPassword = request.getAdminPassword();

        // 회원 아이디 중복 확인
        userService.findByUserName(userId);

        // 사용자 ROLE 기본 USER로 설정
        UserRoleEnum authority = determineUserRole(adminPassword);

        // 사용자 등록
        User user = userService.createUser(userId, userName, password, email, description, authority); // user service

        return new SignupResponseDto(user);
    }

 

기존에는 코드가 잘 실행되는지, 원하는 기능을 수행하고 있는지가 1순위였는데

이제는 효율적인 코드를 짜기 위해 조금 더 많은 생각을 해야겠다!