7. 유지보수 (Maintenance)

유지보수 (Maintenance) 배포된 소프트웨어를 지속적으로 관리하고 개선하는 단계 오류 수정 주요 목적 시스템의 안정성과 신뢰성을 향상시킨다. 사용자 경험을 개선하고 만족도를 높인다. 시스템의 정상적인 기능 수행을 보장한다. 보안 취약점을 해결하여 시스템 보안을 강화한다. 비즈니스 프로세스의 중단을 최소화한다. 시스템의 성능을 최적화한다. 법적, 규제적 요구사항을 지속적으로 충족시킨다. 소프트웨어의 수명을 연장한다. 세부 활동과 산출물 세부 활동 설명 주요 산출물 오류 보고 접수 사용자나 모니터링 시스템으로부터 오류 보고 수집 오류 보고서 오류 분류 및 우선순위 지정 오류의 심각도와 영향도에 따른 분류 및 우선순위 결정 오류 분류 문서 오류 재현 및 분석 보고된 오류 상황 재현 및 근본 원인 분석 오류 분석 보고서 수정 계획 수립 오류 수정을 위한 접근 방법 및 일정 계획 수정 계획서 코드 수정 실제 코드 수정 작업 수행 수정된 소스 코드 단위 테스트 수정된 코드에 대한 단위 테스트 실행 단위 테스트 결과 통합 테스트 수정사항이 전체 시스템에 미치는 영향 확인 통합 테스트 보고서 문서 업데이트 관련 문서 (사용자 매뉴얼, 기술 문서 등) 갱신 업데이트된 문서 변경 사항 배포 수정된 버전 배포 및 적용 배포 로그 사후 모니터링 수정 후 시스템 안정성 및 성능 모니터링 모니터링 보고서 주의해야할 요소 주의 요소 설명 영향 분석 수정이 다른 기능에 미치는 영향 철저히 분석 우선순위 관리 중요도와 긴급성에 따른 적절한 우선순위 부여 버전 관리 수정 사항에 대한 명확한 버전 관리 유지 테스트 커버리지 충분한 테스트를 통한 수정 효과 검증 문서화 오류 원인, 수정 과정, 해결책 상세 문서화 커뮤니케이션 이해관계자에게 수정 사항 명확히 전달 보안 고려 수정 과정에서 새로운 보안 취약점 발생 방지 성능 영향 수정으로 인한 성능 저하 방지 호환성 다양한 환경에서의 호환성 유지 롤백 계획 문제 발생 시 신속한 롤백 가능성 확보 성능 개선 주요 목적 시스템의 응답 시간을 단축하여 사용자 경험을 향상시킨다. 자원 사용을 최적화하여 시스템의 효율성을 높인다. 시스템의 처리량을 증가시켜 더 많은 작업을 수행할 수 있게 한다. 확장성을 개선하여 증가하는 사용자 수와 데이터 양을 처리할 수 있게 한다. 시스템의 안정성과 신뢰성을 향상시킨다. 운영 비용을 절감한다. 사용자 만족도를 높이고 비즈니스 생산성을 향상시킨다. 경쟁력을 유지하고 시스템의 수명을 연장한다. 세부 활동과 산출물 세부 활동 설명 주요 산출물 성능 분석 현재 시스템 성능 측정 및 분석 성능 분석 보고서 병목점 식별 성능 저하의 주요 원인 파악 병목점 분석 문서 개선 계획 수립 성능 개선을 위한 전략 및 방법 계획 성능 개선 계획서 코드 최적화 비효율적인 코드 개선 최적화된 소스 코드 데이터베이스 튜닝 쿼리 최적화 및 인덱스 조정 DB 튜닝 보고서 캐싱 전략 구현 데이터 접근 속도 향상을 위한 캐싱 적용 캐싱 구현 문서 리소스 할당 최적화 하드웨어 및 소프트웨어 리소스 재할당 리소스 할당 계획 로드 밸런싱 구현 부하 분산을 위한 로드 밸런싱 적용 로드 밸런싱 구성도 성능 테스트 개선 사항에 대한 성능 테스트 실행 성능 테스트 결과 보고서 모니터링 체계 개선 지속적인 성능 모니터링 시스템 강화 모니터링 대시보드 주의해야할 요소 주의 요소 설명 사용자 영향 최소화 성능 개선 작업으로 인한 서비스 중단 최소화 전체적 접근 특정 부분만이 아닌 시스템 전체의 균형적 개선 확장성 고려 향후 성장을 고려한 확장 가능한 솔루션 적용 비용 대비 효과 투자 비용 대비 성능 개선 효과 분석 보안 유지 성능 개선 과정에서 보안 취약점 발생 방지 데이터 무결성 성능 개선 작업 중 데이터 손실 또는 오류 방지 호환성 기존 시스템 및 외부 시스템과의 호환성 유지 테스트 커버리지 다양한 시나리오에 대한 충분한 성능 테스트 수행 문서화 성능 개선 과정 및 결과의 상세한 문서화 지속적 모니터링 개선 후 지속적인 성능 모니터링 및 평가 기능 개선 및 추가 주요 목적 변화하는 사용자 요구사항을 충족시킨다. 시스템의 기능성과 유용성을 향상시킨다. 비즈니스 프로세스의 효율성을 개선한다. 시스템의 경쟁력을 유지하고 향상시킨다. 새로운 기술 트렌드를 반영하여 시스템을 현대화한다. 사용자 만족도를 높이고 시스템 수명을 연장한다. 새로운 비즈니스 기회를 창출한다. 규제 및 법적 요구사항의 변화에 대응한다. 세부 활동과 산출물 세부 활동 설명 주요 산출물 요구사항 수집 사용자 및 이해관계자로부터 새로운 요구사항 수집 요구사항 문서 영향 분석 새 기능이 기존 시스템에 미치는 영향 평가 영향 분석 보고서 기능 설계 새로운 기능 또는 개선사항 설계 기능 설계 문서 개발 계획 수립 개발 일정, 자원 할당 등 계획 수립 개발 계획서 코드 구현 새로운 기능 구현 또는 기존 기능 수정 업데이트된 소스 코드 단위 테스트 개발된 기능에 대한 단위 테스트 수행 단위 테스트 결과 통합 테스트 새 기능과 기존 시스템의 통합 테스트 통합 테스트 보고서 사용자 문서 업데이트 사용자 매뉴얼, 도움말 등 업데이트 업데이트된 사용자 문서 사용자 교육 새로운 기능에 대한 사용자 교육 실시 교육 자료 및 교육 결과 보고서 배포 및 릴리스 개선된 기능의 배포 및 릴리스 릴리스 노트, 배포 계획 주의해야할 요소 주의 요소 설명 기존 기능과의 일관성 새로운 기능이 기존 시스템과 일관성을 유지하도록 설계 사용자 경험 기능 추가로 인한 사용자 경험 변화 최소화 성능 영향 새 기능 추가로 인한 시스템 성능 저하 방지 확장성 향후 추가 확장을 고려한 유연한 설계 보안 고려 새로운 기능 추가 시 보안 취약점 발생 방지 테스트 커버리지 새로운 기능 및 기존 기능에 대한 충분한 테스트 수행 버전 관리 기능 변경에 따른 명확한 버전 관리 문서화 새로운 기능 및 변경사항에 대한 철저한 문서화 사용자 피드백 개선된 기능에 대한 사용자 피드백 수집 및 반영 비용 대비 효과 기능 개선/추가에 따른 비용과 기대 효과 분석 보안 업데이트 주요 목적 알려진 보안 취약점을 해결하여 시스템의 안전성을 강화한다. 새로운 보안 위협에 대한 대응 능력을 향상시킨다. 데이터의 기밀성, 무결성, 가용성을 보장한다. 규제 및 법적 요구사항을 준수한다. 사용자와 조직의 신뢰를 유지한다. 잠재적인 보안 사고로 인한 재정적, 평판적 손실을 예방한다. 시스템의 전반적인 보안 상태를 지속적으로 개선한다. 최신 보안 기술과 best practices를 적용한다. 세부 활동과 산출물 세부 활동 설명 주요 산출물 보안 취약점 모니터링 새로운 보안 위협 및 취약점 정보 수집 보안 취약점 보고서 위험 평가 식별된 취약점의 심각도 및 영향 평가 위험 평가 문서 패치 개발 보안 취약점을 해결하기 위한 패치 개발 보안 패치 테스트 환경 구성 패치 테스트를 위한 격리된 환경 준비 테스트 환경 구성 문서 패치 테스트 개발된 패치의 효과성 및 부작용 테스트 패치 테스트 결과 보고서 배포 계획 수립 패치 적용 일정 및 방법 계획 패치 배포 계획서 사용자 공지 보안 업데이트 내용 및 일정 공지 사용자 공지문 패치 적용 실제 운영 환경에 패치 적용 패치 적용 로그 모니터링 및 검증 패치 적용 후 시스템 안정성 및 보안성 확인 패치 적용 후 검증 보고서 문서 업데이트 보안 정책 및 절차 문서 갱신 업데이트된 보안 문서 주의해야할 요소 주의 요소 설명 긴급성 vs 안정성 신속한 패치 적용과 충분한 테스트 사이의 균형 유지 호환성 보안 패치와 기존 시스템 및 애플리케이션과의 호환성 확인 다운타임 최소화 패치 적용으로 인한 서비스 중단 시간 최소화 롤백 계획 문제 발생 시 신속하게 이전 상태로 복원할 수 있는 계획 수립 전체적 접근 개별 구성 요소뿐만 아니라 시스템 전체의 보안 고려 사용자 교육 새로운 보안 기능이나 변경사항에 대한 사용자 교육 규제 준수 관련 법규 및 산업 표준 준수 여부 확인 지속적 모니터링 패치 적용 후 지속적인 보안 모니터링 실시 문서화 모든 보안 업데이트 과정 및 결과의 상세한 문서화 제3자 소프트웨어 사용 중인 제3자 라이브러리 및 도구의 보안 업데이트 관리 기술 스택 업그레이드 주요 목적 시스템의 성능, 안정성, 보안성을 향상시킨다. 최신 기술의 이점을 활용하여 시스템 효율성을 개선한다. 기술적 부채를 줄이고 시스템의 유지보수성을 향상시킨다. 새로운 기능과 확장성을 지원한다. 지원 종료된 기술에 대한 의존성을 제거한다. 개발자 생산성을 향상시키고 최신 개발 도구를 활용한다. 시스템의 장기적인 지속 가능성을 보장한다. 비즈니스 요구사항의 변화에 더 잘 대응할 수 있게 한다. 세부 활동과 산출물 세부 활동 설명 주요 산출물 현재 기술 스택 분석 현재 사용 중인 기술의 상태 및 한계 평가 기술 스택 현황 보고서 새로운 기술 조사 최신 기술 트렌드 및 대안 조사 기술 조사 보고서 업그레이드 계획 수립 업그레이드 범위, 일정, 자원 계획 업그레이드 계획서 영향 분석 업그레이드가 시스템에 미치는 영향 평가 영향 분석 보고서 프로토타입 개발 새로운 기술 스택으로 프로토타입 구현 프로토타입 및 평가 결과 마이그레이션 전략 수립 기존 시스템에서 새 기술로의 전환 전략 마이그레이션 전략 문서 코드 리팩토링 새로운 기술 스택에 맞게 코드 수정 업데이트된 소스 코드 테스트 수행 업그레이드된 시스템의 기능 및 성능 테스트 테스트 결과 보고서 문서 업데이트 기술 문서, API 문서 등 갱신 업데이트된 기술 문서 교육 및 지원 개발팀 및 운영팀 대상 새 기술 교육 교육 자료 및 교육 결과 보고서 주의해야할 요소 주의 요소 설명 호환성 새로운 기술과 기존 시스템 및 데이터와의 호환성 확보 성능 영향 업그레이드로 인한 성능 변화 평가 및 최적화 학습 곡선 팀 구성원의 새로운 기술 습득에 필요한 시간과 노력 고려 비용 대비 효과 업그레이드 비용과 예상되는 이점의 균형 평가 위험 관리 업그레이드 과정에서 발생할 수 있는 위험 식별 및 대비 단계적 접근 전체 시스템을 한 번에 업그레이드하기보다 단계적 접근 고려 롤백 계획 문제 발생 시 이전 버전으로 복원할 수 있는 계획 수립 보안 고려사항 새로운 기술 스택의 보안 특성 및 취약점 평가 라이선스 관리 새로운 기술의 라이선스 조건 및 비용 검토 장기적 지원 선택한 새 기술의 장기적 지원 및 커뮤니티 활성도 고려 문서 업데이트 주요 목적 시스템의 현재 상태와 기능을 정확히 반영한다. 사용자, 개발자, 운영자에게 최신 정보를 제공한다. 시스템 유지보수 및 향후 개발의 효율성을 향상시킨다. 지식 전달과 팀 간 커뮤니케이션을 원활하게 한다. 규제 준수 및 감사 요구사항을 충족시킨다. 새로운 팀 구성원의 온보딩 프로세스를 지원한다. 시스템의 변경 이력을 추적하고 관리한다. 사용자 지원 및 교육의 기반을 제공한다. 세부 활동과 산출물 세부 활동 설명 주요 산출물 변경사항 식별 시스템 변경 및 업데이트 사항 파악 변경사항 목록 문서 검토 기존 문서의 정확성 및 완전성 검토 문서 검토 보고서 업데이트 계획 수립 문서 업데이트 범위 및 일정 계획 문서 업데이트 계획서 기술 문서 갱신 시스템 아키텍처, API 등 기술 문서 수정 업데이트된 기술 문서 사용자 매뉴얼 수정 사용자 인터페이스 및 기능 변경사항 반영 업데이트된 사용자 매뉴얼 운영 가이드 업데이트 시스템 운영 및 유지보수 절차 갱신 업데이트된 운영 가이드 릴리스 노트 작성 새로운 기능 및 변경사항 요약 릴리스 노트 버전 관리 문서의 버전 정보 업데이트 및 관리 버전 관리 로그 검증 및 승인 업데이트된 문서의 정확성 검증 및 승인 문서 승인 기록 배포 및 공유 업데이트된 문서를 관련 이해관계자에게 배포 문서 배포 로그 주의해야할 요소 주의 요소 설명 일관성 유지 모든 문서 간의 정보 일관성 확보 명확성과 간결성 복잡한 정보를 명확하고 간결하게 전달 대상 독자 고려 문서의 대상에 맞는 적절한 언어와 상세도 사용 버전 관리 문서의 버전을 명확히 관리하고 추적 접근성 필요한 사람이 쉽게 접근할 수 있는 문서 저장 및 공유 방식 보안 고려 민감한 정보에 대한 적절한 보안 조치 적용 규제 준수 관련 법규 및 산업 표준을 준수하는 문서화 피드백 반영 사용자 및 이해관계자의 피드백을 지속적으로 수렴하고 반영 다국어 지원 필요한 경우 다양한 언어로 문서 제공 멀티미디어 활용 텍스트뿐만 아니라 이미지, 비디오 등을 활용한 효과적인 설명 사용자 지원 주요 목적 사용자가 시스템을 효과적으로 사용할 수 있도록 돕는다. 사용자의 문제와 질문을 신속하게 해결한다. 시스템 사용에 대한 사용자 만족도를 높인다. 시스템의 기능과 가치를 최대한 활용할 수 있도록 지원한다. 사용자 피드백을 수집하여 시스템 개선에 활용한다. 시스템 사용 중 발생하는 오류와 문제점을 식별하고 해결한다. 사용자의 시스템 이해도를 높여 생산성을 향상시킨다. 지속적인 사용자 교육을 통해 시스템의 가치를 유지한다. 세부 활동과 산출물 세부 활동 설명 주요 산출물 헬프데스크 운영 사용자 문의 및 문제 해결을 위한 지원 센터 운영 헬프데스크 운영 보고서 FAQ 관리 자주 묻는 질문과 답변 정리 및 업데이트 FAQ 문서 사용자 매뉴얼 제공 상세한 시스템 사용 가이드 제공 사용자 매뉴얼 온라인 지원 포털 운영 자가 해결 및 정보 제공을 위한 온라인 플랫폼 운영 온라인 지원 포털 사용 통계 교육 세션 진행 정기적인 사용자 교육 프로그램 실시 교육 자료 및 교육 결과 보고서 문제 추적 및 관리 사용자 보고 문제의 추적 및 해결 관리 문제 추적 로그 피드백 수집 및 분석 사용자 의견 수집 및 분석 사용자 피드백 분석 보고서 시스템 업데이트 안내 새로운 기능 및 변경사항에 대한 사용자 공지 업데이트 안내문 원격 지원 제공 필요 시 원격으로 사용자 지원 원격 지원 로그 성과 측정 사용자 지원 활동의 효과성 평가 사용자 지원 성과 보고서 주의해야할 요소 주의 요소 설명 응답 시간 사용자 문의에 대한 신속한 응답 및 해결 일관성 모든 지원 채널에서 일관된 정보 및 서비스 제공 전문성 지원 팀의 시스템에 대한 깊이 있는 이해와 전문성 확보 사용자 친화성 쉽고 접근 가능한 방식으로 지원 제공 다양한 지원 채널 전화, 이메일, 채팅 등 다양한 지원 방식 제공 개인정보 보호 사용자 정보 및 문의 내용의 기밀성 유지 확장성 증가하는 사용자 수와 복잡성에 대응할 수 있는 지원 체계 지속적 개선 피드백을 바탕으로 한 지원 프로세스의 지속적 개선 문화적 고려 다양한 문화와 언어를 고려한 지원 제공 자가 해결 촉진 사용자가 스스로 문제를 해결할 수 있는 도구와 정보 제공 시스템 모니터링 및 백업 주요 목적 시스템의 안정성과 가용성을 지속적으로 유지한다. 성능 문제와 잠재적 장애를 사전에 감지하고 예방한다. 시스템 리소스 사용을 최적화한다. 보안 위협을 실시간으로 모니터링하고 대응한다. 데이터 손실을 방지하고 빠른 복구를 가능하게 한다. 규제 준수 요구사항을 충족시킨다. 시스템 성능과 사용 패턴에 대한 인사이트를 제공한다. 비즈니스 연속성을 보장한다. 세부 활동과 산출물 세부 활동 설명 주요 산출물 모니터링 도구 설정 시스템 모니터링 도구 선택 및 구성 모니터링 도구 구성 문서 성능 지표 정의 핵심 성능 지표(KPI) 선정 및 임계값 설정 성능 지표 정의서 실시간 모니터링 시스템 성능, 가용성, 보안 상태 실시간 감시 실시간 모니터링 대시보드 로그 분석 시스템 로그 수집 및 분석 로그 분석 보고서 알림 설정 문제 발생 시 즉각적인 알림 체계 구축 알림 규칙 문서 정기 성능 보고 시스템 성능에 대한 정기적인 보고서 작성 성능 분석 보고서 백업 정책 수립 데이터 백업 주기, 방법, 보관 기간 등 정의 백업 정책 문서 정기 백업 수행 설정된 정책에 따른 정기적인 데이터 백업 백업 로그 복구 테스트 백업 데이터를 사용한 복구 절차 테스트 복구 테스트 보고서 용량 계획 미래 시스템 요구사항 예측 및 계획 용량 계획 문서 주의해야할 요소 주의 요소 설명 과도한 모니터링 시스템 성능에 영향을 주지 않는 적절한 모니터링 수준 유지 데이터 프라이버시 모니터링 및 백업 과정에서 개인정보 보호 준수 알림 피로 과도한 알림으로 인한 중요 이슈 간과 방지 백업 무결성 백업 데이터의 정확성과 완전성 보장 확장성 시스템 규모 증가에 따른 모니터링 및 백업 확장성 고려 보안 모니터링 도구와 백업 데이터에 대한 보안 강화 복구 시간 목표 비즈니스 요구사항에 맞는 복구 시간 목표(RTO) 설정 자동화 반복적인 모니터링 및 백업 작업의 자동화 규제 준수 산업 규제 및 법적 요구사항 준수 비용 최적화 효과적인 모니터링 및 백업을 위한 비용 대비 효과 고려 참고 및 출처

