Skip to content

Commit d70cd87

Browse files
authored
Merge pull request #24 from KKU-NoteFlow/fix/ocr_performance
OCR Performance improve
2 parents a2288b3 + 08f2fa8 commit d70cd87

File tree

16 files changed

+285
-355
lines changed

16 files changed

+285
-355
lines changed

db.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
from sqlalchemy import create_engine
22
from sqlalchemy.orm import sessionmaker
3+
from models import Base # ensure models are imported so metadata knows all tables
4+
import os
35

4-
DATABASE_URL = "mysql+mysqlconnector://noteflow:NoteFlow123!@localhost/noteflow"
5-
engine = create_engine(DATABASE_URL)
6+
DATABASE_URL = os.getenv("DATABASE_URL", "mysql+mysqlconnector://noteflow:NoteFlow123!@localhost/noteflow")
7+
8+
engine = create_engine(DATABASE_URL, pool_pre_ping=True)
69
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
710

8-
# 데이터베이스 의존성
11+
def init_db():
12+
Base.metadata.create_all(bind=engine)
13+
914
def get_db():
1015
db = SessionLocal()
1116
try:
1217
yield db
1318
finally:
14-
db.close()
19+
db.close()

main.py

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,48 @@
1-
# src/main.py
1+
# Backend/main.py
22
import os
33
from dotenv import load_dotenv
44
from fastapi import FastAPI
55
from fastapi.middleware.cors import CORSMiddleware
6+
from fastapi.staticfiles import StaticFiles
7+
8+
from db import init_db
69
from routers.auth import router as auth_router
710
from routers.note import router as note_router
8-
from routers.folder import router as folder_router
9-
from fastapi.staticfiles import StaticFiles
10-
from routers.file import router as file_router
11-
import logging
12-
import uvicorn
11+
from routers.folder import router as folder_router
12+
from routers.checklist import router as checklist_router
13+
from routers.file import router as file_router
1314

14-
# 1) 환경변수 로드
15-
load_dotenv()
15+
import uvicorn
1616

17-
# 2) 로깅 설정
18-
logging.basicConfig(level=logging.INFO)
19-
logger = logging.getLogger(__name__)
17+
load_dotenv()
2018

21-
# 3) FastAPI 앱 생성
2219
app = FastAPI()
2320

24-
# 4) CORS 설정
25-
origins = [
26-
"http://localhost:5174",
27-
]
28-
2921
app.add_middleware(
3022
CORSMiddleware,
31-
allow_origins=["*"],
23+
allow_origins=["*"], # 개발 중 전체 허용
3224
allow_credentials=True,
3325
allow_methods=["*"],
3426
allow_headers=["*"],
3527
)
3628

