응집성에 신경을 쓰자

Jin·2022년 7월 21일

이것은 TIL레포지토리에 남기자.

이전 코드

@Service
@Transactional
class RegistrationService(
    private val userRepository: UserRepository,
    private val jwtUtil: JwtUtil,
) {
    fun signup(name: String, email: String, password: String): SignupResultDto {
        if (userRepository.findByEmail(email) != null) {
            throw SignupFailed()
        }

        val id = userRepository.generateId()

        val user = User(
            id = id,
            name = name,
            email = email,
            encodedPassword = argonUtil.encodePassword(password),
            createdAt = Clock.System.now().toLocalDateTime(TimeZone.UTC),
        )

        userRepository.save(user)

        val accessToken = jwtUtil.encode(userId = user.id)

        return SignupResultDto(
            accessToken = accessToken,
            user = UserDto(
                id = user.id,
                name = user.name,
            ),
        )
    }
}
  • 하는 일의 추상화 레벨이 맞지 않는다.
  • 해킹을 하는 듯이 보인다.

바뀐코드

@Service
@Transactional
class SignupInteractor(
    private val userRepository: UserRepository,
    private val jwtUtil: JwtUtil,
) {
    fun signup(signupDto: SignupDto): SignupResultDto {
        val user = createUser(
            name = signupDto.name,
            email = signupDto.email,
            password = signupDto.password,
        )

        val accessToken = createAccessToken(user = user)

        return SignupResultDto(
            accessToken = accessToken,
            user = UserDto(
                id = user.id,
                name = user.name,
            ),
        )
    }

    private fun createUser(
        name: String,
        email: String,
        password: String,
    ): User {
        if (!userRepository.exists(email = email)) {
            throw AlreadyExistingUser()
        }

        val user = User.create(
            repository = userRepository,
            name = name,
            email = email,
            password = password
        )

        return user
    }

    private fun createAccessToken(user: User): String {
        return jwtUtil.encode(userId = user.id)
    }
}
  • 사용자 생성 부분과 AccessToken을 생성하는 별도의 관심사가 각각의 응집성을 지닌 단위로 분리되었다. (이 원칙을 기억해야 함.)

<span> 을 활용하는 올바른 방법

0개의 댓글