# Metabase

## Metabase 도입으로 백오피스 장애를 줄이고 데이터 요청을 분산시킨 경험.

### 배경 : 백오피스가 계속 뻗기 시작했다.

DA(Data Analytics) 팀이 설립되면서 지표 추출/리포팅 요청이 급격히 늘었다.

문제는 그 요청들이 **기존 BackOffice(운영/관리 화면)** 로 몰렸다는 점이다.

* 조회성 기능(지표 추출)이 계속 추가됨.
* 운영자/DA 가 더 많은 쿼리를 실행함.
* 결과적으로 BackOffice 가 자주 느려지거나 뻗는 문제가 반복됨.

처음에는 단순 성능 문제처럼 보였지만, 시간이 지나면서 본질은 "BackOffice 가 운영 기능 + 데이터 분석 기능을 동시에 떠안는 구조" 라는 점이 더 크게 보였다.

그래서 목표를 이렇게 잡았다.

> **BackOffice 는 운영 업무에 집중시키고, 지표/분석 조회는 별도 채널로 분리하자.**
>
> 그리고 초심자도 스스로 데이터를 뽑을 수 있게 만들자.

***

### 해결 방향 : "데잍터를 뽑는 도구" 를 분리하자.

내가 찾던 도구 조건은 명확했다.

* DA 팀은 **SQL로 복잡한 분석** 을 할 수 있어야 하고
* 마케팅/기획은 **SQL 없이도 클릭 기반으로 조회** 가 가능해야 하고
* 운영 부담(설치/관리)이 크지 않아야 하고
* 대시보드 공유/ 필터링이 가능해야 했다.

이런 관점에서 BI 도구 후보(Tableau, Superset, Redash 등)를 검토했고, 최종적으로 **Metabse** 를 선택했다.

***

### 왜 Metabase 였나

#### 1) DA 팀 생산성 극대화(SQL & No-Code 공존)

**SQL Editor**

DA 팀은 SQL 에 익숙해서, 조인/CTE 같은 복잡한 쿼리 기반 분석이 필요했다. Metabase 는 SQL 작성 경험이 괜찮고, 결과를 바로 시각화로 연결하기가 편했다.

**Visual Query Builder(노코드 조회)**

반대로 마케팅/기획은 단순 지표를 확인하려고 매번 DA 에게 요청하는 상황이 많았는데, Metabase 는 클릭/드래그 기반으로 기본적인 조회가 가능했다.

결과적으로

DA 팀은 반복적인 단순 데이터 요청(Ad-hoc Query) 에서 벗어나고, 비개발/비SQL 사용자도 필요한 지표를 스스로 확인할 수 있게 만드는 효과를 기대했다.

#### 2) 설치/운영 편의성(운영 부담 최소화)

Tableau 처럼 무겁거나 Superset 처럼 초기 구성이 복잡한 도구에 비해, Metabase는 **Docker 로 비교적 빠르게 올릴 수 있는 편** 이었다.

운영개발 관점에서는 "도입 이후 유지보수 비용" 이 중요한데, Metabase 는 그 부분이 부담이 적었다.

또한 데이터 선택 시 자동으로 적절한 형태의 그래프를 제안해주는 기능이 있어, "리포트를 만드는 시간"도 줄일 수 있었다.

#### 3) 협업/공유 기능이 실사용에 유리했다.

* **대시보드 공유** : DA 가 만든 대시보드를 여러 팀이 함께 사용 가능
* **Interactive Filtering** : 필터만 바꿔가며 스스로 데이터를 탐색 가능
* **정기 구독(Pulse)** : 주요 지표를 정기적으로 공유하는 운영 방식도 고려할 수 있음

도구의 기능이 좋아도, "팀이 실제로 쓰게 만드는 것" 이 더 어렵다.&#x20;

Metabase 는 사용자가 접근하기 쉬운 편이라 **도입 후 확산 가능성** 이 높다고 판단했다.

***

### 운영 설계 포인트 : BackOffice 부하를 줄이는 방향

Metabase 도입은 단순히 BI 도구 하나 추가가 아니라, 운영 구조를 바꾸는 일이었다.

* BackOffice 에 있던 "조회/지표 기능" 을 Metabase 로 분산
* 반복 조회는 대시보드로 고정화
* DA 가 필요한 쿼리는 SQL 기반으로 만들고
* 비 SQL 사용자는 필터/드래그로 필요한 범위 내에서 자가 조회

즉, BackOffice 는 운영 업무에 집중하고,

지표조회는 Metabase 로 분리함으로써 **BackOffice 장애/부하 위험을 줄이는 구조** 를 목표로 했다.

***

### 설치

#### Docker Repository 설정 전 yum-utils 설치

```
sudo yum install -y yum-utils
```

#### yum remove

기존에 있떤 docker 삭제 후 다시 설치

```
 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
```

```
sudo yum list | grep docker-re  # 현재 존재하지 않음
```

#### docker repository 추가

```
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

#### repository 확인

```
ll /etc/yum.repos.d/
```

#### docker package 설치

```
sudo yum install docker-ce docker-ce-cli containerd.io
```

#### docker systemctl 확인

```
systemctl status docker
```

#### 재기동 시 자동 실행 하도록 명령

```
sudo systemctl enable docker
```

#### docker 실행(안켜져 있다면)

```
sudo systemctl start docker
```

#### docker compose 설치, 1.27.4

```
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod 755 /usr/local/bin/docker-compose
```

#### metabase 설치 및 컨테이너 생성, 실행

```
docker run -e "JAVA_OPTS= -Xms 2048m -Xmx4096m" -d -p 3000:3000 -name metabase metabase/metabase:latest
```

#### docker 프로세스 확인

```
docker ps -a
```

#### metabase ojdbc 플러그인 설치

1. oracle 홈페이지 가서 ojdbc8.jar 설치 후 서버에 옮기기
2. docker cp 쓰기

```
docker cp /home/happytuk/ojdbc8.jar <container_name>:/plugins/
```

3. 확인

```
docker ps -a # container id 확인 후

docker exec -it <container_id> /bin/sh # metabase 컨테이너 쉘 접속

# cd plugins # ojdbc8.jar 있는지 확인
```

4. 재실행

```
docker start <container_name>
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wjddustkd45.gitbook.io/organizeme/company-org/metabase.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
