[250211] 사전캠프 18일차 아티클 스터디 + SQL 문제

이효원·2025년 2월 11일

아티클 스터디

데이터를 쉽게 찾고 잘 활용할 수 있는 기반을 만드는, Data Analytics Engineer
[주제]

  • 토스의 Data Analytics Engineer(DAE)

[아티클 요약]

  • 토스 DAE의 업무 및 역할
    • 각 제품팀에서 생산하는 데이터가 전사적으로 유용하게 사용될 수 있게 함
      • 데이터 자산화
      • 데이터 파이프라인 운영
      • 데이터 웨어하우스 구축
    • 데이터를 활용하는 구성원들이 분석에 필요한 데이터에 쉽게 접근해 사용할 수 있게 함
      • 담당 도메인의 데이터 구조화/설계
      • 데이터 마트 구축, 데이터 표준정책 수립
      • 모니터링과 최적화를 통해 데이터 파이프라인 안정성을 유지하며, 변화에 대응
    • 데이터 분석과 비즈니스 인사이트 도출이 원활하게 이루어질 수 있도록 함
  • 토스 DAE의 협업 방식
    • 주로 담당 도메인의 데이터 분석가와 협업
      • 제품 분석하는 관점에서 어떠한 데이터 마트들이 생성되면 좋을지 파악하여 데이터 마트를 개발하고 전사의 활성 유저 집계, 매출, 비용 등 연동
      • 데이터 엔지니어의 도움을 받아 실시간 파이프라인 제공
      • 서버 개발자, DBA와 협업하여 집계한 데이터 마트를 제품에 활용하도록 하는 데이터 연동 작업 실시
    • 데이터 마트팀의 협업
      • 데이터 분석 플랫폼팀, DW팀과 정기 미팅을 통해 과제 발굴
      • 프로젝트 단위로 데이터 매니저, 테크니컬 프로덕트 매니저(TPM)과 협업
      • 서버 개발자 및 데이터옵스 매니저와 협업
  • 전사 Data Maturity 개선을 위해 시도 중인 액션들 및 데이터 오너십을 갖는 방식
    • 애자일 조직 기반에 수많은 제품들이 개발되어 데이터 사일로화 가속화되는 상황
      • 애자일 조직 : 빠른 변화에 대응하기 위해 유연하고 협업적인 방식으로 업무를 처리하는 조직 문화
      • 데이터 사일로화 : 데이터가 부서나 팀마다 분리되어 관리되는 현상
      • Data Maturity(데이터 성숙도) : 조직이 데이터를 얼마나 효율적으로 관리하고 활용하는지, 데이터 기반 의사결정을 얼마나 잘 내리는지 나타냄
    • 토스 DW 표준안 적립
    • 각 제품들의 주요 개념들을 명확하게 정의한 표준 데이터 마트 구축중
    • 단순히 마트 테이블을 생성하는 것이 아닌, 데이터 소비 주체들에게 서비스 수준으로 제공 가능한 Data Product를 만듬
      • 명확한 개념 정의, 일관된 표현 표준 준수, 문서화, 데이터 품질 모니터링
    • 유지 관리를 위한 데이터 오너십
      • 중앙의 표준 관리 조직(데이터 마트팀)이 각 도메인에 표준을 전파, 교육, 표준 모니터링 수행
      • 각 도메인의 DAE는 분산된 데이터 오너십 가짐
      • Data Mesh 방식 : 분산형 데이터 관리, 각 도메인이 자율적으로 데이터를 관리하고 공유
  • 데이터 마트팀과 각 도메인에 배치되는 DAE들의 목표
    • 데이터 마트팀 DAE
      • DW 표준안 전사적 안착을 위한 노력
      • 표준마트 활용도를 높이기 위한 개선안 도출
      • 전사 차원의 데이터 프로젝트 담당
    • 도메인 DAE
      • 해당 서비스 데이터의 오너십을 가짐
      • 데이터 설계, 도메인 차원의 DW 구축 및 운영
  • 토스 DAE의 장점
    • 다양한 맥락의 제품 많고 복잡한 데이터 적극적으로 활용가능
    • 데이터 소비와 데이터 환경 구축에 대한 경험 획득 가능
  • 원하는 인재
    • 어떻게 하면 쉽게 데이터를 찾고, 잘 사용하게 할 수 있을지에 대한 고민과 실행경험
    • 재사용성과 확장성이 높도록 테이블이나 데이터를 구조화해 본 경험
  • 다양한 제품을 다루면서 데이터를 적극적으로 활용하는 환경
    • 도전의 연속이지만 성장의 기회 많음
    • 데이터 환경 개선 과정의 의미 큼

