목표는 Data Warehouse, Data Lake, Lake House 구축 후 간단한 실습까지 진행해보는 것

 

모든 것을 진행할 환경은 minikube로.. 클라우드나 온프레미스 서버를 장만하기엔 너무 거창하니 간단하게 진행할 예정

 

 

chat GPT와 이것저것 이야기한 결과, 최종 개발 로드맵은 아래와 같다.

 

🧪 데이터 아키텍처 실습 플랜: DW → DL → Lakehouse (Minikube 기반)


✅ 전체 개요

  • 목표: Minikube 환경에서 Data Warehouse → Data Lake → Lakehouse 아키텍처를 직접 구축하고 흐름을 이해함
  • 도구:
    • Kubernetes (Minikube)
    • Helm
    • Apache Airflow
    • Apache Spark
    • MinIO (S3 호환)
    • PostgreSQL / MariaDB
    • Trino
    • Superset
    • Apache Iceberg (or Delta Lake)
    • Kafka (옵션)
    • code-server (개발 IDE)

1️⃣ 실습 1단계: Data Warehouse (DW)

🧱 구성

  • PostgreSQL
  • Superset
  • Airflow

🛠️ 실습 흐름

  1. 공공 CSV 데이터 수집 (서울시 교통량 등)
  2. Airflow DAG으로 PostgreSQL에 적재
  3. Superset에서 PostgreSQL 연결 후 시각화

🎯 학습 포인트

  • 정형 데이터 분석 환경 구조 익히기
  • SQL 분석 흐름 이해하기

2️⃣ 실습 2단계: Data Lake (DL)

🧱 구성

  • MinIO (S3 호환 객체 저장소)
  • Spark
  • Airflow

🛠️ 실습 흐름

  1. CSV/JSON 데이터를 MinIO에 업로드 (Airflow로 DAG 자동화)
  2. Spark로 MinIO에서 데이터 읽기 → 정제 → 다시 MinIO에 저장
  3. (선택) 결과를 PostgreSQL로 적재

🎯 학습 포인트

  • Raw 데이터를 유연하게 저장/정제하는 DL 개념
  • Spark + S3 연동 처리 실습

3️⃣ 실습 3단계: Lakehouse

🧱 구성

  • MinIO
  • Apache Iceberg (또는 Delta Lake)
  • Spark
  • Trino
  • Superset
  • Hive Metastore (PostgreSQL)

🛠️ 실습 흐름

  1. Spark로 MinIO에 저장된 CSV를 Iceberg 테이블로 변환
  2. PostgreSQL 기반 Metastore에 Iceberg 테이블 등록
  3. Trino로 Iceberg 테이블 SQL 분석
  4. Superset → Trino 연결 후 시각화

🎯 학습 포인트

  • Lake + Warehouse 개념 통합
  • Iceberg 또는 Delta Lake 구조 이해
  • SQL Query 엔진과의 연동 이해

💡 추가 실습 아이디어

  • Kafka Producer → MinIO / PostgreSQL → 실시간 수집 파이프라인
  • code-server에서 DAG/Spark 코드 작성 → Git으로 버전 관리
  • Airflow → SparkSubmitOperator → Iceberg 쿼리 자동화
  • Superset Dashboard 자동 생성 스크립트

✅ 실습 환경 요구사항 (Minikube 기준)

  • minikube start --cpus=6 --memory=12g
  • Ingress 활성화: minikube addons enable ingress
  • Helm 3.x 이상

 

Airflow DAG코드 수정을 간편하게 하기 위해 code-server를 사용할거고,

모니터링 툴하고 superset과 같은 BI쪽은 시간되면 할텐데 일단 데이터 엔지니어링 쪽에 집중하려고 한다!

 

 

목표는 아래와 같다.

* spark 공부 및 실습

* hadoop 공부 및 실습

* Data Lake, Lake House 공부 및 실습

 

Data Warehouse는 이미 회사에서 사용하고 있고, 실제 MinIO를 이용하여 DW에 전달하는 ELT도 하고 있기는 한데..