September 20, 2024 · 11 min · Me

JSON vs. XML vs. Protobuf vs. MessagePack vs. Parquet

JSON vs. XML vs. Protobuf vs. MessagePack vs. Parquet 데이터 직렬화 형식은 애플리케이션 간 데이터 교환의 핵심 요소이다. 세 가지 직렬화 형식은 각각 고유한 장단점이 있어 특정 사용 사례에 더 적합하다: JSON은 웹 애플리케이션과 사람이 읽을 수 있는 인터페이스에 이상적이다. 단순성과 광범위한 지원이 특징이다. XML은 복잡한 문서와 엔터프라이즈 시스템에 적합하다. 강력한 스키마 지원과 메타데이터 처리 능력이 있다. Protobuf는 고성능 시스템과 마이크로서비스 아키텍처에 최적화되어 있다. 속도와 효율성이 중요한 경우에 탁월하다. 선택은 프로젝트 요구사항, 팀 전문성, 상호운용성 요구사항, 성능 고려사항에 따라 달라질 수 있다. 단일 프로젝트 내에서도 다양한 부분에 서로 다른 형식을 사용하는 것이 적절할 수 있다. ...

October 26, 2024 · 4 min · Me

Encoding and Decoding

인코딩 (Encoding)과 디코딩 (Decoding) 아래는 주어진 프레임워크에 따라 “Encoding and Decoding"에 대한 1단계(기본 분석 및 검증) 작업입니다. 각 세부 요구사항과 표준 형식, 구조를 반영하여 단계별로 체계적으로 작성합니다. 1단계: 기본 분석 및 검증 1. 주제 유형 식별 이론/개념형(A형) 인코딩(Encoding)과 디코딩(Decoding)은 데이터 표현(Data Representation)의 핵심 이론적 개념이며, 수학적/논리적 모델과 규칙 기반의 추상화가 요구됩니다. 2. 복잡도 평가 (Level 1-3) 기초(1): 비트, 바이트, 문자 집합, 데이터 타입별 기본 개념 중급(2): 인코딩 방식간 비교, 오류 검증 코드, 실무 구현 사례 고급(3): 복잡한 인코딩(예: 베이스64(Base64), Huffman, ASN.1, 영상/음성 압축), 산업별 적용 사례, 최신 트렌드 이번 조사에서는 **Level 2(중급)**을 기본으로 하며, 실무 지향의 심화 예시도 일부 적용합니다. ...

