'개발자가 왜 로우코드를 써야 하죠?' 사내 발표에서 이 질문을 받았을 때 솔직히 할 말이 없었다. 나도 처음엔 '그건 비개발자들이나 쓰는 거 아닌가'라고 생각했다. 그런데 관리자 페이지를 Retool로 하루 만에 만들어본 뒤 생각이 완전히 바뀌었다. 이틀 걸릴 작업이 3시간 만에 끝났으니까.
로우코드/노코드 시장 현황
로우코드/노코드 시장은 지속적으로 성장하고 있습니다. Gartner에 따르면 2026년까지 기업 내 새로운 애플리케이션의 70% 이상이 로우코드 또는 노코드 기술을 사용하여 개발될 것으로 전망됩니다. 이는 2020년의 25% 미만에서 크게 증가한 수치입니다.
로우코드 vs 노코드 구분
- 노코드(No-code): 코드 작성 없이 시각적 인터페이스만으로 앱을 구축합니다. 주요 사용자는 비개발자(시민 개발자)이며, 표준화된 업무 프로세스에 적합합니다.
- 로우코드(Low-code): 시각적 도구를 기본으로 하되, 커스텀 코드를 추가하여 확장할 수 있습니다. 개발자가 사용하면 복잡한 로직과 외부 시스템 연동이 가능합니다.
주요 플랫폼 비교
개발자 친화적인 로우코드 플랫폼을 중심으로 비교해 보겠습니다. 각 플랫폼마다 강점이 다르므로 사용 목적에 맞게 선택해야 합니다.
Retool
내부 도구(Internal Tools) 구축에 특화된 로우코드 플랫폼입니다. 드래그 앤 드롭으로 UI를 구성하고, JavaScript로 비즈니스 로직을 작성합니다.
- 강점: 50개 이상의 데이터 소스 네이티브 연동, JavaScript/SQL 직접 작성 가능, 자체 호스팅(셀프 호스트) 지원
- 약점: 외부 고객용 앱에는 부적합, 무료 플랜 제한, UI 커스터마이징 한계
- 적합한 사례: 고객 지원 대시보드, 주문 관리 시스템, 데이터 조회/수정 어드민 패널
Appsmith
오픈소스 로우코드 플랫폼으로, Retool의 오픈소스 대안입니다. 셀프 호스팅이 기본이며, 커뮤니티가 활발합니다.
- 강점: 완전한 오픈소스(Apache 2.0), 셀프 호스팅 무료, Git 연동으로 버전 관리 가능, JavaScript 전체 지원
- 약점: Retool 대비 기능 성숙도가 낮은 부분이 있음, 엔터프라이즈 지원은 유료
- 적합한 사례: 비용에 민감한 스타트업, 데이터 민감도가 높아 셀프 호스팅이 필수인 환경
Budibase
오픈소스 로우코드 플랫폼으로, 내장 데이터베이스를 제공하여 별도 DB 없이도 앱을 구축할 수 있습니다.
- 강점: 내장 DB(BudibaseDB) 제공, 자동화 워크플로우 빌더, Docker 기반 간편 배포
- 약점: 복잡한 로직 구현 시 한계, 대규모 트래픽 처리에 대한 검증 부족
- 적합한 사례: 소규모 팀의 업무 프로세스 앱, 간단한 양식(Form) 기반 앱
OutSystems
엔터프라이즈급 로우코드 플랫폼으로, 대규모 조직의 미션 크리티컬 애플리케이션 개발을 지원합니다.
- 강점: 높은 확장성, 네이티브 모바일 앱 생성, 엔터프라이즈 보안 인증, AI 지원 개발
- 약점: 높은 라이선스 비용, 벤더 종속(Lock-in) 우려, 학습 곡선
- 적합한 사례: 대기업의 고객용 앱, 레거시 시스템 현대화, 복잡한 엔터프라이즈 워크플로우
개발자 관점에서의 활용법
개발자가 로우코드 플랫폼을 가장 효과적으로 활용할 수 있는 영역은 내부 도구 구축입니다. 반복적인 CRUD UI를 직접 코딩하는 대신, 로우코드로 빠르게 만들고 핵심 백엔드 로직에 집중할 수 있습니다.
Retool로 어드민 대시보드 구축 예시
// Retool 내 JavaScript Query 예시
// 주문 목록 검색 쿼리에 필터와 페이지네이션 적용
const filters = {
status: statusSelect.value || null,
startDate: dateRangePicker.value.start,
endDate: dateRangePicker.value.end,
search: searchInput.value || null
};
const params = new URLSearchParams();
Object.entries(filters).forEach(([key, value]) => {
if (value) params.append(key, value);
});
params.append('page', table1.pageIndex + 1);
params.append('size', table1.pageSize);
const response = await fetch(
`${API_BASE_URL}/admin/orders?${params.toString()}`,
{
headers: {
'Authorization': `Bearer ${localStorage.getItem('admin_token')}`,
'Content-Type': 'application/json'
}
}
);
if (!response.ok) {
throw new Error(`API 오류: ${response.status}`);
}
return await response.json();
// Retool - 주문 상태 변경 Transformer
// 테이블에서 선택된 행의 주문 상태를 일괄 변경
const selectedOrders = table1.selectedRows;
if (selectedOrders.length === 0) {
utils.showNotification({
title: "알림",
description: "변경할 주문을 선택해주세요.",
notificationType: "warning"
});
return;
}
const newStatus = statusChangeSelect.value;
const results = await Promise.allSettled(
selectedOrders.map(order =>
fetch(`${API_BASE_URL}/admin/orders/${order.id}/status`, {
method: 'PATCH',
headers: {
'Authorization': `Bearer ${localStorage.getItem('admin_token')}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ status: newStatus })
})
)
);
const succeeded = results.filter(r => r.status === 'fulfilled').length;
const failed = results.filter(r => r.status === 'rejected').length;
utils.showNotification({
title: "처리 완료",
description: `성공: ${succeeded}건, 실패: ${failed}건`,
notificationType: failed > 0 ? "warning" : "success"
});
// 테이블 새로고침
await orderListQuery.trigger();
커스텀 코드 연동
로우코드 플랫폼의 한계를 넘기 위해 커스텀 코드를 연동하는 방법입니다. 대부분의 플랫폼에서 JavaScript를 실행하거나 외부 API를 호출할 수 있습니다.
Appsmith에서 커스텀 위젯 활용
// Appsmith Custom Widget - 차트 라이브러리 연동
// Custom Widget 내에서 외부 라이브러리 활용 가능
// appsmith에서 전달받은 데이터
const chartData = appsmith.model.salesData;
// Chart.js를 활용한 커스텀 차트 렌더링
const ctx = document.getElementById('salesChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: chartData.map(d => d.month),
datasets: [{
label: '월별 매출',
data: chartData.map(d => d.revenue),
backgroundColor: 'rgba(54, 162, 235, 0.5)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1
}]
},
options: {
responsive: true,
onClick: (event, elements) => {
if (elements.length > 0) {
const index = elements[0].index;
// 클릭 이벤트를 Appsmith로 전달
appsmith.triggerEvent('onChartClick', {
month: chartData[index].month,
revenue: chartData[index].revenue
});
}
}
}
});
기존 API 통합
로우코드 플랫폼의 진정한 가치는 기존 시스템과의 통합에서 나옵니다. REST API, GraphQL, 데이터베이스를 연결하여 여러 시스템의 데이터를 하나의 인터페이스로 통합할 수 있습니다.
API 통합 아키텍처
// 통합 API Gateway 패턴
// 로우코드 앱에서 직접 여러 서비스를 호출하는 대신,
// 중간 API Gateway를 두어 보안과 로직을 관리
// Express.js 기반 BFF(Backend For Frontend) 예시
const express = require('express');
const router = express.Router();
// 로우코드 앱 전용 통합 엔드포인트
router.get('/dashboard/summary', async (req, res) => {
try {
// 여러 마이크로서비스에서 데이터를 병렬로 수집
const [orders, users, revenue] = await Promise.all([
orderService.getRecentOrders({ limit: 10 }),
userService.getActiveUserCount(),
billingService.getMonthlyRevenue()
]);
// 로우코드 앱에 최적화된 형태로 가공
res.json({
recentOrders: orders.map(o => ({
id: o.id,
customer: o.customerName,
amount: o.totalAmount,
status: o.status,
statusLabel: ORDER_STATUS_LABELS[o.status],
createdAt: o.createdAt
})),
stats: {
activeUsers: users.count,
monthlyRevenue: revenue.total,
revenueGrowth: revenue.growthRate
}
});
} catch (error) {
logger.error('Dashboard summary failed:', error);
res.status(500).json({ error: '데이터 조회 중 오류가 발생했습니다.' });
}
});
보안 고려사항
로우코드 플랫폼을 엔터프라이즈 환경에서 사용할 때 반드시 고려해야 할 보안 요소들입니다.
데이터 보안
- 셀프 호스팅 여부: 민감한 데이터를 다루는 경우, 클라우드 SaaS 대신 셀프 호스팅 옵션이 있는 플랫폼(Appsmith, Budibase, Retool On-Premise)을 선택합니다
- 데이터 암호화: 전송 중(TLS) 및 저장 시(AES-256) 암호화가 지원되는지 확인합니다
- 접근 제어: RBAC(역할 기반 접근 제어)를 설정하여 사용자별로 접근 가능한 데이터와 기능을 제한합니다
인증 및 권한 관리
// Retool에서 SSO 및 RBAC 설정 예시
// 환경 변수로 민감한 정보 관리
// 1. SSO 연동 (SAML/OIDC)
// Retool 설정에서 SSO 프로바이더 구성
// -> Settings > Authentication > SAML/OIDC
// 2. 그룹 기반 권한 관리
// 앱 내 JavaScript에서 사용자 그룹 확인
const userGroups = current_user.groups;
const isAdmin = userGroups.includes('admin');
const isManager = userGroups.includes('manager');
// 조건부 UI 표시
if (!isAdmin) {
// 삭제 버튼 비활성화
deleteButton.setDisabled(true);
}
// 3. 환경별 데이터 소스 분리
// Production, Staging 별도 데이터 소스를 구성하여
// 개발 중 실수로 운영 데이터를 변경하는 것을 방지
적합한 사용 사례와 부적합한 사례
로우코드가 적합한 경우
- 내부 관리 도구: 고객 지원 대시보드, 주문 관리, 재고 조회 등 CRUD 중심 관리자 화면
- 데이터 시각화: 여러 DB와 API에서 데이터를 수집하여 대시보드로 표시하는 앱
- 업무 프로세스 자동화: 승인 워크플로우, 알림 자동화, 데이터 파이프라인 관리
- 프로토타이핑: 아이디어를 빠르게 검증하기 위한 MVP(최소 기능 제품) 구축
- 레거시 시스템 연동: 오래된 시스템의 데이터를 현대적인 UI로 접근하는 레이어
로우코드가 부적합한 경우
- 고객 대면 제품: 브랜드 아이덴티티가 중요한 B2C 앱은 UI 커스터마이징 한계가 문제됩니다
- 고성능 실시간 시스템: 밀리초 단위 응답이 필요한 트레이딩 시스템, 게임 서버 등은 부적합합니다
- 복잡한 알고리즘: 머신러닝 모델 학습, 복잡한 수학 연산 등은 프로 코드가 필요합니다
- 대규모 트래픽 서비스: 동시 사용자가 수만 명 이상인 공개 서비스에는 성능 한계가 있습니다
실제 업무 자동화 구축 예시
실제로 로우코드 플랫폼을 활용하여 업무 자동화를 구축한 사례를 살펴보겠습니다.
사례: 견적서 자동 생성 시스템
영업팀이 고객 요구사항을 입력하면 자동으로 견적서 PDF를 생성하고, 슬랙으로 알림을 보내는 시스템입니다.
// Retool Workflow - 견적서 자동 생성 파이프라인
// 1단계: 폼 제출 시 트리거
// 견적 데이터 수집
const quoteData = {
customerName: customerNameInput.value,
customerEmail: customerEmailInput.value,
items: quoteItemsTable.data.map(item => ({
name: item.productName,
quantity: item.quantity,
unitPrice: item.unitPrice,
subtotal: item.quantity * item.unitPrice
})),
discount: discountInput.value || 0,
validUntil: moment().add(30, 'days').format('YYYY-MM-DD')
};
// 합계 계산
quoteData.subtotal = quoteData.items.reduce(
(sum, item) => sum + item.subtotal, 0
);
quoteData.discountAmount = quoteData.subtotal * (quoteData.discount / 100);
quoteData.tax = (quoteData.subtotal - quoteData.discountAmount) * 0.1;
quoteData.total = quoteData.subtotal - quoteData.discountAmount + quoteData.tax;
// 2단계: PDF 생성 API 호출
const pdfResponse = await generateQuotePDF.trigger({
additionalScope: { quoteData }
});
// 3단계: 슬랙 알림 발송
await slackNotification.trigger({
additionalScope: {
channel: '#sales-quotes',
message: `새 견적서 생성: ${quoteData.customerName} - ₩${quoteData.total.toLocaleString()}`
}
});
// 4단계: DB에 견적 이력 저장
await saveQuoteHistory.trigger({
additionalScope: { quoteData, pdfUrl: pdfResponse.url }
});
사례: 온보딩 체크리스트 앱
// Budibase Automation - 신규 입사자 온보딩 자동화
// 트리거: 새 직원 레코드가 HR DB에 추가될 때
// 자동 생성되는 온보딩 체크리스트
const checklistItems = [
{ task: "계정 생성 (Google Workspace)", assignee: "IT팀", dueOffset: 0 },
{ task: "장비 준비 (노트북, 모니터)", assignee: "IT팀", dueOffset: -2 },
{ task: "슬랙 채널 초대", assignee: "팀 리드", dueOffset: 0 },
{ task: "GitHub 조직 초대", assignee: "DevOps팀", dueOffset: 0 },
{ task: "VPN 계정 발급", assignee: "보안팀", dueOffset: -1 },
{ task: "팀 미팅 일정 등록", assignee: "팀 리드", dueOffset: 0 },
{ task: "사내 시스템 교육", assignee: "HR팀", dueOffset: 3 },
{ task: "보안 교육 수료", assignee: "신규 입사자", dueOffset: 7 }
];
// 각 담당자에게 자동으로 태스크 할당 및 알림 발송
for (const item of checklistItems) {
const dueDate = new Date(startDate);
dueDate.setDate(dueDate.getDate() + item.dueOffset);
await createTask({
employeeId: newEmployee.id,
task: item.task,
assignee: item.assignee,
dueDate: dueDate,
status: 'pending'
});
await sendSlackDM(item.assignee,
`새 온보딩 태스크: "${item.task}" (마감: ${dueDate.toLocaleDateString('ko-KR')})`
);
}
프로 코드와 하이브리드 전략
가장 효과적인 접근법은 로우코드와 프로 코드를 적절히 조합하는 하이브리드 전략입니다.
하이브리드 아키텍처 설계
- 프론트오피스(고객 대면): 프로 코드로 개발. React/Next.js 등으로 브랜드에 맞는 UI/UX를 구현합니다.
- 백오피스(내부 관리): 로우코드로 개발. Retool/Appsmith로 관리 도구를 빠르게 구축합니다.
- 백엔드 API: 프로 코드로 개발. Spring Boot, Express.js 등으로 핵심 비즈니스 로직을 구현합니다.
- 자동화/워크플로우: 로우코드로 구현. n8n, Retool Workflows로 업무 자동화를 처리합니다.
// 하이브리드 아키텍처 예시
//
// [고객 앱] [어드민 대시보드] [자동화 워크플로우]
// React/Next.js Retool/Appsmith n8n/Retool Workflows
// | | |
// +--------------------+-----------------------+
// |
// [API Gateway]
// (Kong/Nginx)
// |
// +----------------+----------------+
// | | |
// [주문 서비스] [사용자 서비스] [결제 서비스]
// Spring Boot Spring Boot Spring Boot
// | | |
// [PostgreSQL] [PostgreSQL] [PostgreSQL]
// API Gateway에서 로우코드 앱 전용 라우팅 설정
// kong.yml
services:
- name: admin-bff
url: http://admin-bff:3000
routes:
- name: retool-api
paths:
- /admin/api
headers:
X-Client-Type:
- retool
마무리
로우코드/노코드 플랫폼은 개발자의 생산성을 높이는 강력한 도구입니다. 핵심은 적재적소에 활용하는 것입니다. 내부 관리 도구와 업무 자동화에는 로우코드를, 고객 대면 제품과 복잡한 비즈니스 로직에는 프로 코드를 사용하는 하이브리드 전략이 가장 현실적이고 효과적인 접근법입니다. 작은 프로젝트부터 시도해 보고, 팀에 맞는 플랫폼과 워크플로우를 찾아가세요.
10년차 풀스택 개발자. Spring Boot, Flutter, AI 등 실무 경험을 기록합니다.
GitHub →
💬 댓글