도커란?

컨테이너 기반의 오픈소스 가상화 플랫폼이다. 어플리케이션을 인프라스트럭처와 분리하여 신속하게 개발, 배포, 운영할 수 있게 해준다.  Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.

 

가상화란, 물리적 자원인 하드웨어를 효율적으로 활용하기 위해서 하드웨어 공간 위에 가상의 머신을 만드는 기술이고

컨테이너란, 컨테이너가 실행되고 있는 호스트 os의 기능을 그대로 사용하면서 프로세스를 격리해 독립된 환경을 만드는 기술이다.

 

도커를 사용하는 이유

  • 개발 과정에서 다른 라이브러리와 충돌하는 것을 방지하기 위해 격리된 환경이 필요할 때(컨테이너 별로 상이한 설정이 가능, 서로 간섭 안받음)
  • 개발 환경과 운영 환경의 동일성이 보장됨(실행환경의 비일관성 문제가 해결됨)
  • 완성된 서비스를 배포할 때, 또는 배포 중인 서비스를 받아서 실행해 볼 때 용이함(이미지만 가져다 컨테이너에 올리면 됨)
  • 운영중인 서버를 다른 서버로 옮겨야 할 때(서버 스펙이 달라져도 동일한 실행을 보장)
  • 다수의 서버를 운영해야 할 때 (클라우드 서버를 이용하거나, 로드 분산을 위해 동일한 서비스를 여러 서버에 배포해야 하는 등의 경우, 다수 서버를 각각 설정할 필요 없으므로 배포 및 관리가 쉬워짐)

 

도커 아키텍처

도커는 클라이언트-서버 아키텍처를 사용한다. 도커 데몬은 컨테이너를 빌드, 실행, 배포하는 역할을 담당하고, 도커 클라이언트는 이러한 도커 데몬과 REST API로 통신한다. 도커 클라이언트와 데몬은 한 컴퓨터 내에서 실행될 수도 있고, 별개의 컴퓨터에서 실행될 수도 있다.

도커 데몬 (The Docker daemon)

도커 데몬은, 도커 API 요청을 받아 도커 객체(이미지, 컨테이너, 네트워크 볼륨 등)을 관리하는 역할을 한다.

 

도커 클라이언트 (The Docker client)

도커 클라이언트는, 사용자가 도커와 상호작용 하는 주요 수단이다. 사용자가 docker run 같은 명령어를 사용하면, 도커 클라이언트가 해당 명령을 데몬에 보내고, 데몬이 명령을 수행한다. 도커 클라이언트는 하나 이상의 데몬과 통신할 수 있다.

 

도커 데스크탑 (Docker Desktop)

도커 데스크탑은 컨테이너화된 애플리케이션과 마이크로서비스를 구축하고 공유할 수 있는 Mac, Windows 또는 Linux 환경을 위한 설치하기 쉬운 애플리케이션이다. 도커 데스크탑에는 도커 데몬(dockerd), 도커 클라이언트(docker), Docker Compose, Docker Content Trust, Kubernetes 및 Credential Helper가 포함된다.

 

도커 레지스트리 (Docker registries)

도커 레지스트리는 도커 이미지를 저장한다. 도커 허브(Docker Hub)는 공개된 레지스트리(저장소)로, 누구나 이용 가능하다.  도커는 기본적으로 도커 허브에서 이미지를 찾도록 설정되어 있으나, 자신만의 비공개 레지스트리를 운영하는 것도 가능하다.

 

도커 객체

Docker를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 개체를 만들고 사용하게 된다. 이러한 개체 중 일부에 대한 간략한 개요를 살펴보면 다음과 같다.

 

이미지

이미지는 읽기 전용 템플릿으로, 도커 컨테이너를 생성하는 명령어들이 포함되어 있다. 주로 이미지는, 다른 이미지를 기반으로 생성해서 약간의 커스터마이징을 하게 된다. 예를 들어, 사용자는 ubuntu 이미지를 기반으로 이미지를 빌드하여 아파치 웹 서버나 다른 어플리케이션을 설치 및 설정 할 수 있다.

 

이미지는 직접 생성하거나, 공개된 레지스트리에 등록된 이미지를 가져다 사용할 수도 있다. 자신만의 이미지를 생성하려면, 이미지 생성하는 명령과 스텝을 기술한 Dockerfile을 작성하고 실행하면 된다. Dockerfile의 각 명령은 이미지 안의 하나의 레이어를 생성한다. Dockerfile을 변경하고 이미지를 다시 빌드하면, 변경된 레이어만 다시 빌드된다. 이점이 이미지를 가볍고, 작고, 빠르게 만들 수 있는 기술이다.

 

컨테이너

컨테이너는 이미지의 실행 가능한 인스턴스이다. 사용자는 Docker API나 CLI를 이용해 컨테이너를 생성, 시작, 중지, 이동, 삭제할 수 있다. 컨테이너를 하나 이상의 네트워크에 연결하거나, 스토리지를 연결하거나, 현재 상태를 기반으로 새 이미지를 생성할 수도 있다.

 

기본적으로 컨테이너는 다른 컨테이너 및 해당 호스트 시스템과 비교적 잘 격리되어 있다. 컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너나 호스트 시스템과 얼마나 격리되었는지 제어할 수 있다.

컨테이너는 이미지 + 환경설정 옵션(컨테이너를 만들거나 시작할때 설정 옵션 추가 가능)으로 정의된다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항은 사라진다.

 

 

참고

https://docs.docker.com/get-started/overview/

https://en.wikipedia.org/wiki/Docker_(software) 

