본문으로 바로가기
  • 코드리뷰
  • 커밋, 코드 컨벤션
  • 머신러닝 1주차
  • 코드리뷰하고 유지보수하며 커밋 코드컨벤션 연습하기
  • 깃에 커밋하기
  • 주말에 공부할 것 계획짜기

코드리뷰를 하면서 장고를 전체적으로 이해하는 시간을 가졌다. live share를 이용해서 팀원분들과 각자 주석을 달고 서로 설명하는 시간을 가졌는데 주석을 달아서 괜찮다고 생각한 점은 개발자가 어떤생각을 하면서 코드를 입력했는지 알 수 있어서 이해하는데 큰 도움이 되었고 공부도 되었다. 그리고 혼자서 봤을때 시간을 투자하면 내 코드로 만들 수 있어서 좋았다. 머신러닝 수업을 들었는데 흥미로웠다 선형회귀를 실습하는 시간을 가졌는데 금토일 연휴를 이용해서 조금 더 공부하고 싶다는 생각을 했다. 하지만 무엇보다 지금은 장고를 그중에서도 프론트가 아닌 백엔드, 데이터 베이스쪽 공부를 더 탄탄하게 해서 궁극적인 목표인 백엔드 개발자의 길을 걸어야 한다고 다시 다짐했다. 주말에 우선적으로 파이썬 복습과 장고 복습을 통해서 기본기를 다지고 준비가 된다면 알고리즘, 자구, 머신러닝을 공부할 예정이다.

오늘 공부한 것 중에 제일 의미있는 프로젝트 회고와 코드리뷰를 작성해볼까 한다.  또 유지보수를 하면서 내가 왜 이런코드를 작성했는지 이때 사용한 코드를 더 깔끔하게 할 수는 없을까 생각하면서 더 깊이 공부 할 수 있었다.

유저정보 업데이트 함수를 만들고 코드리뷰를 통해 더 나은 코드를 만들 수 있었다.

###user_update## 코드수정 전

@login_required
def update(request):
    # get 요청시 페이지를 보여준다.
    if request.method == 'GET':
        return render(request, 'user/update.html')
    elif request.method == 'POST':
        # 요청한 유저를 user로 정해준다.
        user = request.user
        bio = request.POST.get('bio')
        email = request.POST.get('email')
        username = request.POST.get('username')
        nickname = request.POST.get('nickname')
        # filter 를 활용해서 가져온 인스턴스와 입력한 인스턴스를 비교하는 변수를 만들어준다.
        exist_nickname = get_user_model().objects.filter(nickname=nickname)
        exist_username = get_user_model().objects.filter(username=username)
        # 닉네임은 중복이 불가한 컬럼이다. 회원정보 수정시 원래 닉네임과 같으면 변경이 안되는 걸 막기위한 코드다.

        # TODO
        if (exist_nickname and user.nickname == nickname) and (exist_username and user.username == username):
            user.nickname = nickname
            user.bio = bio
            user.email = email
            user.username = username
            user.save()
            return redirect('/', user.username)
        # 입력한 닉네임과 db에 저장되어있는 닉네임이 중복되고 내 닉네임과 다르다면 에러창을 띄운다.
        elif exist_nickname and user.nickname != nickname:
            return render(request, 'user/update.html', {'error': '이미 사용중인 nickname 입니다.'})
        elif exist_username and user.username != username:
            return render(request, 'user/update.html', {'error': '이미 사용중인 username 입니다.'})
        # 이게 있어야 하는지 의문이다.
        else:
            user.nickname = nickname
            user.bio = bio
            user.email = email
            user.username = username
            user.save()
            return redirect('/', user.username)
###user_update## 코드수정 후


@login_required
def update(request):
    # get 요청시 페이지를 보여준다.
    if request.method == 'GET':
        return render(request, 'user/update.html')
    elif request.method == 'POST':
        # 요청한 유저를 user로 정해준다.
        user = request.user
        bio = request.POST.get('bio')
        email = request.POST.get('email')
        username = request.POST.get('username')
        nickname = request.POST.get('nickname')
        # filter 를 활용해서 가져온 인스턴스와 입력한 인스턴스를 비교하는 변수를 만들어준다.
        exist_nickname = get_user_model().objects.filter(nickname=nickname)
        exist_username = get_user_model().objects.filter(username=username)
        # 닉네임은 중복이 불가한 컬럼이다. 회원정보 수정시 원래 닉네임과 같으면 변경이 안되는 걸 막기위한 코드다.

        # TODO
        # 입력한 닉네임과 db에 저장되어있는 닉네임이 중복되고 내 닉네임과 다르다면 에러창을 띄운다.
        if exist_nickname and user.nickname != nickname:
            return render(request, 'user/update.html', {'error': '이미 사용중인 nickname 입니다.'})
        elif exist_username and user.username != username:
            return render(request, 'user/update.html', {'error': '이미 사용중인 username 입니다.'})
        # 이게 있어야 하는지 의문이다.
        else:
            user.nickname = nickname
            user.bio = bio
            user.email = email
            user.username = username
            user.save()
            return redirect('/', user.username)

