diff --git a/README.md b/README.md
index fea36a2..efc71c7 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,180 @@
-# main-back
\ No newline at end of file
+## π νλ‘μ νΈ μκ°
+
+> μλμ΄λ΄μΌμ 5060 ν΄μ§μ λ° μ€μ₯λ
μΈ΅ ꡬμ§λ₯Ό μν μλΉμ€
+μλμ΄ λ§μΆ€ν μΌμ리 μΆμ² μκ³ λ¦¬μ¦μ ν΅ν΄ λ€μν μ±μ©κ³΅κ³ λ₯Ό μ νκ³ Β κ°νΈμ΄λ ₯μλ₯Ό ν΅ν΄ μ§μκΉμ§ λ³΄λ€ μ½κ² μ¬μ© κ°λ₯ν λ°μν μΉ π
+---
+## :link: λ°°ν¬ λ§ν¬
+
+> ### FE : https://senior-tomorrow.kro.kr/
+> ### BE : https://senior-naeil.life/
+
+---
+## π£οΈ νλ‘μ νΈ λ°ν μμ & λ°ν λ¬Έμ
+
+> ### ποΈ 2025.05.13
+> ### [πΊ λ°ν μμ μμ]()
+> ### [π λ°ν λ¬Έμ μμ]()
+
+---
+
+## π§° μ¬μ© μ€ν
+
+### FE
+
+
+
+

+

+

+
+
+
+

+

+

+

+
+
+
+

+
+
+
+

+

+

+

+
+
+
+

+

+

+

+
+
+
+### BE
+
+
+
+

+

+
+
+
+

+

+
+
+
+

+

+

+

+

+

+

+
+
+
+

+

+

+
+
+
+

+

+

+
+
+
+

+

