Dummy 생성 module 개발 후기

BestJelly·2022년 6월 4일
0

프로젝트

목록 보기
4/4

2021.12 - 2021.3
더미 생성기 개발기 지금 바로 시작합니다.

프로젝트의 시작

학교 및 외부 프로젝트를 진행하면서 항상 개발 생산성에 관련되어 고민해왔다. “개발의 속도와 품질이 양립할 수 있을까?” 대충 이런 주제였다. 마감기한이 엄청나게 짧은 프로젝트는 어떻게든 보여주기용으로만 개발이 완성되어 유지보수적인 부분에서 문제가 많았다. 반대로 마감기한이 긴 프로젝트는 품질은 좋지만 그만큼 생산성이 저하된다는 문제였다.

나는 욕심쟁이기에 개발의 속도와 품질 모두 잡고 싶었다. 따라서 구현 뿐만 아니라 기획/설계 및 데이터베이스를 비롯하여 프로젝트의 전반적인 부분이 어떻게 진행되는지를 공부하였다. 그리고 개발 프로젝트 진행에서 “최대한 빨리 핵심 기능만을 포함한 프로토타입을 만들고 마감기한 중 남은 기한은 수많은 리팩토링을 거쳐 품질을 올리자"라는 것을 목표로 잡았다.



더미 데이터의 중요성

더미 데이터는 말 그대로 실제 사용되는 데이터가 아닌 오로지 프로젝트 개발을 위해 임시로 만든 더미용 데이터이다. 개발자마다 다양한 개발 스타일이 있는데 나같은 경우에는 처음에는 기능의 중요성과 상관 없이 기본적인것들 부터 구현한 후에 데이터가 필요한 부분은 CRUD의 Create 부분부터 만들어 자연스럽게 DB에 데이터가 쌓이도록 하였다.

하지만 위의 문제점은 개발 속도가 너무 떨어진다는 점이다. 예를 들어 우리가 블로그를 구현한다고 했을 때 블로그의 글 목록 페이징 기능을 만든다고 해보자. 이럴 때에 하나하나 글 작성 기능을 통해 데이터를 만든다면 엄청나게 많은 데이터를 만들어야 비로소 페이징 테스트를 해볼 수 있을 것이다.

따라서 기존의 방식을 버리고 데이터를 자연스럽게 쌓아 올리는 것이 아니라 필요한 데이터를 미리 만들어 둔 뒤에 구현하는 방식으로 개발을 진행하였다. 보통 Spring으로 개발할 때 PostConstructor에 JPA를 통해 for문을 돌리거나 SQL SCHEMA 파일을 만든 후에 ddl-auto 옵션을 통해 서버 시작전 더미 데이터를 만들도록 하였다.



일반적인 더미 데이터 생성에 한계를 느끼다

더미데이터를 만드는 것은 엄청나게 쉽다. JPA까지 사용한다면 그저 객체를 for문으로 생성한 후 DB에 업데이트 하면 된다. JPA는 연관관계도 쉽게 설정할 수 있기 때문에 구현하는 개발자 입장에서 크게 신경쓸 부분이 없다. (ORM을 처음 맡본 후에 일반적인 쿼리나 함수형으로 돌아가기가 꺼려졌다)

또한 ddl-auto 옵션을 통해 서버가 시작할 때마다 DB 전체를 초기화 시킬 수 있고 update 속성을 통해 db가 초기화 되지 않고 자연스럽게 쌓여가는 구조로도 구현할 수 있다. 하지만 위와 같은 구조로 더미 데이터를 생성할 때 많은 문제점들에 직면하였다.



어려움에 부딪힌 부분

첫번쨰로 먼저 원하는 형식으로 데이터를 집어넣지 못한다는 점이다. 예를 들어 우리가 앱스토어 사이트를 만들 때 앱들이 앱 리스트에서 보이는 조건이 app 테이블의 public 컬럼이 active 값이여야 한다고 하자. 더미를 생성할 때 inactive와 active 값을 섞어놔야 테스트 할 때 용이하다. 물론 이들을 random 함수들을 통해 설정할 수 있지만 실제 구현이 아닌 더미를 생성하고자 코드가 점점 늘어난다. ( 날짜, 내용, 제목, 특정 포맷, 특정 범위, 순서 등)