ELT 부분을 spark보다는 python에 의존하는 경향이 있어서 업무에 적용도 할겸 공부를 해보려고 한다.

 

진행하려는 부분만 보면 데엔보단 플랫폼 엔지니어 쪽에 가깝긴하지만, 위 과정을 겪으며 Data Warehouse, Data Lake, Lake House의 차이, 왜 발전하게 되었는지, 어떤 상황에서 주로 사용하는지.. 뭐 이런거를 알면 더 좋지 않을까 생각이 든다.

 

실제 나와 같은 데이터 엔지니어 직무 주니어 라던지,, 이 직무를 준비하는 취준생에게도 어느 정도 가이드맵이 되었으면 좋겠다 :)

맨날 애타게 기다리던 싸피에서 드디어 결과발표 소식이 났다.

결과는 합격!!!!!!!

 

결과를 기다리면서 싸피 준비과정을 티스토리에 올리고 싶다는 생각을 했었는데

막상 올렸다가 떨어지면 슬프니까 미뤄왔었다ㅎ

이제 합격했으니 맘껏 후기를 작성해야지!!!

 


후기를 작성하기에 앞서 보안서약으로 인해 자세한 내용은 담지 못하니 참고 바랍니다!

 

 

자기소개서

아마 자기소개서 준비를 한 1주일은 했던 것 같다.

다 쓰고 갈아엎는거를 3번 반복했나..? 마지막 제출 자소서까지 좀 불안한 마음은 있었지만 시간이 없으니 그냥 제출했던 것 같다 ㅎㅎ..

 

전공자다보니 학부생때 프로젝트를 했던 경험을 강조할까, 아니면 취업을 준비하며 sw쪽으로 노력을 한걸 강조할까 하다가, 교육의 취지에 맞게 내가 교육이 필요한 이유를 경험에 녹여 작성했다!

 

 

 

SW 적성검사

음....... 이거는 그냥 머리가 좋은 사람은 공부를 안해도 잘 보고 나같은 사람은 공부가 필수적인 느낌...

자세한 부분은 말할 수 없지만 그냥 본인이 좀 부족한 것 같으면 책을 마구 사서 풀어보길 추천한다!!!

내가 풀어본 책은 시대고시 SSAFY SW적성진단, 해커스 20대기업 인적성 검사, 해커스 GSAT 삼성직무적성검사

이렇게 3권을 풀었다. 앞 2권은 다 풀었는데 마지막꺼는 시간없어서 내가 부족하다고 느낀 파트만 풀었다!

 

CT부분은 평소에 코테대비 알고리즘 문제를 꾸준히 풀었어서 따로 준비하진 않았다.

 

그 결과!

합격쓰 ㅎ

 

 

 

인터뷰

최종 인터뷰... 진짜 내가 제일 걱정했던 부분이다ㅠㅠㅠ

발표만 하면 덜덜덜 떠는 바람에 학부생 때도 발표하나 제대로 못했는데 면접은 어떻겠는가........

면접 날짜가 나오고 준비할 때까지 면접 시뮬레이션 돌릴 때마다 엄청 걱정되고 떨었던 것 같다ㅠㅠㅠ

그래서 처음에는 그냥 혼자 준비할까 하다가 아무래도 다른 사람들과 함께 준비하는게 도움이 될 것 같아서 급히 오픈채팅방에 들어갔다!

 

처음 들어갔던 오픈채팅방은 총 5명쯤? 이었는데 나빼고 전부다 비전공자분들이라 전공쪽의 질문이 부족할 것 같아서 오픈채팅방을 나왔다ㅠㅠ

그리고 두번째 들어간 오픈채팅방은 나빼고 비전공자분이시긴 했는데 한분이 컴공 복수전공이시라 괜찮을 것 같았다!!!

 

그렇게 시작한 면접 스터디!

결론부터 말하자면 엄청 도움이 되었다. 정말정말 감사합니다ㅠㅠㅠ

스터디원들 전부 다 적극적으로 스터디에 참여해주시는 것도 좋았고, 질문뿐만 아니라 내가 면접할때 보여지는 안좋은 습관까지도 다 잡아주셨다!!! 덕분에 면접을 합격한게 아닐까 싶기도 했다 ㅎㅎㅎ

 

