기술블로그-Django편

✅ Django 모델에서 ForeignKey(User, ...) 에서 'User'는 인자일까? 매개변수일까?

Chansman 2025. 5. 7. 11:23

Django 모델에서 ForeignKey(User, ...) 에서 'User'는 인자일까? 매개변수일까?

Django 모델을 작성할 때 다음과 같은 코드 많이 보셨을 거예요:

from django.contrib.auth.models import User

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)

그럼 여기서 User는 '인자(argument)'일까요? 매개변수(parameter)'일까요?
많은 분들이 "안에서 쓰니까 매개변수 아니냐" 하고 헷갈릴 수 있습니다.


1️⃣ 매개변수(parameter) vs 인자(argument) 간단 정리

용어 영어 언제 사용? 예시

매개변수 parameter 함수나 클래스 정의할 때 def func(x): 에서 x
인자 argument 함수나 클래스 호출할 때 func(3) 에서 3

2️⃣ 지금 코드에서 어떤 구조인가?

author = models.ForeignKey(User, on_delete=models.CASCADE)
  • models.ForeignKey(...) → ForeignKey 클래스의 생성자(함수처럼 작동)
  • User → ForeignKey에게 넘겨주는
  • on_delete=models.CASCADE → 키워드 인자

📌 따라서 User는 **ForeignKey에게 전달하는 값 = 인자(argument)**입니다!


3️⃣ 왜 헷갈릴까? "내부에 쓰니까 매개변수 아닌가요?"

아닙니다! 중요한 건 값이 전달되는 시점이냐, 정의하는 시점이냐입니다.

# 함수 정의 (여기 있는 건 매개변수)
def greet(name):
    return f"Hello, {name}"

# 함수 호출 (여기 있는 건 인자)
greet("찬희")
# ForeignKey는 class지만 마치 함수처럼 동작
models.ForeignKey(User)  # User는 전달되는 값, 즉 인자!

🔍 시각적 정리: 매개변수 vs 인자

           ┌───────────────┐                       ┌────────────┐
  정의 시  │ def add(x, y):│         호출 시       │ add(3, 5)  │
           │     return x+y│      ─────────────▶   └────────────┘
           └─────┬─────────┘                         │      │
                 │                                   ▼      ▼
           매개변수(Parameter)                인자(Argument) 값
Django 예시:

models.ForeignKey(User, on_delete=models.CASCADE)
                 ▲
                 │
       ForeignKey 생성자에 전달되는 값 → 인자

✅ ForeignKey와 관련된 추가 정리

📌 ForeignKey는 무엇인가?

외래 키: 다른 테이블(모델)의 데이터를 참조하는 관계 설정 도구입니다.

from django.contrib.auth.models import User

author = models.ForeignKey(User, on_delete=models.CASCADE)

이 경우:

  • User 모델의 기본 키(id)를 참조
  • author 필드는 auth_user 테이블을 참조하는 외래 키가 됨

📌 on_delete 옵션 요약

옵션 설명
CASCADE 부모가 삭제되면 자식도 함께 삭제됨
SET_NULL 부모가 삭제되면 null로 설정됨 (null 허용 필드 필요)
PROTECT 삭제 시 예외 발생, 삭제 차단됨
SET_DEFAULT 삭제 시 기본값으로 설정됨
DO_NOTHING 아무 동작 없음 (실제 DB에서 오류 발생할 수 있음)

📌 역참조: post.author vs user.post_set

post = Post.objects.first()
print(post.author.username)  # 정방향: post → user

user = User.objects.first()
print(user.post_set.all())   # 역방향: user → post 목록

→ ForeignKey를 기준으로 모델이름_set 형태로 자동 연결됩니다.


✅ 최종 요약

항목 설명
User ForeignKey에 전달되는 값이므로 인자(argument)
매개변수는 함수나 클래스를 정의할 때 사용되는 변수 이름
ForeignKey(...) 클래스 생성자 호출, 인자 전달 구조
on_delete 외래 키 삭제 정책 지정 옵션
역참조 user.post_set.all()처럼 반대 방향으로도 조회 가능