guricode

[자취의 정석] 자취도우미 ai 챗봇 만들기, XOR, Object 키워드, Entity -클린 아키텍쳐 Domain 레이어 본문

앱/Flutter&Dart

[자취의 정석] 자취도우미 ai 챗봇 만들기, XOR, Object 키워드, Entity -클린 아키텍쳐 Domain 레이어

agentrakugaki 2025. 10. 14. 01:47

 

이전에 Data레이어(데이터소스,임플)를  만들었다

 ai챗봇모델을 셋팅하고 외부 api를 연결했다.

 

 

Domain 레이어에서는 비즈니스 규칙을 만들것이다.

 

첫번째로 대화섹션의 핵심 모델인 챗봇 Entity를 만든다.

class ChatMessage {
  final String role; // 'user' 또는 'assistant'
  final String content; 
  final DateTime timestamp; 

  const ChatMessage({
    required this.role,
    required this.content,
    required this.timestamp,
  });

  //(Firebase 저장용)
  Map<String, dynamic> toJson() {
    return {
      'role': role,
      'content': content,
      'timestamp': timestamp.toIso8601String(),//DateTime.now()
    };
  }

  //(Firebase 불러오기용)
  factory ChatMessage.fromJson(Map<String, dynamic> json) {
    return ChatMessage(
      role: json['role'] as String,
      content: json['content'] as String,
      timestamp: DateTime.parse(json['timestamp'] as String),
    );
  }

  @override
  String toString() {
    return 'ChatMessage(role: $role, content: $content, timestamp: $timestamp)';
  }

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    return other is ChatMessage &&
        other.role == role &&
        other.content == content &&
        other.timestamp == timestamp;
  }

  @override
  int get hashCode {
    return role.hashCode ^ content.hashCode ^ timestamp.hashCode;
  }
}

Map이나 Set으로 데이터를 넣을때 중복값을 비교

Map,Set은 중복값을 체크할때 객체의 hashcode로 버킷을 선택하고 같은 hashcode가 있으면 동등비교 (==)를통해 값을 비교하고 덮어쓴다.

 

객체는 생성될때마다 메모리 기준으로 다른 hashcode를 가진다.

같은 내용이라도 다른 객체면 다른 해시코드가 나옴...

 

하지만 값들은 값 기준으로 hashcode가 결정된다.

따라서 같은 내용인데 객체가 다르면 연산자로 비교했을때 false가 나올수가 있다.

그걸 방지하기 위해 객체의 해시코드를 값 XOR 값 .... 해서 값들의  XOR값으로 고정하는 작업이다.

오버로딩

오버로딩은 Object에서 연산자를 정의하는 키워드같은건데

bool operator (연산자)로 사용한다.

identical은 같은 메모리에 있는 객체인지를 판별하는 함수로 값이 같아도 객체가 다르면 false를 반환한다.

여기서 this는 연산자 == 앞에있는 값, other은 뒤에있는 값이다.

other.role == role은 other.role == this.role과 같은 의미다.

이 구현이 있으면 Set/Map키로 사용,테스트에서 값 비교 등이 직관적으로 동작한다.

 

hashCode

객체가 가지는 해시코드다.

여기서는 role,content,timestamp를 XOR한 값으로 hashcode를 가지게 했다.

xor은 값이 같으면 같은 값이 나온다 정도만 알고있으면된다.