데브옵스(DevOps)란,

소프트웨어의 개발(Development)운영(Operations)의 합성어로서, 개발(Dev)팀과 운영(Ops)팀이 협업하여, 더 빠르고 신뢰성있는 릴리즈 파이프라인을 구축하는 문화입니다. 데브옵스는 소프트웨어 개발조직과 운영조직간의 상호 의존적 대응이며 조직이 소프트웨어 제품과 서비스를 빠른 시간에 개발 및 배포하는 것을 목적으로 합니다. 

 

등장 배경

기존에는 개발 조직과 운영 조직이 구분되어 있어 둘 사이에 사일로 효과가 발생했습니다.

  • 사일로 효과: 조직 부서들이 서로 다른 부서와 담을 쌓고 내부 이익만을 추구하는 현상을 일컫는 말. 곡식 및 사료를 저장해두는 굴뚝 모양의 창고인 사일로(silo)에 빗대어 조직 장벽과 부서 이기주의를 의미하는 경영학 용어로 사용된다. https://terms.naver.com/entry.naver?docId=2066351&cid=50305&categoryId=50305

개발조직은 새로운 기능을 개발해 출시하는 것을 목표로 하기에 새로운 것을 만들어 내려 하고,

운영조직은 소프트웨어가 안정적으로 돌아가는 것을 중시하기에 변화를 싫어하고 배포를 가능한 적게 하고싶어 하기에, 둘의 목표가 상충되었습니다.

또한 시간이 지날수록 소프트웨어 개발 환경과 운영 환경이 상이하게 변해감에 따라 개발조직에서는 잘 동작하는 프로그램이 운영조직으로 넘어가 배포를 하면 문제가 생기는 경우도 발생 하였습니다(실행 환경의 비일관성 문제 발생).

이에 두 조직의 사일로 효과를 없애고 개발-배포-운영-모니터링까지 전체를 하나의 프로세스로 유기적으로 연계함으로써, 지속적인 배포와 높은 소프트웨어 품질을 유지하기 위한 개발 방법론이나 문화인 '데브옵스'가 탄생하게 됩니다.

 

데브옵스의 목적

  • 소프트웨어 개발 라이프사이클을 짧게 단축 (작은 단위로 빠르게 개발 > 테스트 > 통합 > 빌드 > 배포 > 피드백을 받게 함)
  • 개발&운영 단계를 연계하여 지속적인 배포와 높은 소프트웨어 품질의 유지

 

데브옵스 툴체인

소프트웨어 개발 라이프사이클의 각 단계별 or 여러 단계를 통합하여 자동화 함으로써 데브옵스를 실천하는데 도움을 줍니다. 아래는 단계 구분과, 단계별 사용되는 툴의 예 입니다.

  • 계획: 이 단계는 비즈니스 가치 및 요구사항을 정의하는 데 도움이 됩니다. 샘플 툴로는 알려진 문제를 추적하고 프로젝트 관리를 수행하는 데 도움이 되는 Jira 또는 Git가 있습니다.
  • 코딩: 이 단계에는 소프트웨어 설계 및 소프트웨어 코드 생성이 포함됩니다. 샘플 툴로는 GitHub, GitLab, Bitbucket 또는 Stash가 있습니다.
  • 구축: 이 단계에서는 소프트웨어 빌드 및 버전을 관리하고 자동화된 툴을 사용하여 코드를 컴파일하고 패키징하여 향후 제품 릴리즈에 제공합니다. 소스 코드 저장소 또는 패키지 저장소를 사용합니다. 이러한 저장소는 제품 릴리즈에 필요한 "패키지" 인프라 역할도 합니다. 샘플 툴로는 Docker, Ansible, Puppet, Chef, Gradle, Maven 또는 JFrog Artifactory가 있습니다.
  • 테스트: 이 단계에서는 최적의 코드 품질을 보장하기 위해 지속적인 테스트(수동 또는 자동)를 수행합니다. 샘플 툴로는 JUnit, Codeception, Selenium, Vagrant, TestNG 또는 BlazeMeter가 있습니다.
  • 배포: 이 단계에는 제품 릴리즈를 운영 단계로 관리, 조정, 예약 및 자동화하는 데 도움이 되는 툴이 포함될 수 있습니다. 샘플 툴로는 Puppet, Chef, Ansible, Jenkins, Kubernetes, OpenShift, OpenStack, Docker 또는 Jira가 있습니다.
  • 운영: 이 단계에서는 운영 중인 소프트웨어를 관리합니다. 샘플 툴로는 Anabilities, Puppet, PowerShell, Chef, Salt 또는 Otter가 있습니다.
  • 모니터링: 이 단계에서는 운영 환경의 특정 소프트웨어 릴리즈에서 발생하는 문제에 대한 정보를 식별하고 수집합니다. 샘플 툴로는 New Relic, Datadog, Grafana, Wireshark, Splunk, Nagios 또는 Slack이 있습니다.