October 26, 2024 · 39 min · Me

Poetry vs uv vs Rye

Poetry vs. Uv vs. Rye Poetry, uv, Rye는 모두 파이썬 프로젝트 관리와 패키지 설치를 위한 도구들이다. 각각의 도구는 고유한 특징과 장단점을 가지고 있어 개발자들의 다양한 요구사항을 충족시키고 있다. Poetry는 파이썬 프로젝트의 의존성 관리와 패키징을 위한 도구로, 2018년에 출시되었다. 주요 특징으로는 의존성 해결, 가상 환경 관리, 프로젝트 패키징 등이 있다. uv는 Rust로 작성된 초고속 파이썬 패키지 설치 및 의존성 해결 도구이다. pip와 pip-tools의 대체제로 설계되었으며, 속도와 효율성에 중점을 두고 있다. Rye는 Flask의 개발자인 Armin Ronacher가 개발한 올인원 파이썬 프로젝트 관리 도구이다. 파이썬 버전 관리, 의존성 관리, 가상 환경 생성 등 다양한 기능을 제공한다. Poetry, uv, Rye에 대한 비교를 요청하신 카테고리별로 표로 정리했습니다. 각 도구의 특징을 비교하여 살펴볼 수 있도록 구성했습니다. ...

November 27, 2024 · 3 min · Me

