Coding History/Team Project

팀플) 로우데이터 저장 전략.

BlackBirdIT 2024. 10. 18. 08:30

일단 DB연결 문제를 겪으면서 계속 들었던 생각이 테이블을 행성별로 나눠야할 것 같다는 생각이 들었다.

왜?

1년이 365일이니까 행성 8개를 저장하면 365 * 8 = 2920 즉, 칼럼이 2920개나 된다.
그래서 년도 별로 나누고 행성별로 나눠서 관리하는 편이 용이할 것 같다는 생각이 들었다. 우선은 24년도 데이터를 넣을거고 정상적으로 작동되는 것이 확인되면 매년 말일에 자동으로 테이블 생성, 그리고 1년치 8개의 행성의 데이터를 넣는 로직도 짜야한다. 가 계획이다.

일단은 지금 당장 쓸 데이터를 넣어야하니까 테이블을 수정했다.

-- 행성 정보 테이블 생성
CREATE TABLE planet_info (
                             planet_code INT PRIMARY KEY,
                             planet_name VARCHAR(255) NOT NULL
);

-- 행성 정보 초기 데이터 삽입
INSERT INTO planet_info (planet_code, planet_name) VALUES
                                                       (199, 'Mercury'),
                                                       (299, 'Venus'),
                                                       (399, 'Earth'),
                                                       (499, 'Mars'),
                                                       (599, 'Jupiter'),
                                                       (699, 'Saturn'),
                                                       (799, 'Uranus'),
                                                       (899, 'Neptune'),
                                                       (999, 'Pluto');

-- 각 행성에 대한 테이블 생성 (1년치 데이터를 저장)

-- 수성 (Mercury, 행성 코드: 199)
CREATE TABLE mercury_2024_opposition_events (
                                                id INT AUTO_INCREMENT PRIMARY KEY,
                                                planet_code INT NOT NULL,
                                                reg_date DATE NOT NULL,
                                                distance DOUBLE NOT NULL
);

-- 금성 (Venus, 행성 코드: 299)
CREATE TABLE venus_2024_opposition_events (
                                              id INT AUTO_INCREMENT PRIMARY KEY,
                                              planet_code INT NOT NULL,
                                              reg_date DATE NOT NULL,
                                              distance DOUBLE NOT NULL
);

-- 화성 (Mars, 행성 코드: 499)
CREATE TABLE mars_2024_opposition_events (
                                             id INT AUTO_INCREMENT PRIMARY KEY,
                                             planet_code INT NOT NULL,
                                             reg_date DATE NOT NULL,
                                             distance DOUBLE NOT NULL
);

-- 목성 (Jupiter, 행성 코드: 599)
CREATE TABLE jupiter_2024_opposition_events (
                                                id INT AUTO_INCREMENT PRIMARY KEY,
                                                planet_code INT NOT NULL,
                                                reg_date DATE NOT NULL,
                                                distance DOUBLE NOT NULL
);

-- 토성 (Saturn, 행성 코드: 699)
CREATE TABLE saturn_2024_opposition_events (
                                               id INT AUTO_INCREMENT PRIMARY KEY,
                                               planet_code INT NOT NULL,
                                               reg_date DATE NOT NULL,
                                               distance DOUBLE NOT NULL
);

-- 천왕성 (Uranus, 행성 코드: 799)
CREATE TABLE uranus_2024_opposition_events (
                                               id INT AUTO_INCREMENT PRIMARY KEY,
                                               planet_code INT NOT NULL,
                                               reg_date DATE NOT NULL,
                                               distance DOUBLE NOT NULL
);

-- 해왕성 (Neptune, 행성 코드: 899)
CREATE TABLE neptune_2024_opposition_events (
                                                id INT AUTO_INCREMENT PRIMARY KEY,
                                                planet_code INT NOT NULL,
                                                reg_date DATE NOT NULL,
                                                distance DOUBLE NOT NULL
);

-- 명왕성 (Pluto, 행성 코드: 999)
CREATE TABLE pluto_2024_opposition_events (
                                              id INT AUTO_INCREMENT PRIMARY KEY,
                                              planet_code INT NOT NULL,
                                              reg_date DATE NOT NULL,
                                              distance DOUBLE NOT NULL
);

이게 우선은 DB 구조다.

테이블이 바뀌었으니, 파이썬 코드의 로직도 바뀔 필요가 있었다.

코드도 바꾼 뒤에 목성의 3일치 데이터를 넣었다.

오케이!!

이제는 1년치를 넣는 로직을 짜면 되는데 (뭐 사실 요청만 하면 된다)

이게 가만 생각을 해보니까 1년에 한번씩 자동으로 넣는 로직을 넣는게 좋을 것 같기도 한데 지금 테스트 단계에서 특정 년도를 조회, 그러니까 처음으로 조회할 때를 감지해서 해당년도의 테이블 생성후에 자동으로 1년치 요청하고 넣는 로직이 만들어져도 좋을 것 같다는 생각을 했다.


그래서 그렇게 만들었고 제대로 동작하고 결과값도 잘 뽑아낸다.

그런데 여기서 비슷하게 만든 후에 가시성에서도 DB로 접근할 수 있게 만들고 싶어서 구현을 해봤더니 오류가 났다.

의외로 오류는 빨리 찾았다.

DB 다 지워놓고 화성을 조회해봤는데, DB에 넣을 행성 코드가 문자열이라서 발생한 것.

여기서는 왜 이런 문제가 발생했는지 보면 되는데,

Skyfield api에서 사용하는 행성 코드와 Horizon API에서 사용하는 행성코드가 다르다.
때문에 같은 로직으로 DB 접근을 하려고 했을 때 행성 대접근에서는 하나의 코드 매핑이 필요했지만 행성의 가시성 조회에서 DB 접근까지 하려면 코드 매핑 로직이 두개가 필요하다.

이걸 빼놓고 구현해서 DB에 올바른 값을 넣지 못해서 발생한 것.

뭐 원인을 명확히 알았으니 코드 수정하고..

결과를 잘 뽑아냈다. 이제 24년도 1년치의 화성 DB DATA가 잘 삽입이 되었는가 조회해보면 된다.

테이블 잘 생성 되었고.

1년치 데이터도 잘 들어간다. 이제는 24년도의 화성에 대한 요청이 들어오면 DB를 확인하게 되고 다른행성의 24년도를 조회하려고 한다면 또 다른 테이블 생성하고 1년치를 저장한다. 굳 이제 이건 완성이다.