37-
# 5) 라우터 등록
29+
# 정적 파일(업로드) 서빙
30+
os.makedirs(os.path.join(os.path.dirname(__file__), "uploads"), exist_ok=True)
31+
app.mount("/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "uploads")), name="static")
32+
33+
# 라우터 등록
3834
app.include_router(auth_router)
3935
app.include_router(note_router)
40-
app.include_router(folder_router)
36+
app.include_router(folder_router)
4137
app.include_router(file_router)
38+
app.include_router(checklist_router)
4239

43-
# 6) 루트 엔드포인트
4440
@app.get("/")
45-
def read_root():
41+
def root():
4642
return {"message": "mini"}
4743

48-
# 7) 실행 설정
44+
# 앱 시작 시(uvicorn main:app) 한 번만 테이블 생성 (개발용)
45+
init_db()
46+
4947
if __name__ == "__main__":
50-
uvicorn.run(
51-
"main:app",
52-
host="0.0.0.0",
53-
port=8080,
54-
reload=True,
55-
env_file=".env"
56-
)
48+
uvicorn.run("main:app", host="0.0.0.0", port=8080, reload=True)

models/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,8 @@
1-
from .user import User
1+
from .base import Base
2+
from .user import User
3+
from .folder import Folder
4+
from .note import Note
5+
from .file import File
6+
from .checklist import Checklist
7+
8+
__all__ = ["Base", "User", "Folder", "Note", "File", "Checklist"]

models/base.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
from sqlalchemy.ext.declarative import declarative_base
2-
Base = declarative_base()
1+
from sqlalchemy.orm import declarative_base
2+
3+
Base = declarative_base()

models/checklist.py

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,17 @@
1-
from sqlalchemy import Column, Integer, String, Enum, TIMESTAMP, text
1+
from sqlalchemy import Column, Integer, String, Boolean, TIMESTAMP, ForeignKey, text
22
from sqlalchemy.orm import relationship
3+
from .base import Base
34

4-
class User(Base):
5-
__tablename__ = "user"
5+
class Checklist(Base):
6+
__tablename__ = "checklist"
67

7-
u_id = Column(Integer, primary_key=True, autoincrement=True) # PK
8-
id = Column(String(50), unique=True, nullable=False) # 로그인 ID
9-
email = Column(String(150), unique=True, nullable=False)
10-
password = Column(String(255), nullable=False)
11-
provider = Column(
12-
Enum("local", "google", "kakao", "naver", name="provider_enum"),
13-
nullable=False,
14-
server_default="local",
15-
)
16-
created_at = Column(
17-
TIMESTAMP, nullable=False, server_default=text("CURRENT_TIMESTAMP")
18-
)
19-
updated_at = Column(
20-
TIMESTAMP,
21-
nullable=False,
22-
server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"),
23-
)
8+
id = Column(Integer, primary_key=True, autoincrement=True)
9+
user_id = Column(Integer, ForeignKey("user.u_id", ondelete="CASCADE"), nullable=False)
10+
title = Column(String(255), nullable=False)
11+
is_clear = Column(Boolean, nullable=False, server_default=text("0"))
12+
created_at = Column(TIMESTAMP, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
13+
updated_at = Column(TIMESTAMP, nullable=False,
14+
server_default=text("CURRENT_TIMESTAMP"),
15+
onupdate=text("CURRENT_TIMESTAMP"))
2416

25-
# 역참조: checklist 목록
26-
checklists = relationship("Checklist", back_populates="user", cascade="all, delete-orphan")
17+
user = relationship("User", back_populates="checklists")

models/file.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
from sqlalchemy import Column, Integer, String, ForeignKey, TIMESTAMP, text
2+
from sqlalchemy.orm import relationship
23
from .base import Base
34

45
class File(Base):
5-
__tablename__ = 'file'
6+
__tablename__ = "file"
67

78
id = Column(Integer, primary_key=True, autoincrement=True)
8-
user_id = Column(Integer, ForeignKey('user.u_id', ondelete='CASCADE'), nullable=False)
9-
folder_id = Column(Integer, ForeignKey('folder.id', ondelete='SET NULL'), nullable=True)
10-
note_id = Column(Integer, ForeignKey('note.id', ondelete='SET NULL'), nullable=True) # ✅ 첨부된 노트 ID
11-
original_name = Column(String(255), nullable=False) # 유저가 업로드한 원본 파일 이름
12-
saved_path = Column(String(512), nullable=False) # 서버에 저장된(실제) 경로
13-
content_type = Column(String(100), nullable=False) # MIME 타입
14-
created_at = Column(TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP'))
9+
user_id = Column(Integer, ForeignKey("user.u_id", ondelete="CASCADE"), nullable=False)
10+
folder_id = Column(Integer, ForeignKey("folder.id", ondelete="SET NULL"), nullable=True)
11+
note_id = Column(Integer, ForeignKey("note.id", ondelete="SET NULL"), nullable=True)
12+
original_name = Column(String(255), nullable=False)
13+
saved_path = Column(String(512), nullable=False)
14+
content_type = Column(String(100), nullable=False)
15+
created_at = Column(TIMESTAMP, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
16+
17+
# relations
18+
user = relationship("User", back_populates="files")
19+
note = relationship("Note", back_populates="files")

models/folder.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
from sqlalchemy import Column, Integer, String, ForeignKey, TIMESTAMP, text
2+
from sqlalchemy.orm import relationship
23
from .base import Base
34

45
class Folder(Base):
5-
__tablename__ = 'folder'
6+
__tablename__ = "folder"
67

78
id = Column(Integer, primary_key=True, autoincrement=True)
8-
user_id = Column(Integer, ForeignKey('user.u_id', ondelete='CASCADE'), nullable=False)
9+
user_id = Column(Integer, ForeignKey("user.u_id", ondelete="CASCADE"), nullable=False)
910
name = Column(String(100), nullable=False)
10-
parent_id = Column(Integer, ForeignKey('folder.id', ondelete='SET NULL'), nullable=True)
11-
created_at = Column(TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP'))
11+
parent_id = Column(Integer, ForeignKey("folder.id", ondelete="SET NULL"), nullable=True)
12+
created_at = Column(TIMESTAMP, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
1213
updated_at = Column(TIMESTAMP, nullable=False,
13-
server_default=text('CURRENT_TIMESTAMP'),
14-
onupdate=text('CURRENT_TIMESTAMP'))
14+
server_default=text("CURRENT_TIMESTAMP"),
15+
onupdate=text("CURRENT_TIMESTAMP"))
16+
17+
# relations
18+
user = relationship("User")
19+
parent = relationship("Folder", remote_side=[id], backref="children")
20+
notes = relationship("Note", back_populates="folder", cascade="all, delete")

models/note.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
from sqlalchemy import Column, Integer, String, Text, Boolean, ForeignKey, TIMESTAMP, text
2+
from sqlalchemy.orm import relationship
23
from .base import Base
34

45
class Note(Base):
5-
__tablename__ = 'note'
6+
__tablename__ = "note"
67

78
id = Column(Integer, primary_key=True, autoincrement=True)
8-
user_id = Column(Integer, ForeignKey('user.u_id', ondelete='CASCADE'), nullable=False)
9-
folder_id = Column(Integer, ForeignKey('folder.id', ondelete='SET NULL'), nullable=True)
9+
user_id = Column(Integer, ForeignKey("user.u_id", ondelete="CASCADE"), nullable=False)
10+
folder_id = Column(Integer, ForeignKey("folder.id", ondelete="SET NULL"), nullable=True)
1011
title = Column(String(255), nullable=False)
1112
content = Column(Text)
12-
is_favorite = Column(Boolean, nullable=False, server_default=text('FALSE'))
13+
is_favorite = Column(Boolean, nullable=False, server_default=text("FALSE"))
1314
last_accessed = Column(TIMESTAMP, nullable=True)
14-
created_at = Column(TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP'))
15+
created_at = Column(TIMESTAMP, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
1516
updated_at = Column(TIMESTAMP, nullable=False,
16-
server_default=text('CURRENT_TIMESTAMP'),
17-
onupdate=text('CURRENT_TIMESTAMP'))
17+
server_default=text("CURRENT_TIMESTAMP"),
18+
onupdate=text("CURRENT_TIMESTAMP"))
19+
20+
# relations
21+
user = relationship("User", back_populates="notes")
22+
folder = relationship("Folder", back_populates="notes")
23+
files = relationship("File", back_populates="note", cascade="all, delete")

models/user.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
from sqlalchemy import Column, Integer, String, Enum, TIMESTAMP, text
2+
from sqlalchemy.orm import relationship
23
from .base import Base
34

45
class User(Base):
5-
__tablename__ = 'user'
6+
__tablename__ = "user"
67

78
u_id = Column(Integer, primary_key=True, autoincrement=True)
8-
id = Column(String(50), nullable=False, unique=True)
9+
id = Column(String(50), nullable=False, unique=True) # 로그인 ID 또는 소셜 ID
910
email = Column(String(150), nullable=False, unique=True)
1011
password = Column(String(255), nullable=False)
11-
provider = Column(
12-
Enum('local','google','kakao','naver', name='provider_enum'),
13-
nullable=False,
14-
server_default=text("'local'")
15-
)
16-
created_at = Column(TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP'))
12+
provider = Column(Enum("local", "google", "kakao", "naver", name="provider_enum"),
13+
nullable=False, server_default=text("'local'"))
14+
created_at = Column(TIMESTAMP, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
1715
updated_at = Column(TIMESTAMP, nullable=False,
18-
server_default=text('CURRENT_TIMESTAMP'),
19-
onupdate=text('CURRENT_TIMESTAMP'))
16+
server_default=text("CURRENT_TIMESTAMP"),
17+
onupdate=text("CURRENT_TIMESTAMP"))
18+
19+
# relations
20+
notes = relationship("Note", back_populates="user", cascade="all, delete-orphan")
21+
files = relationship("File", back_populates="user", cascade="all, delete-orphan")
22+
checklists = relationship("Checklist", back_populates="user", cascade="all, delete-orphan")

routers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from .auth import router as auth_router
2+
from .checklist import router as checklist_router
23

34
routers = [
45
auth_router,
6+
checklist_router
57
]

0 commit comments

Comments
 (0)