Back-End

μ½”λ‘œλ‚˜ μ‹œλŒ€ 원격 QA! μ˜€ν”ˆμ†ŒμŠ€ λ””λ°”μ΄μŠ€νŒœ STF λ„μž…κΈ°

μ•ˆλ…•ν•˜μ„Έμš”. Software Quality EngineeringΒ νŒ€ μž„μ§€ν›ˆμž…λ‹ˆλ‹€. QA(Quality Assurance) λ‹¨κ³„μ—μ„œ νŠΉμ • λ‹¨λ§κΈ°μ—μ„œλ§Œ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” κ²½μš°κ°€ μ’…μ’… μžˆμŠ΅λ‹ˆλ‹€.Β ν•˜μ§€λ§Œ μ½”λ‘œλ‚˜19둜 인해 ν•΄μ™ΈΒ μΆœμž₯은 λ¬Όλ‘  좜근쑰차 μ–΄λ €μ›Œμ§€λ©΄μ„œ μ›κ²©μ§€μ˜ 단말기λ₯Ό μž…μˆ˜ν•΄ ν…ŒμŠ€νŠΈν•˜λŠ” 일이 λΆˆκ°€λŠ₯ν•œ κ²½μš°κ°€ λ§Žμ•„μ‘ŒμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ””λ°”μ΄μŠ€νŒœμ„ κ΅¬μΆ•ν•˜κ³  ν…ŒμŠ€νŠΈ μžλ™ν™”μ— ν™œμš©ν•œ 사둀λ₯Ό μ—¬λŸ¬λΆ„κ»˜ κ³΅μœ ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

Kubernetesλ₯Ό μ΄μš©ν•œ 효율적인 데이터 μ—”μ§€λ‹ˆμ–΄λ§(Airflow on Kubernetes VS Airflow Kubernetes Executor) – 2

μ•ˆλ…•ν•˜μ„Έμš”. LINE Financial Data Platform을 μš΄μ˜ν•˜κ³  κ°œλ°œν•˜κ³  μžˆλŠ” μ΄μ›…κ·œμž…λ‹ˆλ‹€. 이 글은 μ§€λ‚œ NAVER DEVIEW 2020μ—μ„œ λ°œν‘œν–ˆλ˜ Kubernetesλ₯Ό μ΄μš©ν•œ 효율적인 데이터 μ—”μ§€λ‹ˆμ–΄λ§ (Airflow on Kubernetes VS Airflow Kubernetes Executor) μ„Έμ…˜μ—μ„œ λ°œν‘œ ν˜•μ‹ 및 μ‹œκ°„ 관계상 μ„€λͺ…ν•˜κΈ° νž˜λ“€μ—ˆλ˜ 뢀뢄을 쑰금 더 μžμ„Έν•˜κ²Œ μ„€λͺ…ν•˜κ³ μž μž‘μ„±ν•œ 두 번째 κΈ€μž…λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” 일반적인 Kubernetes Airflow ν™˜κ²½κ³Ό μƒˆλ‘œμš΄ λ°©μ‹μ˜ νŠΉμ§• 및 μž₯단점을 λΉ„κ΅ν•©λ‹ˆλ‹€. 그리고 μƒˆλ‘œμš΄ 방식인 Kubernetes Executor와 KubernetesPodOperatorλ₯Ό μ μš©ν•΄ 데이터 ν”Œλž«νΌμ„ μ–΄λ–»κ²Œ μš΄μ˜ν•˜κ³  κ°œλ°œν•˜κ³  μžˆλŠ”μ§€ λ§μ”€λ“œλ¦¬κ³ , 이λ₯Ό 톡해 기쑴보닀 ν™•μž₯성을 λ†’μ˜€λ˜ κ²½ν—˜μ„ κ³΅μœ ν•˜κ² μŠ΅λ‹ˆλ‹€.

Kubernetesλ₯Ό μ΄μš©ν•œ 효율적인 데이터 μ—”μ§€λ‹ˆμ–΄λ§(Airflow on Kubernetes VS Airflow Kubernetes Executor) – 1