[인사이트]
처음에는 아티클 스터디를 하면서 용어도 어렵고 잘 와닿지 않았는데, SQL을 공부해보고 많은 아티클을 접하면서 점점 그 내용의 중요성이 더 느껴지는 것 같다. 아직 데이터 분석에 대해 아는 것은 적지만, 어제 봤던 리디의 데이터 분석가보다 토스의 데이터마트팀 DAE의 업무가 더 관심이 가고 내 성향에 더 맞을 것 같다는 생각이 들었다. 특히 오늘 아티클을 통해 서버 개발자, DBA, 데이터 분석 플랫폼팀, DW팀, 데이터 매니저, 테크니컬 프로덕트 매니저(TPM) 등 정말 다양한 데이터 관련 직무가 있다는 것을 알 수 있었다. 다양한 직무가 있는 만큼 세부적인 업무에 대해 미리 파악하고 범위를 좁혀서 준비할 수 있었으면 좋겠다. 마지막으로, 아티클의 내용은 아는 만큼 보인다고 느껴져서 본캠프를 수료하고 나서 정리해놓은 아티클 스터디를 다시 한 번 보고 지금과는 또 다른 인사이트를 얻어갈 수 있으면 좋겠다.

SQL

SQL 실전 Lv5. 가장 높은 월급을 받는 직원은?

1. 각 직원의 이름, 부서, 월급, 그리고 그 직원이 속한 부서에서 가장 높은 월급을 받고 있는 직원의 이름과 월급을 조회하는 SQL 쿼리를 작성해주세요.

SELECT 
  e1.Name
, e1.Department
, e1.Salary 
, e2.Name Top_Earner
, e2.Salary Top_Salary
FROM employees e1
JOIN employees e2
# 두 테이블을 Department로 JOIN하여 연동
ON e1.Department = e2.Department -- 이로 인해 결과에 중복을 발생시켜줌
WHERE 
	e2.Salary = 
		(
		SELECT 
		MAX(e3.Salary)
		FROM employees e3
        # 주 쿼리에서 선택된 e1.Department 값에 대해서만 최고 월급을 계산
		WHERE e1.Department = e3.Department 
		);

어제랑 비슷하게 서브쿼리가 이해가 안되서, 계속 GPT를 잡고 있었다.
드디어 이해한 내용은 다음과 같다

계산을 행 별로 하기 때문에 e1.Department는 전체 Department 리스트가 아니라, 선택된 한 명의 직원의 Department를 의미한다

  1. 주쿼리는 e1테이블에서 각 직원 한 명씩 처리한다.
  2. 각 직원(e1)에 대해 그 직원이 속한 부서(e1.Department)를 확인하고, 해당 부서에서 최고 월급을 받는 직원을 찾기 위해 서브쿼리가 실행된다.
  3. 서브쿼리는 주 쿼리에서 처리 중인 각 직원의 부서(e1.Department)에 대해 실행된다.
  4. 서브쿼리는 해당 직원이 속한 부서에 대해 최고 월급을 받는 직원을 찾는다.
  5. 다음 직원으로 반복!