유저 업데이트 함수 수정 전 후 를 비교할 수 있다. 팀원끼리 정한 컨벤션인 #TODO 아래쪽을 보면 마지막의 else와 중복되는 부분이 있어서 불필요한 코드라고 생각을 했고 삭제 후 테스트를 통해서 마지막 else에서 저장을 해도 되는 것을 확인했다.

지워진 부분

        if (exist_nickname and user.nickname == nickname) and (exist_username and user.username == username):
            user.nickname = nickname
            user.bio = bio
            user.email = email
            user.username = username
            user.save()
            return redirect('/', user.username)

 

비밀번호 변경 함수를 만들어 보았다.

@login_required
def change_password(request):
    if request.method == "POST":
        # 요청유저 인식
        user = request.user
        origin_password = request.POST["origin_password"]
        #장고가 제공한 기능을 통해서 현재 비밀번호와 신규 비밀번호를 비교한다.
        if check_password(origin_password, user.password):
            new_password = request.POST["new_password"]
            confirm_password = request.POST["confirm_password"]
            #현재 비밀번호와 신규 비밀번호를 비교하고 현재 비밀번호와 신규 비밀번호 확인을 비교하여 오류를 띄워준다.
            if origin_password == confirm_password or new_password == origin_password:
                return render(request, 'user/change_password.html', {'error': '사용하고 있는 비밀번호를 입력하셨습니다.'})
            #새 비밀번호와 새 비밀번호 확인이 같아야 비밀번호를 저장한다.
            elif new_password == confirm_password:
                user.set_password(new_password)
                user.save()
                auth.login(request, user,
                           backend='django.contrib.auth.backends.ModelBackend')
                return redirect('/')
            else:
                return render(request, 'user/change_password.html', {'error': '신규 비밀번호와 신규 비밀번호 확인을 똑같이 입력해주세요.'})
        else:
            return render(request, 'user/change_password.html', {'error': '현재 비밀번호가 틀렸습니다.'})
    else:
        return render(request, 'user/change_password.html')

로그인 함수 이메일을 입력했을때 일치하는 이메일이 없다면 오류가 나는 것을 수정했다.

### 로그인 ###


def login(request):
    if request.method == 'GET':
        return render(request, 'user/login.html')
    elif request.method == 'POST':
        # 이메일 양식 체크
        check_email = re.compile(
            '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
        email = request.POST.get('email', None)
        password = request.POST.get('password', None)
        check_email = check_email.match(email)

        if check_email is None:
            return render(request, 'user/login.html', {'error': '이메일 양식이 올바르지 않습니다.'})

        # 입력란 빈칸일때
        if email == '':
            return render(request, 'user/login.html', {'error': '메일을 입력해주세요.'})
        elif password == '':
            return render(request, 'user/login.html', {'error': '패스워드를 입력해주세요.'})

        # 이미 존재하지 않는 이메일로 로그인을 시도했을때 에러 띄우기
        exist_email = get_user_model().objects.filter(email=email)
        if exist_email:
            pass
        else:
            return render(request, 'user/login.html', {'error': '유저 정보를 찾을 수 없습니다.'})
        username = UserModel.objects.get(email=email.lower()).username

        # User 인증 함수. 자격 증명이 유효한 경우 User 객체를, 그렇지 않은 경우 None을 반환
        user = auth.authenticate(request, username=username, password=password)
        if user is not None:
            auth.login(request, user)  # 로그인 처리
            user = request.user
            print(user.nickname, user, user.username)
            return redirect("/")
        else:
            print('로그인 실패')
            return render(request, 'user/login.html', {'error': '유저 정보를 찾을 수 없습니다.'})

        # 이미 존재하지 않는 이메일로 로그인을 시도했을때 에러 띄우기
        exist_email = get_user_model().objects.filter(email=email)
        if exist_email:
            pass
        else:
            return render(request, 'user/login.html', {'error': '유저 정보를 찾을 수 없습니다.'})
        username = UserModel.objects.get(email=email.lower()).username

코드를 추가하면서 에러가 나는 경우의 수를 처리해줬다.