웹 서비스나 업무 시스템을 운영할 때 피할 수 없는 것이 서버 유지보수입니다.
OS 업데이트, PHP 버전 변경, 데이터베이스(DB) 관리, 보안 대책, 장애 대응 등 서버를 안정적으로 가동시키기 위해서는 지속적인 관리가 필요합니다.
하지만 실제 개발 현장에서는 다음과 같은 의문이 생길 수 있습니다.
- 서버 유지보수는 관리자와 개발자 중 누가 담당해야 하는가?
- 서버 업데이트로 인해 시스템이 작동하지 않을 경우, 누가 대응하는가?
- PHP나 Node.js와 같은 실행 환경을 변경할 때, 관리자만 판단해도 되는가?
- 서버의 안정적인 가동과 애플리케이션의 정상 동작은 어떻게 구분해야 하는가?
저는 시스템 개발을 중심으로 AI 개발, 웹 애플리케이션 개발, 데이터베이스 설계, 프로덕션(본번) 환경 배포 등에 참여해 왔습니다.
그 경험으로 볼 때, 관리자와 개발자는 밀접하게 관련되어 있지만, 본래 맡아야 할 책임과 기술적인 역할은 다릅니다.
이번 글에서는 개발자의 입장에서 이 차이점을 기술적/실무적으로 분석하겠습니다.
먼저, 양쪽의 역할을 정리해 보겠습니다.
서버 관리자(System Administrator)의 주요 역할은 시스템이 구동되는 인프라 환경을 안정적으로 유지하는 것입니다.
구체적으로는 다음과 같은 업무가 있습니다.
- Linux나 Windows Server 등의 OS 관리
- CPU, 메모리, 디스크 용량 모니터링
- 네트워크 및 방화벽(Firewall) 설정
- SSH와 같은 접근 권한 관리
- SSL/TLS 인증서 관리
- OS나 미들웨어의 보안 업데이트
- 서버 백업 및 복구
- 장애 발생 시 인프라 조사
- nginx, Apache 등의 웹 서버 관리
- 서버 가동 상황 및 리소스 모니터링
즉, 관리자는 '시스템이 동작하기 위한 토대'를 유지하는 역할을 담당합니다.
반면, 개발자(Developer)의 주요 역할은 서버 위에서 동작하는 애플리케이션이 정상적으로 기능하도록 보장하는 것입니다.
구체적으로는 다음과 같은 업무가 있습니다.
- 애플리케이션 설계 및 개발
- 프로그램 수정 및 기능 추가
- 데이터베이스 설계 및 관리
- API나 외부 서비스와의 연동
- PHP, Python, Node.js 등의 실행 환경 대응
- 라이브러리나 프레임워크의 의존성(Dependency) 관리
- 버전 업그레이드 후 동작 검증
- 에러 로그 분석
- 애플리케이션 취약점 수정
- 프로덕션 환경 배포 및 릴리스 관리
개발자에게 중요한 것은 단순히 프로그램을 작성하는 것만이 아닙니다. 서버 환경이 바뀌었을 때도 기존 기능이나 데이터를 유지하면서 서비스를 정상적으로 가동시키는 것입니다.
| 비교 항목 | 서버 관리자 | 시스템 개발자 |
|---|
| 주요 책임 | 인프라의 안정적 가동 | 애플리케이션의 정상 동작 |
| ... | | |
| 여기서 중요한 것은, 어느 한쪽만으로 서버 유지보수가 완료되는 것이 아니라는 점입니다. | | |
실무상 특히 주의가 필요한 부분이 프로그래밍 언어나 실행 환경의 버전 업그레이드입니다.
예를 들어, PHP 7.4로 동작하는 웹 시스템을 PHP 8.4로 마이그레이션(Migration)하는 경우를 가정해 보겠습니다.
관리자는 서버 위에 PHP 8.4를 설치하고, 웹 서버와의 연결이나 실행 환경 설정을 할 수 있습니다.
하지만 그것만으로는 시스템의 이식이 완료되지 않습니다.
왜냐하면, PHP 버전이 바뀌면서 기존 애플리케이션에 영향이 발생할 가능성이 있기 때문입니다.
예를 들어, 다음과 같은 문제가 있을 수 있습니다.
- PHP의 사용 중지(Deprecated) 기능이나 삭제된 기능에 대한 의존성
- 함수나 메서드의 사양 변경
- 타입 체크 강화로 인한 에러
- 오래된 라이브러리와의 호환성 문제
- CakePHP나 Laravel 같은 프레임워크의 대응 상황
- 데이터베이스 연결 드라이버(Driver) 변경에 따른 영향
- 외부 API와의 통신 처리에 미치는 영향
예를 들어, 구 버전인 CakePHP 3.8을 사용하는 시스템에서는 PHP 버전만 변경해도 정상적으로 동작한다고 보장할 수 없습니다.
이 경우, 개발자가 소스 코드, 의존 라이브러리, 프레임워크의 호환성을 확인해야 합니다.
제 생각으로는, 실행 환경의 변경은 관리자가 기술적인 환경 정비를 담당하고, 개발자가 애플리케이션의 호환성과 동작 보장을 담당해야 합니다.
서버에 새로운 PHP를 설치할 수 있는 것과, 기존 시스템이 새로운 PHP로 정상적으로 동작하는 것은 완전히 별개의 문제입니다.
이 차이를 이해하는 것이 중요합니다.
서버 유지보수 과정에서는 인프라 측의 변경 사항이 애플리케이션에 영향을 미치는 경우가 있습니다.
여기서는 대표적인 4가지 케이스를 살펴보겠습니다.
예를 들어, Ubuntu의 보안 업데이트를 수행한 후 애플리케이션이 더 이상 실행되지 않는 상황을 가정해 봅시다.
가능한 원인은 다음과 같습니다:
- nginx 설정 변경
- OpenSSL과 같은 라이브러리 업데이트
- 파일 접근 권한 변경
- systemd 설정 변경
- Node.js나 PHP의 실행 환경에 미치는 영향
이 경우, 관리자는 OS 또는 미들웨어의 변경 이력을 확인합니다.
개발자는 애플리케이션의 시작 로그와 의존성을 확인합니다.
두 주체가 협력함으로써 원인을 특정할 수 있습니다.
PostgreSQL이나 MySQL과 같은 데이터베이스를 업데이트할 때도 주의가 필요합니다.데이터베이스 버전 변경에 따라 SQL 동작 방식, 설정, 인증 방식 등에 영향을 줄 수 있기 때문입니다.
관리자가 담당하는 내용:
- DB 서버 백업
- 데이터베이스 엔진 업데이트
- 연결 설정 및 리소스 관리
- 장애 발생 시 복구 환경 준비
개발자가 담당하는 내용:
- SQL 호환성 확인
- 테이블 구조 검증
- 마이그레이션(Migration) 실행
- 데이터 무결성 확인
- 애플리케이션에서의 연결 테스트
특히 업무 시스템의 경우, 데이터베이스의 불일치가 실제 업무 자체에 영향을 미칩니다. 단순히 데이터베이스가 구동되었다고 해서 유지보수가 완료되었다고 말할 수 없습니다.
보안 대책은 매우 중요합니다.
하지만 업데이트를 적용하는 과정에서 기존 애플리케이션이 정상적으로 작동하지 않게 되는 경우도 있습니다.
예를 들어, 암호화 방식 변경, TLS 설정 변경, 라이브러리 업데이트 등이 있습니다.
관리자는 인프라 측의 보안을 확보하고, 개발자는 애플리케이션의 통신 및 인증 처리가 정상적으로 기능하는지 확인해야 합니다.
보안 대책과 시스템의 호환성은 양립시켜야 합니다.
백업에 대해서도 관리자와 개발자의 역할은 다릅니다.관리자는 백업 획득 스케줄, 저장 위치, 접근 권한, 복구 절차 등을 관리합니다.반면, 개발자는 복구된 데이터를 이용해 애플리케이션이 정상적으로 작동하는지 검증합니다.
예를 들어, 백업 파일이 존재하더라도 데이터베이스의 무결성이 손상되었거나 이미지 파일과 데이터베이스 간의 참조 관계가 끊어져 있다면 서비스는 정상적으로 복구될 수 없습니다.
백업을 취득하는 것과 시스템을 복구할 수 있는 것은 같지 않습니다.
실제 복원 테스트를 수행하여 업무 데이터나 애플리케이션 동작을 확인하는 것이 중요합니다.
저는 개발자가 애플리케이션 코드만을 관리하면 된다는 생각에는 동의하지 않습니다.현대의 웹 시스템은 애플리케이션과 인프라가 밀접하게 연결되어 있기 때문입니다.
예를 들어, 제가 개발에서 다루게 되는 다음과 같은 기술들을 생각해 보겠습니다.
- Ubuntu Server
- nginx
- Node.js
- Next.js
- React
- TypeScript
- PostgreSQL
- Supabase
- PM2
- Docker
이들은 각각 독립된 기술이 아니라, 실제 시스템에서는 서로 상호 연계되어 있습니다.
예를 들어, Next.js로 개발한 애플리케이션을 Ubuntu Server에 배포할 경우 다음과 같은 구성이 됩니다.
[ User / Browser ]
|
v
...
이 구성에서 장애가 발생했을 때, 원인이 반드시 애플리케이션에 있다고 단정할 수는 없습니다.nginx 설정, PM2의 프로세스 관리, Node.js 버전, 데이터베이스 연결 제한 등 여러 요인을 고려해야 합니다.
따라서 개발자에게도 인프라에 관한 지식이 요구됩니다.
특히 다음 능력들은 중요하다고 생각합니다.
- Linux의 기본적인 조작 및 로그 조사
- 웹 서버 설정 이해
- 데이터베이스 백업 및 복구
- 네트워크와 HTTPS에 대한 이해
- CI/CD나 배포 메커니즘
- 서버와 애플리케이션의 장애 분리(Troubleshooting)
- 보안 업데이트 후 동작 검증
이는 DevOps나 SRE라는 개념으로도 이어집니다.개발과 운영을 완전히 분리하는 것이 아니라, 양쪽이 협력하여 시스템 전체의 품질을 유지하는 것이 중요합니다.
또 다른 실무적으로 중요한 문제가 있습니다.그것은 유지보수 책임 범위가 모호해지는 경우입니다.예를 들어, 서버 회사에서 PHP 버전 업그레이드를 실시한다고 가정해 보겠습니다.
서버 회사에서는 PHP의 새로운 버전을 제공할 수 있습니다.
하지만, 사용자가 이용하는 기존 웹 시스템까지 정상적으로 동작함을 보장하지는 않습니다.
마찬가지로, 개발자가 프로그램을 수정했다고 하더라도 서버의 네트워크 장애나 하드웨어 장애까지 단독으로 해결할 수는 없습니다.
여기서 중요한 것은 작업의 책임 범위를 명확히 하는 것입니다.
| 작업 내용 | 관리자 | 개발자 |
|---|
| OS 업데이트 | 주 담당 | 영향 조사 |
| ... | | |
| 물론, 실제 조직에 따라 담당 범위는 다릅니다. | | |
소규모 개발사나 프리랜서의 경우, 개발자가 인프라 관리까지 담당하는 사례도 있습니다. 하지만 그 경우에도 어디까지가 계약상의 유지보수 범위인지 명확히 해 둘 필요가 있습니다.
개발자의 입장에서 생각할 때, 서버 유지보수는 다음과 같은 절차로 진행하는 것이 이상적입니다.
첫째, 현재 환경을 파악합니다.
- OS 버전
- PHP나 Node.js의 버전
- 웹 서버 종류
- 데이터베이스(DB) 종류와 버전
- 프레임워크 버전
- 설치된 라이브러리
- 외부 API와의 연결 상황
이 정보가 없으면 안전한 업데이트 계획을 세울 수 없습니다.
둘째, 업데이트 대상이 기존 시스템에 미치는 영향을 분석합니다. 특히 오래된 시스템의 경우, 의존 라이브러리나 프레임워크의 지원 현황을 확인해야 합니다.
업데이트 전에는 반드시 복구 가능한 상태를 확보합니다.
- 데이터베이스(DB)
- 애플리케이션 소스 코드
- 설정 파일
- 업로드 파일
- SSL 관련 설정
- 환경 변수나 비밀 정보 관리
또한, 백업이 정상적으로 복원되는지 확인해야 합니다. 갑자기 운영 환경(Production Environment)을 변경하는 것이 아니라, 가능한 한 스테이징 환경(Staging Environment)에서 검증합니다.
이 단계에서 오류, 호환성 문제, 성능 변화 등을 확인합니다.
검증이 완료되면 운영 환경에 반영합니다. 유지보수 시간, 영향 범위, 롤백 방법(Rollback Method)을 사전에 결정해 두는 것이 중요합니다.
마지막으로, 애플리케이션의 주요 기능을 확인합니다. 예를 들어 다음과 같은 항목들입니다.
- 로그인/로그아웃
- 데이터 등록/갱신/삭제 (CRUD)
- 파일 업로드
- API 통신
- 결제 처리
- 메일 전송
- 관리 화면
- PDF나 CSV 출력
단순히 서버가 구동되고 있다는 것뿐만 아니라, 사용자가 필요로 하는 기능이 정상적으로 동작하는지 확인해야 합니다.
최근에는 AI를 활용한 시스템 개발이나 운영 자동화가 급속하게 진행되고 있습니다. 예를 들어, AI를 이용하면 다음과 같은 작업을 효율화할 수 있습니다.
- 서버 로그 분석
- 오류 원인 조사 지원
- 보안 위험 감지 지원
- SQL 최적화
- 버전 업 시 코드 수정 지원
- 테스트 코드 자동 생성
- 배포 스크립트 작성
- 문서 자동 생성
하지만 AI가 코드를 수정할 수 있는 것과 안전한 운영 환경의 변경을 판단할 수 있는 것은 별개의 문제입니다. 예를 들어, AI가 PHP 7.4에서 PHP 8.4로의 마이그레이션(Migration) 코드를 생성했다고 하더라도, 실제 운영 환경에서 문제가 없이 동작하는지는 검증해 보지 않으면 알 수 없습니다.
또한, 백업 확보나 복구에 대해서도 AI가 명령어만 제안하는 것만으로는 충분하지 않습니다. 실제로 데이터가 복원되는지, 무결성(Integrity)이 유지되고 있는지를 확인해야 합니다.
앞으로의 관리자와 개발자에게는 AI를 능숙하게 다루는 능력뿐만 아니라, AI가 제안한 변경 사항의 위험도를 판단할 수 있는 기술력이 요구된다고 생각합니다.
이번 내용을 정리하면 다음과 같습니다.
서버 관리자는 시스템이 동작하기 위한 인프라 환경을 유지하는 역할을 담당합니다. 반면, 개발자는 그 인프라 위에서 동작하는 애플리케이션의 품질과 정상적인 동작을 유지하는 역할을 담당합니다.
다만, 현대 웹 시스템에서는 양쪽 지식이 많이 겹치는 부분이 많습니다. 특히 PHP나 Node.js 버전 업그레이드, 데이터베이스 마이그레이션, 보안 업데이트 등은 인프라와 애플리케이션 양쪽을 이해하고 있어야 안전하게 수행할 수 있습니다.
저 자신도 시스템 개발에 참여하면서, 프로그램을 개발하는 능력뿐만 아니라 서버 환경, 데이터베이스, 보안, 배포(Deploy), 운영까지 이해하는 것의 중요성을 느꼈습니다.
마지막으로, 제가 가장 중요하다고 생각하는 것을 하나 꼽자면.
서버의 가용성(Availability)을 유지하는 것이 관리자의 역할이며, 그 서버 위에서 서비스가 정상적으로 계속 작동하도록 구현하는 것이 개발자의 역할입니다.
그리고 이 두 가지 역할이 적절하게 연계되어야만 비로소 안정적인 시스템 운영이 실현될 수 있지 않을까요?
여러분은 서버 유지보수 과정에서 관리자와 개발자의 책임 범위를 어떻게 생각하시나요?
실제 개발 및 운영 현장에서의 경험이나 의견도 꼭 듣고 싶습니다.