+
+
+
+
+---
+
+## :busts_in_silhouette: ν λλ£
+
+### FE
+
+| 
@KIMDOTS
| 
@chiyo-an
| 
@sasha-designer
|
+|:------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------:|
+| κΉλ―Όμ | μμ μ | λ°μ ν |
+### BE
+
+| 
@Anianim
| 
@rodzlen
| 
@parkh12
|
+|:-------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------:|
+| κ³ μμ£Ό | κΉνμ | λ°νμ± |
+
+---
+
+## β¨ λ°±μλ κ°λ° κ·μΉ
+
+### Branch Strategy
+> - main / dev λΈλμΉ κΈ°λ³Έ μμ±
+> - mainκ³Ό devλ‘ μ§μ push μ ν
+> - PR μ poetry, migration λ³λ μ¬ν μμ±
+> - λ¬Έμ λ°μμ Isues νΉμ Discordλ‘ κ³΅μ
+> - PR μ μ΅μ 2μΈ μ΄μ μΉμΈ νμ
+
+### Git Convention
+> 1. μ μ ν μ»€λ° μ λμ¬ μμ±
+> 2. μ»€λ° λ©μμ§ λ΄μ© μμ±
+
+>| μ λμ¬ | μ΄λͺ¨μ§ | μ€λͺ
|
+>| ------------ | ------ | -------------------------------------------------------------------- |
+>| Feat | β¨ | μλ‘μ΄ κΈ°λ₯ μΆκ° |
+>| Fix | π | κΈ°λ₯ μμ λ° λ²κ·Έ μμ |
+>| Chore | π‘ | μ€ν μμ , μ£Όμ μΆκ° λ± κΈ°λ₯ λ³κ²½ μμ΄ μ½λ μμ |
+>| Docs | π | λ¬Έμ μμ (μ: README.md) |
+>| Build | π | λΉλ κ΄λ ¨ νμΌ μμ λλ μμ |
+>| Test | β
| ν
μ€νΈ μ½λ μΆκ° λ° μμ (νλ‘λμ
μ½λ λ³κ²½ μμ) |
+>| Refactor | β»οΈ | μ½λ 리ν©ν λ§ (κΈ°λ₯ λ³ν μμ΄ κ΅¬μ‘° κ°μ ) |
+>| Hotfix | π | κΈ΄κΈ μμ
+
+### Git Flosw
+main(λ©μΈ) - dev(κ°λ°μ€) - feature/(μμ
μ€μΈλΈλ°μΉ) - release(λ°°ν¬ν
μ€νΈ) - prod(λ°°ν¬)
+
+---
+
+### ν΄λ ꡬ쑰 (κΈ°λ₯ μ€μ¬ ꡬ쑰)
+
+```
+main-back/
+βββ .github/ # GitHub CI / CD
+βββ config/ # μ₯κ³ νλ‘μ νΈ μ€μ (Settings, Urls)
+βββ job-posting/ # κ³΅κ³ κ΄λ ¨ API
+βββ resume/ # μ΄λ ₯μ κ΄λ ¨ API
+βββ search/ # νν°λ§ κ΄λ ¨ API
+βββ staticfiles/ # Django Admin μ μ νμΌ
+βββ users/ # μ μ κ΄λ ¨ API
+βββ utils/ # μ μ κ΄λ ¨ API
+```
+
+
+
+
+---
+---
+
+## :clipboard: Documents
+> [π API λͺ
μΈμ](https://www.notion.so/API-1cfcaf5650aa80b6999bf3a2733a030f)
+>
+> [π μ¬μ
κΈ°νν μꡬμ¬ν μ μμ](https://www.notion.so/1cecaf5650aa80c1ae32ff4f2efff850)
+>
+> [π FE μꡬμ¬ν μ μμ](https://docs.google.com/document/d/1rmbJZBB7H0fK-2nM2vk_Fqd1gL9m1Rmp0jahHoRzJXg/edit?tab=t.0)
+>
+> [π BE μꡬμ¬ν μ μμ](https://docs.google.com/document/d/1DVcntERD_Ypr-7SBBtSy8bu_6zjl6Ka7e1It-mRyq0U/edit?tab=t.0)
+>
+> [π ERD](https://www.erdcloud.com/d/4Qn2DHKPTvoSmR9BQ)
+>
+> [π ν
μ΄λΈ λͺ
μΈμ](https://docs.google.com/spreadsheets/d/1MutR7L5QezUi0IUW9aGQy_QuUHMVsSGfpqtv0PHUV3s/edit?gid=0#gid=0)
+>
+> [π μμ΄μ΄νλ μ λ° νλ©΄μ μμ](https://www.figma.com/design/kcE3AdbnTxhmsYeaMLBWtH/1%ED%8C%80-%EC%82%AC%EB%B3%B8---%EC%8B%9C%EB%8B%88%EC%96%B4-%EB%82%B4%EC%9D%BC-%EC%99%80%EC%9D%B4%EC%96%B4%ED%94%84%EB%A0%88%EC%9E%84?node-id=92-5561&p=f&t=P4E3JUVuuh8WciXv-0))
+>
+> [π νλ‘μ°μ°¨νΈ](https://www.figma.com/design/kcE3AdbnTxhmsYeaMLBWtH/1%ED%8C%80-%EC%82%AC%EB%B3%B8---%EC%8B%9C%EB%8B%88%EC%96%B4-%EB%82%B4%EC%9D%BC-%EC%99%80%EC%9D%B4%EC%96%B4%ED%94%84%EB%A0%88%EC%9E%84?node-id=161-8740&p=f&t=P4E3JUVuuh8WciXv-0))
diff --git a/config/settings/base.py b/config/settings/base.py
index c17722d..ddb1504 100644
--- a/config/settings/base.py
+++ b/config/settings/base.py
@@ -202,3 +202,79 @@
NAVER_TOKEN_URL = os.getenv("NAVER_TOKEN_URL") or ""
NAVER_USER_INFO_URL = os.getenv("NAVER_USER_INFO_URL") or ""
+
+log_dir = BASE_DIR / "logs"
+
+# λ‘κ·Έ λλ ν°λ¦¬κ° μ‘΄μ¬νμ§ μμΌλ©΄ μμ±
+if not log_dir.exists():
+ log_dir.mkdir(parents=True)
+
+LOGGING = {
+ "version": 1,
+ "disable_existing_loggers": False,
+ "formatters": {
+ "verbose": {
+ "format": "{levelname} {asctime} {filename}:{lineno} - {funcName} - {message}",
+ "style": "{",
+ },
+ },
+ "handlers": {
+ "user_file": {
+ "level": "ERROR",
+ "class": "logging.FileHandler",
+ "filename": log_dir / "user.log",
+ "formatter": "verbose",
+ },
+ "job_posting_file": {
+ "level": "ERROR",
+ "class": "logging.FileHandler",
+ "filename": log_dir / "job_posting.log",
+ "formatter": "verbose",
+ },
+ "resume_file": {
+ "level": "ERROR",
+ "class": "logging.FileHandler",
+ "filename": log_dir / "resume.log",
+ "formatter": "verbose",
+ },
+ "search_file": {
+ "level": "ERROR",
+ "class": "logging.FileHandler",
+ "filename": log_dir / "search.log",
+ "formatter": "verbose",
+ },
+ "utils_file": {
+ "level": "ERROR",
+ "class": "logging.FileHandler",
+ "filename": log_dir / "utils.log",
+ "formatter": "verbose",
+ },
+ },
+ "loggers": {
+ "user": {
+ "handlers": ["user_file"],
+ "level": "DEBUG",
+ "propagate": True,
+ },
+ "job_posting": {
+ "handlers": ["job_posting_file"],
+ "level": "DEBUG",
+ "propagate": True,
+ },
+ "resume": {
+ "handlers": ["resume_file"],
+ "level": "DEBUG",
+ "propagate": True,
+ },
+ "search": {
+ "handlers": ["search_file"],
+ "level": "DEBUG",
+ "propagate": True,
+ },
+ "utils": {
+ "handlers": ["utils_file"],
+ "level": "DEBUG",
+ "propagate": True,
+ },
+ },
+}
diff --git a/utils/logging_decorators.py b/utils/logging_decorators.py
new file mode 100644
index 0000000..f63f853
--- /dev/null
+++ b/utils/logging_decorators.py
@@ -0,0 +1,83 @@
+import logging
+from functools import wraps
+
+logger_user = logging.getLogger("user")
+logger_job_posting = logging.getLogger("job_posting")
+logger_resume = logging.getLogger("resume")
+logger_search = logging.getLogger("search")
+logger_utils = logging.getLogger("utils")
+
+
+def log_user_call(view_func):
+ @wraps(view_func)
+ def wrapper(request, *args, **kwargs):
+ logger_user.info(f"μμ²: {request.method} {request.path}")
+ try:
+ response = view_func(request, *args, **kwargs)
+ logger_user.info(f"μλ΅: {response.status_code} {request.path}")
+ return response
+ except Exception as e:
+ logger_user.exception(f"μλ¬ λ°μ: {e}")
+ raise
+
+ return wrapper
+
+
+def log_job_posting_call(view_func):
+ @wraps(view_func)
+ def wrapper(request, *args, **kwargs):
+ logger_job_posting.info(f"μμ²: {request.method} {request.path}")
+ try:
+ response = view_func(request, *args, **kwargs)
+ logger_job_posting.info(f"μλ΅: {response.status_code} {request.path}")
+ return response
+ except Exception as e:
+ logger_job_posting.exception(f"μλ¬ λ°μ: {e}")
+ raise
+
+ return wrapper
+
+
+def log_resume_call(view_func):
+ @wraps(view_func)
+ def wrapper(request, *args, **kwargs):
+ logger_resume.info(f"μμ²: {request.method} {request.path}")
+ try:
+ response = view_func(request, *args, **kwargs)
+ logger_resume.info(f"μλ΅: {response.status_code} {request.path}")
+ return response
+ except Exception as e:
+ logger_resume.exception(f"μλ¬ λ°μ: {e}")
+ raise
+
+ return wrapper
+
+
+def log_search_call(view_func):
+ @wraps(view_func)
+ def wrapper(request, *args, **kwargs):
+ logger_search.info(f"μμ²: {request.method} {request.path}")
+ try:
+ response = view_func(request, *args, **kwargs)
+ logger_search.info(f"μλ΅: {response.status_code} {request.path}")
+ return response
+ except Exception as e:
+ logger_search.exception(f"μλ¬ λ°μ: {e}")
+ raise
+
+ return wrapper
+
+
+def log_utils_call(view_func):
+ @wraps(view_func)
+ def wrapper(request, *args, **kwargs):
+ logger_utils.info(f"μμ²: {request.method} {request.path}")
+ try:
+ response = view_func(request, *args, **kwargs)
+ logger_utils.info(f"μλ΅: {response.status_code} {request.path}")
+ return response
+ except Exception as e:
+ logger_utils.exception(f"μλ¬ λ°μ: {e}")
+ raise
+
+ return wrapper