면접을 준비했던 방법!

1. 스터디원들과 서로의 자소서에서 질문들을 뽑아낸 후 거기에 답변을 준비

2. 공통적으로 나올 질문(1분 자기소개, 지원동기, 마지막할말 등)과 PT면접을 준비하고 모의 면접

3. 스터디외에도 나 혼자서 서류를 보면서 질문이 나올법한 주제를 준비

 

이렇게 하고 나니 총 50개 정도의 질문들을 준비할 수 있었던 것 같다!

그리고 이러한 것들이 면접에서 정말 많은 도움이 되었다 ㅎㅎ

 

대망의 면접 당일!

내가 생각했던 것보단 많이 안떨렸다. 준비한 스크립트도 지겹도록 봐서 그냥 입에서 술술 나오는 정도였고..ㅎ

멀캠 건물에 도착해서 대기를 하는데도 하나도 안떨려서 그냥 멍때리면서 대기했던거 같다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

(사실 혹시 몰라서 청심환을 먹기는 했다)

 

인터뷰하는 곳에 들어가서도 많이 안떨긴했는데, 인터뷰 도중에 좀 버벅거리자마자 바로 긴장모드..

다행히 인터뷰가 끝나갈 무렵이었어서 마지막 질문에서만 목소리가 좀 떨렸다!

그래도 할말은 다 하고 나온 것 같다.

 

암튼 면접을 마치고 결과날짜만 기다리면서 맨날 오픈채팅방만 봤던 것 같다 ㅋㅋㅋ

 

그 결과!

합격!!!! 1지망 서울로 했었는데 붙었다ㅎㅎㅎㅎㅎㅎ


앞으로 SSAFY를 준비하시는 분께 조그마한 tip을 드리자면..!

SSAFY는 일반 기업들과는 완전히 다른 교육기관입니다!!!!!

본인을 자랑하는 것보단 교육이 정말정말 필요하다는 것을 강조하는게 제일 중요하다고 생각합니다.

그리고 그러한 것들을 본인의 경험에 빗대어 말하면 전달력이 더 좋아질 거에요!ㅎㅎ

 

다들 열심히 준비해서 SSAFY에서 만나요!

 

 

내가 풀었던 방식으로 했을때는 테스트 케이스 1번과 2번에서 문제가 발생했다.

ex) 

tickets=[['ICN' ,'AAA'], ['ICN', 'BBB'] ,['BBB','ICN']]

답 : ['ICN', 'BBB', 'ICN', 'AAA']

이렇게 나와야하는데, 나의 방식은 ['ICN', 'AAA', 'ICN', 'BBB']로 나온다.

이 방법의 문제점은 AAA에서 출발하는 노선이 없다는 것. 따라서 저 방법은 성립하지 못한다.

 

 

나의 풀이

def solution(tickets):
    answer=[]
    tickets.sort(key=lambda x:(-(x[0]=='ICN'),x[1]))

    index=0
    answer.append(tickets[0][0])

    while True:
        if len(tickets)==0:
            break
        de, en = tickets[index]
        answer.append(en)
        tickets.__delitem__(index)
        for i in range(len(tickets)):
            if tickets[i][0]==en:
                index=i
                break

    return answer

 

고친 풀이 1 (스택사용)

def solution(tickets):
    answer=[]
    tickets.sort(reverse=True)
    routes=dict()

    for t1, t2 in tickets:
        if t1 in routes:
            routes[t1].append(t2)
        else:
            routes[t1]=[t2]

    st=['ICN']
    print(routes)

    while st:
        print(st)
        top=st[-1]
        if top not in routes or len(routes[top])==0:
            answer.append(st.pop())
        else:
            st.append(routes[top].pop())

    answer.reverse()

    return answer

 

고친 풀이 2 (DFS 사용)

def dfs(graph, N, path, here):
    path.append(here)

    if len(path)==N+1:
        return True

    if here not in graph:
        path.pop()
        return False

    for i in range(len(graph[here])):
        there=graph[here][-1]
        graph[here].pop()

        if dfs(graph,N,path,there):
            return True

        graph[here].insert(0,there)

    path.pop()
    return False

