USER ๋ถ„๋ฆฌ

ํ™ฉ์—ฐ์ค€ยท2024๋…„ 7์›” 22์ผ

Lambda Service ๋ฐฑ์—”๋“œ ์ธํ„ด

๋ชฉ๋ก ๋ณด๊ธฐ
6/9

์™œ?

๊ธฐ์กด์—๋Š” ์„ ์ƒ๋‹˜ user๋งŒ ์กด์žฌํ•˜์˜€๋‹ค.
ํ•˜์ง€๋งŒ ํ•™์ƒ๋„ user์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ์ƒ๊ฒผ๋‹ค. (for B2C and B2B2C)

Django User

from django.contrib.auth.models import User

๊ธฐ์กด์— ์‚ฌ์šฉํ–ˆ๋˜ User์ด๋‹ค.

User class๋Š” ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ,
is_staff๋Š” django admin๊ถŒํ•œ (superuser๋กœ ์ƒ์„ฑํ•˜๋ฉด True์ด๋‹ค)
is_active๋Š” ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ID๋ฅผ ๋น„ํ™œ์„ฑํ™” (์ง€์†๋˜๋ฉด ์ œ๊ฑฐ)
is_superuser๋Š” ๋ชจ๋“  ๊ถŒํ•œ์„ ๊ฐ€์ง„ flag๋ฅผ ๋œปํ•œ๋‹ค.

๐Ÿ˜‚๋”ฐ๋ผ์„œ student user๋ฅผ ๊ตฌ๋ถ„์ง“๊ธฐ ์œ„ํ•œ flag๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค!!!
(์œ„์— ์žˆ๋Š” flag๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜ user๊ฐ€ ๊ถŒํ•œ์„ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฐ–๊ฒŒ ๋œ๋‹ค)

ํ•ด๊ฒฐ์ฑ… : USER ๋ถ„๋ฆฌ (teacher, student)

  • profile์„ ๋งŒ๋“ค์–ด User์™€ is_student boolean flag๋ฅผ ๊ฐ€์ง„ table์ด OneToOne๊ด€๊ณ„๋ฅผ ๊ฐ–๊ฒŒํ•œ๋‹ค.

    ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ๊ฒฐ๊ตญ ๋‚˜์ค‘์—๋Š” student๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” page์™€ teacher์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” page(url)๋ฅผ ๊ตฌ๋ถ„์‹œ์ผœ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด app์„ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •!!

    python manage.py startapp teacher
  • User๋Š” teacher๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค. ๊ธฐ์กด์— ์žˆ๋Š” database์— ํ•˜๋‚˜์”ฉ ์ˆ˜์ž‘์—…์œผ๋กœ relation์— ๋งž๊ฒŒ๋” ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

    ๋”์ฐํ•˜๋‹ค. database ์–ด๋А์ •๋„ ์ง€์›Œ์ฃผ๊ณ  ์‹œ์ž‘ํ•˜์ž(๊ฒฐ๊ตญ ๋‹ค์ง€์›€)

  • ๐Ÿ”‘User๋ฅผ Root๋กœ ํ•˜๊ณ  teacher ์™€ student ํ…Œ์ด๋ธ”๋ผ๋ฆฌ ๊ด€๊ณ„๋ฅผ ๊ฐ–๊ฒŒ ํ•˜์˜€๋‹ค.
    ROOT <-> teacher OneToOne
    ROOT <-> student OneToOne
    teacher -> student OneToMany (์„ ์ƒ๋‹˜์€ ๋งŽ์€ ํ•™์ƒ์„ ํ•œ๋ฒˆ์— ๊ฐ€๋ฅด์นœ๋‹ค๋Š” ๊ฐ€์ •)

student/models.py

teacher/models.py

์œ„ 2๊ฐ€์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  migrate ๊ณผ์ •

  • python manage.py makemigrations

  • python manage.py migrate

