23/11/08 TIL vi 편집기 명령어(:set paste)

김민재·2023년 11월 8일
0


Vim(vi) 편집기로 소스 코드 등을 복사하여 붙여 넣을 때 들여 쓰기로 인해 개행, code format이 엉망이 되는 경우가 있어서 해결방법을 찾아봤다.
편집기에서 :set 명령어로 현재 vim의 모드를 확인할 수 있다.

계단 현상이 발생할 때, set paste 명령으로 붙여 넣기 모드를 활성화한 후 코드를 붙여 넣으면 들여 쓰기 원본 형식을 유지하면서 소스를 붙여 넣을 수 있다. 반대로 다시 비활성화 할 때는
:set nopaste 명령어를 입력하면 된다.


프로젝트 오류 해결과정


우선 코드의 구조는 이런데, 필드에 대해선 간략하게 설명하자면 처음에는 레시피 게시글 필드에 식재료 값이 저장되는 형태로 생각했으나 데이터베이스에 저장하는 형태나 프론트에 넘겨주는 걸 고려해 각 레시피_id를 FK로 갖는 ingredient 필드를 따로 생성해줬다. 다만, url에서 article_recipe_id 값과 article_recipe_ingredients_id 값을 받아오는 형태로 레시피의 재료를 삭제하는 url은 "recipe/<int:article_recipe_id>/ingredients/<int:article_recipe_ingredients_id>/" 다음과 같다.
이런 식으로 진행이 되면 예를 들어 (id=1)인 레시피에 식재료가 2개 저장이 되어있고(식재료 id=1,2) 이를 모두 1번 유저가 작성했다고 하고 2번 유저가 이제 2번 레시피를 작성해 식재료를 하나 넣었는데 잘못 작성한 상황이라고 가정한다.
그렇다면 유저가 "recipe/2/ingredients/3/"이라는 url로 가게 될 것인데(수정이나 삭제버튼을 눌렀을때) 코드 아래의 유효성 검사는 문제 없이 작동해 2번 유저가 작성한 레시피의 식재료를 수정,삭제하는데 아무런 문제가 없을 것이다. 그런데 2번 유저가 어떠한 의도가 되었던 "recipe/2/ingredients/1/"이라는 url로 갔을때가 문제가 되는데, (id=1)인 ingredients는 1번 유저가 작성한 레시피의 식재료이기때문에 의도대로라면 삭제나 수정이 불가해야 하는데(2번 레시피의 식재료가 아니라고 불러오는 것 포함), 코드 5번째 줄의 recipe_ingredients라는 변수에서 (id=article_recipe_ingredients_id)인 식재료를 get_object_or_404라는 함수로 불러와주고 있기 때문에 예의 문제가 되는 url("recipe/2/ingredients/1/")은 1번 id값을 갖는 식재료를 ArticleRecipeIngredients 클래스(models.py)에서 그대로 가져올 것이고 유효성 검사도 (id=2)인 게시글이 2번 유저기 때문에 문제없이 넘어가서 그대로 수정,삭제가 가능한 상황이다.
그래서 식재료를 url에서 받아오는 id값에만 맞춰 get하는 것이 아니라, 뭔가 한 번 더 제한을 줘야 할 것 같다고 생각이 들어서 recipe_ingredients 변수를 아래와 같이 수정해줬다.

recipe_ingredients = recipe.recipe_ingredients.get(
            id=article_recipe_ingredients_id)
        print(recipe_ingredients.ingredients)

바로 위의 변수 recipe는 url에서 찍히는 id값의 레시피를 가져오는 의도대로 잘 작동하고 있었기에 그렇게 가져온 recipe 모델의 field값에는 recipe_ingredients가 없기 때문에 recipe_id를 fk로 가지는 식재료 모델에서 정의해준 related_name에 따라 recipe가 식재료를 역참조해줘서 그 레시피가 가지고 있는 식재료만을 가지고 오게 해줬다. 그래서 예의 문제코드에서는 2번 레시피는 1번 식재료를 가지고 있지 않기 때문에 get함수에서 오류를 발생시켜주게 된다. 처음에는 all방식으로 가져오는 것도 해봤으나 그 방식은 따로 id값을 지정해줄 수 없어서 다음과 같은 형태로 바꿨는데 어차피 식재료도 하나씩 수정,삭제하는 형태라 괜찮지 않을까 싶다.

다만 회의 과정에서 식재료 관련한 url이 수정이 필요할 것 같단 의견이 나와서 최종코드에는 기록되지 않을수도?

0개의 댓글