두번째로 더미데이터들간의 연관관계를 랜덤으로 설정하고 싶을때 어려움을 겪는다. 예를 들어 블로그의 글과 카테고리가 서로 many to one 관계를 가진다고 하자. 일반적인 데이터 생성은 글 작성 과정에서 카테고리를 설정하여 제출하므로 ORM을 통해 손쉽게 연관관계 매핑을 할 수 있을 것이다.

하지만 카테고리 테이블과 글 테이블 모두 더미로 생성해야 한다면 더미 생성을 통해 생성된 카테고리의 primary key에 한정하여 글의 foreign key에 랜덤으로 적절히 섞어줘야 한다. 해당 과정 또한 어떻게든 구현할 수는 있겠지만 실제 구현이 아닌 도움이 되는 더미 생성 코드에 너무 많은 시간을 뺏기게 된다.

세번째는 dll-auto를 사용할 때 개발자가 실수할 수 있다는 점이다. 해당 문제가 결정적으로 이번 프로젝트를 시작하게 되는 계기가 되었다. ddl-auto 옵션은 보통 프로젝트 초기에 create 옵션으로 설정하는 경우가 많다 (서버 시작시에 자동으로 DB도 초기화) 적절한 시점에서 이 옵션을 꺼야되는데 실수로 끄지 않은 상태에서 서버를 실행해버려 손수 기능을 사용하여 생성한 데이터도 다 날라가 버릴 때가 있다.따라서 서버 시작시 자동으로 초기화 되는 것이 아닌 적절한 시점에 데이터 삭제를 결정할 수 있는 기능이 필요하였다.

위의 모든 문제점들을 극복하기 위해 더미 생성 모듈을 개발하기 시작하였다.



프로젝트 진행

프로젝트 개요

  • 백엔드 : Spring
  • 프론드엔드 : html, css, js, jquery, angular js
  • 배포 환경 : AWS EC2, S3, Route 53, Docker
  • DB 연동
    • 더미 생성 : JDBC
    • 전체 서비스 : JPA
  • DB : 테스트 h2, 배포 mariadb

더미 생성은 객체에 의존적이여야 하나?

먼저 DB 연동부에서 회원 정보, 더미 생성 설정 정보 같은 서비스와 관련된 부분은 JPA로 처리하였고 실제 외부 DB와 연동되어 더미를 생성, 삭제 하는 부분은 JDBC를 사용하였다. JDBC로 더미 생성을 하는 이유는 더미를 생성하는데 연관관계 매핑이나 컬럼 포맷 옵션 등을 설정하는데 객체에 의존적이면 다양한 스키마의 테이블과 호환되기 어려웠기 때문이다.

그 외

그리고 이전 프로젝트들과 이번 프로젝트에 docker를 사용해봤는데 너무 편하다. docker의 장점으로 vm 처럼 무겁지 않고 이미지 형식으로 가볍다는 것이 제일 부각되는데 개인적으로는 FTP를 통해 build 파일을 옮길 필요 없이 git처럼 간단하게 push/pull이 가능한게 너무 좋은 것 같다.

전체적인 구조

컨테이너, 블록 구조

용어를 어렵게 사용하긴 했는데 그냥 더미 설정을 폴더 구조처럼 쉽게 생성, 관리 할 수 있도록 만든 개념이다. 더미 컨테이너는 하나의 DB를 기준으로 하며 더미 컨테이너안에 여러개의 설정(더미 블록)을 만들 수 있다. 더미 블록은 해당 DB의 테이블이 기준이다.

