✔️ Django 웹 개발
웹 사이트에 필요한 모델을 만들 때 처음부터 완벽하게 만들었다면 좋겠지만 개발을 하다 보면 뒤늦게 유효성을 추가하거나 검증해야 하는 경우들이 생긴다.
앞에서 배운 내용대로 유효성 검사를 할 수 있지만 문제는 기존에 저장되어 있던 데이터를 다시 유효성 작업에 맞추는 일이다.
이러한 작업은 실제 개발 상황에서 빈번하게 일어나곤 하는데 이 때 중요한 것은 기존 데이터의 유실을 최소화하면서 유효성을 맞추는 것이다.
이번에는 간단한 예시를 가지고 이러한 문제를 해결하는 과정을 배워보도록 하겠다.
우리가 작성한 포스트 웹 사이트이다.
그리고 랜덤한 포스트 하나를 보자면...
이 글을 보면 수정일이 작성일보다 더 과거에 만들어졌다고 표시되어 있다.
그러니까 글이 만들어진건 2020년인데 수정을 2000년에 했다고 되어 있습니다.
우리는 알아야할 것은 수정일은 작성일보다 나중에 되어야 하는데 지금 작성한 글을 과거에서 수정할 수 없기 때문이다.
이것은 우리가 django-seed 를 이용해서 아무 데이터나 생성을 하면서 발생한 오류이다.
한 번 이러한 부분들도 해결해보겠다.
먼저, 유효성 검증을 하는 부분에 &에 대한 검증을 추가해 주도록 하겠다.
우리 프로젝트로 돌아가서 validators.py 로 가서...
유효성을 검증하는 부분에 or 넣어주고 & 기호가 들어가면 안 된다는 로직을 추가해 주도록 해준다.
그리고 밑에 있는 문구도 약간 수정해준다.
그러면 이제 개발 서버를 실행해서 한번 확인해준다.
글쓰기를 누른다음에...
그리고 다음과 같이 작성해준다.
똑같이 작성하고 작성완료를 누르면...
그러면 이렇게 아래쪽에 에러 메시지가 잘 출력되는 것을 볼 수 있다.
새로 추가한 유효성 검증이 잘 수행되고 있는데 하지만 기존의 데이터들은 이미 데이터베이스에 저장이 되어있는 상태이기 때문에 이러한 유효성 검증을 수행하지 않았다.
기존 데이터들도 새로 추가된 유효성에 맞게 수정해 보겠다.
다시 VSCode 로 가서 파일 하나를 생성해준다.
posts 앱 안에 새로운 파일을 만들고 이름으로 validate_data.py 라고 지어준다.
이제 여기에 기존에 데이터를 새로 추가된 유효성에 맞춰주는 로직을 작성해보도록 하겠다.
우리가 할 작업들...
- 모든 포스트 데이터 가져오기
- 각각의 포스트 데이터를 보면서 내용 안에 &가 있는지 체크하기
- 만약 '&'가 있다면 해당 '&'를 삭제 처리해주기
- 데이터를 저장하기
먼저 모든 포스트의 데이터를 가져와본다.
다음에 이제 for 문을 이용해서 각각의 포스트를 반복해서 지금 가지고 있는 content 내용을 가져온 다음에 이제 &가 content 안에 있다면 콘솔에서 확인할 수 있도록 메시지를 하나 넣어주겠다.
for post in posts: 이렇게 해서 모든 게시글을 돌면서 if 문을 넣어준다.
만약에 & 기호가 content 에 있는지 확인해준다.
그리고 다음과 같이 코드를 작성해준다.
만약에 & 기호가 있다면 해당 '&'를 삭제해준다.
그리하 post.content 라는 변수에 replace 메서드를 사용해서 없애준다.
다음엔 데이터를 저장해야 하니까 post.save( ) 를 해준다.
그리가 전에 말했던 시간 정보도 처리해보겠다.
다시 if 문을 사용해서 코드를 완료해준다.
코드를 보면 만약에 생성일 이전에 수정일이라면 그러니까 생성일이 수정일이 이전이라면 이것은 말이 안되는 코드이다.
print 문과 save 를 해서 완성시켜준다.
이 코드를 들여 쓰기를 해주고 함수에 넣어준다.
이제 이 함수를 실행해주면 되는데 지금 코드를 보면 모델이나 ORM 등 django 의 기능을 이용해서 코드를 구현했다.
그러하기 때문에 이 함수를 직접 실행할려면 django 의 기능을 사용할 수 있는 환경이 닫혀진 곳에서 실행해야 한다.
가장 간단하게 사용할 수 있는 방법은 django 의 쉘을 사용하는 건데 한 번 확인해보자!
새로운 터미널을 켜서 다음과 같은 커맨드를 입력해준다.
python3 manage.py shell
그리고 직접 작성한 함수를 가져와본다.
from posts.validate_data import validate_post
그리고 밑에 있는 커맨드도 입력해주면...
validate_post()
이렇게 각각의 포스트를 돌며 데이터를 수정하게 된다.
그러면 개발 서버를 켜서 확인을 해준다.
먼저 쉘에서 나가고...
exit()
실행하고 아까전에 확인한 포스트를 다시 들어가보면...
수정일이 모두 현재 날짜로 들어가 있다는 것을 알 수 있다.
끝으로 :