프로젝트 진행
1. Yahoo Query를 이용한 데이터 수집
- Yahoo Query Open API를 이용해 주식 정보를 수집했다.
- Python을 이용해서 수집했으며, Pandas를 이용해서 csv파일을 추출했다.
- csv파일을 데이터 베이스에 적용하기 위해서 pandas의 to_sql을 사용했다.
- 약 1150개의 회사 정보를 수집했다. (해외 주식 포함)
- 약 500만개의 주가 정보를 수집했다.
- 회사 상세 정보, 회사 금융 정보, 환율, 금리 등 다양한 정보를 수집했다.
2. 복잡한 Business Logic 풀기
- 주식 게임을 진행하는데에는 많은 테이블이 연관되어 있다.
- 또한, 매수/매도를 실행하면 해당 데이터와 연관되어 있는 모든 테이블을 업데이트 시킨 후 다시 새로운 데이터로 업데이트 시켜야 했다.
- 복잡한 비즈니스 로직을 해결하기 위해 다음과 같은 방법을 사용했다.
- Data 모델링 : 비즈니스 로직에 필요한 데이터 구조를 설계했다. 테이블 간의 관계를 정의하고, 상속 및 연관관계를 설정했다.
- Entity 모델링 : Data 모델링을 통해 설계한 테이블을 바탕으로 Entity를 모델링 했다. 또한, 데이터를 효율적으로 관리하기 위해 Dto로 변환하는 작업과 Update하는 작업을 함수화 시켜 중복 발생을 최소화하며, 데이터 양식을 균일화했다.
- 관계 매핑 : 다대일(ManyToOne) 양식을 지키며 관계 매핑을 지정했다.
- 트랜잭션 관리 : 한 서비스에서 여러 테이블을 조회하고 수정하기 때문에 트랜잭션 관리를 통해 데이터 베이스의 일관성을 유지했다.
- 예외처리 : 데이터 조회 문제, 잘못된 사용자 요청 등 다양한 예외 상황을 고려하여 예외처리 로직을 수행했다. 특히, @RestControllerAdvice, @ExceptionHandler를 이용하여 다양한 Error에 대응할 수 있도록 구성했다.
- 책임분리 : 다양한 서비스들을 생성해 책임 분리(Separation of Concerns)를 수행했다. 이를 통해서 각 서비스의 로직의 신뢰성 보장할 수 있었고, 하위 서비스들을 종합해 복잡한 비즈니스 로직을 해결할 수 있었다.
- 코드 가독성 : 코드 가독성을 위해 모든 서비스 및 메소드에 Description, Parmas, Return 양식을 지켜 주석을 작성했다.
3. 결과
- to_sql을 사용한 결과 데이터 input에 걸리는 시간은 약 10분 내외. mysql에 직접 넣거나, work bench를 이용할 경우 약 2시간 (추정치) 이상으로 데이터를 효과적으로 수집할 수 있었다.
- 복잡한 비즈니스 로직을 체계적으로 풀어내 주어진 시간안에 서비스를 구현할 수 있었다.
- 테스트 및 요구사항 변경이 발생했을 때 해당하는 서비스만 수정해 빠르게 대처할 수 있었다.