μ•ˆλ…•ν•˜μ„Έμš”. LINE Financial Data Platform을 μš΄μ˜ν•˜κ³  κ°œλ°œν•˜κ³  μžˆλŠ” μ΄μ›…κ·œμž…λ‹ˆλ‹€. μ €λŠ” μ§€λ‚œ NAVER DEVIEW 2020μ—μ„œ λ°œν‘œν–ˆλ˜ Kubernetesλ₯Ό μ΄μš©ν•œ 효율적인 데이터 μ—”μ§€λ‹ˆμ–΄λ§ (Airflow on Kubernetes VS Airflow Kubernetes Executor) μ„Έμ…˜μ—μ„œ λ°œν‘œ ν˜•μ‹ 및 μ‹œκ°„ 관계상 μ„€λͺ…ν•˜κΈ° νž˜λ“€μ—ˆλ˜ 뢀뢄을 λΈ”λ‘œκ·Έλ₯Ό 톡해 쑰금 더 μžμ„Έν•˜κ²Œ μ„€λͺ…ν•˜κ³ μž ν•©λ‹ˆλ‹€.

μ €λŠ” 두 λ²ˆμ— 걸쳐 Kubernetesλ₯Ό μ΄μš©ν•œ 효율적인 데이터 μ—”μ§€λ‹ˆμ–΄λ§μ— λŒ€ν•΄ κ³΅μœ ν•˜λ €κ³  ν•˜λŠ”λ°μš”. λ¨Όμ € 이번 κΈ€μ—μ„œλŠ” Apache Airflowλ₯Ό κ°„λž΅ν•˜κ²Œ μ†Œκ°œν•˜κ³  Executor의 μ’…λ₯˜μ™€ 각 μ’…λ₯˜λ³„ λ™μž‘ 방식을 μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

Kafka와 MongoDB, Kubernetes둜 μœ μ—°ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ LINE μ‡Όν•‘ ν”Œλž«νΌ κ΅¬μΆ•ν•˜κΈ°