관련 글:

https://life-coding.tistory.com/64

 

[DevOps] 데브옵스 관련 툴 모음 & 요약

데브옵스에서 사용되는 툴들 모음 & 간략한 요약 Jira (지라) Atlassian 사에서 개발한 이슈 추적 제품이며 버그 추적, 이슈 추적, 프로젝트 관리 기능을 제공하는 소프트웨어이다. https://en.wikipedia.org

life-coding.tistory.com

 

참고:

https://ko.wikipedia.org/wiki/%EB%8D%B0%EB%B8%8C%EC%98%B5%EC%8A%A4

https://en.wikipedia.org/wiki/DevOps

https://www.netapp.com/ko/devops-solutions/what-is-devops/

 

'개발 > 방법론,디자인패턴' 카테고리의 다른 글

[DevOps] 데브옵스 관련 툴 모음 & 요약  (0) 2022.08.23

폼을 전송하기 전에, 자바스크립트에서 특정 작업을 수행 후 전송여부를 결정하고 싶을 때가 있다.

  • JavaScript에서 validation을 한 후, 유효한 경우에만 전송을 허용 한다던가
  • 사용자에게 질의 후 응답 여부에 따라 폼 전송을 할지/말지 결정 한다던가

가능한 방법은 여러가지가 있겠지만, 아래 두 가지만 알아보도록 하겠다.

 

1. form의 onsubmit 이벤트 활용

onsubmit은, form 태그 안에서 form전송을 하기 전에 입력된 데이터의 유효성을 체크하기 위해 사용하는 이벤트이다.

onsubmit='return false' 이면 전송을 하지 않고 / onsubmit='return true' 이면 폼 전송을 한다.

 

아래와 같이 onsubmit에 특정 함수 결과를 리턴하도록 정의해주면, 함수의 리턴 결과에 따라 폼 전송을 막거나/허용할 수 있다.

onsubmit="return validateForm(this.form);"

 

form의 submit 버튼이 눌리면 > onsubmit 에 명시한 함수가 먼저 호출되고 > 그 함수 리턴값에 따라 전송 여부가 결정되는 것이다.

함수 안에서 validation을 하고 문제 없으면 true를 리턴해서 폼 전송을 허용하고, 그렇지 않으면 false를 리턴해서 전송을 막으면 된다.

<script type="text/javascript">
function validateForm(form) {
    if (confirm('폼의 값을 전송할까요?')==1) 
    {
        return true;
    }
    return false;
}
</script>

<form onsubmit="return validateForm(this.form);">
  <p>
    <label for="mail">
      <span>Please enter an email address:</span>
      <input type="email" id="mail" name="mail" required minlength="8">
      <span class="error" aria-live="polite"></span>
    </label>
  </p>
  <button>Submit</button>
</form>

 

2. form의 submit 이벤트에 eventListener 등록

html 코드를 건드릴 필요 없이, javascript에서 addEventListener를 통해 해당 form의 submit 이벤트 발생 시 실행할 함수를 등록할 수도 있다.

 

submit 이벤트가 발생하면 > submit 이벤트에 등록한 함수가 먼저 호출되고 > 함수 실행이 완료된 후 폼 전송이 진행된다.

이 때, 함수 안에서 폼 전송여부를 컨트롤 할 수 있다.

  • 전송을 중지하고 싶은 경우 : 함수 안에서 event.preventDefault();를 호출하면 폼 전송이 이루어지지 않는다.
  • 그 외의 경우엔, 함수 실행이 끝난 후 자동으로 폼이 전송된다.
<script type="text/javascript">
const form = document.getElementsByTagName('form')[0];
form.addEventListener('submit', function (event) {
    if (confirm('[event] 폼의 값을 전송할까요?')==0) 
    {
        alert('전송을 중지합니다.');
        // 이벤트를 취소해서 폼 전송을 막음
        event.preventDefault();
    }        
});
</script>

<form>
  <p>
    <label for="mail">
      <span>Please enter an email address:</span>
      <input type="email" id="mail" name="mail" required minlength="8">
      <span class="error" aria-live="polite"></span>
    </label>
  </p>
  <button>Submit</button>
</form>

1. 불필요한 플러그인 줄이기

- 불필요한 플러그인은 비활성화 후 삭제하기

