Coding History/Team Project

팀플) 기존 행성 데이터 DB 저장, 조회기능 SQLAlchemy로 적용해보기.

BlackBirdIT 2024. 10. 25. 15:19

이게 생각보다 요청이 오래 걸려서 DB에 저장하고 꺼내와서 위치데이터 기반으로 가시성에 대한 계산 로직을 짜야할 것 같았다.

그래서 유성우 요청시에 혜성의 데이터까지 표시하도록 한 이유가 바로 DB에 저장하기 위해서 일부러 그렇게 한 것이다.

암튼! 이번에는 수동으로 DB에 넣는 로직이 아닌 SQLAlchemy를 써볼 생각이다.

이게 그.. Spring에서 JPA 같은 역할을 수행한다고 한다.

SQLAlchemy로의 전환은 조금 큰 작업이 될 것 같다. 이전에 행성 DB 저장 로직도 다 고쳐야하고, 기존에 저장해둔 도커 볼륨의 데이터도 지켜야하기 때문에 일단은 백업을 하는 방법부터 알아냈다.

docker run --rm --volumes-from <container_name> -v 
$(pwd):/backup ubuntu tar cvf /backup/backup.tar /path/to/volume

볼륨에 저장된 데이터를 백업시켰으니.. 이제 내 마음대로 주물러보자.

우선 기전의 pymysql을 바로 지우고 시작하는 것이 아니고 SQLAlchemy에 필요한 코드들, 즉 기본설정이나 기존의 행성의 로직부터 적용을 해야하니 그와 관련된 코드를 작성해줬다.

그리고 보니까 flask db init명령어로 마이그레이션 초기화를 시켜줘야한다고 해서 했다.

마이그레이션 초기화가 뭔지는 모름..

심지어 버그도 발생함.

저게 천체력 파일인데 뭐 권한이 없고 어쩌구 해서, 내가 만들어둔 data 디렉토리로 이동시켜주었다.

여튼 해결하고 명령어를 성공하니까

이런 폴더와 파일이 생성되었다. (아 중간에 원래 년도와 행성별로 나누던 테이블의 구조도 년도별로만 나눌 수 있게 틀을 짰다.)

여기서 alembic.ini 파일에 내 DB의 url을 연결 시켜주어야된다고 한다.

sqlalchemy.url = mysql+pymysql://root:@localhost:3306/STAR_INFO_API_DB

그래서 해줬다.

다음으로는 마이그레이션 파일 생성을 해줘야한다고 하는데. flask db migrate -m "이름이름이름"일케 해주면 된다.

아! 이거 하기전에 나는 도커 컴포즈 설정을 먼저 SQLAlchemy로 바꿔줘야한다.

바꾸고,,, 서버 켜보고,,, DB 연결 됐는지 확인하고...

테이블들도 한번 봤다..

이제 준비준비는 끝났으니까 다시 해보자.


음.. 지금 꽤 이상하게 계속 연결이 안되어서 방법을 계속 찾아봤는데,

데이터베이스가 준비되기 전에 flask가 시작되지 않도록 지연을 시켜야된다고 한다.

그래서.. 해당 깃에서wait-for-it.sh이놈을 다운 받아서 도커 컴포즈에 넣어보기로 했다.

아!

curl -o wait-for-it.sh https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh

해당 명령어로 다운 받으면 된다.


이 문제가 아니였고, 난 명령어를 그냥 터미널에 쳤었다. 근데 이게 더 알아보니까 docker 내부 터미널에서 실행시켜야하는 명령어였다. 아 이걸로 몇시간을 버린거야..

여튼

잘 적용되었다.

flask db upgrade

다음 명령어 까지 완료하고..

이제 테이블이 내가 의도한대로 생성이 되었는가 확인해봤다.

음 됐구만.

그럼 planet_raw_data도 삽입해봐야지.

저번에 해놓은 Postman을 사용하자구..

성공 메세지 반환 받았고.

실제로도 값이 들어간 것도 확인.

이제는 조회가 되는지 확인해보면 된다.

행성의 가시성과 대접근에 대한 결과를 올바르게 반환하는 것도 확인했다.


오케이!!! 이제는 유성우 로우 데이터 저장 로직을 짜면 된다.


핵심.

지금 작업의 핵심은 프로젝트 전반의 DB 관리를 pymysql로 관리했던 것을, SQLAlchemy를 도입함으로써 조금 더 수월하게 관리할 수 있는 환경으로 만들었다. (쿼리가 없으니 코드가 눈에 보이게 줄긴 했다.)
이 과정에서 도커 서버와 도커의 DB 서버 등등 좀 문제가 많긴 했는데 뭐.. 결국 해결은 했고 기존의 로직들이 망가지지 않게 잘 올렸다.

SQLAlchemy 도입 완료.