μ•ˆλ…•ν•˜μ„Έμš”. LINE Commerce Platformμ—μ„œ LINE μ‡Όν•‘(https://ec.line.me) κ°œλ°œμ„ λ‹΄λ‹Ήν•˜κ³  μžˆλŠ” μœ μž¬κ· μž…λ‹ˆλ‹€. LINE 쇼핑에선 μ—¬λŸ¬ νŒλ§€μžλ‘œλΆ€ν„° 전달 받은 μƒν’ˆ 정보λ₯Ό ν•œκ³³μ— λͺ¨μ•„μ„œ μΌμ •ν•œ 기쀀에 따라 λΆ„λ₯˜ν•˜κ³ , κ·Έλ£Ήν™”ν•œ λ’€, μ •λ ¬ν•˜μ—¬ μ‚¬μš©μžλ“€μ΄ μƒν’ˆ 정보λ₯Ό μ‰½κ²Œ 얻을 수 μžˆλ„λ‘ μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 넀이버 μ‡Όν•‘μ΄λ‚˜ λ‹€λ‚˜μ™€ 등이 LINE μ‡Όν•‘κ³Ό λ™μΌν•œ λͺ¨λΈμ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

LINE μ‡Όν•‘μ˜ νŒλ§€μžλŠ” κ²½μš°μ— 따라 μˆ˜μ‹­μ—μ„œ 수천만 개 μ΄μƒμ˜ μƒν’ˆ 정보λ₯Ό λ³΄μœ ν•˜κ³  μžˆλŠ”λ°μš”. 이런 νŒλ§€μžλ“€μ˜ μƒν’ˆμ„ ν•œκ³³μ— λͺ¨μ•„μ„œ μ„œλΉ„μŠ€ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν”Œλž«νΌμ„ ꡬ좕해야 ν• κΉŒμš”? 이번 글에선 저희 νŒ€μ΄ 이 μ–΄λ €μš΄ 과제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ ν”Œλž«νΌμ„ κ΅¬μΆ•ν–ˆλŠ”μ§€ μ†Œκ°œν•˜λ €κ³  ν•©λ‹ˆλ‹€.

120가지 μ‚¬μš©μž 행동 뢄석을 μžλ™ν™”ν•  수 μžˆλŠ” ‘데이터 μ œν’ˆ’ λ§Œλ“€κΈ°

μ•ˆλ…•ν•˜μ„Έμš”. LINEμ—μ„œ 데이터 뢄석을 맑고 μžˆλŠ” Insight Planning νŒ€μ˜ λ°•μš©μž¬μž…λ‹ˆλ‹€. 이번 글에선 LINE의 톡합 λŒ€μ‹œλ³΄λ“œμΈ LINE User Activity Analytics(μ΄ν•˜ LUA Analytics)κ°€ 개발된 과정을 μ†Œκ°œν•˜κ² μŠ΅λ‹ˆλ‹€.

지속 κ°€λŠ₯ν•œ μ†Œν”„νŠΈμ›¨μ–΄ 섀계 νŒ¨ν„΄: ν¬νŠΈμ™€ μ–΄λŒ‘ν„° μ•„ν‚€ν…μ²˜ μ μš©ν•˜κΈ°

μœ‘κ°ν˜• 섀계(Hexagonal Architecture)둜 더 잘 μ•Œλ €μ Έ μžˆλŠ” ν¬νŠΈμ™€ μ–΄λŒ‘ν„° 섀계(Ports and Adapters Architecture)λŠ”, μΈν„°νŽ˜μ΄μŠ€λ‚˜ 기반 μš”μ†Œ(infrastructure)의 변경에 영ν–₯을 받지 μ•ŠλŠ” 핡심 μ½”λ“œλ₯Ό λ§Œλ“€κ³  이λ₯Ό κ²¬κ³ ν•˜κ²Œ κ΄€λ¦¬ν•˜λŠ” 것이 λͺ©ν‘œμž…λ‹ˆλ‹€.

ν¬νŠΈμ™€ μ–΄λŒ‘ν„° 섀계λ₯Ό μ μš©ν•˜λ©΄ μΈν„°νŽ˜μ΄μŠ€λ‚˜ 기반 μš”μ†Œκ°€ μ‚¬μš©μžμ˜ μš”κ΅¬ 사항 ν˜Ήμ€ 수용 λŠ₯λ ₯에 영ν–₯을 λ°›μ•„ λ³€κ²½λœλ‹€κ³  ν•˜λ”λΌλ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ£Όμš” λ™μž‘(도메인 둜직 ν˜Ήμ€ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직)μ—λŠ” μ•„λ¬΄λŸ° 영ν–₯을 주지 μ•ŠμŠ΅λ‹ˆλ‹€. 도메인 λ‘œμ§μ„ κ²¬κ³ ν•˜κ²Œ μœ μ§€ν•˜λ©° μ†Œν”„νŠΈμ›¨μ–΄μ˜ 지속 κ°€λŠ₯성을 높일 수 μžˆλŠ” 것이죠. μ €λŠ” 이번 글을 톡해 ν¬νŠΈμ™€ μ–΄λŒ‘ν„°κ°€ 무엇인지, 이 섀계λ₯Ό λ”°λ₯΄λ©΄ μ½”λ“œκ°€ μ–΄λ–€ μ‹μœΌλ‘œ μ‘°μ§λ˜λŠ”μ§€, μ‹€μ œ μΈν„°νŽ˜μ΄μŠ€λ‚˜ 기반 μš”μ†Œ λ“± ν•œ 번 λ³€κ²½λ˜λ©΄ μž‘μ—…λŸ‰μ΄ λ§Žμ€ 일에도 μ–΄λ–»κ²Œ μ‰½κ²Œ μ μš©λ˜λŠ”μ§€, 섀계에 따라 개발된 업무 λ‘œμ§μ„ μ–Όλ§ˆλ‚˜ μ‰½κ²Œ ν…ŒμŠ€νŠΈν•  수 μžˆλŠ”μ§€λ₯Ό λ³΄μ—¬λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 ν¬νŠΈμ™€ μ–΄λŒ‘ν„° μ„€κ³„μ˜ μž₯점을 μ‹€μ œλ‘œ λ³΄μ—¬λ“œλ¦¬κ³ μž ν•©λ‹ˆλ‹€.

LINE Timeline의 μƒˆλ‘œμš΄ 도전 3편 – Discover μΆ”μ²œ λͺ¨λΈ

LINE Timeline에 ν•„μš”ν•œ λ¨Έμ‹  λŸ¬λ‹κ³Ό μΆ”μ²œ λͺ¨λΈμ„ λ§Œλ“€κ³  μžˆλŠ” Data Science Dev의 μ‘°μ˜μΈμž…λ‹ˆλ‹€. 1편과 2νŽΈμ— 이어 이번 3νŽΈμ—μ„œλŠ” Discover에 μ§„μž…ν•œ μ‚¬μš©μžμ—κ²Œ 보여쀄 μ½˜ν…μΈ λ₯Ό μ–΄λ–»κ²Œ μ„ μ •ν•˜κ³ , μ–΄λ–€ μˆœμ„œλ‘œ λ°°μΉ˜ν•˜λŠ”μ§€μ— λŒ€ν•΄ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

LINE Timeline의 μƒˆλ‘œμš΄ 도전 2편 – Discover λ”œλ¦¬λ²„λ¦¬ μ‹œμŠ€ν…œ μ†Œκ°œ

μ§€λ‚œ 1편, LINE Timeline의 μƒˆλ‘œμš΄ 도전 1편 – μΆ”μ²œ μ½˜ν…μΈ  탐색을 μœ„ν•œ Discover와 μƒˆλ‘œμš΄ ꡬ독 λͺ¨λΈ Follow에 μ΄μ–΄μ„œ μ΄λ²ˆμ—λŠ” Discover λ”œλ¦¬λ²„λ¦¬ μ‹œμŠ€ν…œμ„ μ’€ 더 μžμ„Έν•˜κ²Œ μ†Œκ°œν•˜λ €κ³  ν•©λ‹ˆλ‹€. Discover λ”œλ¦¬λ²„λ¦¬ μ‹œμŠ€ν…œμ€ 크게 Discover Feed와 Discover μ—μ΄μ „νŠΈ, Discover ML(Machine Learning) μ„œλ²„λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” Discover Feed와 Discover μ—μ΄μ „νŠΈλ₯Ό μ€‘μ μ μœΌλ‘œ μ‚΄νŽ΄λ³΄κ³ , λ‹€μŒ κΈ€μ—μ„œ Discover ML μ„œλ²„λ₯Ό λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€.

λ¨Έμ‹ λŸ¬λ‹μ„ ν™œμš©ν•œ μ˜€ν”ˆμ±— 클린 μŠ€μ½”μ–΄ λͺ¨λΈ 개발기

μ˜€ν”ˆμ±—(OpenChat)은 LINE 친ꡬλ₯Ό 맺지 μ•Šκ³ λ„ 관심사가 λΉ„μŠ·ν•œ 읡λͺ…μ˜ μ‚¬μš©μžλ“€κ³Ό ν•¨κ»˜ λŒ€ν™”λ₯Ό λ‚˜λˆŒ 수 μžˆλŠ” μ˜€ν”ˆ μ±„νŒ…λ°© μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. 각 μ±„νŒ…λ°©μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œν•„μ„ μ‚¬μš©ν•  수 있고, λ‚΄κ°€ κ°€μž…ν•˜κΈ° μ „μ˜ μ˜€ν”ˆμ±— λŒ€ν™” λ‚΄μš©λ„ λ³Ό 수 μžˆλŠ” 것이 νŠΉμ§•μž…λ‹ˆλ‹€. LINE μΉœκ΅¬κ°€ μ•„λ‹Œ μ‚¬μš©μžλ“€κ³Ό 읡λͺ…μœΌλ‘œ λŒ€ν™”ν•  수 μžˆλ‹€λŠ” 점이 μ˜€ν”ˆμ±—μ˜ νŠΉμ§•μΈλ°μš”. 이런 νŠΉμ§•μ€ μž₯점인 λ™μ‹œμ— 단점이 될 수 μžˆμŠ΅λ‹ˆλ‹€. μš•μ„€μ΄λ‚˜ κ΄‘κ³ , 성인 이미지 λ“±μ˜ λΆ€μ μ ˆν•œ μ½˜ν…μΈ μ— λ…ΈμΆœλ  수 있고, μ˜€ν”„λΌμΈ λ§Œλ‚¨ 등을 λͺ©μ μœΌλ‘œ ν•˜λŠ” μ˜€ν”ˆμ±—μ΄ 많이 생겨날 μˆ˜λ„ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 특히 μ‚¬μš©μžλ“€μ΄ μ˜€ν”ˆ 초기, μ„œλΉ„μŠ€μ˜ 성격이 μ™„μ „νžˆ 자리 작기 전에 이런 단점듀에 많이 λ…ΈμΆœλ˜λŠ” 것은 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€. μ„œλΉ„μŠ€μ— λŒ€ν•΄ 잘λͺ»λœ 인식을 심어쀄 수 μžˆλŠ” 것은 λ¬Όλ‘ , LINE λ©”μ‹ μ € μ„œλΉ„μŠ€ 전체에 λŒ€ν•΄ λ‚˜μœ 인상을 쀄 μˆ˜λ„ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ˜€ν”ˆμ±— 클린 μŠ€μ½”μ–΄λŠ” 이런 λ°°κ²½μ—μ„œ, μ„œλΉ„μŠ€ 메인 νŽ˜μ΄μ§€μ— λ…ΈμΆœν•΄λ„ 될 λ§Œν•œ, μ΅œλŒ€ν•œ κΉ¨λ—ν•œ μ†Œμˆ˜μ˜ ‘ν™”μ΄νŠΈ’ μ˜€ν”ˆμ±—μ„ μ°Ύμ•„λ‚Ό λͺ©μ μœΌλ‘œ κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.μ˜€ν”ˆμ±— 클린 μŠ€μ½”μ–΄λŠ” 이런 λ°°κ²½μ—μ„œ, μ„œλΉ„μŠ€ 메인 νŽ˜μ΄μ§€μ— λ…ΈμΆœν•΄λ„ 될 λ§Œν•œ, μ΅œλŒ€ν•œ κΉ¨λ—ν•œ μ†Œμˆ˜μ˜ ‘ν™”μ΄νŠΈ’ μ˜€ν”ˆμ±—μ„ μ°Ύμ•„λ‚Ό λͺ©μ μœΌλ‘œ κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λˆ„κ°€ Kubernetes ν΄λŸ¬μŠ€ν„°μ— μžˆλŠ” λ‚˜μ˜ μ‚¬λž‘μŠ€λŸ¬μš΄ Prometheus μ»¨ν…Œμ΄λ„ˆλ₯Ό μ£½μ˜€λ‚˜!

μ•ˆλ…•ν•˜μ„Έμš”. 이번 κΈ€μ—μ„œλŠ” CrashLoopBackoff μƒνƒœμ— μžˆλŠ” Prometheus μ»¨ν…Œμ΄λ„ˆ 이슈의 원인을 μ‘°μ‚¬ν•˜κ³  ν•΄κ²°ν•˜λŠ” κ³Όμ •μ—μ„œ κ²ͺ은 ν₯미둜운 κ²½ν—˜μ„ κ³΅μœ ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 사싀 이런 ν˜„μƒμ΄ λ°œμƒν•˜λŠ” 원인과 해결책은 λ„ˆλ¬΄ λ»”ν•˜κ³  κ°„λ‹¨ν•΄μ„œ ꡳ이 이런 주제λ₯Ό λ‹€λ£¨λŠ” 데 μ‹œκ°„μ„ νˆ¬μžν•  κ°€μΉ˜κ°€ μžˆλ‚˜λŠ” μ§ˆλ¬Έμ„ 던질 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 저와 λ§ˆμ°¬κ°€μ§€λ‘œ, 이 문제λ₯Ό μ‘°μ‚¬ν•˜λŠ” κ³Όμ •μ˜ 각 단계λ₯Ό μžμ„Ένžˆ μ΄ν•΄ν•˜κ³ μž ν•˜λŠ” λ…μžκ°€ μžˆμ„ 거라고 μƒκ°ν•˜λ©° μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€. 이 글을 μ½μœΌλ©΄μ„œ 얻을 수 μžˆλŠ” 것듀을 μ•„λž˜μ™€ 같이 정리해 λ΄€μŠ΅λ‹ˆλ‹€.