- 가벼운 플러그인 사용하기

 

2. 파일 사이즈 줄이기

- 이미지 압축

- 전체 파일 개수/사이즈 줄이기

 

3. 소프트웨어 최적화

1) Web Server

 

2) php

- APCOPcache 적용

* OPcache

- 실행한 PHP의 컴파일된 코드를 바이너리로 메모리에 캐싱해 결과값을 더 빠르게 얻을 수 있게 하는 역할을 함.

- php 5.5 버전 이상부터는 기본 탑재되어 적용됨

- 적용 확인 방법 : phpinfo.php 페이지에 접속해서, Zend OPcache 항목을 찾아 적용여부 확인 가능

 

3) MySQL/MariaDB

- 쿼리 최적화, 인덱스 생성 등

 

4. 캐싱

1) 캐시 플러그인

* W3 TOTAL CACHE

서버사이드/클라이언트 사이드 성능 향상을 위해 아래 기능들 사용 가능 (설정에 따라.. 프리미엄 기능은 비용 발생할 듯)

- 페이지 캐싱

- 파일 최소화 : HTML, CSS, JavaScript에서 불필요한 문자 삭제

- 데이터베이스 캐싱

- 헤더 설정 : entity tag, cache-control, expires

- CDN

 

2) 서버측 캐시

- Alternative PHP Cache(APC)

- Varnish Cache 

 

3) 브라우저 캐싱

- 정적인 파일이 수정되지 않았으면, 서버에서 받아오지 않고 브라우저에 캐싱된 파일 사용

 

5. 컨텐츠 오프로딩

컨텐츠를 여러 서버에 분산시키는 것

- CDN 사용 (Content Delivery Network)

- js, 동영상 등 리소스 일부를 다른 서버에 분산시킴

 

6. 압축

- gzip 

 

7. 데이터베이스 튜닝

 

8. 하드웨어 업그레이드

- RAM 추가

- 하드디스크를 SSD로 교체

 

9. 서버 추가

 

참고 : https://wordpress.org/support/article/optimization/#Content_Offloading

'개발 > 워드프레스' 카테고리의 다른 글

[WordPress] 워드프레스 로딩 시퀀스  (0) 2022.06.09

1. 디렉토리가 비어있는지 체크

Qt 5.9 이후부터는 QDir 클래스의 isEmpty() 함수로 체크 가능하다.

QString directoryPath = "C:\Directory";
QDir dir(directoryPath);
if (dir.isEmpty())
	qDebug() << directoryPath << " is Empty!";
else
	qDebug() << directoryPath << " is not Empty!";

 

2. 디렉토리 안 파일 개수 카운팅

QDir 클래스의 count() 함수로 카운팅 가능하다.

다만, .(현재폴더) ..(부모 폴더) 두개가 자동으로 포함되어 카운팅 되기 때문에, 이들을 빼주어야 한다.

QString directoryPath = "C:\Directory";
QDir dir(directoryPath);
dir.setFilter( QDir::AllEntries | QDir::NoDotAndDotDot ); // 현재, 부모 폴더 빼주기
qDebug() << directoryPath << " contains << dir.count() << " files.";

워드프레스 사이트에 접속 시(브라우저에서 url 호출 시), 워드프레스에서 일어나는 일련의 작업들을 간략히 정리한 가이드

 

첫 로딩 파일

사용자인 경우 : index.php (별로 하는 일 없음. 상수 정의하고 wp-blog-header.php를 로딩함)

어드민인 경우 : wp-admin/index.php

 

wp-blog-header.php

3가지 일을 함

- wp-load.php를 로딩 : wordpress 환경 전체를 셋업함

- wp() 함수 실행 : wp-includes/functions.php 안에 존재, query를 로딩함

- template-loader.php : 어떤 템플릿이 불려야 할지 결정함

 

wp-load.php

- wp-config.php를 체크해서 환경 설정을 계속함

- 마지막에 wp-settings.php 로딩하여, 실제 setup process를 진행함

 

wp-settings.php

아래 3개 파일 로딩함

- load.php (wp-includes 폴더 안에 존재) : 워드프레스가 필요한 첫 함수들 제공

- default-constants.php  (또한 wp-includes 폴더 안에 존재): 상수들 정의

- version.php  (이것도 wp-includes 폴더 안에 존재): 버전 정보 정의

 

functions.php, wp classes, plugin api

- compat.php : 옛날 php 버전 지원

- functions.php : 사이트 운영을 위한 기본적인 함수들

- class-wp.php :  쿼리 빌드

- class-wp-error.php : 에러 트래킹

