카테고리 없음

스파르타 AI-8기 TIL(2/3)-코딩테스트, CS

kimjunki-8 2025. 2. 3. 23:28

사이드 프로젝트 구상 ERD에 대한 공부 설명

Type에는 여러가지 들어갈 수 있다.

1. INTEGER
정수형 데이터 타입입니다.사용 예: 나이, 수량, 카운트 등.
age         INTEGER​

 

2. FLOAT / DOUBLE
소수점을 포함한 숫자입니다.
FLOAT은 더 적은 정밀도를 가질 수 있으며, DOUBLE은 더 높은 정밀도를 제공합니다.
사용 예: 가격, 비용, 평균 등.
price       FLOAT

 

3. DECIMAL / NUMERIC
고정 소수점 값을 저장하는 데이터 타입입니다. 주로 금액 계산에서 사용됩니다.
예를 들어 DECIMAL(10, 2)는 10자리 숫자 중 2자리는 소수점으로 설정됩니다.
amount      DECIMAL(10, 2)

 

4. BOOLEAN
참(True) 또는 거짓(False) 값을 저장합니다.
사용 예: 활성화 여부, 동의 여부 등.
is_active   BOOLEAN

 5. DATE

날짜를 저장하는 타입입니다.
사용 예: 생일, 계약 날짜 등.
birthdate   DATE

 

6. DATETIME / TIMESTAMP
날짜와 시간을 함께 저장하는 타입입니다.
사용 예: 등록 시간, 마지막 수정 시간 등.
created_at  DATETIME

 

7. TEXT
긴 텍스트를 저장하는 타입입니다. VARCHAR와 비슷하지만, 길이에 제한이 없습니다.
사용 예: 글 내용, 설명 등.
description TEXT

 

8. BLOB (Binary Large Object)

바이너리 데이터를 저장하는 타입입니다. 이미지, 오디오 파일 등 이진 데이터를 저장하는 데 사용됩니다.
사용 예: 이미지, 파일 등.
file_data   BLOB

 

9. UUID
고유 식별자를 저장하는 타입입니다. 보통 복잡한 시스템에서 고유한 ID를 생성할 때 사용됩니다.
사용 예: 유저 고유 ID, 트랜잭션 ID 등.
user_id     UUID

 

10. ENUM
미리 정의된 값 중 하나를 저장할 수 있는 타입입니다.
예를 들어, status 필드는 "active", "inactive" 등의 값을 가질 수 있습니다.
status      ENUM('active', 'inactive', 'pending')

 

11. JSON
JSON 형식의 데이터를 저장할 수 있는 타입입니다. 최근에 많이 사용되는 데이터 타입 중 하나입니다.
사용 예: 설정, 동적 데이터 등.
settings    JSON

옵저버 패턴
옵저버 패턴 (Observer) 옵저버 패턴은 객체의 상태 변화가 있을 때, 이를 감지하여 자동으로 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려 주는 디자인 패턴입니다.
class Observer:
    def update(self, message):
        pass

class ConcreteObserver(Observer):
    def update(self, message):
        print(f"Received message: {message}")

class Subject:
    def __init__(self):
        self.observers = []

    def add_observer(self, observer):
        self.observers.append(observer)

    def notify_observers(self, message):
        for observer in self.observers:
            observer.update(message)

subject = Subject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()

subject.add_observer(observer1)
subject.add_observer(observer2)

subject.notify_observers("Hello Observers!")

주체(Subject)는 상태를 가지고 있고, 상태가 변화하면 옵저버(Observer)들에게 그 변화를 알림.
옵저버(Observer)는 주체의 상태 변화를 감지하고, 그에 따라 자신만의 방식으로 반응함.

주체(Subject) 클래스
Subject는 상태 변화를 관리하는 객체입니다. 예를 들어, 뉴스 서비스에서는 주체가 뉴스 콘텐츠를 담당하고, 그 뉴스가 변경되면 그에 대한 알림을 구독자(옵저버)에게 보냅니다.

class Subject:
    def __init__(self):
        self.observers = []  # 옵저버(구독자)들을 저장할 리스트

__init__(self): 초기화 메서드로, self.observers는 등록된 옵저버들을 저장하는 리스트입니다.

    def add_observer(self, observer):
        self.observers.append(observer)  # 옵저버를 리스트에 추가

 add_observer(self, observer): 새로운 옵저버를 등록하는 메서드로, 옵저버는 나중에 상태 변화가 있을 때 알림을 받을 객체입니다.

    def notify_observers(self, message):
        for observer in self.observers:
            observer.update(message)  # 등록된 모든 옵저버에게 알림 전달

 

