종합설계프로젝트 도메인 주도 개발

2024. 4. 3. 19:56카테고리 없음

클라이언트 설계

 

클라이언트 주요 도메인 나누기

- 차량 (차량 정보 가져오기, 차량 마커 그리기 , 차량 부채꼴 그리기 등)

- 발생원 (발생원 정보 가져오기 , 발생원 마커 그리기 등)

- 악취 예측 (차량과 발생원을 이용한 악취 발생원 찾기 등)

- 지도 (차량과 발생원 객체 생성, 객체들을 지도에 시각화 등)

- 모달 (차량 정보 , 발생원 정보, 결과 정보를 표시하는 창 객체 등)

- 지도 컨트롤러(모드에 맞는 지도객체 생성 등)

- Minimum Significant Value (최소감지값을 충족하는 성분만 반영 등)

 

구현 시나리오

1. 지도 컨트롤러.js가 지도 데이터 로드.

2. 지도.js는 모드에 따른 prototype 정의

3. 모드에 따른 지도 객체 생성

4. 차량.js 과 발생원.js 는 마커를 그리거나 부채꼴을 그리는 prototype을 정의

5. 지도.js 는 차량과 발생원 객체 생성 후 prototype을 이용하여 마커를 시각화함.

6. 객체 생성 과정에서 msv에 만족하는 성분만 반영

7. 악취 예측.js 에서 차량과 발생원 객체들을 통해 악취 발생원을 예측함.

     7-1. 차량이 감지한 냄새 유형과 같은 발생원 객체 탐색 후 리스트화

     7-2. 차량이 감지한 냄새 유형과 같은 발생원 객체와 차량 사이의 거리를 구함

     7-3. 거리 중 풍향과 풍속을 참고하여 발생원일 가능성이 높은 객체를 선별

     7-4. 해당 객체중 차량이 탐지한 성분이 같은 발생원을 선별

8. 모달.js 에 차량 혹은 발생원 객체를 넘겨 결과를 시각화

 

서버 설계

 

기존 프로젝트 클라이언트에서 사용되는 데이터 확인하기

1.  차량 gps 정보 -> 차량 마커 생성에 사용됨

  {
   "list": [
    {
     "gps_no" : 1 ,
     "machine_name : "xx",
     "Latitude" : xx.544353,
     "Longitude" : xx.327673,
     "gps_date" : 2024-01-31 10:13:00
     },
    {
     "gps_no" : 2 ,
     "machine_name : "xx",
     "Latitude" : xx.544353,
     "Longitude" : xx.327673,
     "gps_date" : 2024-01-31 10:13:11
     }
    ]
  }

2. 차량 날씨 및 위치정보. 1과 동일한 목적에서 사용됨

  {
   "list": [
    {
     "si_idx": 2,
	 "area": null,
	 "ou_value": 0,
     "machine_name": xx,
     "Latitude" : xx.544353,
     "Longitude": xx.327673,
     "humi" : 0,
     "temp" : 0,
     "directionWind" : 0,
     "sppedWind" : 0,
     "airPressure" : 0,
     "csv_filename" : "파일 이름",
     "reg_date" : 2024-01-31 10:13:00
     },
    {
     "si_idx": 3,
	 "area": null,
	 "ou_value": 0,
     "machine_name": "S1",
     "Latitude" : xx.544353,
     "Longitude": xx.327673,
     "humi" : 0,
     "temp" : 0,
     "directionWind" : 0,
     "sppedWind" : 0,
     "airPressure" : 0,
     "csv_filename" : "파일 이름",
     "reg_date" : 2024-01-31 10:13:00
     }]}

 

 

 

3. 최소 감지값. 클라이언트에서 모든 리스트를 가져오고 이름에 맞는 성분을 선별해서 사용중. 악취 예측에 사용

  {
   "list": [
    {
      "material" : "성분 이름";
      "msv" : xxx;
     },
    {
      "material" : "성분 이름";
      "msv" : xxx;
     }
     ]
   }

 

 

 

4. 기관별 발생 성분, 기관 이름을 통해 기관이 발생하는 성분을 검색

  { "list" : [
    {
     "customer": "00공장",
     "chemical_name": "성분 이름",
     "chemical_value" : xxx.719
     },
    {
     "customer": "00공장",
     "chemical_name": "성분 이름",
     "chemical_value" : xxx.113
     }
  ]}

 