- plugin.php : 액션, 필터 훅을 위해 필요한 함수들 제공

- mo.php : 번역 지원

 

Database class와 cache 설정

- require_wp_db() 와 wp_start_object_cache() 함수가 호출됨 (load.php 에서) : 데이터베이스 연결과 캐싱에 필요한 작업들 수행

 

default-filters.php

- 수많은 action과 filter 들을 설정함

 

multisite startup

- 멀티사이트가 설정된 경우, 필요한 작업들을 함

 

기본 로딩 마지막

- 워드프레스의 메인 함수 로딩이 끝났음

- 하지만 아직 워드프레스의 모든 기능이 사용 가능한 것은 아님(플러그인 등)

 

대부분의 워드프레스 로딩

- 긴 require 리스트를 로딩하면서 워드프레스의 코어 기능들을 위한 함수를 모두 로딩함

 

필수 플러그인 로딩

- 일반 플러그인 로딩 전, 필수 플러그인 로딩을 먼저 함

 

기본 taxonomies 와 post type

- Post, Page, Attachment, Category, Tag,… 등의 기본 taxonomies 와 post type 정의

 

Global object 생성

- wp, wp_query 등의 글로벌 object 생성하고 현재 쿼리 유지함

 

테마 선택

- 활성화된 테마를 체크하고, 테마의 functions.php 파일 로딩함

 

init hook

- init 훅에 걸린 액션들을 수행함

- 이 훅을 사용하는 플러그인과 테마들을 로딩함

 

wp_loaded hook

- 멀티사이트라면, wp_loaded 훅에 걸린 액션들을 수행 함

 

WP()

- 이 시점에는, 워드프레스의 모든 코어 함수들이 사용 가능함 (wp-includes/functions.php에 존재)

- url을 체크하고, 필요한 쿼리를 빌드하고 페이지에 필요한 데이터를 가져옴

 

template-loader.php

- 어떤 템플릿이 로딩되어야 하는지 체크함 

- template_redirect 체크

- http head request 체크

- robot이나 rss-feed, trackback인지 체크

- 위의 셋 중 하나가 아니면, 가능한 템플릿 리스트를 훓으면서 조건에 맞는 템플릿 선택함 > 현재 테마에 템플릿이 있는지 체크 > 있으면 $template 변수에 저장됨

- 매칭되는게 없으면, 기본 index 템플릿이 변수에 저장됨

- 마지막 filter (template_include) 불리고 결과가 브라우저에 표시됨

 

참고

https://medium.com/@dendeffe/wordpress-loading-sequence-a-guided-tour-e077c7dbd119

'개발 > 워드프레스' 카테고리의 다른 글

[워드프레스] 사이트 최적화  (0) 2022.07.02

1. 컴파일 에러

컴파일 시, invalid new-expression of abstract class type 에러가 나는 경우가 있다.

 

2. 원인

구현 클래스에서, 추상클래스의 함수를 모두 구현하지 않은 경우 위 에러가 난다.

 

3. 해결

추상클래스에 선언된 함수 중, 구현하지 않은 함수를 찾아 구현해준다.

'개발 > C,C++' 카테고리의 다른 글

[Visual Studio] 단축키  (0) 2023.02.28
.dll과 .lib의 차이  (0) 2023.02.23

1. 문제 상황

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted 가 뜨는 경우가 있다.

 

2. 원인

메모리 부족으로 추정된다.

* PHP의 메모리 제한 기본값은 128MB

 

3. 해결

PHP 설정파일에서 메모리 제한을 수정 후(더 큰 값으로 늘림), 웹서버를 재시작 해주면 모든 PHP 파일에 적용된다.

아래는 CentOS, Apache를 사용하는 경우의 예이다.

Bash

vi /etc/php.ini

php.ini

memory_limit = 256M

Bash

systemctl restart httpd

 

참고

https://zetawiki.com/wiki/PHP_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EB%B6%80%EC%A1%B1

읽기 전용 파일은 덮어쓰거나, 삭제가 안된다. 

 

이 때, 파일 퍼미션을 설정해서 읽기 전용 속성을 제거할 수 있다.

(파일에 쓰기 권한을 주면, 덮어쓰기나 삭제가 가능해진다.)

 

읽기 전용(Read Only) 파일에 쓰기 권한 주기

// C++ code
#include <QFile>

void removeReadOnly(QString filepath)
{
    QFile file(filepath);
    file.setPermissions(file.permissions() |
                        QFileDevice::WriteOwner |
                        QFileDevice::WriteUser |
                        QFileDevice::WriteGroup |
                        QFileDevice::WriteOther);
}

 

+ Recent posts