def solution(tickets):
    answer=[]

    routes=dict()

    for (start, end) in tickets:
        routes[start]=routes.get(start,[])+[end]

    for r in routes.keys():
        routes[r].sort(reverse=True)

    N=len(tickets)
    path=[]

    if dfs(routes, N, path, 'ICN'):
        answer=path

    return answer

다른것은 다 성공적으로 설치가 되고 맨 위에 MySQL Server만 계속 failed가 뜬다.

 

 

[해결방법 1]

www.microsoft.com/en-in/download/details.aspx?id=40784

 

Visual C++ Redistributable Packages for Visual Studio 2013

The Visual C++ Redistributable Packages install run-time components that are required to run C++ applications that are built by using Visual Studio 2013. For an updated version of these redistributable packages, see KB 3138367.

www.microsoft.com

MySQL server는 visual studio 2013이 필요하다.

 

위의 파일을 다운받고 설치한다. (x64와 x86)

 

그 다음 다시 MySQL설치 진행

나는 이 방법이 안먹혔다..

 

 

[해결방법 2]

버전을 낮춰서 설치한다...^^....

5.7.16으로 하니까 바로 성공

(버전을 낮추는거라.. 혹시 모를 오류에 대비해 이 방법은 최후로 쓰세요ㅠㅠㅠㅠ)

 


추가!

최근에 MySQL을 다시 다운받다가 제가 가지고 있던 문제점을 발견했습니다..!

 

MySQL을 설치하실 분들은 이미 MySQL이 컴퓨터에 깔려있는지 확인하시고,

뿌리까지 깨끗하게 삭제 후 MySQL을 다운받으셔야 합니다.

 

그러면 원래 발생했던 오류들이 발생하지 않을거에요!!

간단한 GUI로 마무리를 지을 계획이었던 졸작이 스케일이 커져 앱까지 도전하게 되었다.

전공이 컴퓨터 공학이 아니라 컴공 비스무리한 과여서 앱은 물론 안드로이드 스튜디오 마저 건드려본적이 없다.

말그대로 초보 ㅠ 하나도 모름다 ㅠ

 

예전부터 앱을 만들까 라는 고민을 하긴 했었는데 이놈의 귀찮음이 미루고 미루다가 

졸작할때 앱을 처음하게 만듦 ㅎㅎ

 

아무튼 앱을 처음 만들기 위해 안드로이드 스튜디오를 선택!

(문제는 JAVA또한 한번도 해본적이 없다는거 ^^!)

 

뭔가 난관이 예상되긴 하지만 언제부터 뭘 다 알고했다구 ㅎㅎ 

나는 Google 선생님을 믿는다.

 

 

Android Studio 설치

1. Android Studio 다운받기

developer.android.com/studio/

 

Download Android Studio and SDK tools  |  Android 스튜디오

developer.android.com

위 사이트로 들어가면 DOWNLOAD ANDROID STUDIO라는 버튼이 나온다. 

버튼을 누르고 exe파일 설치를 진행!

 

 

2. 설치

 

' Next > ' 버튼을 누른다.

 

가상환경에서의 개발을 위해 디폴트로 선택되어있는 Android Virtual Device를 선택하고,

' Next > ' 버튼을 누른다.

 

이 다음 화면에서 경로를 정하고 ' Next > ' 버튼을 누른다. 

 

 

설치를 해주자. Install 버튼 클릭

 

설치가 완료되면 Next 클릭

 

설치가 완료되었다는 창이 나오고,

바로 실행시키기 위해 Start Android Studio를 체크하고 Finish 버튼 누른다.

 

 

 

3. Android Studio 설정 및 컴포넌트 다운

 

위 창이 켜지면서 기존 설정이 있는 경우 Import할 수 있는 창이 나온다.

처음 시작하는 사용자라면 Do not import setting 체크 후 OK버튼 클릭

 

 

안드로이드 스튜디오 진입!

Next 버튼 클릭

 