Linux Basic Command

Linux Command Command Description 1 pwd 현재 위치 출력 2 ls 현재 디렉터리 내의 파일과 디렉터리 출력 3 cd 디렉터리 이동 4 mkdir 디렉터리 생성 5 cp 파일 또는 디렉터리 복사 6 mv 파일 또는 디렉터리 이동 7 rm 파일 또는 디렉터리 삭제 8 cat 파일 내용을 확인 9 touch 빈 파일을 생성 10 echo 문자열 화면에 표시 11 ip addr/ifconfig IP 정보 확인 12 ss 네트워크 상태 확인 13 nc 서버의 포트 확인 14 which, whereis, locate 명령어 위치 확인 15 tail 파일의 마지막 부분 확인하기 16 find 파일이나 디렉터리 찾기 17 ps 현재 실행 중인 프로세스 목록과 상태 확인 18 grep 주어진 입력값에서 패턴에 맞는 값 출력 19 kill 프로세스 종료 20 alias 명령어 별칭 만들기 21 vi / vim 편집기 Pwd work directory의 약자로 작업 중인 디렉터리를 보여줌 1 2 $ pwd /Users/hyden Ls list segments의 약자로 현재 디렉터리의 파일과 디렉터리를 보여준다. 보통 단독으로 잘 사용하지 않고 a,l 등의 옵션과 함께 사용 Option Description ls -l 파일들의 상세 정보를 보여줌 ls -a 숨김 파일 표시 ls -t 최신 파일부터 표시 ls -rt 오래된 파일부터 표시 ls -F 파일을 표시할 때 파일의 타입을 나타내는 문자열을 표시(/ 디렉터리, * 실행파일, @심볼릭 링크) ls -R 하위 디렉터리의 내용까지 표시 보통은 위 옵셥들을 조합해 ls -al, ls -alt, ls -altF 등으로 사용 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 $ ls -altF total 95340 drwxr-x--- 28 hyden hyden 4096 Oct 29 12:34 ./ -rw------- 1 hyden hyden 326035 Oct 29 12:34 .zsh_history drwx------ 8 hyden hyden 4096 Oct 29 12:34 .cache/ -rw------- 1 hyden hyden 33 Oct 27 16:40 .lesshst -rw------- 1 hyden hyden 25052 Oct 27 16:39 .bash_history -rw------- 1 hyden hyden 38160 Oct 27 16:32 .viminfo drwx------ 6 hyden hyden 4096 Oct 27 15:50 .config/ drwx------ 2 hyden hyden 4096 Oct 27 15:36 .ssh/ -rw-rw-r-- 1 hyden hyden 287 Oct 27 13:34 .wget-hsts -r--r--r-- 1 hyden hyden 117120 Oct 27 12:31 .zcompdump-devserver-5.8.1.zwc -rw-rw-r-- 1 hyden hyden 50720 Oct 27 12:31 .zcompdump-devserver-5.8.1 -rw-rw-r-- 1 hyden hyden 49203 Oct 27 12:31 .zcompdump drwxr-x--- 6 hyden hyden 4096 Oct 26 16:20 istio-1.18.2/ drwxr-xr-x 12 hyden hyden 4096 Oct 26 14:30 .oh-my-zsh/ -rw-r--r-- 1 hyden hyden 4789 Oct 26 14:30 .zshrc drwxr-xr-x 9 hyden hyden 4096 Oct 23 13:01 .minikube/ -rw-r--r-- 1 hyden hyden 3919 Oct 20 17:47 .bashrc -rw------- 1 hyden hyden 2313 Oct 5 12:49 kubeconfig.yaml drwxrwxr-x 2 hyden hyden 4096 Sep 19 12:52 lang_test/ drwxrwxr-x 2 hyden hyden 4096 Sep 18 20:27 .ncloud/ drwxr-xr-x 5 hyden hyden 4096 Sep 11 19:06 pybind11/ drwxrwxr-x 2 hyden hyden 4096 Sep 8 16:25 data/ -rw------- 1 hyden hyden 151 Sep 8 15:59 .python_history -rw-rw-r-- 1 hyden hyden 1452216 Sep 7 18:59 libboost_regex.so.1.58.0 drwxrwxr-x 2 hyden hyden 4096 Sep 6 14:35 test/ drwxrwxr-x 4 hyden hyden 4096 Sep 6 14:28 ffmpeg/ drwxrwxr-x 2 hyden hyden 4096 Aug 30 16:00 dockerbuild/ drwxr-xr-x 8 root root 4096 Aug 30 10:50 ../ -rw-rw-r-- 1 hyden hyden 435 Aug 3 17:05 default-user-config.yaml drwxr-x--- 3 hyden hyden 4096 Aug 3 15:30 .kube/ drwxrwxr-x 5 hyden hyden 4096 Aug 3 14:47 manage_kubernetes/ -rw-rw-r-- 1 hyden hyden 84 Aug 2 18:54 .bash_profile -rw-rw-r-- 1 hyden hyden 508 Aug 2 18:53 ncp-iam-authenticator.sha256 -rwxrwxr-x 1 hyden hyden 11665408 Aug 2 18:53 ncp-iam-authenticator* -rwx------ 1 hyden hyden 11345 Aug 2 10:13 get_helm.sh* 심볼릭 링크(symbolic link): 원본 파일을 가리키도록 링크만 연결. 윈도우의 바로가기 링크와 같은 개념 Cd change directory의 약자로 디렉터리 이동시 사용하는 명령어 Option Description cd ~ 홈 디렉터리로 이동 cd.. 상위 디렉터리로 이동. cd../../ 같은 식으로 여러 단계를 한 번에 이동 가능 cd /dir 절대 경로를 지정해 이동 가능 cd - 바로 전의 디렉터리로 이동 Mkdir make directory의 약자로 디렉터리를 만들 때 사용 1 2 # <이름>의 디렉터리를 현재 디렉터리에 만든다 $ mkdir <이름> 절대 경로를 지정하여 만들 수도 있다. 1 2 # <이름>의 디렉터리를 절대 경로의 디렉터리에 만든다 $ mkdir /home/hyden/<이름> -p 옵션으로 하위 디렉터리까지 한 번에 생성할 수 있다 1 mkdir -p <디렉터리명>/<하위 디렉터리명> Cp copy의 약자로 파일 또는 디렉터리를 복사할 때 사용 1 2 3 4 5 6 7 8 # source를 target으로 복사 $ cp source target # target 파일의 이미 있는 경우 덮어쓰기 $ cp -f source target # 디렉터리를 복사할 때 사용. 하위 디렉터리도 모두 복사하기 $ cp -R sourceDir targetDir Mv move의 약자로 파일 또는 디렉터리의 위치를 옮길 때 사용. 혹은 이름을 변경할 때도 사용 1 2 3 4 5 6 7 8 # afile 이름을 bfile로 변경 $ mv afile bfile # afile을 상위 디렉터리로 옮김 $ mv afile ../ # afile을 /opt 이하 디렉터리로 옮김 $ mv afile /opt/ Rm remove의 약자로 파일 또는 디렉터리를 삭제할 때 사용 1 2 3 4 5 6 7 8 9 10 11 # afile을 삭제 $ rm afile # 디렉터리 adir을 삭제. 삭제 시 확인을 함 $ rm -r adir # 디렉터리 adir을 삭제. 삭제 시 확인 안 함 $ rm -rf adir # txt로 끝나는 모든 파일을 삭제할지 물어보면서 삭제 $ rm -i *.txt Cat catenate의 약자로 파일의 내용을 확인할 때 사용. 1 2 # test.txt 파일의 내용을 확인 $ cat test.txt Touch touch는 빈 파일을 생성. 혹은 파일의 날짜와 시간을 수정할 때 사용한다. 1 2 3 4 5 6 7 8 # afile을 생성 $ touch afile # afile의 시간을 현재 시간으로 갱신 $ touch -c afile # bfile의 날짜 정보를 afile의 정보와 동일하게 변경 $ touch -r afile bfile Echo echo는 어떤 문자열을 화면에 보여줄 때 사용. echo와 리다이렉션을 사용해 파일을 생성, 추가하는 작업을 많이 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # helloworld 출력 $ echo 'helloworld' # 패스로 지정된 문자열을 출력 $ echo $PATH # 이스케이프 문자열을 해석 $ echo -e 문자열 # 개행을 표시할 수 있음 $ echo -e "안녕하세요\n이렇게 하면\n새 줄이생겨요" # ls와 유사하게 현재 디렉터리의 파일과 폴더를 출력 $ echo * # 리다이렉션 '>'을 사용해 hello.txt 파일 생성. 파일 내용에는 echo로 표시되는 내용이 들어감 $ echo hello redirection > hello.txt # 추가 연산자 >>를 사용해 기존 파일에 문자열 추가 $ echo hello2 >> hello.txt Ip addr/ifconfig 접속한 리눅스의 IP 정보를 알아낼 때 사용. 1 2 3 4 5 6 7 8 9 10 11 $ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 50000 link/ether fa:16:3e:5d:0b:d7 brd ff:ff:ff:ff:ff:ff inet 10.201.1.10/16 brd 10.202.255.255 scope global eth0 valid_lft forever preferred_lft forever ip addr이 설치되어 있지 않은 경우에는 ifconfig를 사용. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $ ifconfig eth0 Link encap:Ethernet HWaddr 06:4d:de:ae:a8:50 inet addr:172.31.27.212 Bcast:172.31.31.255 Mask:255.255.240.0 inet6 addr: fe80::44d:deff:feae:a850/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:68903966 errors:0 dropped:0 overruns:0 frame:0 TX packets:75295223 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:15691124260 (15.6 GB) TX bytes:42265387295 (42.2 GB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:6623596 errors:0 dropped:0 overruns:0 frame:0 TX packets:6623596 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:349206971 (349.2 MB) TX bytes:349206971 (349.2 MB) Ss socket statistics의 약자로 네트워크 상태를 확인하는 데 사용. nestat과 동일. 옵션으로 a, t, u, l, p, n 등이 있다. Option Description ss -a 모든 포트 확인 ss -t TCP 포트 확인 ss -u UDP 포트 확인 ss -l LISTEN 상태 포트 확인 ss -p 프로세스 표시 ss -n 호스트, 포트, 사용자명을 숫자로 표시 TCP 포트 중 LISTEN 상태인 포트의 번호를 알고 싶을 때 다음과 같이. 1 2 3 4 $ ss -tln LISTEN 0 511 *:443 *:* LISTEN 0 1 127.0.0.1:8006 *:* LISTEN 0 511 *:80 *:* Nc netcat의 약자로 예전에는 포트가 열렸는지 확인하는 데 사용. 1 2 3 4 5 6 7 8 # 포트가 오픈됐는지 확인 $ nc IP주소 포트 # 더 자세한 정보가 남음 $ nc -v IP주소 포트 # 현재 서버의 포트를 오픈(방화벽에 해당 포트 번호가 설정 함) $ nc -l 포트 Which, Whereis, Locate which는 특정 명령어의 위치를 찾아줌. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ which git /usr/local/bin/git # which -a : 검색 가능한 모든 경로에서 명령어를 찾아준다. $ which -a git /usr/local/bin/git /usr/bin/git # where : which -a와 같다. $ where git /usr/local/bin/git /usr/bin/git # whereis는 실행 파일, 소스, man 페이지의 파일을 찾아준다. $ whereis ssh ssh: /usr/bin/ssh /usr/share/man/man1/ssh.1 # locate는 파일명을 패턴으로 빠르게 찾아준다. # 아래 예제는 .java 파일을 찾아주는 명령. $ locate *.java Tail tail은 파일의 마지막 부분을 보여준다. 이와 반대로 head는 파일의 첫 부분을 보여준다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 파일의 마지막 라인부터 숫자만큼의 파일의 라인 수를 보여주기 $ tail -n {숫자} {파일경로} # 숫자로 지정한 라인부터 보여주기 $ tail -n +{숫자} {파일경로} # 파일의 마지막 라인부터 숫자로 지정한 바이트 수 만큼 보여주기 $ tail -c {숫자} {파일경로} # Ctrl + C로 중단하기 전까지 지정한 파일의 마지막에 라인이 추가되면 계속 출력하기 $ tail -f {파일경로} : # 파일의 마지막 라인부터 지정한 숫자만큼을 # {초}로 지정한 시간이 지날 때마다 리프레시해서 보여주기 $ tail -n {숫자} -s {초} -f {파일경로} Find find는 명령어의 뜻 그대로 파일이나 디렉터리를 찾는 데 사용하는 명령어. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 확장자 명으로 찾기 $ find {디렉터리} -name '*.bak' # 디렉터리를 지정해 찾기 $ find {디렉터리} -path '**/검색 시 사용하는 디렉터리명/**.*.js' # 파일명을 패턴으로 찾기 $ find {디렉터리} -name '*패턴*' # 파일명을 패턴으로 찾되 특정 경로는 제외하기 $ find {디렉터리} -name '*.py' -not -path '*/site-packates/*' # 파일을 찾은 다음 명령어 실행하기 $ find {디렉터리} -name '*.ext' -exec wc -l {} \; # 최근 7일간 수정된 파일을 찾고 삭제하기 $ find {디렉터리} -daystart -mtime -7 -delete # 0바이트인 파일을 찾고 삭제하기 $ find {디렉터리} -type f -empty -delete Ps 현재 실행 중인 프로세스 목록과 상태를 보여준다. 1 2 3 4 5 6 7 8 9 10 11 # 실행 중인 모든 프로세스를 보여주기 $ ps aux # 실행 중인 모든 프로세스를 전체 커맨드를 포함해 보여주기 $ ps auxww # 특정 문자열과 매칭되는 프로세스 찾기(grep은 바로 다음에 나옵니다) $ ps aus | grep {패턴} # 메모리 사용량에 따라 정렬하기 $ ps --sort size ps와 grep을 pipe로 사용하여 현재 실행 중인 프로세스 목록중 특정 명칭을 포함하는 프로세스를 찾는 식으로 사용하기도 한다. Grep grep은 입력에서 패턴에 매칭되는 내용을 찾는 명령어. grep이라는 이름은 ed의 명령어인 g/re/p(내용 전체를 정규식으로 찾은 다음 프린트하라: globally search for a regular expression and print matching lines)에서 왔음. 보통 find, ps 등과 조합해 사용. 1 2 3 4 5 6 7 8 9 10 11 # 파일에서 특정 패턴을 만족하는 부분 찾기 $ grep "패턴" 파일경로 # 파일명과 라인을 함께 표시하기 $ grep --with-filename --line-number "패턴" 파일경로 # 매칭하지 않는 부분 표시하기 $ grep --invert-match "패턴" # cat과 함께 사용하기 $ cat 파일경로 | grep "패턴" Kill 프로세스를 죽이는 명령어 프로세스를 죽인다고는 하지만 원리는 프로세스에 중지하라는 시그널을 보내는 것 SIGKILL, SIGSTOP은 강제 종료이며 나머지는 정상적으로 종료. 프로세스 아이디는 ps 명령어로 알아낼 수 있다. 1 2 3 4 5 6 7 8 9 10 11 # kill에서 사용할 수 있는 시그널 표시하기 $ kill -l # 프로세스 죽이기 SIGTERM(terminate) $ kill 프로세스ID # 백그라운드 잡 종료시키기 $ kill {잡ID} # 프로세스 강제 종료 $ kill -9 | KILL 프로세스ID Alias alias를 사용하면 줄여서 사용할 수 있다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 모든 alias 표시하기 $ alias # alias 만들기 # 예) alias ll="ls -al" $ alias 단어="명령" # cd ../..을 cd …으로 줄여 쓰기 # cd ../../../은 cd ….으로 가능 $ alias ...=../.. $ alias ....=../../.. $ alias .....=../../../.. $ alias ......=../../../../.. # alias 삭제하기 $ unalias 단어 Vi / Vim vi 혹은 vim은 대부분의 리눅스에 기본적으로 설치되어 있는 텍스트 에디터 1 vi test.txt 참고 및 출처 백엔드 개발자라면 알아야 할 리눅스 필수 명령어 21개