teacher์— ๊ธฐ์กด์˜ student url ๋ถ€๋ถ„์„ copy and paste ํ•ด์คŒ์œผ๋กœ์จ teacher์ด ์‚ฌ์šฉํ•  ํŽ˜์ด์ง€๋Š” ์™„์„ฑ๋˜์—ˆ๋‹ค.

๐Ÿคฃ์ค‘๊ฐ„์— ์ž๊พธ error๊ฐ€ ๋‚˜์„œ database์ƒ์˜ user๋“ค์„ ๋‹ค ์ง€์›Œ์คฌ๋‹ค.
์•„๋งˆ ๊ด€๊ณ„๊ฐ€ ์„œ๋กœ ๊ผฌ์ด๋ฉด์„œ ์ƒ๊ธด error์ธ ๊ฒƒ ๊ฐ™๋‹ค.

Front ๋‹จ์˜ End point๋„ /student์—์„œ /teacher๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

๐ŸฅฒVS code์—์„œ๋Š” Pycharm๊ณผ ctrl + s๋กœ ์ „์ฒด ์ €์žฅ์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ „์ฒด์ €์žฅ์ธ ctrl + shift + s๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.. (๋‰ด๋น„ ์‹ค์ˆ˜)

์—ฌ์ „ํžˆ Error๊ฐ€ ์กด์žฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Pycharm Debugging ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ฐพ์•„๋ณด์•˜๋‹ค.

user/views.py ์—์„œ ํšŒ์›๊ฐ€์ž… ํ•  ๋•Œ teacher์™€์˜ relationship์— ๊ด€ํ•œ ๋ฌธ์ œ์˜€๋‹ค. ๋”ฐ๋ผ์„œ, ํšŒ์›๊ฐ€์ž… ํ•  ๋•Œ ์ž๋™์œผ๋กœ teacher์—๋„ ์ƒ์„ฑํ•˜๊ฒŒ๋” ํ•ด์ฃผ์—ˆ๋‹ค.

serializer์— front์—์„œ ๋ณด๋‚ด๋Š” request.data ( username, email, password )๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.seralizer.save()๋ฅผ ํ†ตํ•ด ์ง๋ ฌํ™”๋œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋ฉด user.id๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ serializer.instance๋ฅผ ํ†ตํ•ด teacher.id = user.id ๊ฐ€ ๋˜๊ฒŒ๋” ํ•ด์ฃผ๊ณ  teacher.name ์€ user.username์ด๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.

ํ•™์ƒ ์ƒ์„ฑ

teacher๊ฐ€ ํ•™์ƒ์„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์–ด๋–ค request ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€์•ผํ• ๊นŒ? id์™€ ํ•™์ƒ์˜ ์ด๋ฆ„ ๊ทธ๋ฆฌ๊ณ  email์„ ๋ฐ›์•„์˜ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. password๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ฒŒ๋” ํ•ด์ค„๊ฒƒ์ด๋‹ค.

ํ•™์ƒ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ascii letter์—์„œ ๋žœ๋ค์œผ๋กœ 8๊ธ€์ž๋ฅผ ๊ณจ๋ผ password๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์ƒ์„ฑ๋œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ๋” ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

์ฆ‰, ์ „์ฒด์ ์ธ DB๋ฅผ ๋ดค์„๋•Œ ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

USER๊ฐ€ ROOT๋กœ ์กด์žฌํ•˜๊ณ  ํ•™์ƒ๊ณผ ์„ ์ƒ๋‹˜์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํ•™์ƒ์ด ์‚ฌ์šฉํ•˜๋Š” page ๊ฐœ๋ฐœ

login์„ ํ–ˆ์„ ๋•Œ, ์ด ๊ณ„์ •์ด ํ•™์ƒ ๊ณ„์ •์ธ์ง€ ์„ ์ƒ๋‹˜ ๊ณ„์ •์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, FE์—์„œ JWT TOKEN์„ ๊ฒ€์ฆ ๋ฐ›์„ ๋•Œ Student table์—๋งŒ ์กด์žฌํ•˜๋Š” column์ด ์žˆ๋‹ค๋ฉด student role์„, ์—†๋‹ค๋ฉด teacher role์„ returnํ•˜๊ฒŒ๋” ํ•ด์ฃผ์—ˆ๋‹ค. FE์—์„œ๋Š” RETURN๋œ role๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ teacher, student ์ „์šฉ route๋ฅผ ๋‚˜๋ˆ ์ฃผ์—ˆ๋‹ค.

