SlideShare una empresa de Scribd logo
1 de 39
Descargar para leer sin conexión
프로그래머스프론트엔드아키텍처변천사
:좋은개발경험을찾아서
Speaker
김은수(EunsuKim)
(현)Grepp(프로그래머스)FrontendDeveloper
(전)Mathpresso(콴다)FrontendDeveloper
프로그래머스
개발자성장주기에맞는교육,평가,채용서비스를제공하고있습니다
프로그래머스기술스택(~2021)
RubyonRails
Vue(byWebpacker)
프로그래머스프론트엔드아키텍처(~2021)
프론트엔드개발자가겪는문제들
Vue코드만수정했는데배포하는데너무오래걸려요
서로다른팀이하나의package.json을공유해서의존성관리가힘들어요
RailsWebpacker에강한의존성이생겼어요
결론적으로,개발경험이안좋아요😭
프론트엔드개발자가원하는것
🚀 빠르게개발하고배포하는것
🪄 의존성관리도팀별로알아서척척
⚛️ Vue말고React도쓰고싶다!
그래서우리는프론트엔드아키텍처를개선하기로했습니다
New프론트엔드아키텍처설계
✅ Do
프론트엔드를Rails애플리케이션과독립적으로개발/빌드/배포가능
프론트엔드코드베이스는모노레포로관리
전사공통패키지외에는팀에서자유롭게의존성도입
기존아키텍처와새로운아키텍처가공존하고,점진적(Progressive)으로마이그레이션가능
❌ Don’t
아키텍처를바꾸느라제품개발프로세스가멈추면안됨
선행조사
Airbnb사례-Hypernova
오늘의집사레-오늘의집MSAPhase1.프론트엔드분리작업
프로그래머스가처한상황과비슷한사례가있을까?
Airbnb사례:Hypernova
Aserviceforserver-siderenderingyourJavaScriptviews
Server MyComponent.js
var hypernova = require('hypernova/server');
hypernova({
devMode: true,
getComponent(name) {
if (name === 'MyComponent.js') {
return require('./app/assets/javascripts/MyComponent.
}
return null;
},
port: 3030,
});
const React = require('react');
const renderReact = require('hypernova-react').renderR
function MyComponent(props) {
return <div>Hello, {props.name}!</div>;
}
module.exports = renderReact('MyComponent.js', MyCompo
Airbnb사례:Hypernova
1. 클라이언트코드가서버코드로부터분리될수있음
2. 점진적으로적용가능함
실제로구현된사례를확인함으로써아키텍처설계에대한힌트를얻게되었다!
New프로그래머스프론트엔드아키텍처-CoreConcept
프론트엔드코드를저장할모노레포지토리
프론트엔드애플리케이션manifest를Rails템플릿에임베딩
WebpackManifest
Vue/React/AnythinginRails
WebpackManifest
1. 개발자가작성한소스코드
2. 작성한소스코드가의존하는라이브러리및벤더(vendor)코드
3. Webpackruntime및manifest
Manifest
Asthecompilerenters,resolves,andmapsoutyourapplication,itkeepsdetailednotesonallyourmodules.Thiscollectionofdata
iscalledthe"Manifest,"andit’swhattheruntimewillusetoresolveandloadmodulesoncethey’vebeenbundledandshippedto
thebrowser.
Webpack으로빌드된애플리케이션이포함하는코드
WebpackManifestPlugin
Webpackmanifest를추출할수있게해주는플러그인
// webpack.config.ts
import { WebpackManifestPlugin } from 'webpack-manifest-plugin';
const productionConfig: Configuration = {
mode: 'production',
output: { filename: '[contenthash].js' },
module: { ... },
plugins: [
new WebpackManifestPlugin(),
],
};
// dist/manifest.json
{
"main.js": "/b815c1d65ebb736ed574.js",
"175.css": "/175.67ac9023a9a76244ce98.css",
"175.css.map": "/175.67ac9023a9a76244ce98.css.map",
"js": "/02067bc9c4a3d115e4c4.js",
"js.map": "/02067bc9c4a3d115e4c4.js.map",
"index.html": "/index.html",
}
기존프로그래머스프론트엔드아키텍처
개선된프로그래머스프론트엔드아키텍처
개선된아키텍처의장점-(1)Scalability
기존Rails코드베이스의수정없이새로운웹애플리케이션개발및배포가가능
개선된아키텍처의장점-(2)Independency
애플리케이션의의존성을독립적으로관리가가능
그렇게프로그래머스프론트엔드개발자들은행복하게잘살았습니다
그렇게프로그래머스프론트엔드개발자들은행복하게잘살았습니다
…가또불편한점이생겼습니다
개선된아키텍처의불편한점
각애플리케이션에서의존하는코드가새로릴리즈되면해당사항을반영하기위해모든앱을다시배포해야함
개선된아키텍처의불편한점
각애플리케이션에서의존하는코드가새로릴리즈되면해당사항을반영하기위해모든앱을다시배포해야함
앱을다시배포하지않고의존하는코드의변경사항을런타임에바로적용할수없을까?
앱을다시배포하지않고의존하는코드의변경사항을런타임에바로적용할수없을까?
Webpack5ModuleFederation
Webpack5ModuleFederation-CoreConcept
빌드된애플리케이션=컨테이너
호스트(Host)컨테이너:외부에노출된모듈을불러와사용
리모트(Remote)컨테이너:모듈을외부로노출(expose)
Webpack5버전부터포함된ContainerPlugin을사용하여적용가능
ContainerPlugin을추상화한ModuleFederationPlugin을사용하면더쉽게적용가능
ModuleFederationPlugin
Host컨테이너의webpackconfig Remote컨테이너의webpackconfig
import { container } from 'webpack';
const config: Configuration = {
// ...생략
plugins: [
new container.ModuleFederationPlugin({
remotes: {
remoteApp:
`remoteApp@${process.env.APP_URL}/remoteEntry.js`
},
}),
],
}
import { container } from 'webpack';
const config: Configuration = {
// ... 생략
plugins: [
new container.ModuleFederationPlugin({
name: 'remoteApp',
filename: 'remoteEntry.js',
exposes: {
'./Header': './src/components/Header.tsx',
},
}),
],
};
ModuleFederation사용예시
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { Suspense } from 'react';
const Header = lazy(() => import('remoteApp/Header'));
function CustomHeader() {
return (
<Suspense fallback={<LoadingSpinner />} >
<Header />
</Suspense>
);
}
export default CustomHeader;
개선된프론트엔드아키텍처(현재)
그래서우리는얼마나빠르게제품을개발하고배포할수있게되었을까요?
프론트엔드프로덕션배포소요시간
현재:<5분
기존:30~40분
프로덕션릴리즈횟수
2022년11월:173회
2022년3월:46회
ClosedPullRequest개수
신규repo:8개월간1400여개(175PRs/month)
기존repo:6년4개월간5500여개(72PRs/month)
NextSteps
Rails번들러마이그레이션
Rails에서번들러의존성을제거
개발경험개선
NextSteps-(1)Rails번들러마이그레이션
RailsWebpacker를Shakapacker로마이그레이션하여Webpack5버전을사용할뿐만아니라babel외의빌드도구
(swc,esbuild)도사용가능
NextSteps-(2)Rails에서번들러의존성을제거
Rails로부터번들러(Webpacker)의존성을분리함으로써Rails는API서버처럼동작
NextSteps-(3)개발경험개선
Remotemodule의typechecking
앱간의커뮤니케이션컨벤션정의
Bestpractice탐구
프로그래머스의프론트엔드개발경험을개선하기위한모험은계속됩니다
Recap
Rails와Vue가함께있는레포지토리에서프론트엔드개발경험이좋지않음
프론트엔드코드베이스를Rails코드와분리시켜독립적으로개발/빌드/배포할수있고점진적으로마이그레이션가능
한아키텍처를설계
Airbnb의Hypernova사례를바탕으로
신규프론트엔드애플리케이션의Webpackmanifest를Rails템플릿에임베딩
신규프론트엔드애플리케이션간의ModuleFederation을통한RuntimeIntegration
개발경험을개선하기위한노력이여전히진행중
Rails번들러마이그레이션
Rails에서번들러의존성제거
신규프론트엔드코드베이스의개발경험개선

Más contenido relacionado

La actualidad más candente

컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
우영 주
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
devCAT Studio, NEXON
 

La actualidad más candente (20)

Massive service basic
Massive service basicMassive service basic
Massive service basic
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbie
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우
 
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해
 
로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법
 
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템
 
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
 

Similar a 프로그래머스 프론트엔드 아키텍처 변천사: 좋은 개발 경험을 찾아서

주니어 개발자의 개인프로젝트 개발기
주니어 개발자의 개인프로젝트 개발기주니어 개발자의 개인프로젝트 개발기
주니어 개발자의 개인프로젝트 개발기
sung yong jung
 
[D2 오픈세미나]4.진보된개발환경 주우영
[D2 오픈세미나]4.진보된개발환경 주우영[D2 오픈세미나]4.진보된개발환경 주우영
[D2 오픈세미나]4.진보된개발환경 주우영
NAVER D2
 
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
Jinuk Kim
 

Similar a 프로그래머스 프론트엔드 아키텍처 변천사: 좋은 개발 경험을 찾아서 (20)

『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기
『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기
『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기
 
Web Framework (웹 프레임워크)
Web Framework (웹 프레임워크)Web Framework (웹 프레임워크)
Web Framework (웹 프레임워크)
 
GDG Korea campus 새해 밋업 발표자료_플레이윙즈 신호석
GDG Korea campus 새해 밋업 발표자료_플레이윙즈 신호석GDG Korea campus 새해 밋업 발표자료_플레이윙즈 신호석
GDG Korea campus 새해 밋업 발표자료_플레이윙즈 신호석
 
How to build Design System?
How to build Design System?How to build Design System?
How to build Design System?
 
주니어 개발자의 개인프로젝트 개발기
주니어 개발자의 개인프로젝트 개발기주니어 개발자의 개인프로젝트 개발기
주니어 개발자의 개인프로젝트 개발기
 
Team project (for frontend)
Team project (for frontend)Team project (for frontend)
Team project (for frontend)
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기
 
Java the good parts
Java the good partsJava the good parts
Java the good parts
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기
 
NAVER TECH CONCERT_FE2019_빠르게 훑어보는 웹 개발 트렌드
NAVER TECH CONCERT_FE2019_빠르게 훑어보는 웹 개발 트렌드NAVER TECH CONCERT_FE2019_빠르게 훑어보는 웹 개발 트렌드
NAVER TECH CONCERT_FE2019_빠르게 훑어보는 웹 개발 트렌드
 
격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go
 
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정
 
Docker와 DevOps에서 Serverless와 NoOps로의 여정
Docker와 DevOps에서 Serverless와 NoOps로의 여정Docker와 DevOps에서 Serverless와 NoOps로의 여정
Docker와 DevOps에서 Serverless와 NoOps로의 여정
 
[AUG]개발자와 QA가 상생하는 테스트 프로세스
[AUG]개발자와 QA가 상생하는 테스트 프로세스[AUG]개발자와 QA가 상생하는 테스트 프로세스
[AUG]개발자와 QA가 상생하는 테스트 프로세스
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
예비 개발자를 위한 웹서비스 개발 방법론 특강 - 폴리텍대학교 강서캠퍼스
예비 개발자를 위한 웹서비스 개발 방법론 특강 - 폴리텍대학교 강서캠퍼스예비 개발자를 위한 웹서비스 개발 방법론 특강 - 폴리텍대학교 강서캠퍼스
예비 개발자를 위한 웹서비스 개발 방법론 특강 - 폴리텍대학교 강서캠퍼스
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
 
[D2 오픈세미나]4.진보된개발환경 주우영
[D2 오픈세미나]4.진보된개발환경 주우영[D2 오픈세미나]4.진보된개발환경 주우영
[D2 오픈세미나]4.진보된개발환경 주우영
 
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
 

프로그래머스 프론트엔드 아키텍처 변천사: 좋은 개발 경험을 찾아서