https://velog.io/@markany/%EB%8F%84%EC%BB%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%96%B4%EB%96%A4-%EA%B2%83-1.-%EB%8F%84%EC%BB%A4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

데브옵스에서 사용되는 툴들 모음 & 간략한 요약

Jira (지라)

Atlassian 사에서 개발한 이슈 추적 제품이며 버그 추적, 이슈 추적, 프로젝트 관리 기능을 제공하는 소프트웨어이다.

https://en.wikipedia.org/wiki/Jira_(software) 

Git (깃)

분산형 버전 관리 시스템(Version Control System)이다. 소스코드를 효과적으로 관리할 수 있게 해주는 무료, 공개 소프트웨어이다.

https://git-scm.com/book/ko/v2

GitHub (깃허브)

깃허브(Github)는 분산 버전 관리 툴인 깃(Git)를 사용하는 프로젝트를 지원하는 웹호스팅 서비스이다

https://ko.wikipedia.org/wiki/%EA%B9%83%ED%97%88%EB%B8%8C

Docker (도커)

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.

https://aws.amazon.com/ko/docker/

https://en.wikipedia.org/wiki/Docker_(software) 

https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

Ansible (앤서블)

앤서블이란, IaC(Infrastructure as a Code)를 가능하게 해주는 소프트웨어 툴의 집합이다. 소프트웨어 프로비저닝, 설정 관리, 배포 기능을 포함하는 파이썬 기반의 오픈소스이다. Ansible의 주요 목적은 IT 장비 관리를 자동화하는 것이다.

https://en.wikipedia.org/wiki/Ansible_(software)

Chef (셰프)

Ruby와 Erlang으로 작성된 구성관리 도구이다. 회사의 서버의 구성 및 유지보수 작업을 간소화하며, 인터냅, 아마존 EC2, 구글 클라우드 플랫폼, 오픈스택, 소프트레이어, 마이크로소프트 애저, 랙스페이스와 같은 클라우드 기반 플랫폼들과 통합하여 자동으로 새로운 머신을 프로비저닝하고 구성할 수 있다.

https://ko.wikipedia.org/wiki/%EC%85%B0%ED%94%84_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)

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

Puppet (퍼펫)

ruby로 만들어진 시스템 관리 자동화 툴이다. 주로 설정, 관리, 배포, orchestrate와 같은 일을 하기 위해 사용된다. 다수의 서버플랫폼을 코딩을 통해 관리하는 Infrastructure as a code 서비스를 제공하는 구성 관리 도구 (configuration management tool)이다. 

https://en.wikipedia.org/wiki/Puppet_(software) 

https://barram.tistory.com/m/23

Gradle (그래들)

Groovy를 이용한 빌드 자동화 시스템이다.  컴파일, 패키징, 테스팅, 디플로이, 퍼블리싱 과정을 관리한다. Ant Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 도구이다.  안드로이드 스튜디오의 공식 빌드 도구이기도 하다.

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

https://github.com/gradle/gradle

https://madplay.github.io/post/what-is-gradle

https://kotlinworld.com/311

Maven (메이븐)

자바 프로젝트를 겨냥한 빌드 자동화 툴이다. Apache Ant의 대안으로 만들어졌다. 프로젝트 객체모델(Project Object Model: POM) 이라는 개념을 바탕으로  프로젝트의 의존성관리, 라이브러리관리, 프로젝트 라이프사이클 관리 기능등을 제공하는 프로젝트 관리도구이다. 

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

https://cheershennah.tistory.com/151

Jenkins (젠킨스)

오픈 소스 자동화 서버이다. 소프트웨어 배포와 관련된 작업들(빌드, 테스트, 배포)를 자동화하여 지속적 통합(Continuous Integration, CI)과 지속적 배포(Continuous Delivery, CD)를 도와준다. 소스 버전 관리 툴과 연동하여 코드 변경을 감지하고, 자동화 테스트를 포함한 빌드를 수행하여 소프트웨어 품질을 향상시킬 수 있다.

https://en.wikipedia.org/wiki/Jenkins_(software) 

https://narup.tistory.com/179

https://www.itworld.co.kr/news/107527

Kubernetes (쿠버네티스)

쿠버네티스란 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 시스템이다. (컨테이너 오케스트레이션 소프트웨어)

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

https://tech.ktcloud.com/67

OpenShift (오픈시프트)

컨테이너 기반 소프트웨어의 디플로이 및 관리를 위한 레드햇의 컴퓨터 소프트웨어 제품이다. 구체적으로 말해, 가속화된 애플리케이션 개발을 위해 도커 컨테이너와 데브옵스 도구를 사용하는 쿠버네티스의 지원 배포판이라 할 수 있다. (컨테이너 오케스트레이션 소프트웨어)

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

https://ko.wikipedia.org/wiki/%EC%98%A4%ED%94%88%EC%8B%9C%ED%94%84%ED%8A%B8

https://www.redhat.com/ko/topics/containers/red-hat-openshift-kubernetes

OpenStack (오픈스택)

풀링된 가상 리소스를 사용하여 프라이빗  퍼블릭 클라우드를 구축하고 관리하는 오픈소스 플랫폼이다. Infrastructure-as-a-service(IaaS) 형태로 제공된다.

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

https://www.redhat.com/ko/openstack-35971

 

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

[DevOps] 데브옵스란?  (0) 2022.08.23

데브옵스(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. 수정된 파일의 차이점 보기

git diff filename

2. 수정된 파일 히스토리 보기

git log --follow -p -- filename

3. 누가 어느 부분을 수정했는지 보기

git blame filename

4. 커밋 내용만 보기

git log --follow filename

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

+ Recent posts