2년차 백엔드 개발자로 스타트업에서 일하고 있던 중, 이기종 DB간의 데이터를 동기화하는 모듈 개발을 진행하게 되었다. 예를 들면 Mysql의 특정 테이블에서 Postgresql의 특정 테이블로 데이터를 동기화 하는 것.
프로젝트는 내 주언어인 자바로 진행하게 되었고, 프로젝트에 대한 아키텍처가 전혀 없는 정말 맨바닥 단계부터 진행하게 되어 초반부터 많은 고민들과
삽질
을 하게 되었다.
이 글은, 프로젝트를 진행하면서 했던 기술적인 고민들을 기록하기 위한 글이다. (회사와 관련된 민감한 정보들은 최대한 누락하고 작성할 예정... 이지만 차후 문제가 생길 경우 글이 내려갈 수 있다...)
프로젝트 첫 날 ~ 샛째 날
프로젝트 요구사항을 분석했다.
요구사항의 개략적인 맥락은 크게 세 단계로 보였다.
1. 소스 데이터베이스(이하 컨테이너)에서 자바 시스템으로 마이그레이션 하고자 하는 데이터를 가져온다.
2. 데이터가 대량일 수 있으므로 자바에서는 데이터를 필요한 방식으로 가공/저장한다.
3. 이관하고자 하는 데이터를 타겟 컨테이너로 밀어 넣는다.
이렇게까지 봤을 때는, 요구사항 자체가 너무 간단해보였기에 꽤 쉬운 과업이 될 것 같았다. 하지만 각 단계를 곰곰히 생각해보니 생각보다 쉬운 문제가 아닐 수도 있겠다는 생각이 머리를 스쳤다.
이에 1번부터 집중해서 파악해보기로 했고, 곧 아래와 같은 고민에 빠지게 됐다.
데이터베이스 테이블마다 테이블 구조가 다 다른데, 어떻게 그걸 자바로 가져오지...?
자바는 '기본적으로' 타입에 엄격하고 컴파일 단계에서 변수 선언과 같은 과정들이 결정되기 때문에 자바스크립트처럼 데이터를 동적으로 할당할 수가 없다. 문제는 이관하고자 하는 컨테이너의 테이블 구조는, 자바 시스템이 구동된 이후에 결정된다는 부분이었다. 말이 어려운데 그냥 간단하게 말하면, 프로그램을 짜는 코드 단계에서는 실제 사용자가 마이그레이션 할 때의 테이블 구조를 알 수가 없다는 것. 그리고 자바는 그걸 대응하기가 조금 까다로운 언어라는 것.
이후 여러 방면으로 고민을 하게 되었고, 가장 먼저 떠오른 것은 자바의 리플렉션이라는 기능이었다. 리플렉션은 이전에도 한번 사용해본 적이 있었고, 런타임 환경에서 변수를 할당하고 인스턴스의 구조를 변경할 수 있는 기술이라는 점 때문에 이러한 환경에 딱 맞는 기술이지 않을까... 하는 생각을 하게 됐다.
아래는 과거에 내가 썼던 리플렉션 관련된 게시글
https://gaebalsogi.tistory.com/87
우선 리플렉션을 조금 파보는 방식으로, 이런 구조에서 사용하기 용이한지 파악해보고자 한다.
+ ByteBuddy라는 라이브러리를 알게 됐다. 리플렉션과 같이 런타임 환경에서 인스턴스를 조작하는 라이브러리 같은데, 사용하기 용이하지 않을까... 하는 생각을 해봤다. 리플렉션에 대해 공부해보면서 이 라이브러리도 좀 눈여겨 볼 생각이다.
'메모 & 삽질기록보관소' 카테고리의 다른 글
[자바] MXBean already registered 에러 핸들링 (0) | 2023.06.15 |
---|---|
MQTT 공부 중 참고할만한 문헌 모아두기 (5) | 2023.06.11 |
[데이터베이스] MySQL과 MariaDB의 차이점? (0) | 2022.11.17 |
[strapi] NginX 리버스 프록싱 관련 이슈 (0) | 2022.07.07 |
[JPA] 스프링이 엔티티를 인식하지 않는 것 같습니다! (0) | 2022.06.18 |