주 쿼리에서 첫 번째 직원(Alice)을 처리.
-> Alice가 속한 HR 부서에 대해 서브쿼리가 실행되어 Eve가 최고 월급을 받는 직원으로 확인.
주 쿼리에서 두 번째 직원(Bob)을 처리.
-> Bob이 속한 IT 부서에 대해 서브쿼리가 실행되어 Heidi가 최고 월급을 받는 직원으로 확인.
주 쿼리에서 세 번째 직원(Charlie)을 처리.
-> Charlie가 속한 IT 부서에 대해 서브쿼리가 실행되어 Heidi가 최고 월급을 받는 직원으로 확인.

2. 부서별로 평균 월급이 가장 높은 부서의 이름과 해당 부서의 평균 월급을 조회하는 SQL 쿼리를 작성해주세요.

SELECT 
	  e.Department
	, AVG(e.Salary) AVG_Salary
FROM employees e
GROUP BY e.Department
HAVING AVG(e.Salary) = 
	(
	SELECT MAX(AVG_Salary)
	FROM 
		(
		SELECT AVG(e.Salary) AVG_Salary
		FROM employees e
		GROUP BY e.Department
		)subq
	);

이건 그나마 빨리 했다. 슬렉 질문방 읽어보니 확실히 비효율적인 쿼리가 맞다.

SELECT 
	  e.Department
	, AVG(e.Salary) AVG_Salary
FROM employees e
GROUP BY e.department
ORDER BY AVG_Salary DESC LIMIT 1;

이게 훨씬 깔끔. 공동 1위라서 제대로 표현하지는 못한다. 아무튼 넘어가자.

Lv6. 가장 많이 팔린 품목은?

1. 각 고객이 구매한 모든 제품의 총 금액을 계산하고, 고객 이름, 총 구매 금액, 주문 수를 출력하는 SQL 쿼리를 작성해주세요.

SELECT 
	  c.CustomerName 
	, SUM(p.Price * o.Quantity) Total_Amount
	, COUNT(*) order_count
FROM orders o
JOIN customers c
	ON o.CustomerID = c.CustomerID 
JOIN products p 
	ON o.ProductID = p.ProductID
GROUP BY c.CustomerName;

답은 맞았는데, 결과가 다르다. 혹시 몰라서 답 복사해서 넣어도 똑같다. 내 데이터가 잘못 입력되었을까봐 봤는데도 똑같다. 답지의 문제인가..? 질문하려고 헀는데 이미 다른 분이 먼저 하셔서 기다려야겠다.

2. 각 제품 카테고리별로 가장 많이 팔린 제품의 이름과 총 판매량을 조회하는 SQL 쿼리를 작성해주세요.

SELECT 
	p.Category 
	, p.ProductName Top_Product
    # 제품 별 총 판매량 계산
	, SUM(o.Quantity) TotalSold	
FROM orders o
JOIN products p 
	ON o.ProductID = p.ProductID
GROUP BY p.Category, p.ProductName
# 제품별 총 판매량이 카테고리별 최대인 것으로 조건 제시
HAVING SUM(o.Quantity) = 
		(# 서브쿼리 작성
        SELECT 
        	# 카테고리별 총 판매량의 최대값 
            MAX(sum_Quantity)
        FROM # 위와 동일하게 카테고리별 총 판매량 계산 sum_Quantity
            (SELECT 
                 p2.Category,
                 SUM(o2.Quantity) AS sum_Quantity
             FROM 
                 Products p2
             JOIN Orders o2 
             	ON p2.ProductID = o2.ProductID
             GROUP BY 
                 p2.Category, p2.ProductID
             ) Subq
   	 	);


lv5의 2번문제와 동일한 방식으로 풀기. 근데 같은 쿼리를 본쿼리와 서브쿼리에 똑같이 쓰는건 비효율적인거 같은데 효율적으로 푸는 방법이 없을까 궁금하다.

느낀점

아티클 스터디 종료! 앞으로 사전캠프 삼일 남았다. 북스터디 잘 하고 7번 문제까지 다 풀 수 있었으면 좋겠다! 달리기반 솔직히 완벽히 이해는 안가지만 그래도 한 번 훑고 본캠프 들어가면 반드시 큰 자산이 될 것이다.

0개의 댓글