250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- iterable
- gitignore
- WIL
- googlesheet
- python
- vscode
- 내일배움캠프
- 함수실행시간
- target
- 가상환경
- 함수성능평가
- AI 5기
- Display
- AI
- git #github #내일배움캠프
- with\
- itertools
- A태그
- 우선순위
- time()
- 알고리즘
- cte
- onClick
- venv
- position
- Iterator
- googleappscript
- sql
- Level1
- 프로그래머스
Archives
- Today
- Total
05의 개발 계발
[TIL] 230417 회원가입 조건 세분화하기 | if 본문
728x90
TIL 학습목표
- if 문을 활용해 원하는 경우을 분리할 수 있다.
- if 조건문을 활용해 회원가입 조건을 세분화 할 수 있다.
1) 문제점 (Problem)
지난주 진행하였던 Django 팀프로젝트에서 회원가입 시 프로필파일 업로드 용량제한 기능을 추가하는 과정에서
파일용량제한을 초과했다는 메세지가 나오지만, 회원가입이 되어버리는 issue가 발생했다.
회원가입 입력값
- 아이디*(필수)
- 비밀번호*(필수)
- 닉네임*(필수)
- 이메일*(필수)
- 프로필이미지(선택) - (500KB↓제한)
Case | Error msg | user 생성 | 작동 |
공란이 있을 경우 | 공란발생 메세지 | X | 정상작동 |
비밀번호가 불일치할 경우 | 비밀번호 불일치 메세지 | X | 정상작동 |
이미 존재하는 아이디일 경우 | 아이디 중복 메세지 | X | 정상작동 |
모두 기입하고, 이미지선택 안 할 경우 |
회원가입성공 | O | 정상작동 |
모두 기입하고, 500KB↓이미지선택 할 경우 |
회원가입성공 | O | 정상작동 |
모두 기입하고, 500KB↑이미지선택 할 경우 |
이미지 용량 초과 메세지 | X | msg는 나오나 user도 생성됨 |
2) 시도해본 것들 (Try)
▶기존코드리뷰
else:
# 유저계정생성하여 DB저장 ★<1>
user=UserModel.objects.create_user(
username=username, #아이디
password=password, #비밀번호
nickname=nickname, #닉네임
email=email, #이메일
)
# 유저 이미지 불러와서 파일시스템에 저장하기 ★<2>
user_img = request.FILES.get("user_img",None) # 이미지 업로드 받아오기
if user_img:
# 파일 크기가 500KB를 초과하는 경우 에러 발생 ★<3>
if user_img.size > 500 * 1024:
return render(
request,
"user/signup_detail.html",
{"error_message": "야레야레~ 500KB 이상은 버겁다구~"},
)
위 코드를 살펴보자.
★<1> : 먼저 유저계정을 생성하여 DB에 저장한 뒤,
★<2> : 이미지를 불러와서 저장하고,
★<3> : 이미지의 크기를 판별한다.
이 과정대로라면 당연히 이미지 크기를 판별하기 전에, DB에 유저계정이 생성되게 된다.
그래서 [ 파일용량제한을 초과했다는 메세지가 나오지만, 회원가입이 되어버리는 issue가 발생했다. ]
+전체코드
더보기
# 회원가입
def sign_up(request):
if request.method == "GET": # 회원가입 페이지를 눌렀을 때
return render(request, "user/signup.html")
elif request.method == "POST": # 회원가입정보 제출할 때
username = request.POST.get("username", None) # 회원 ID
password = request.POST.get("password", None) # 비밀번호
password2 = request.POST.get("password2", None) # 비밀번호 확인
nickname = request.POST.get("nickname", None) # 닉네임
email = request.POST.get("email", None) # 이메일
# 입력란이 모두 작성되어있다면 실행, 공란이 하나라도 있으면 else가 작동하여 에러메세지 출력
if username and password and password2 and nickname and email:
if password != password2:
return render(
request,
"user/signup.html",
{"error_message": "[비밀번호불일치!] 진정하고 천천히 다시써봐요 예?"},
)
else:
exist_user = get_user_model().objects.filter(username=username)
if exist_user:
# 중복된 ID라면 에러메세지 출력
return render(
request,
"user/signup.html",
{"error_message": "[중복 발견!] 이미 있는 ID입니다. 아시겠어요?"},
)
else:
# 유저계정생성하여 DB저장
user=UserModel.objects.create_user(
username=username, #아이디
password=password, #비밀번호
nickname=nickname, #닉네임
email=email, #이메일
)
# 유저 이미지 불러와서 파일시스템에 저장하기
user_img = request.FILES.get("user_img",None) # 이미지 업로드 받아오기
if user_img:
# 파일 크기가 500KB를 초과하는 경우 에러 발생
if user_img.size > 500 * 1024:
return render(
request,
"user/signup_detail.html",
{"error_message": "야레야레~ 500KB 이상은 버겁다구~"},
)
# 파일을 시스템에 저장 | FileSystemStorage | DB가 아닌 시스템으로 지정한 dir에 저장
storage = FileSystemStorage()
#
file_saved = storage.save(user_img.name, user_img)
# 저장한 파일의 경로를 url로 추출
uploaded_file_url = storage.url(file_saved)
# 신규 회원의 id 추출 후 업데이트
check = UserModel.objects.filter(id=user.id)
check.update(user_img=uploaded_file_url)
# 회원가입 성공시 로그인 페이지로 이동
return redirect("sign-in")
# 공란이 하나라도 있으면 else가 작동하여 에러메세지 출력
else:
return render(
request,
"user/signup.html",
{"error_message": "[빈칸 발견!] 공란이 빤히 보이는데, 미치셨어요?"},
)
▶조건문 위치 변경 및 추가
user_img = request.FILES.get("user_img",None) # 이미지 업로드 받아오기 ★<1>
...
...
else:
# 500KB 보다 큰 파일을 업로드한다면 경고메세지
if user_img and user_img.size > 500 * 1024: #★<2>
return render(
request,
"user/signup.html",
{"error_message": "[용량 초과!] 야레야레~ 500KB 이상은 버겁다구~"},
)
else:
# 유저계정생성하여 DB저장 ★<3>
user=UserModel.objects.create_user(
username=username, #아이디
password=password, #비밀번호
nickname=nickname, #닉네임
email=email, #이메일
)
...
...
...
위 처럼 코드의 순서와 조건문을 고쳐보았다.
★<1> : 먼저 이미지를 불러와서 저장하고,
★<2> : 이미지가 존재하면서 크기가 크다면 에러메세지를 주도록 하고,
★<3> : 아니라면 유저계정을 생성하여 DB에 저장한다
이 과정대로라면 ★<3>에는
이미지 선택이 없을 때 + 이미지 크기가 500KB↓일 때 만
모두 해당되어 DB에 유저계정이 생성되게 된다.
+전체코드
더보기
# ============================= 회원가입 =============================
def sign_up(request):
if request.method == "GET": # 회원가입 페이지를 눌렀을 때
return render(request, "user/signup.html")
elif request.method == "POST": # 회원가입정보 제출할 때
username = request.POST.get("username", None) # 회원 ID
password = request.POST.get("password", None) # 비밀번호
password2 = request.POST.get("password2", None) # 비밀번호 확인
nickname = request.POST.get("nickname", None) # 닉네임
email = request.POST.get("email", None) # 이메일
user_img = request.FILES.get("user_img",None) # 이미지 업로드 받아오기
# 입력란이 모두 작성되어있다면 실행, 공란이 하나라도 있으면 else가 작동하여 에러메세지 출력
if username and password and password2 and nickname and email:
if password != password2:
return render(
request,
"user/signup.html",
{"error_message": "[비밀번호불일치!] 진정하고 천천히 다시써봐요 예?"},
)
else:
exist_user = get_user_model().objects.filter(username=username)
if exist_user:
# 중복된 ID라면 에러메세지 출력
return render(
request,
"user/signup.html",
{"error_message": "[중복 발견!] 이미 있는 ID입니다. 아시겠어요?"},
)
else:
# 500KB 보다 큰 파일을 업로드한다면 경고메세지
if user_img and user_img.size > 500 * 1024:
return render(
request,
"user/signup.html",
{"error_message": "[용량 초과!] 야레야레~ 500KB 이상은 버겁다구~"},
)
else:
# 유저계정생성하여 DB저장
user=UserModel.objects.create_user(
username=username, #아이디
password=password, #비밀번호
nickname=nickname, #닉네임
email=email, #이메일
)
if user_img:
# 파일을 시스템에 저장 | FileSystemStorage | DB가 아닌 시스템으로 지정한 dir에 저장
storage = FileSystemStorage() #실제로 이미지 파일이 저장되는 것
#
file_saved = storage.save(user_img.name, user_img)
# 저장한 파일의 경로를 url로 추출
uploaded_file_url = storage.url(file_saved)
# 신규 회원의 id 추출 후 업데이트
check = UserModel.objects.filter(id=user.id)
check.update(user_img=uploaded_file_url)
# 회원가입 성공시 로그인 페이지로 이동
return redirect("sign-in")
# 공란이 하나라도 있으면 else가 작동하여 에러메세지 출력
else:
return render(
request,
"user/signup.html",
{"error_message": "[빈칸 발견!] 공란이 빤히 보이는데, 미치셨어요?"},
)
3) 해결 (Solution)
if 문의 구조와 순서를 변경함으로써 해결
# ============================= 회원가입 =============================
def sign_up(request):
if request.method == "GET": # 회원가입 페이지를 눌렀을 때
return render(request, "user/signup.html")
elif request.method == "POST": # 회원가입정보 제출할 때
username = request.POST.get("username", None) # 회원 ID
password = request.POST.get("password", None) # 비밀번호
password2 = request.POST.get("password2", None) # 비밀번호 확인
nickname = request.POST.get("nickname", None) # 닉네임
email = request.POST.get("email", None) # 이메일
user_img = request.FILES.get("user_img",None) # 이미지 업로드 받아오기
# 입력란이 모두 작성되어있다면 실행, 공란이 하나라도 있으면 else가 작동하여 에러메세지 출력
if username and password and password2 and nickname and email:
if password != password2:
return render(
request,
"user/signup.html",
{"error_message": "[비밀번호불일치!] 진정하고 천천히 다시써봐요 예?"},
)
else:
exist_user = get_user_model().objects.filter(username=username)
if exist_user:
# 중복된 ID라면 회원가입창으로 돌아가기
# 영오: 이미 있는 ID입니다. 새로 지정해주세요. 메세지 떠야합니다.
return render(
request,
"user/signup.html",
{"error_message": "[중복 발견!] 이미 있는 ID입니다. 아시겠어요?"},
)
else:
# 500KB 보다 큰 파일을 업로드한다면 경고메세지
if user_img and user_img.size > 500 * 1024:
return render(
request,
"user/signup.html",
{"error_message": "[용량 초과!] 야레야레~ 500KB 이상은 버겁다구~"},
)
else:
# 유저계정생성하여 DB저장
user=UserModel.objects.create_user(
username=username, #아이디
password=password, #비밀번호
nickname=nickname, #닉네임
email=email, #이메일
)
if user_img:
# 파일을 시스템에 저장 | FileSystemStorage | DB가 아닌 시스템으로 지정한 dir에 저장
storage = FileSystemStorage() #실제로 이미지 파일이 저장되는 것
#
file_saved = storage.save(user_img.name, user_img)
# 저장한 파일의 경로를 url로 추출
uploaded_file_url = storage.url(file_saved)
# 신규 회원의 id 추출 후 업데이트
check = UserModel.objects.filter(id=user.id)
check.update(user_img=uploaded_file_url)
# 회원가입 성공시 로그인 페이지로 이동
return redirect("sign-in")
# 공란이 하나라도 있으면 else가 작동하여 에러메세지 출력
else:
return render(
request,
"user/signup.html",
{"error_message": "[빈칸 발견!] 공란이 빤히 보이는데, 미치셨어요?"},
)
4) 알게 된 점 (Learnd)
코드리뷰가 참 중요함을 느끼게 되었다.
알고리즘을 풀고, 다른 사람들의 코드를 보며 코드 보는 눈을 길러두었던게 큰 도움이 되었던 것 같다.
그리고 주석을 달면서 논리의 흐름을 기록하는 것이 제법 적응되었다.
하지만 앞으로는 필요한 주석만 작성할 수도 있도록 연습해야겠다.
728x90
'TIL' 카테고리의 다른 글
[TIL] 230419 coroutine & asyncio | pipenv & poetry (0) | 2023.04.20 |
---|---|
[TIL] 230418 데이터 타입별 메서드 + 프로세스, 스레드 (0) | 2023.04.18 |
[TIL] 230407 [Python] [Django] Secret_Key 를 gitignore하기 (0) | 2023.04.07 |
[TIL] 230406 메소드(method)의 종류 (인스턴스 / 정적 / 클래스) (1) | 2023.04.06 |
[TIL] 230405 [Python] [Django] VScode에서 설치 및 세팅하기 (1) | 2023.04.05 |