해당 구조를 고안한 결과 상황에 따라 다양한 더미 설정을 생성할 수 있고 해당 더미 설정을 서비스 DB에 저장되어 로그인만 한다면 언제든지 이용할 수 있다. 같은 테이블이라도 다른 더미 설정으로 블록을 만들 수 있다.

예를들어 사이즈 10에 public 컬럼이 active로 고정되게 더미를 생성하다가 inactive와 active값이 섞인 더미 설정으로 바꾸고 싶다면 기존 더미 블록 설정 변경 없이 다른 더미 블록을 생성하여 해당 옵션으로 설정하고 번갈아가면서 사용하면 된다.

컬럼 설정

컬럼 설정은 개인적으로 자주 사용하는 포맷 형식만 일단 등록해두었다. 사용하면서 다른 포맷이 필요하다면 해당 형식도 추가할 생각이다. 기본적을 일반, 내용(긴 문자열), 유니크 아이디, 날짜, 고정값, 선택값, 순서, 범위, 연관관계 설정 (many to one, one to one) 이렇게 구성해두었다.

단순히 dictionary 형태로 key는 컬럼명, 값은 옵션으로 세팅하고 서버로 보내면 해당 포맷 형식으로 더미 값을 자동 세팅해준다.

rest api 지원

원래는 rest api로만 만들려고 했지만 매번 더미 설정 옵션을 작성하기에는 귀찮았기 때문에 Front 부분도 구현하였다. rest api는 로그인 없이 메인 페이지에서 바로 json 형식으로 작성하면 동작하게 하였다.

Dummy Module 개발

DB 연결 → Exception으로 오류 출력

DB 연결, 계정 불일치 등 더미 데이터를 생성하던 중에 다양한 문제로 Exception이 발생하면 해당 Exception을 프론트부분에 메시지 형태로 알려주었다. exception 메시지 그대로 출력되기 때문에 이를 참조하면 될 듯 하다.

테이블 존재 확인

기본적으로 더미 생성 조건들을 확인했는데 대표적으로 테이블 존재 확인이 있다. 중간중간 조건에 맞지 않으면 exception을 발생하도록 하였다.

테이블 분석 → PK, FK, 일반 컬럼 추출

더미 데이터를 생성하기 위해 먼저 설정된 테이블의 컬럼부터 분석한다. 테이블 분석시 가져오는 데이터는 PK(primary key), FK(foreign key), 일반 컬럼이 있으며 컬럼의 종류별로 데이터를 세팅한다.

더미 사이즈 만큼 컬럼 Array 생성

기존의 JPA처럼 해당 테이블 스키마에 맞는 Row 데이터를 하나하나 만들어 가는 방식이 아니라 컬럼 데이터 리스트를 만들고 마지막에 Row 데이터를 만드는 방식으로 구현하였다. 연관관계 매핑시 설정된 연관관계 테이블의 PK를 가져와 이들을 random으로 뿌려줘야 하기 때문이다.

컬럼 옵션 확인 및 해당 옵션대로 생성

컬럼 옵션을 확인하고 이들의 포맷에 맞춰 데이터를 컬럼 리스트에 삽입한다.

컬럼 Array 하나씩 가져오면서 Rows 데이터를 만들고 이를 실제 DB에 삽입

이전에 넣어준 컬럼 리스트들을 가져와 하나하나 분해하면서 실제 row 데이터를 만들고 만들어진 데이터는 DB에 삽입하였다.

결과물

시연 영상 (썸네일 클릭)

IMAGE ALT TEXT HERE

후기

프로토타입으로 일단 만들어서 오류가 많을듯 하다. 지원 DB driver는 mariadb와 h2로 하였다. (아무래도 테스트 개발 단계에서 활용할 것으로 기대했기 때문에 h2에 많은 중점을 두었다) 앞으로 해당 프로젝트를 더욱 발전시켜 모든 프로젝트에 더미 생성기를 적용시키고 개발 생산성을 높일 계획이다.

profile
성장 중인 신입 백엔드 개발자, 개발에는 최선을 다한다!

0개의 댓글