본문 바로가기

Study/BackEnd

(6)
[MeMind 리팩토링] 2. OCP 원칙 적용하기 ▽ SRP 원칙을 적용하는 과정은 이전 포스팅을 참고해주세요!! ▽ [MeMind 리팩토링] 1. SRP 원칙 적용하기 비즈니스 로직을 포함하는 Service 디렉토리의 코드에 SRP 원칙 (단일 책임 원칙)을 적용해보려고 한다. 1. 기존 코드 분석 # service/talk.py """ ChatGPT와의 API 통신을 통해 대화하는 로직 """ from fastapi impo it-is-my-life.tistory.com 1. 기존 코드 분석 이전 포스팅에서 SRP 원칙까지 적용 완료된 코드의 가장 큰 문제점은 비슷한 일을 하는 클래스들이 너무 많다는 것이다. # 월별 Conversation 조회 class MonthlyConversationLoader: def __init__(self, sessio..
[MeMind 리팩토링] 1. SRP 원칙 적용하기 0. 리팩토링을 시작한 이유 본격적인 리팩토링을 시작하기 전에, 리팩토링을 해야겠다라고 생각한 계기를 간단히 얘기해보려고 한다. 조코딩 AI 해커톤에 참여하고 운이 좋아서 수상까지 하게 되었지만, 개발을 하고 운영을 하는 내내, 내 코드가 불안하다는 느낌을 지울 수가 없었다. 프론트에서 뭔가 에러가 나면, 기억에 의존해서 코드를 찾아가며 고치는 일이 잦았고 뭔가 구조를 가지고 단단하게 코드를 짜는 느낌이 들지 않았다. 그래서 객체지향 프로그래밍의 개발 원칙인 SOLID 원칙을 적용하는 것부터 테스트 코드, 시스템 아키텍처까지 천천히 그러나 꼼꼼하게 리팩토링 해보려고 한다. 포스팅 내에는 분량 상, 일부 파일의 코드만 올라갈 예정이고 만약 전체 디렉토리 및 코드를 보고 싶다면, 아래 깃허브를 참고해주시길!..
[FastAPI] SQLModel에서 default와 default_factory 옵션의 차이점 sqlmodel을 이용해서 데이터베이스 모델을 구현하고 있었는데, 날짜 값이 입력되지 않을 경우에 datetime 함수를 실행해서 자동으로 날짜를 채우도록 필드에 default 옵션을 줬는데도 불구하고 날짜가 업데이트 되지 않고 어느 한 날짜로 계속 고정이 되어 있는 문제가 발생했다. 문제는 바로 이 default 옵션에 있었다. 내 코드 중 문제가 되는 부분으로 살펴보자. class Conversation(SQLModel, table = True): nickname: str = Field(foreign_key = User.nickname) conversation_id: str = Field(default = None, primary_key = True) day: Optional[int] = Field(..
[Database] 테이블의 Character_set을 utf8로 바꿔주기 새로 만든 api의 test를 하던 도중에, 프론트엔드 개발자 분께 에러 해결 요청이 왔다. 해당 api로 요청을 보내면 500번대 에러가 뜬다는 것! 바로 에러 메세지를 확인해보니, django.db.utils.OperationalError: ({아이디값}, "Incorrect string value: '\\xED\\x95\\x9C\\xEA\\xB8\\x80' for column {데이터베이스명}.{테이블명}.{컬럼명} at row 1") 이라는 에러가 떴다. 내용으로 봐서는 한글 인코딩에 문제가 생긴듯 했고, 다른 api는 정상작동하는 것으로 보아서 해당 컬럼의 Character_set만 utf8로 바꾸는 작업을 진행했다. 데이터베이스에 접속해서, 해당 테이블로 이동하고 다음 명령어를 이용하여 해당 ..
[Django] Django model에 InheritanceManager 적용하기 데이터베이스 테이블이 많아지고 상속이 빈번해지는 등 각 테이블 간의 관계가 복잡해지면서, 상속 관계에 있는 모델들을 복잡하지 않게 관리하고자 하는 요구 사항이 생겼다. (회사 코드를 가져올 수는 없어서 비슷한 예시로 대체한다.) 예를 들어서, 아래와 같은 관계의 모델이 있다고 해보자. 차라는 부모 클래스를 휘발유 차와 전기 차라는 자식 클래스가 상속하고 있는 형태이다. 코드로 나타내면 다음과 같이 작성될거다. from django.db import models class Car(models.Model): car_id = models.AutoField(primary_key = True) car_nickname = models.CharField(verbose_name = "별명") class Gasoline..
[Django] Django Model 상속 알아보기 회사에서 django를 다루면서, ORM을 공부할 일이 정말 많다. 그 중에서도 특히 model 상속과 관련된 부분을 따로 정리해보려고 한다. 1. 추상 기본 클래스 (Abstract Base Class) 추상 기본 클래스는 여러 다른 모델이 공통된 필드를 가지고 있어서, 해당 필드들을 여러번 반복해서 작성하는 비효율이 발생할 때 유용하다. 예를 들어서, 어느 대학교에 다니는 대학생들은 이름, 학번 등의 공통된 필드를 가지고 있고 과별로 졸업을 위해서 필요한 요건이 다르다. 이런 경우에 모델을 각각 생성해주려면 아래와 같은 형태가 될 것이다. from django.db import models class EducationStudent(models.Model): name = models.CharField(..