October 1, 2024 · 10 min · Me

Linux Permission

Linux Permission Source: https://medium.com/@usamashafique00786/day-4-task-linux-permissions-and-access-control-lists-ef59cebf9324 File type: 파일 유형 type Description - normal file d directory l link p named pipe s socket c character device b block device Permissions: 각 파일에 접근해서 읽거나 쓰거나 실행할 권리를 갖는 소유자 / 그룹 / 다른 사용자로 나눠서 관리 Source: https://pamirwebhost.com/check-linux-file-permissions-with-ls/ Permission은 3개로 나눠서 관리 Description User 파일을 만든 소유주 Group 파일을 만든 소유주가 속한 그룹 Other 기타 사용자 Permission은 4가지에 대하여 구분 Permission 파일 디렉토리 r 파일에 대한 읽기 권한.열기, 읽기 허용 디렉토리 내의 파일을 나열할 수 있게 허용 w 파일에 대한 쓰기 권한.쓰기, 잘라내기 허용.이름 변경이나 파일 삭제 허용되지 않음. 파일 삭제나 파일 이름 변경 디렉토리 속성에 의해 결정 디렉토리 내의 파일들을 생성, 삭제, 이름 변경이 가능하도록 허용 x 파일에 대한 실행 권한.파일이 프로그램으로 처리되고 파일이 실행되도록 허용.스크립트 언어에서 작성된 프로그램 파일들은 읽기 가능으로 설정 되어 있어야만 실행 가능 디렉토리 내에서 탐색을 위해 이동할 수 있도록 허용(디렉토리에 들어올 수 있도록 허용) - r,w,x에 대한 권한이 없음을 표시 r,w,x에 대한 권한이 없음을 표시 Permission Source: https://medium.com/@gumbershruti1119/day-6-file-permissions-and-access-control-lists-2126f994a5b8 ...