5. 기관별 냄새 유형, 기관이 발생하는 냄새 유형들을 검색

  { "list" : [
    {
     "c_name": "00공장",
     "c_odor": "00냄새",
     },
    {
     "c_name": "00공장",
     "c_odor": "00냄새",
     }
  ]}

 

 

 

6. 차량 검출 성분, csvfile name을 통해 차량이 관측한 성분을 검색

   {
    "list": [
     {
        "chemical_name": "성분 이름",
        "chemical_value": 00.424
      },
     {
        "chemical_name": "성분 이름",
        "chemical_value": 00.424
      }]
   }

 

7. 기관 위치 정보, 기관 마커를 생성하는데 사용

{ "list" : [
   {
  "lat" = 00.5165000;
  "lon" = 00.3575444;
  "p_index" : 1,
  "name" : "00공장"
  "poi" : 0
   },
   {
  "lat" = 00.5005000;
  "lon" = 00.3075444;
  "p_index" : 2,
  "name" : "00공장"
  "poi" : 0
   }
  ]}

 

8. 가장 최근의 차량 날씨 및 위치정보. 정보 데이터

    {
     "si_idx": 2,
     "machine_name": xx,
     "Latitude" : xx.544353,
     "Longitude": xx.327673,
     "humi" : 0,
     "temp" : 0,
     "directionWind" : 0,
     "sppedWind" : 0,
     "airPressure" : null,
     "csv_filename" : "fadfas",
     "reg_date" : 2024-01-31 10:13:00
     }

 

9. 가장 최근의 차량 정보

{
      "gps_no" : 1 ,
      "machine_name : "S1",
      "Latitude" : 35.544353,
      "Longitude" : 129.327673,
      "gps_date" : 2024-01-31 10:13:00
}

 

10. 차량 관측 냄새 유형, 차량 관측 성분을 매개변수로 냄새 유형 및 강도를 반환해준다.

{[
{"pred_smell_kind": "악취 종류 이름"},
 {"pred_smell_strength": 수치 }
]}

 

기존 테이블 설계의 문제점 

1. 제2 정규화 혹은 제3 정규화가 되어있지 않은 경우가 존재함.

2. 테이블간 관계가 없음. (데이터 수정이 어려움)

3. 같은 기능을 하는 테이블이 존재함

4. 리스트를 받아 클라이언트에서 리스트를 처리하는 로직이 있음

   - 모든 기관의 발생성분 데이터를 받아 특정 기관에 대한 발생성분 데이터로 전처리

   - 모든 최소 감지값 리스트를 받아 특정이름의 최소 감지값 수치를 찾음

5. 필드명이 명확하지 않을때가 있음.

 

문제 해결로 발생할 수 있는 문제

- 관계를 설정하면서 조회에 성능이 느려질 수 있음

- 쿼리 작성이 어려워질 수 있음.

 

해결

1. 데이터베이스 설계를 새롭게 한다.

2. 데이터 전처리를 서버가 하도록 설계한다.

 

필요한 테이블

1. 발생원 위치 테이블

2. 발생원 냄새 유형 테이블

3. 발생원 성분 테이블

4. 차량 위치 테이블

5. 차량 악취 관측 정보 테이블

6. 차량 기상 관측 정보 테이블

7. 최소 감지값 테이블

 

차량 관측 냄새 유형 및 강도 정보(10번 )도 필요하지만 이는 다른 서버를 통해 처리되어서 제외한다. 

 

데이터베이스 설계

 

화학 성분 테이블 (Chemical Table):
  - ChemicalId (Primary Key)
  - ChemicalName


발생원 회원 테이블 (Source Table):
  - SourceId (Primary Key)
  - Name

  - Latitude
  - Longitude


발생원 냄새 유형 테이블 (OdorType Table):
  - OdorTypeId (Primary Key)
  - SourceId (Foreign Key referencing Source Table)
  - OdorType


발생원 성분 테이블 (SourceChemical Table):
  - SourceChemicalId (Primary Key)
  - SourceId (Foreign Key referencing Source Table)
  - ChemicalId (Foreign Key referencing Chemical Table)
  - ChemicalValue


차량 테이블 (CarCategory Table):
  - CarId (Primary Key)
  - Category


차량 위치 테이블 (CarLocation Table):
  - CarLocationId (Primary Key)
  - CarId (Foreign Key referencing CarCategory Table)

  - CarWeatherObservationId  (Foreign Key referencing CarWeather Table)
  - Latitude
  - Longitude
  - Date


