✅ 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()처럼 반대 방향으로도 조회 가능 |
'기술블로그' 카테고리의 다른 글
📌 Django form.save(commit=False) 완전 정복 (0) | 2025.05.07 |
---|---|
📌 파이썬 데코레이터 완벽 정리 - 함수에 기능을 덧붙이는 마법 (0) | 2025.05.07 |
✅ Django 서버 실행 시 "That port is already in use" 에러 해결법 (포트 점유 강제 종료) (0) | 2025.05.06 |
✅ 왜 로그인은 자동인데, 회원가입은 우리가 직접 만들어야 할까? (0) | 2025.05.06 |
✅ Django에서 LOGIN_URL, LOGIN_REDIRECT_URL을 설정했는데, 왜 view에서 또 명시해야 할까? (0) | 2025.05.06 |