October 1, 2024 · 2 min · Me

Kafka vs RabbitMQ

Kafka vs. RabbitMQ Apache Kafka와 RabbitMQ는 모두 분산 메시징 시스템이지만 설계 목적, 아키텍처, 활용 사례에서 뚜렷한 차이를 보인다. 기본 개념 항목 Apache Kafka RabbitMQ 유형 분산 이벤트 스트리밍 플랫폼 메시지 브로커 (AMQP 구현) 주요 목적 대규모 실시간 데이터 스트리밍 및 처리 유연한 메시지 라우팅과 비동기 통신 지원 데이터 처리 로그 기반 스트림 (메시지 재생 가능) 큐 기반 메시지 (소비 후 삭제) Kafka는 LinkedIn에서 개발되어 나중에 Apache 재단으로 이관된 분산 이벤트 스트리밍 플랫폼이다. 주로 대용량 데이터 스트림을 실시간으로 처리하기 위해 설계되었다. ...

October 22, 2024 · 7 min · Me

Callback vs Promise vs Async/Await

Callback vs. Promise vs. Async/Await JavaScript의 비동기 처리 방식은 프로그램의 실행 흐름을 막지 않고 다른 작업을 수행할 수 있게 해주는 중요한 기능이다. 주요 비동기 처리 방식에는 콜백(Callbacks), 프로미스(Promises), 그리고 async/await가 있다. 특성 콜백 (Callback) Promise Async/Await 정의 다른 함수의 인자로 전달되어 특정 시점에 실행되는 함수 비동기 작업의 최종 완료 또는 실패를 나타내는 객체 Promise를 기반으로 비동기 코드를 동기 코드처럼 작성할 수 있게 해주는 문법 도입 시기 JavaScript 초기부터 사용 ES6 (2015) ES8 (2017) 문법 function(err, result) { … } new Promise((resolve, reject) => { … }) async function() { await … } 에러 처리 콜백 함수의 첫 번째 인자로 에러 객체 전달 .catch() 메서드 사용 try-catch 구문 사용 장점 - 간단한 비동기 처리에 적합 - 모든 환경에서 지원 - 체이닝 가능 - 에러 처리 용이 - 병렬 처리 가능 (Promise.all) - 동기 코드와 유사한 구조 - 가독성 향상 - 직관적인 에러 처리 단점 - 콜백 지옥 발생 가능 - 에러 처리 복잡 - 약간의 학습 곡선 존재 - 브라우저 지원 고려 필요 - 항상 Promise를 반환 - 오래된 환경에서 지원 안 됨 비동기 처리 방식 콜백 함수를 통해 결과 처리 then() 메서드를 통해 결과 처리 await 키워드로 결과를 기다림 중첩 처리 콜백 안에 콜백을 계속 넣어야 함 .then() 체이닝으로 처리 일반적인 동기 코드처럼 작성 가능 병렬 처리 복잡한 로직 필요 Promise.all() 사용 Promise.all()과 함께 사용 순차적 처리 콜백 중첩으로 처리 .then() 체이닝으로 처리 일반 동기 코드처럼 작성 타입스크립트 통합 타입 추론이 어려움 제네릭을 통해 타입 안정성 확보 가장 타입 안정적 테스트 용이성 테스트 작성이 복잡할 수 있음 테스트 작성이 비교적 쉬움 가장 테스트 작성이 쉬움 디버깅 콜백 중첩으로 인해 어려움 스택 트레이스가 깔끔함 동기 코드와 유사해 가장 쉬움 메모리 사용 콜백 중첩 시 메모리 사용량 증가 체이닝으로 인한 약간의 오버헤드 일반적으로 가장 효율적 취소 가능성 직접 구현 필요 취소 불가능 (별도 구현 필요) 취소 불가능 (별도 구현 필요) 구현 예시 콜백 함수 (Callbacks) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // 콜백 함수를 사용한 비동기 처리 예시 function fetchData(callback) { // 데이터를 가져오는 비동기 작업 시뮬레이션 setTimeout(() => { const data = { id: 1, name: "John" }; callback(null, data); // 성공시 첫 번째 인자는 null }, 1000); } fetchData((error, data) => { if (error) { console.error('에러 발생:', error); return; } console.log('데이터:', data); }); 하지만 콜백 방식은 여러 비동기 작업을 연달아 처리해야 할 때 “콜백 지옥"이라는 문제가 발생합니다: ...