차량 기상 정보 테이블 (CarWeather Table):
  - CarWeatherObservationId (Primary Key)
  - Humidity
  - Temperature
  - WindDirection
  - WindSpeed


차량 관측 정보 테이블 (CarChemicalObservation Table):
  - CarChemicalObservationId (Primary Key)
  - ChemicalId (Foreign Key referencing Chemical Table)
  - ChemicalValue

  - CarLocationId (Foreign Key referencing CarLocation Table)


최소 감지값 테이블 (MinimumSignificantValue Table):
  - MinimumSignificantValueId (Primary Key)
  - ChemicalId (Foreign Key referencing Chemical Table)
  - ChemicalValue

 

ERD설계 결과

 

성공적으로 데이터베이스를 생성했다.

 

데이터  등록 시나리오

초기 세팅

1. car_category_table 추적하는 차량 카테고리 등록 

2. chemical_table에  관리하는  화학 성분 등록

3. source_table에 관리하는 발생원 등록

 

minimum_significant_value_table 등록

1. 화학물질 이름을 chemical_table에 검색해 chemical_entity를 얻는다.

2. 화학성분id 와 수치값으로 minimum_significant_value_entity 생성

3. minimum_significant_value_entity에 set으로 chemical_entity 값을 넣는다.

4. persist에 저장한다.

 

odor_type_table 등록

1. 발생원 이름을 source_table 에 검색해 source_entity를 얻는다.

2. 냄새유형으로 odor_type_entity 생성

3. set으로  source_entity를 odor_type_entity에 넣는다.

4. persist에 저장한다.

 

source_chemical_table 등록

1. 발생원 이름을 source_table 에 검색해 source entity를 얻는다.

2. 화학물질 이름을 chemical_table에 검색해 camical entity를 얻는다.

3. 화학 수치로 source_chemical_entity를 생성한다.

4. set으로 두엔티티를 넣어준다.

5. persist로 저장한다.

 

차량 정보 등록

1. 차량의 기상정보를 통해 car_weather_entity를 생성한다.

2. 차량 카테고리를 car_category_table에 검색해 car_entity를 얻는다.

3. 경도와 위도로 car_location_entity 생성

4. set으로 1,2번의 엔티티를 car_location_entity에 등록 후 persist로 저장한다.

5.  화학물질 이름을 chemical_table에 검색해  chemical_entity를 얻는다.

6.  화학 수치로 car_chemical_observation_entity 생성 한다.

7.  set으로 car_location_entity를 car_chemical_observation_entity 에 등록한다.

8. 5~7을 모든 화학 물질이 등록될때까지 반복한다.

 

필요한 데이터 조회

1. 차량 카테고리가 주어졌을 때 차량카테고리가 일치하는 car_Location_entity 리스트를 반환한다. (gps 노이즈 제거를 위해 이동거리에 따라 차량 데이터를 제거하면 좋음)

2. 모든 source_entity 리스트 반환.

3. minimum_significant_value_entity 리스트 반환

4. 가장 최근에 등록된 car_Location_entity 반환

 

1번 예시

{
  "CarId": 1,
  "CarObservationEntity": [
    {"chemicalName": "Chemical1", "chemicalValue": 10},
    {"chemicalName": "Chemical2", "chemicalValue": 20},
    {"chemicalName": "Chemical3", "chemicalValue": 30}
  ],
  "CarWeatherObservationEntity": {
    "Humidity": 60,
    "Temperature": 25,
    "WindDirection": "North",
    "WindSpeed": 10
  },
  "Latitude": xx.1234567,
  "Longitude": xx.9876543,
  "Date": "2024-04-15 14:30:00"
}

 

 

 

 

 

 

 

 

 

 

참고자료

1. 도메인 주도 개발

 

[우테코] Domain Driven Development(도메인 주도 개발)이란?

💋 인트로 이 글은 우테코 5기 코치 제이슨의 강의를 듣고, 깃짱이 작성한 글입니다. 💋 레거시 코드 ✔️ 레거시 코드란? 레거시 코드란, 이해할 수 없고 수정하기도 힘든 코드를 지칭하는 속

engineerinsight.tistory.com

 

2. 자바스크립트 객체지향프로그래밍

 

객체 지향 프로그래밍 - Web 개발 학습하기 | MDN

객체 지향 프로그래밍(OOP)은 Java 및 C++를 비롯한 많은 프로그래밍 언어의 기본이 되는 프로그래밍 패러다임입니다. 이 기사에서는 OOP의 기본 개념에 대한 개요를 제공합니다. 클래스와 인스턴스