notify_observers(self, message): 상태 변화가 발생했을 때 호출되는 메서드이며, 이 메서드는 모든 옵저버에게 알림을 보냄. message는 옵저버가 받을 알림 내용이야. 이때 옵저버들의 update() 메서드가 호출됩니다.

옵저버(Observer) 클래스
Observer 클래스는 옵저버(구독자)의 인터페이스입니다. 옵저버는 주체의 상태가 변화했을 때 반응해야 하며, Observer 클래스는 반응할 방법을 정의하는 메서드를 제공하지만, 실제 구현은 구체적인 옵저버(ConcreteObserver)에서 처리합니다.

class Observer:
    def update(self, message):
        pass  # 기본 동작은 없으므로 비워둠

update(self, message): 옵저버가 상태 변화에 반응할 때 호출되는 메서드이며, message는 상태 변화에 대한 알림 메시지야. 기본 구현은 없고 구체적인 옵저버 클래스에서 어떻게 반응할지 정의할 겁니다.

구체적인 옵저버(ConcreteObserver) 클래스
ConcreteObserver는 구체적인 옵저버(구독자)입니다. 이 클래스에서는 상태 변화에 반응하는 방식을 정의합니다. 예를 들어, 구독자가 뉴스를 받으면 그 뉴스를 출력하는 방식으로 반응할 수 있습니다.

class ConcreteObserver(Observer):
    def update(self, message):
        print(f"Received message: {message}")  # 메시지 출력

update(self, message): ConcreteObserver에서는 상태 변화에 대해 출력하는 방식으로 반응하며, message는 주체가 보낸 알림 내용입니다.

전체 흐름: 주체와 옵저버 간의 상호작용
이제, 전체 흐름을 살펴보자. 코드가 실행되는 순서대로 따라가면 이렇게 됩니다.

subject = Subject()  # 주체(뉴스 서비스) 객체 생성
observer1 = ConcreteObserver()  # 첫 번째 옵저버(구독자) 생성
observer2 = ConcreteObserver()  # 두 번째 옵저버(구독자) 생성

 

주체(Subject)인 subject 객체와 두 명의 옵저버(ConcreteObserver)인 observer1과 observer2가 만들어지며, subject는 뉴스 서비스를, observer1과 observer2는 뉴스 구독자들을 나타낸다고 생각하면 됩니다.

subject.add_observer(observer1)  # 첫 번째 구독자 등록
subject.add_observer(observer2)  # 두 번째 구독자 등록

 

subject.add_observer() 메서드를 호출해서, observer1과 observer2를 주체(뉴스 서비스)에 구독자로 등록합니다.
이제 subject는 observer1과 observer2에게 상태 변화가 있을 때마다 알림을 보낼 준비가 됐습니다.

subject.notify_observers("Breaking News: Python is awesome!")  # 상태 변화 알림 보내기

subject.notify_observers() 메서드를 호출해서 뉴스("Breaking News: Python is awesome!")를 구독자들에게 전달함.
이때 subject는 모든 옵저버(구독자)에게 update() 메서드를 호출해서 메시지를 전달함.

# 옵저버들의 update() 메서드가 실행됨
observer1.update("Breaking News: Python is awesome!")
observer2.update("Breaking News: Python is awesome!")

notify_observers() 메서드는 등록된 각 옵저버(observer1, observer2)의 update() 메서드를 호출합니다.
observer1과 observer2는 각각 메시지를 출력하게 돼. update() 메서드에서 메시지를 출력하는 방식으로 반응함.

결과적으로, 콘솔에는 아래와 같이 출력됩니다.

Received message: Breaking News: Python is awesome!
Received message: Breaking News: Python is awesome!


최종적으로, 어떻게 동작하는지 다시 한 번 요약:
주체(Subject)인 subject는 옵저버(구독자)들에게 알림을 보낼 수 있음.
옵저버(Observer)인 observer1과 observer2는 주체에 구독되며, 상태 변화에 반응하기 위해 update() 메서드를 준비함.
상태 변화(뉴스 발행)가 발생하면, 주체는 모든 옵저버에게 알림을 보내고, 옵저버들은 각자 update() 메서드를 통해 반응함.
옵저버 패턴은 이렇게 주체와 옵저버가 서로 느슨하게 연결되어 있기 때문에, 주체의 변경 없이 새로운 옵저버를 추가할 수 있는 유연성이 있습니다!