나는 Android Studio를 처음 사용하기 때문에 Standard로 설치하였다.

Next 버튼 클릭

 

UI 테마 설정 후 Next

 

설치 설정을 변경하는 창이다.

변경을 원하지 않는다면 그냥 Finish 버튼을 누르면 된다.

 

컴포넌트들을 다운한다.

이 부분에서 시간이 좀 걸린다.

 

다운로드가 끝나면 Finish 버튼 클릭

 

 

4. Android Studio 실행

 

제대로 잘 깔렸나 확인을 위해 프로젝트를 하나 만들어 본다.

Start a new Android Studio project 클릭

 

Empty Activity 클릭 후 Next 버튼 클릭

 

이름, 경로, 언어를 원하는 것으로 바꾼 후 Finish 버튼 클릭

 

프로젝트를 로딩하는 중!

 

프로젝트 생성 완료!

 

로딩 후 바로 Run을 하려고 하면 이러한 오류가 뜨면서 되지 않는다.

화면 오른쪽 상단, 최소화 버튼 밑에 핸드폰에 안드로이드 표시 있는 버튼을 클릭!

 

그러면 가상 디바이스를 만들 수 있는 화면이 나온다. 

Create Virtual Device 버튼 클릭

 

이 화면이 나오면, 본인이 원하는 카테고리, 사이즈 등에 맞는 옵션을 선택한 후 Next 버튼 클릭

 

그 후 System Image를 고른 후 옆에 있는 Download 버튼을 누른다.

 

아래쪽에 있는 Accept를 체크한 후 Next 버튼 클릭

 

설치를 진행한다. 

이 부분도 시간이 꽤 소요된다.

 

Download가 완료되면 다운로드한 것을 선택한 후 Next 버튼 클릭

 

그러면 본인이 선택한 옵션에 맞는 가상 디바이스를 생성할 수 있게 된다.

본인이 선택한 옵션이 맞는지 확인 후 Finish 클릭

 

나의 가상 디바이스 목록이 뜬다.

오른쪽 부분에 있는 삼각형 버튼을 누른다.

 

완성!

 

 

 

 

이제 이것들을 이용하여 앱을 만들면 된다!

'IT 팁' 카테고리의 다른 글

mysql 설치 오류, server failed  (0) 2021.02.01
한글 워드 변환 (HWP to DOCX)  (0) 2020.08.04
vcruntime140.dll MSVCP140.dll 오류 시 해결방법  (19) 2020.07.26

한글파일을 워드로 변환하는 방법을 알아보자

 

 

Microsoft Word를 위한 아래아한글 문서 변환 도구

https://www.microsoft.com/ko-kr/download/details.aspx?id=36772

 

Microsoft Word를 위한 아래아한글 문서 변환 도구

Microsoft Word를 위한 아래아한글 문서 변환 도구는 Microsoft Word에서 HWP파일을 DOCX파일처럼 변환하고 열 수 있도록 해 주는 도구입니다.

www.microsoft.com

이 사이트로 들어간다.

 

한국어를 선택한 후 다운로드를 누른다.

 

내 컴퓨터 비트 수에 맞는 파일을 다운받는다. (64비트-> x64, 32비트-> x86)

 

다운로드를 한 경로에 들어가 exe파일을 실행시켜준다.

 

동의를 한 후 '계속'버튼을 누르면 설치가 완료된다.

 

C드라이브 폴더로 들어가서 Program Files -> Microsoft Office -> Office15에 들어간다.

그 후, BATCHHWPCONV를 실행시킨다.

 

파일 하나만 변환하고자 한다면, 파일을 선택한후 오른쪽에 ...를 눌러 원하는 원본파일을 선택, 그리고 변환된 파일을 저장할 폴더를 선택한다.

 

폴더에 있는 것들을 변환하고자 한다면, 폴더를 선택한 후 오른쪽 ...를 눌러 원하는 폴더를 선택, 그리고 변환된 파일들을 저장할 폴더를 선택한다.

 

그리고 변환버튼을 누르면 끝!!

 

 

 

매우 빠르고 편안하게 파일을 변환할 수 있다.

+ Recent posts