developer.mozilla.org

 

3. 자바스크립트 객체배열

 

JavaScript 객체 배열 튜토리얼 - JS 배열 메서드를 사용해 객체를 생성, 업데이트 및 루프하는 방법

저는 평균적으로 일주일에 18번 JSON 데이터로 작업합니다. 그럼에도 불구하고 JSON 데이터를 다룰 때마다 구체적인 메서드 사용법을 검색해야 합니다. 이럴 때마다 명쾌한 해답을 주는 안내서가

www.freecodecamp.org

 

4. 데이터베이스 정규화 및 식별 비식별 관계

 

[Database] 정규화(Normalization) 쉽게 이해하기

지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz

mangkyu.tistory.com

 

 

[ Database ] 제 1정규화, 제 2정규화, 제 3정규화

정규화란? 데이터베이스의 데이터들을 최대한 중복을 제거하여 이상 현상 ( Anomaly ) 을 방지하​기 위한 기술이다. ​ 여기서 말하는 이상현상은 세 가지가 있는데 간략하게 설명하면 다음과 같

mjn5027.tistory.com

 

 

데이터베이스 식별관계와 비식별관계

안녕하세요. 오늘은 데이터베이스 테이블간의 식별관계와 비식별관계에 대해서 간단하게 알아보겠습니다. 테이블간의 관계 설정 예를들어, 데이터베이스에서 유저테이블과 주문테이블간의 관

ithub.tistory.com

5. 데이터베이스 ERD 설계

 

[MySQL] Workbench로 ERD 그리기

Mysql을 사용하는 프로젝트를 할 경우 ERD 설계를 쉽게 도와주는 툴이 workbench 입니다. 새로운 ERD를 그리기 위해 File -> New Model를 선택하면 다음 화면을 볼 수 있습니다. 위의 Add Diagram을 선택하면 ERD

sichan-dev.tistory.com

6. 워크벤치 팅김 문제

 

MySQL Workbench 설치 및 사용

최신 버전은 M1 맥에서 호환이 제대로 되지 않는 문제가 있었다. 따라서 처음에는 8.0.25버전을 설치했었는데, EER Diagram을 생성하던 중 문제가 생겨서 혹시 버전 문제일까 싶어서 8.0.29버전으로 재

velog.io

7. mybatis insert후 키 반환

 

MyBatis/iBatis] 방금 INSERT 된 Key 가져오기

여러 테이블에 insert를 해야되는데, 방금 insert 된 그 PK를 다른테이블에서 써야할 때... select를 해올수도 없고 그럴땐??? 1. MyBatis /* query */ id가 autoincrement인 PK일 경우, 여기서 insert 된 행의 id 값을

marobiana.tistory.com

8. 데이터베이스 조인

 

[Oracle] SQL 문법 JOIN 조인 예제 및 정리 (1) - INNER JOIN | OUTER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN | 조인절

실무에서 필수로 쓰이는 JOIN 절에 대해서 정리해보겠다. 이번 포스팅에서는 INNER 조인 OUTER 조인에 대해서 간략하게 알아보자.. INNER JOIN 이란? LEFT OUTER JOIN 이란? .. 매번 JOIN절은 공부할때마다 이

cceeun.tistory.com

9. myBatis 중첩 조인

 

mybatis resultMap 활용 - join

개발을 하다보면, 두 개 이상의 테이블을 join하여 결과를 가져와야 하는 경우가 많다.일반적으로 하나의 테이블에 각 컬럼에 해당하는 vo(value object) 를 만들어 사용하는데, mybatis에서 하나의 쿼

ssssssu12.tistory.com

10.jpa

 

[JPA] 연관관계 매핑 기초 #2 (양방향 연관관계와 연관관계의 주인)

이번 글에서는 에 대해 알아보겠습니다. 이 시리즈 글은 김영한 님의 강의, 책을 보고 적은 것임을 알려드립니다. (강추) 오타 및 피드백 환영합니다. 양방향 연관관계 이전 글에서는 회원에서

velog.io

 

 

[JPA] 다대다 N : N 관계 풀어내기 (중간 테이블 생성)

JPA를 사용하는 프로젝트를 진행하면서 다대다 관계를 풀어내야할 일이 생겼다. 객체 지향언어에서는 2개의 컬렉션 객체로 다대다 관계를 표현 할 수 있지만, 관계형 데이터베이스는 정규화된 2

rachel0115.tistory.com