카테고리 없음
AndroidStudio 앱개발 서버 구축 종류
연나연
2025. 12. 24. 11:38
앱 개발 서버 구축의 필요성과 종류
1. 서버가 왜 필요한가?
[안드로이드 앱] ←→ [서버] ←→ [데이터베이스]
(클라이언트) (중개자) (PostgreSQL)
2 서버의 역할
🔒 보안
- DB 정보 숨기기: 앱에 DB 비밀번호 노출 방지
- 인증/권한 관리: 로그인, 토큰 검증
- 데이터 검증: 악의적인 요청 차단
❌ 나쁜 방식: 앱에서 DB 직접 연결
[앱] → [PostgreSQL]
문제: 앱 디컴파일 시 DB 비밀번호 노출!
✅ 좋은 방식: 서버를 통한 연결
[앱] → [서버] → [PostgreSQL]
앱은 서버 주소만 알고, DB 정보는 서버만 앎
💼 비즈니스 로직 처리
- 복잡한 계산은 서버에서
- 여러 테이블 조인, 집계 연산
- 트랜잭션 관리
// ❌ 앱에서 처리 (비효율적)
val users = db.getAllUsers()
// 10만 명 val filtered = users.filter { it.age > 20 && it.city == "Seoul" }
// ✅ 서버에서 처리 (효율적)
// 서버: SELECT * FROM users WHERE age > 20 AND city = 'Seoul'
// 앱: 결과만 받음
🔄 데이터 동기화
- 여러 사용자가 같은 데이터 공유
- 실시간 업데이트
- 버전 관리
📊 분석 및 모니터링
- 사용자 행동 분석
- 에러 로그 수집
- 서버 성능 모니터링
2. 서버 구축 방식의 종류
2.1 통신 프로토콜별 분류
🌐 HTTP/HTTPS (REST API) - 가장 대중적 ⭐⭐⭐⭐⭐
특징:
- 웹 표준 프로토콜
- 요청-응답 방식
- JSON 형식으로 데이터 교환
- Stateless (상태 유지 안 함)
장점:
- 개발이 쉬움
- 라이브러리 풍부 (Retrofit, OkHttp)
- 디버깅 용이
- 방화벽 통과 쉬움
- 문서화 쉬움 (Swagger)
단점:
- 실시간 통신에는 부적합
- 오버헤드가 큼 (헤더가 큼)
- 양방향 통신 불가
// Retrofit 사용
interface ApiService {
@POST("/login")
suspend fun login(@Body request: LoginRequest): Response<LoginResponse>
@GET("/users")
suspend fun getUsers(): Response<List<User>>
}
// 사용
val response = apiService.login(LoginRequest("user", "pass"))
if (response.isSuccessful) {
// 로그인 성공
}
🔌 Socket (TCP/UDP) - 회사에서 사용하는 방식 ⭐⭐⭐
특징:
- 저수준 네트워크 통신
- 연결 유지형 (Connection-oriented)
- 바이너리 또는 커스텀 프로토콜
- 양방향 통신 가능
장점:
- 빠른 속도
- 실시간 통신 가능
- 프로토콜 자유도 높음
- 오버헤드 작음
- 산업용/IoT에 적합
단점:
- 개발이 복잡함
- 디버깅 어려움
- 방화벽 문제 가능
- 프로토콜 직접 설계 필요
// C# 서버
// 1. 헤더 10바이트 받기
[STX][CMD][LEN][LEN][LEN][LEN][NUL][NUL][NUL][ETX]
// 2. 바디 받기
[실제 데이터...]
// 3. DB 처리 후 응답
특징:
- 정확한 바이트 단위 제어
- 헤더에 메타데이터 포함
- STX/ETX로 패킷 구분
- 커스텀 프로토콜
사용 사례:
- 공장 자동화 (PLC 통신)
- 금융 시스템 (빠른 거래)
- 게임 서버 (실시간 동기화)
- IoT 기기 제어
- 산업용 모니터링 시스템 ← 회사 프로젝트
대중성: ★★★☆☆ (특수 목적용)
⚡ WebSocket - 실시간 양방향 통신 ⭐⭐⭐⭐
특징:
- HTTP로 시작해서 WebSocket으로 업그레이드
- 연결 유지형
- 양방향 실시간 통신
- 텍스트/바이너리 지원
장점:
- 실시간 통신에 최적
- 서버에서 클라이언트로 푸시 가능
- HTTP보다 오버헤드 작음
- 브라우저 지원 좋음
단점:
- 연결 유지로 서버 부하
- 구현이 REST보다 복잡
// OkHttp WebSocket
val client = OkHttpClient()
val request = Request.Builder().url("ws://example.com/chat").build()
val ws = client.newWebSocket(request, object : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
// 메시지 받음
println("받은 메시지: $text")
}
})
// 메시지 보내기
ws.send("Hello Server!")
사용 사례:
- 채팅 앱 (카카오톡, 슬랙)
- 실시간 알림
- 협업 도구 (구글 독스)
- 주식 시세
- 게임
대중성: ★★★★☆ (실시간 앱에서 필수)
2.2 서버 구축 방식별 분류
1️⃣ 직접 서버 구축 (Traditional Server)
- 서버 프로그램 직접 개발
- c# (.NET) : <-회사방식
- Node.js : (Express.js)
- Python : (Flask, FastAPI)
- JAVA : (Spring Boot)
2️⃣ BaaS (Backend as a Service) - Firebase 같은 것
ex) Firebase
- 특징 1) 서버 코드 작성 불필요
2) 클라우드 기반
3) sdk 제공
주요 BaaS:
- Firebase (Google) - 가장 인기
- AWS Amplify (Amazon)
- Supabase (오픈소스 Firebase 대안)
- Back4App (Parse 기반)
3️⃣ 클라우드 서비스 (IaaS/PaaS)
IaaS (Infrastructure as a Service):
- AWS EC2, Google Compute Engine
- 가상 서버 빌려서 직접 설정
PaaS (Platform as a Service):
- Heroku, AWS Elastic Beanstalk
- 코드만 올리면 자동 배포
4.1 프로젝트 유형별 추천
프로젝트 유형추천 방식이유
| 학교 과제 | REST API (Node.js) | 빠르고 쉬움 |
| 스타트업 MVP | Firebase | 서버 관리 불필요 |
| 채팅 앱 | WebSocket | 실시간 필요 |
| 전자상거래 | REST API (Java Spring) | 안정적, 트랜잭션 |
| 게임 | Socket or WebSocket | 실시간, 저지연 |
| 산업용/IoT | TCP Socket (C#/C++) | 안정성, 제어 |
| 금융 앱 | REST API + gRPC | 보안, 성능 |
나는 socket으로 개발하여야 하는 상황이올시다.