ํ•™์ƒ ์ „์šฉ page์—๋Š” ์„ ์ƒ๋‹˜์ด ํ• ๋‹นํ•œ ๋ฌธ์ œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ‘๊ณผ ๊ฐ™์ด Student/models.py๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.
student๋Š” Task table๊ณผ Many to Many ๊ด€๊ณ„๋ฅผ ๊ฐ–๊ฒŒ๋” ํ•ด ์ฃผ์—ˆ๋‹ค.

์ด MtoM relationship์„ ์‚ฌ์šฉํ•˜์—ฌ Student๋Š” ์ž์‹ ์—๊ฒŒ ํ• ๋‹น๋œ ๋ฌธ์ œ์ง‘๋งŒ ๋ณผ ์ˆ˜ ์žˆ์–ด์กŒ๋‹ค.

๋ฌธ์ œ์ง‘ ๋ณด๊ธฐ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ

FE

BE

@permission_classes((IsAuthenticated,))
@authentication_classes((JSONWebTokenAuthentication,))
class QuestionView(APIView):
    permission_classes = [IsAuthenticated]
    authentication_classes = [JSONWebTokenAuthentication]

    def get(self, request, task_id, format=None):
        """
        Return a list of all questions for the given task ID.
        """
        try:
            task = Task.objects.get(id=task_id)
            questions = Question.objects.filter(task=task)
            if not questions.exists():
                return Response({"detail": "No questions found for this task."}, status=status.HTTP_404_NOT_FOUND)

            serializer = QuestionSerializer(questions, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)
        except Task.DoesNotExist:
            return Response({"detail": "Task not found."}, status=status.HTTP_404_NOT_FOUND)
        except Exception as e:
            return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)


@permission_classes((IsAuthenticated,))
@authentication_classes((JSONWebTokenAuthentication,))
class TaskDeleteView(APIView):
    def delete(self, request, task_id, format=None):
        try:
            tasks = Task.objects.filter(id=task_id)
            tasks.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
        except Task.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

ํ•ด๋‹น Taskid์— ์กด์žฌํ•˜๋Š” question๋“ค์„ ๋ฝ‘์•„์„œ Response๋ฅผ ํ†ตํ•ด ๋ณด๋‚ด์ค€๋‹ค. ( TaskDeleteView๋Š” ํ•™์ƒ๋„ ๋ฌธ์ œ์ง‘์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค. ์ถ”ํ›„์— ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ์ง€๋Š” ์ƒ๊ฐํ•ด ๋ณผ ๋ฌธ์ œ์ด๋‹ค.)

  • ๊ฒฐ๊ณผ

์œ„์™€ ๊ฐ™์ด ํ•ด๋‹น Taskid์— ์—ฐ๊ฒฐ๋œ ๋ฌธ์ œ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์•Œ๊ฒŒ ๋œ ์‚ฌ์‹ค

  • ์„ ์ƒ๋‹˜๊ณผ ํ•™์ƒ์ด JWT TOKEN์„ ๊ฐ™์€ logic์œผ๋กœ ์“ฐ๋˜, FE์—์„œ ๋‹ค๋ฅธ Routes๋กœ ์„ค์ •ํ•œ๋‹ค.

์ด์ œ ํ•™์ƒ๋“ค์€ ์„ ์ƒ๋‹˜์˜ ํŽ˜์ด์ง€์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๋‹ค.

TODO

  • jwt token ๊ฐœ๋… ์ •๋ณตํ•˜๊ธฐ, (refresh token) tls ssl ๋ณต์Šตํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€