November 23, 2024 · 4 min · Me

Redis와 Valkey

Redis와 Valkey Redis는 원래 오픈소스 프로젝트로 시작되었지만, 최근 라이선스 정책을 변경하여 더 이상 완전한 오픈소스가 아니다. 이에 반해 Valkey는 Redis의 오픈소스 정신을 계승하기 위해 만들어진 프로젝트로, Linux Foundation의 관리 하에 있다. 특징 Valkey Redis 라이선스 BSD 3-clause 오픈 소스 Redis Source Available (제한적 오픈 소스) 커뮤니티 지원 AWS, Oracle 등이 지원하는 커뮤니티 주도 Redis Inc.가 상업적으로 지원 멀티스레딩 I/O 및 명령 실행을 위한 향상된 멀티스레드 아키텍처 대부분의 작업이 단일 스레드 복제 이중 채널 복제 마스터-슬레이브 복제 및 Redis Cluster 지원 확장성 자동 클러스터 장애 조치 및 개선된 확장성 클러스터링 및 샤딩 지원 관찰 가능성 상세한 모니터링을 위한 슬롯별 메트릭 제공 기본적인 모니터링 및 메트릭 RDMA 지원 RDMA에 대한 실험적 지원 기본 RDMA 지원 없음 플랫폼 지원 Linux, macOS, OpenBSD, NetBSD, FreeBSD Windows, Linux, macOS 개발 초점 높은 처리량과 낮은 지연 시간 고성능 및 데이터 지속성 기능 세트 Redis 7.2.4 기반, 일부 고급 기능 부족 더 광범위한 기능 세트 (JSON, TimeSeries 등) 참고 및 출처

October 22, 2024 · 1 min · Me

클라우드 서비스 보안인증(CSAP, Cloud Security Assurance Program)

클라우드 서비스 보안인증(CSAP, Cloud Security Assurance Program) 클라우드 서비스 보안인증(CSAP, Cloud Security Assurance Program)은 한국인터넷진흥원(KISA)에서 주관하는 클라우드 서비스의 보안성을 평가하고 인증하는 제도. 이 제도는 클라우드 서비스 이용자의 정보보호를 강화하고 클라우드 서비스의 안정성과 신뢰성을 검증하기 위해 도입되었다. CSAP의 주요 특징 인증 유형: CSAP는 다음과 같은 유형으로 분류된다: IaaS (Infrastructure as a Service) SaaS (Software as a Service) DaaS (Desktop as a Service) 인증 등급: 2022년 12월 29일, 과학기술정보통신부는 CSAP 인증 기준을 개선하여 3단계 등급 체계(상, 중, 하)를 도입함. ...

September 19, 2024 · 4 min · Me