코딩 나도 할 수 있다!!

2024.06.21 (금) 복습 과제 코드 수정

혹시나도? 2024. 6. 21. 17:49

기본 CRUD에서 살을 붙여보기로 했다

 

 

회원가입에 사용되는 request는 이렇다

data class SignUpRequest(
    @field:Pattern(
        regexp = "^[a-z0-9]{3,9}+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+\$",
        message = "@ 앞의 문자열이 최소 3자이상, 9자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성된 이메일이어야 합니다."
    )
    val email: String,

    @field:Pattern(
        regexp = "^[a-zA-Z0-9]{3,}\$\n",
        message = "닉네임은 최소 3자 이상, 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 합니다"
    )
    val name: String,

    @field:Pattern(
        regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[^\\w\\s]).{4,15}$",
        message = "최소 4자 이상, 15자 이하이며 알파벳 대소문자, 숫자, 그리고 특수문자를 포함해야 합니다"
    )
    val password: String,

    @field:Pattern(
        regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[^\\w\\s]).{4,15}$",
        message = "최소 4자 이상, 15자 이하이며 알파벳 대소문자, 숫자, 그리고 특수문자를 포함해야 합니다"
    )
    val passwordCheck: String,

    val role: String
)

정규식을 사용하여 조건을 걸어두었다

이 부분을 하기 위해 정규식을 찾아보았는데 사실 외워서는 못할 것 같다

 

그리고 Service 부분이다

fun signUp(request: SignUpRequest): SignUpResponse {
    if (memberRepository.existsByEmail(request.email)) {
        throw RuntimeException("")
    }
    if (request.name in request.password) throw IllegalArgumentException("비밀번호에 사용자 이름을 사용할 수 없습니다. 다른 비밀번호를 선택해 주세요.")
    if (request.password != request.passwordCheck) throw IllegalArgumentException("비밀번호 불일치")

    return memberRepository.save(
        Member(
            email = request.email,
            password = passwordEncoder.encode(request.password),
            name = request.name,
            role = when (request.role) {
                "ADMIN" -> Role.ADMIN
                "GENERAL" -> Role.GENERAL
                else -> throw IllegalArgumentException("Invalid Id")
            }
        )
    ).toSignUpResponse()
}

if 문을 사용하여 memberRepository에 request.email이 존재한다면 exception이 발생된다
exception은 나중에 수정할 예정이다
다음도 if 문을 사용하여 rest.name이 request.password 안에 들어가 있으면
비밀번호에 사용자 이름을 사용할 수 없습니다. 다른 비밀번호를 선택해 주세요라는 exception이 발생된다
그리고 다시 if 문을 사용하여 request.password와 request.passwordCheck 가 다르면 비밀번호 불일치라는 exception이 발생된다

 

이 부분을 같이 공부하는 팀원이 알려주었다

처음에는 이상하게 알 수 없는 코드로 시도해 보았다 

도저히 모르겠어 팀원에게 도움을 청했다

 

생각보다 쉽게 해답이 나왔다

역시 나는 아직 부족한 게 맞다

 

여기에서 빠진 부분이 있는데 

중복된 닉네임을 걸러내야 하는 작업이 빠져있다

이 부분은 위에서 사용한 코드를 살짝 변형해서 사용할 수 있을 것 같다

 

다음은 Post 부분을 수정해 보았다

@Transactional
fun updatePost(postId: Long, request: UpdatePostRequest, memberPrincipal: MemberPrincipal): PostResponse {
    val result = postRepository.findByIdOrNull(postId) ?: throw ModelNotFoundException("Post", postId)

    if(result.member.id != memberPrincipal.id) throw IllegalArgumentException("회원 ID가 인증된 사용자 ID와 일치하지 않습니다.")


    result.title = request.title
    result.content = request.content
    return postRepository.save(result).toPostResponse()
}

@Transactional
fun deletePost(postId: Long, memberPrincipal: MemberPrincipal) {
    val result = postRepository.findByIdOrNull(postId) ?: throw ModelNotFoundException("Post", postId)
    if(result.member.id != memberPrincipal.id) throw IllegalArgumentException("권한이 없는 사용자입니다.")
    return postRepository.delete(result)
}

여기에도 위에서 회원가입에 사용한 코드를 살짝 바꿔 사용하였다

updatePost 부분에
result.member.id가 memberPrincipal.id 랑 같지 않으면
회원 ID가 인증된 사용자 ID와 일치하지 않습니다.라는 exception이 발생된다
ID가 일치하면 title과 content가 업데이트되고
그걸 Post에 저장하고 toPostResponse를 호출하여 PostResponse 객체로 변환한다

 

deletePost 부분도 비슷하다

현재 인증된 사용자 ID와 작성자 ID를 비교하여 이 글을 본인이 작성했는지 확인을 한다

확인이 되었으면 게시글을 삭제한다

 

오늘은 이렇게 코드를 수정해 보았다
어제 그렇게 엉망진창인 코드를 짜다 오늘 대부분 내가 알고 있는 것들로 코드를 짜니 더 깔끔해졌다
왜 처음부터 이렇게 하지 않았을까라는 생각도 들었다
아는 지식에서 새로운 지식들을 하나씩 쌓아야 했는데 많은 지식들을 한 번에 쌓으려고 하니 탈이 난 거다
더 겸손한 마음으로 배움에 임해야겠다