[작성자:] Saturn

  • 측정오차 R통계: 무작위 오차와 체계적 오차 쉽게 이해하기

    가설을 검증하기 위해서는 데이터를 정확하게 측정하고 분석하는 것이 중요하다. 하지만 측정 과정에서는 종종 측정오차가 발생한다. 측정오차는 우리가 실제로 측정하려는 값과 실제 측정된 값 사이의 차이를 의미한다.

    측정오차 R통계 개념은 연구 결과의 신뢰성을 판단할 때 반드시 해야 합니다. 같은 대상을 측정해도 도구, 환경, 응답자 상태에 따라 값이 달라질 수 있고, 이 차이가 분석 결과에 영향을 줍니다. 이 글은 무작위 오차와 체계적 오차의 차이, 오차를 줄이는 기본 방법을 정리합니다.

    이러한 오차는 결과 해석 및 결론 도출에 영향을 미칠 수 있으므로, 가설 검증에서 매우 중요한 요소이다.
    측정오차를 최소화하고 통제하기 위해 실험 설계를 신중히 하고, 기기를 정기적으로 캘리브레이션하며, 반복적인 측정을 통해 무작위 오차를 평균화하고 체계적인 원인을 식별하여 교정해야 한다.
    측정오차는 일반적으로 체계적 오차(systematic error)와 무작위 오차(random error)로 구분된다.

    체계적 오차

    Read in English

    Ⅰ. 체계적 오차 (Systematic Error)

    체계적 오차는 일관되게 특정 방향으로 발생하는 오차로, 반복적인 측정에서도 동일한 패턴을 보인다. 이는 반복 측정을 하더라도 동일한 방식으로 영향을 미치기 때문에, 평균을 내어도 사라지지 않습니다. 이러한 오차는 주로 측정 기기의 결함, 환경 조건의 변화, 또는 실험 방법 자체의 문제 등으로 인해 발생한다.

    • 예측 가능성: 체계적 오차는 일정한 패턴을 가지므로 예측이 가능하다.
    • 수정 가능성: 일단 원인을 파악하면 수정이 가능하다.

    Ⅰ – 1. 체계적 오차의 유형

    1. 기기 오차(Instrumental Error):
      측정 장비 자체의 결함이나 불완전함으로 인해 발생하는 오차다. 예를 들어, 저울이 일정량 만큼 항상 더 높은 값을 나타내거나 온도계가 실제 온도보다 낮은 값을 지속적으로 표시하는 경우가 이에 해당한다.
    2. 환경적 요인(Environmental Factors):
      환경 조건의 변화나 특정 환경 조건이 지속적으로 영향을 미칠 때 발생한다. 예를 들어, 온도나 습도의 변화가 측정 기기에 영향을 주거나 전자기 간섭 등이 있을 수 있다.
    3. 절차 및 방법상의 오류(Procedural or Methodological Errors):
      실험이나 측정 방법 자체의 문제로 인해 발생하는 오차다. 예를 들어, 샘플을 채취하는 방법이 일관되지 않거나 특정 실험 절차가 잘못 설정된 경우에 발생된다
    4. 인간의 오류(Human Error):
      측정을 수행하는 사람이 일관되게 동일한 방식으로 잘못된 조작을 하거나 기록하는 경우이다. 이는 주로 훈련 부족이나 부주의로 인해 발생할 수 있다.
    5. 교란 변수(Confounding Variables):
      실험 설계에서 통제되지 않은 변수들이 결과에 영향을 미치는 경우이다. 이는 특히 사회과학 연구나 생명과학 연구에서 자주 발생할 수 있다.

    Ⅰ – 2. 체계적 오차 최소화 전략

    체계적 오차는 그 특성상 탐지하고 교정하기 어렵습니다. 그렇기 때문에 이를 최소화하기 위한 여러 가지 전략이 필요하다:

    1. 장비 검교정(Calibration of Instruments):
      주기적으로 장비를 검교정하여 정확성을 유지한다.
    2. 표준화(Standardization):
      실험 및 측정 절차를 표준화하여 동일한 조건 하에서 수행될 수 있도록 한다.
    3. 환경 통제(Control of Environmental Conditions):
      가능한 한 환경 요인을 일정하게 유지하거나 통제한다.
    4. 훈련 및 교육(Training and Education):
      측정을 수행하는 사람들에게 충분한 훈련과 교육을 제공하여 인간의 실수를 줄인다.
    5. 블라인드 테스트(Blind Testing):
      연구자가 결과에 대해 선입견을 갖지 않도록 블라인드 테스트 기법을 활용할 수 있다.

    체계적 오차를 줄이는 것은 연구와 실험 결과의 신뢰성을 높이는 데 매우 중요하다. 이를 위해 다양한 방법들을 활용하여 최대한 정확하고 일관된 데이터를 얻는 것이 중요하다.

    Ⅱ. 무작위 오차 (Random Error)

    무작위 오차는 측정 과정에서 불가피하게 발생하는 예측 불가능한 오차로, 각 측정마다 다른 크기와 방향으로 나타난다. 이러한 오차는 반복 측정을 통해 평균화되면 사라지거나 최소화될 수 있다. 주로 환경의 미세한 변화, 실험 조건의 미세한 변동, 또는 자연적인 요인 등으로 인해 발생한다.

    • 예측 가능성: 무작위 오차는 예측이 불가능하며, 일정한 패턴을 보이지 않다.
    • 수정 가능성: 반복 측정을 통해 평균값을 구하면 무작위 오차의 영향을 줄일 수 있다.

    Ⅱ – 1. 무작위 오차의 유형

    1. 환경적 요인(Environmental Factors):
      환경 조건이 미세하게 변동할 때 발생합니다. 예를 들어, 바람의 세기나 온도의 작은 변화 등이 측정 결과에 영향을 미칠 수 있다.
    2. 계측기기의 한계(Limitations of Measuring Instruments):
      기기의 해상도나 정밀도가 제한적일 경우 발생합니다. 예를 들어, 디지털 저울의 소수점 이하 자릿수가 제한되어 있는 경우이다.
    3. 샘플 변동(Sample Variability):
      샘플 자체가 일관되지 않을 때 발생합니다. 예를 들어, 동일한 화학물질이라도 미세하게 다른 특성을 보이는 경우이다.
    4. 인간의 작은 실수(Human Minor Errors):
      사람이 측정을 수행하면서 생기는 작은 실수들입니다. 예를 들어, 눈금 읽기의 미세한 오차나 손 떨림 등이 이에 해당한다.

    Ⅱ – 2. 무작위 오차 최소화 전략

    무작위 오차는 그 특성상 완전히 제거하기 어렵지만, 이를 최소화하기 위한 여러 가지 전략이 해야 합니다:

    1. 반복 측정(Repeated Measurements):
      동일한 조건에서 여러 번 측정하여 평균값을 구함으로써 무작위 오차를 줄인다.
    2. 고품질 장비 사용(Use of High-Quality Instruments):
      정밀도가 높은 장비를 사용하여 계측기기의 한계를 극복한다.
    3. 환경적 통제(Control Environmental Conditions):
      가능한 환경 조건을 일정하게 유지하여 외부 요인의 영향을 최소화한다.
    4. 표준 절차 준수(Adherence to Standard Procedures):
      표준화된 절차를 엄격히 따름으로써 일관된 결과를 얻는다.
    5. 데이터 처리(Data Processing Techniques):
      통계적 방법을 활용하여 데이터 내의 무작위성을 분석하고 제거한다.

    무작위 오차와 체계적 오차 모두 각각의 특성과 원인을 이해하고 적절히 대응하는 것이 연구 및 실험 결과의 정확성과 신뢰성을 높이는 핵심 요소이다.

    함께 읽으면 좋은 글

    핵심 확인 체크리스트

    • 측정도구가 일관되게 사용되었는가?
    • 응답자·조사환경·기록 과정에서 오차가 생길 가능성은 없는가?
    • 무작위 오차와 체계적 오차를 구분했는가?
    • 오차를 줄이기 위한 사전 점검 절차가 있는가?

    함께 읽으면 좋은 R통계 글

    FAQ

    무작위 오차와 체계적 오차는 어떻게 다른가요?

    무작위 오차는 우연한 변동 때문에 측정값이 흔들리는 것이고, 체계적 오차는 특정 방향으로 계속 치우치는 편향입니다. 두 오차는 원인과 줄이는 방법이 다릅니다.

    측정오차는 연구 결과에 어떤 영향을 주나요?

    측정오차가 크면 변수 간 관계가 약하게 보이거나 잘못된 결론으로 이어질 수 있습니다. 특히 체계적 오차는 결과 전체를 한쪽 방향으로 왜곡할 위험이 큽니다.

    측정오차를 줄이려면 무엇을 확인해야 하나요?

    측정도구의 문항, 조사 환경, 응답 방식, 기록 절차를 표준화해야 합니다. 사전 조사와 반복 측정을 통해 값이 안정적으로 나오는지도 확인하는 것이 좋습니다.

  • 변수와 측정 R통계: 독립변수·종속변수와 측정 수준 이해

    이론을 검증하기 위한 자료 수집을 위해서는 1)무엇을 측정할 것인가?, 2)어떻게 측정할 것인가?의 두 가지 질문에 답할 수 있어야 한다. 즉, 자료수집의 목적과 방법을 명확히 하기 위해선 변수와 측정 이해해야 한다.
    연구에서 변수는 연구자가 관찰하거나 측정하는 요소를 의미하며 변수를 통해 연구자는 특정 현상을 설명하거나 예측할 수 있다.
    연구 설계를 할 때 다양한 유형의 변수를 명확히 정의하고 적절히 통제 및 분석하면 보다 신뢰성 있고 타당한 연구 결과를 도출할 수 있다.

    변수와 측정은 R통계 분석의 출발점입니다. 독립변수와 종속변수를 구분하지 못하거나 측정 수준을 잘못 이해하면, 분석 방법 선택과 결과 해석이 모두 흔들릴 수 있습니다. 이 글은 변수의 역할과 명목·서열·등간·비율척도를 쉽게 정리하고, R통계에서 왜 중요한지 설명합니다.

    Ⅰ. 변수의 종류[변수와 측정]

    Ⅰ-1. 독립변수 (Independent Variable)

    독립변수: 연구자가 조작하는 변수로서 원인을 제공하는 역할을 한다.
    독립변수는 연구자가 조작하거나 변경하여 그 영향을 관찰하고자 하는 변수로 실험에서 원인으로 간주되며, 종속변수에 영향을 미치는 요인으로 작용한다.

    • 예시: 한 실험에서 식물의 성장에 미치는 빛의 영향을 조사한다고 가정해 봅시다. 이 경우 빛의 양(예: 하루에 4시간, 8시간, 12시간)이 독립변수가 됩니다. 연구자는 빛의 양을 조절하여 식물 성장에 어떤 영향을 미치는지 관찰합니다.

    Ⅰ-2. 종속변수 (Dependent Variable)

    종속변수: 독립변수의 변화에 따라 달라지는 결과 변수다.
    종속변수는 연구자가 측정하고자 하는 결과 또는 반응 변수이다. 즉, 독립변수의 변화에 따라 달라지는 변수로, 종속변수가 어떻게 변하는지를 통해 독립변수가 어떤 영향을 미쳤는지 평가할 수 있다.

    • 예시: 앞서 언급한 식물 성장 실험에서, 식물의 성장 정도(예: 높이, 잎의 수)가 종속변수가 됩니다. 여기서는 빛의 양(독립변수)이 변화함에 따라 식물 성장 정도(종속변수)가 어떻게 변하는지를 측정합니다.

    Ⅰ-3. 매개변수 (Mediator Variable)

    매개변수: 독립변수와 종속변수 간의 관계를 중재하거나 설명하는 변수다.
    매개변수는 독립변수가 종속변수에 미치는 영향을 어떤 과정을 통해 전달하는지를 이해하는 데 도움을 준다. 연구자가 독립변수와 종속변수 사이의 메커니즘을 탐구할 때 중요한 역할을 한다.

    • 예시: 식물 성장 실험에서, 빛의 양(독립변수)이 식물의 광합성 속도(매개변수)를 통해 식물 성장 정도(종속변수)에 영향을 줄 수 있습니다. 여기서 광합성 속도는 빛의 양이 증가함에 따라 변하고, 이는 다시 식물 성장 정도에 영향을 미칩니다.

    Ⅰ-4. 통제변수 (Control Variable)

    통제변수: 연구에서 일정하게 유지하여 실험 결과에 영향을 미치지 않도록 하는 변수다.
    통제변수를 일정하게 유지함으로써 독립변수가 종속변수에 미치는 순수한 효과를 측정할 수 있다. 통제변수는 연구 결과의 신뢰성을 높이는 데 중요하다.

    • 예시: 식물 성장 실험에서, 온도, 물의 양, 토양 종류 등은 통제변수가 됩니다. 이러한 변수들이 일정하게 유지됨으로써 빛의 양이 식물 성장 정도에 미치는 영향만을 분명히 확인할 수 있습니다.

    Ⅰ-5. 예측변수 (Predictor Variable)

    예측변수: 종속변수의 변화에 영향을 미칠 것으로 예상되는 변수다.
    예측변수는 연구자가 조작하거나 관찰하는 변수로, 종속변수에 대한 예측을 할 때 사용된다. 이는 종속변수의 변화를 설명하거나 예측하기 위해 중요한 역할을 한다.

    • 예시: 체중 감소 연구에서, 운동량, 식단, 수면 시간 등이 예측변수가 될 수 있습니다. 여기서는 이러한 예측변수가 체중 감소(종속변수)에 어떤 영향을 미치는지를 분석하게 됩니다.

    Ⅰ-6. 결과변수 (Outcome Variable)

    결과변수: 예측변수의 변화에 따라 나타나는 결과로서 연구자가 측정하고자 하는 주요 변수다.
    결과변수는 특정 상황이나 조건 하에서 나타나는 반응 또는 변화를 설명하며, 이를 통해 예측변수가 미치는 영향을 평가할 수 있다.

    • 예시: 학업 성취도 연구에서, 학생의 시험 점수가 결과변수가 됩니다. 이 경우, 공부 시간이나 학습 방법(예측변수)이 시험 점수(결과변수)에 어떤 영향을 미치는지 평가합니다.

    Ⅱ. 측정 수준[변수와 측정]

    측정 수준은 측정 대상과 그 측정 대상이 나타내는 수치 사이의 관계를 의미한다. 변수들은 범주형변수와 연속형 변수로 나눌 수 있다.

    Ⅱ-1. 범주형 변수 (Categorical Variable)

    범주형 변수는 데이터가 몇 가지 고정된 카테고리나 그룹으로 구분되는 경우를 말합니다. 각 값은 특정한 카테고리를 나타내며, 이 값들 사이에는 순서나 크기의 개념이 없다.

    • 예시:
    • 성별: 남성, 여성
    • 혈액형: A형, B형, AB형, O형
    • 주거 형태: 아파트, 단독 주택, 빌라
      범주형 변수는 다시 명목형(Nominal)과 서열형(Ordinal)으로 나눌 수 있습니다.
    • 명목형 변수: 순서가 없는 범주 (예: 혈액형)
    • 이분 변수: 순서가 없는 변수 (예: 예/아니오, 생물/무생물)
    • 서열형 변수: 순서가 있는 범주 (예: 교육 수준 – 초등학교, 중학교, 고등학교)

    Ⅱ-2. 연속형 변수 (Continuous Variable)

    연속형 변수는 특정한 범위 내에서 모든 실수 값을 가질 수 있는 변수를 말하며 이 값들은 측정 가능하고 숫자 간에 순서와 크기의 개념이 존재한다.
    연속형 변수를 다룰 때는 다양한 통계적 기법을 사용할 수 있으며, 평균(mean), 표준 편차(standard deviation), 분산(variance) 등의 척도를 사용하여 데이터를 분석한다.

    • 예시:
    • 키 (cm): 170.5 cm
    • 몸무게 (kg): 65.3 kg
    • 온도 (°C): 22.4°C

    범주형 변수는 구간형(Interval), 비율형(Ratio), 이산형(Discrete)으로 나눌 수 있다.

    • 구간 변수: 연속적인 값을 가지며, 값들 간의 차이가 일정하지만 절대 영점이 없는 변수 (예: 온도 (섭씨 또는 화씨), IQ 점수, 날짜)
    • 비율 변수: 연속적인 값을 가지며, 값들 간의 차이가 일정하고 절대 영점이 있는 변수 (예: 무게, 키, 나이, 소득)
    • 이산 변수: 연속적이지 않은 정수로 표현되는 변수 (예: 학생 수, 자동차 대수, 집안의 가족 수)
    변수와 측정

    Read in English

    함께 읽으면 좋은 글

    핵심 확인 체크리스트

    • 독립변수와 종속변수를 구분했는가?
    • 통제변수나 매개변수가 필요한가?
    • 각 변수의 측정 수준을 확인했는가?
    • 측정 수준에 맞는 분석 방법을 선택했는가?

    함께 읽으면 좋은 R통계 글

    FAQ

    독립변수와 종속변수는 어떻게 구분하나요?

    독립변수는 결과에 영향을 준다고 보는 원인 또는 설명 변수이고, 종속변수는 그 영향을 받는 결과 변수입니다. 연구 질문에서 무엇이 원인이고 무엇이 결과인지 먼저 확인하면 구분이 쉬워집니다.

    측정 수준은 분석 방법 선택에 어떤 영향을 주나요?

    명목·서열·등간·비율척도에 따라 평균, 상관, 회귀 등 사용할 수 있는 분석 방법이 달라집니다. 측정 수준을 잘못 판단하면 통계 결과 해석도 부정확해질 수 있습니다.

    명목·서열·등간·비율척도는 어떻게 다르나요?

    명목척도는 범주 구분, 서열척도는 순서, 등간척도는 간격, 비율척도는 절대영점을 가진 수치입니다. 변수의 성격을 이 네 기준으로 보면 분석 선택이 쉬워집니다.

  • 연구란 무엇인가: R통계 입문을 위한 연구 개념 정리

    우리는 왜?라는 질문을 던진다 이것은 궁금증을 가지기 때문이다.호기심을 갖기 때문이다. 그리고 흥미로운 질문에 대한 답을 얻기위해 다양한 연구를 수행하게 된다.
    연구를 수행하려면 이론을 만들고 검증하기 위한 자료가 필요하다.
    검증을 위해서 양적 연구 방법(Quantiative method)와 질적 연구 방법(Qualitative method)이 존재하는데 양적 연구 방법을 사용하기 위해서는 수치(Numbers)에 대해서 알아야 한다.

    연구란 무엇인가를 먼저 이해하면 R통계 학습의 방향이 훨씬 분명해집니다. 통계 함수나 분석 절차를 외우기 전에, 연구 질문을 세우고 자료를 수집하며 결과를 해석하는 전체 흐름을 알아야 합니다. 이 글은 R통계 입문자가 반드시 알아야 할 연구의 의미와 기본 구조를 정리합니다.

    연구 방법

    Read in English

    I. 연구 방법

    흥미로운 질문에 답을 하려면 다음 단계들을 거쳐야 한다.

    1. 관찰: 첫번째 단계는 관찰로 시작한다. 관찰(Observation)은 일상생활에서 실제로 일어난 사건이나 사람들 사이에서 포착할 수 있는 이야기가 될 수도 있다.
    2. 이론: 초기에 관찰의 내용을 설명하는 이론을 만든다
    3. 가설: 이론으로 부터 추측 또는 추론을 위한 가설을 만든다. 이때는 변수를 정의하고 변수간의 관계를 설정한다.
    4. 자료수집: 이론을 논리적으로 검증할 관련 자료를 수집한다. 변수에 부합되는 정보들의 유형에 따라 자료의 형태는 달라질 수 있다.
    5. 자료분석: 수집된 자료를 분석해서 이론을 검증하거나 이론을 수정한다.

    Ⅱ. 의미있는 가설이란

    좋은 이론은 세상의 상태에 대한 진술(statement: 명제)을 작성할 수 있어야 한다. 이때 진술은 좋은것을 의미한다. 우리는 진술을 통해 세상을 이해하고 미래에 영향을 미치는 결정을 내린다.
    진술 중에는 과학적 활동을 통해 검증할 수 있는 진술도 있고 과학적으로 검증할 수 없는 것들도 있다. 과학적 진술은 실험으로 확인하거나 반증할 수 있다.
    ‘아이유가 있기 있는 가수이다’ – 비과학적 진술
    ‘아이유는 대한민국에서 음반 판매량이 가장 많은 가수이다. ‘ – 과학적 진술
    그래서 의미있는 가설은 좋은 이론으로 과학적 진술에 해당하는 가설을 만드는 것이다.

    Ⅲ. 검증과 반증

    과학적 연구에서 검증(verification)과 반증(falsification)은 과학 이론의 유효성을 평가하고 과학적 지식을 축적하는 과정에서 핵심적인 역할을 한다.
    검증과 반증 모두 과학적 연구에서 중요하지만 그 역할이 다르다

    • 검증: 가설이나 이론을 지지하는 데이터를 찾고 이를 통해 신뢰성을 높이는 과정이다.
    • 반증: 단 하나의 반례로 인해 가설이나 이론을 틀렸음을 입증하는 과정이다.

    Ⅱ – 1. 검증 (Verification)

    검증은 특정 이론이나 가설이 실제로 옳은지 확인하는 과정이다. 검증을 통해 얻어진 데이터가 가설이나 이론을 지지하면, 해당 이론의 신뢰성은 강화된다. 하지만 검증만으로는 그 이론이 절대적으로 참임을 입증할 수 없는데 이는 다른 가능성 있는 설명들이 존재할 수 있기 때문이다.

    [예시]만유인력의 법칙: 아이작 뉴턴의 만유인력의 법칙은 두 물체 사이에 작용하는 중력의 크기를 설명한다. 이를 검증하기 위해 다양한 실험과 관찰이 진행했다. 예를 들어, 행성들의 궤도 운동을 관찰하거나 지구 상에서 물체가 떨어지는 것을 실험하여, 뉴턴의 법칙이 예측한 결과와 실제 결과를 비교했다. 이러한 다수의 성공적인 검증 사례를 통해 만유인력의 법칙이 존재한다는 것을 받아들이게 된다.

    Ⅲ – 2. 반증 (Falsification)

    반증은 특정 이론이나 가설이 틀렸음을 입증하는 과정이다. 철학자 칼 포퍼(Karl Popper)는 과학적 방법론에서 반증 가능성이 중요하다고 주장했다. 그는 어떤 가설도 무한히 많은 검증 사례를 통해 완전히 참임을 증명할 수 없지만, 단 하나의 반례로 인해 틀렸음을 입증할 수 있기 때문이다.

    [예시]에테르 이론: 19세기 말까지 빛은 ‘에테르’라는 매질을 통해 전파된다고 믿었다. 하지만 마이컬슨-몰리 실험(Michelson-Morley experiment)을 통해 빛이 에테르 없이도 진공에서 전파될 수 있음을 입증했고. 결국 에테르 이론은 반증되었다. 이에 따라 새로운 빛에 대한 이해가 필요하게 되었고, 이는 아인슈타인의 상대성 이론으로 이어졌다.

    함께 읽으면 좋은 글

    핵심 확인 체크리스트

    • 연구 질문이 명확한가?
    • 연구 대상과 범위가 정해져 있는가?
    • 자료 수집 방법이 연구 질문과 연결되는가?
    • 분석 결과를 어떤 기준으로 해석할지 정했는가?

    함께 읽으면 좋은 R통계 글

    FAQ

    연구 질문은 왜 중요한가요?

    연구 질문은 자료 수집과 분석 방향을 정하는 기준입니다. 질문이 모호하면 어떤 변수를 볼지, 어떤 통계 방법을 쓸지, 결과를 어떻게 해석할지도 함께 흔들립니다.

    연구와 통계 분석은 어떻게 연결되나요?

    연구는 질문을 세우고 근거를 모아 해석하는 과정이며, 통계 분석은 그 근거를 체계적으로 확인하는 도구입니다. 그래서 통계는 연구 설계 안에서 의미를 가집니다.

    R통계를 배우기 전에 어떤 연구 개념을 알아야 하나요?

    연구 질문, 변수, 측정, 표본, 자료 수집, 분석 목적을 먼저 이해하는 것이 좋습니다. 이 개념을 알아야 R 코드 결과를 단순 숫자가 아니라 연구 결과로 해석할 수 있습니다.

  • Nextcloud 설치 및 셋팅

    Nextcloud 설치 및 셋팅

    1. 사전 준비

    아래의 설치 과정은 ubuntu 22 환경에서 진행되는 절차입니다. 사전 준비가 필요하면 아래 단계를 참고해주세요

    1. Ubuntu 22.04.1 설치(VirtualBox)
    2. ubuntu update 및 upgrade
    3. Ubuntu 방화벽 iptables 설치 및 활성화
    4. Ubuntu 방화벽 iptables 설정 및 관리
    5. Ubuntu OpenSSH 설치 및 MobaXterm 설치
    6. Ubuntu SSH 포트 설정 및 연결
    7. Nginx 웹서버 설치(ubuntu)
    8. PHP 8 설치(ubuntu)
    9. Nginx + Php8 설정
    10. MariaDB 설치 및 관리(MySQL)
    11. OpenSSL 설치
    12. 무료 HTTPS 설정(Let’s Encrypt, Cloudflare)
    13. 메모리 caching APCu, Redis, Memcached 설치

    2. 설치형 클라우드 Nextcloud 이해

    Nextcloud는 개인 및 기업용 클라우드 저장소 및 협업 플랫폼입니다. Nextcloud는 2016년 Frank Karlitschek이 ownCloud 프로젝트를 떠나 개발한 오픈 소스 소프트웨어로 ownCloud의 커뮤니티 구성원들이 Nextcloud를 만들기 위해 모여 개발을 시작하였습니다.

    1) Nextcloud 특징

    Nextcloud는 개인 및 기업에서 안전하고 효율적인 클라우드 저장소 및 협업 도구로 많이 사용되고 있습니다.

    1. 파일 동기화 및 공유: Nextcloud를 사용하면 여러 디바이스 간에 파일을 동기화하고 공유할 수 있습니다.
    2. 보안: Nextcloud는 데이터 암호화, 2단계 인증 등 다양한 보안 기능을 제공하여 사용자의 데이터 보호를 강화합니다.
    3. 협업 도구: 문서 편집, 캘린더, 주소록 등과 같은 협업 도구를 포함하여 다양한 작업을 팀원들과 함께 수행할 수 있습니다.
    4. 앱 생태계: 다양한 앱과 확장 기능을 제공하여 사용자의 요구에 맞게 Nextcloud를 확장할 수 있습니다.
    5. 자체 호스팅: Nextcloud는 온프레미스나 클라우드에서 사용할 수 있으며, 사용자는 자신만의 서버를 운영하여 데이터를 관리할 수 있습니다.

    2) 장점

    1. 개인정보 보호: Nextcloud는 사용자가 직접 데이터를 관리할 수 있으므로 개인정보 보호에 용이합니다.
    2. 확장성: 다양한 앱과 확장 기능을 통해 사용자의 요구에 맞게 Nextcloud를 확장할 수 있습니다.
    3. 협업 기능: 문서 편집, 캘린더 등 다양한 협업 도구를 제공하여 팀원들과 함께 작업하기 용이합니다.

    3) 단점

    1. 기술적 지식 필요: 서버 설정 및 유지보수에 대한 기술적인 이해가 해야 합니다.
    2. 초기 설정 복잡성: 처음에 Nextcloud를 설정하는 과정은 다소 복잡할 수 있습니다.

    4) 시스템 요구사항

    플랫폼옵션
    운영 체제 (64비트)Ubuntu 22.04 LTS(권장)
    우분투 20.04 LTS
    Red Hat Enterprise Linux 8(권장)
    데비안 12
    리눅스 엔터프라이즈 서버 15
    openSUSE Leap 15.4
    CentOS 스트림
    데이터베이스MySQL 8.0+ 또는 MariaDB 10.3/10.4/10.5/10.6(권장)
    Oracle Database 11g(엔터프라이즈 구독의 일부로만 해당))
    PostgreSQL 10/11/12/13/14/15
    SQLite(테스트 및 최소 인스턴스에만 권장됨))
    웹서버Apache 2.4 및 or (권장) mod_phpphp-fpm
    nginx php-fpm
    PHP 런타임8.0(더 이상 사용되지 않음))
    8.1
    8.2(권장)

    Read in English

    3) 하드웨어 요구사항

    1. 프로세서: 1GHz 이상의 듀얼 코어 프로세서
    2. 메모리: 최소 512MB RAM (추천: 2GB 이상)
    3. 저장 공간: 최소 10GB 이상의 여유 공간
    4. 네트워크: 인터넷 연결을 위한 네트워크 인터페이스

    2. Nextcloud 설치

    nextcloud 설치는 all-in-one VM, all-in-one Docker, 웹 인스톨러 설치 등의 방법이 있습니다. 여기서는 웹 인스톨러를 사용해서 설치를 진행하겠습니다.

    1) 폴더 생성 및 설치 파일 다운로드

    nextcloud를 설치할 폴더를 생성합니다. 하위에 웹 로그를 저장할 logs 폴더와 nextcloud 를 설치할 public 폴더를 생성합니다.

    sudo mkdir  /var/www/nc.skdream.com
    sudo mkdir  /var/www/nc.skdream.com/logs
    sudo mkdir  /var/www/nc.skdream.com/public

    public 폴더에 설치 파일을 다운로드 합니다. https://download.nextcloud.com/server/installer/setup-nextcloud.php

    cd /var/www/nc.skdream.com/public
    sudo wget https://download.nextcloud.com/server/installer/setup-nextcloud.php

    public 폴더 사용자를 www-data로 변경합니다.

    sudo chown -R www-data:www-data /var/www/nc.skdream.com/public

    2) Nginx의 서버 블럭 생성

    도메인 연결을 위한 서버 블럭 파일을 생성합니다.

    sudo nano /etc/nginx/sites-available/nc.skdream.com

    아래 코드를 붙여넣고 도메인 부분을 자신의 도메인으로 변경합니다.

    upstream php-handler {
            server unix:/var/run/php/php8.2-fpm.sock;
    
    }
    # Set the `immutable` cache control options only for assets with a cache busting `v` argument
    map $arg_v $asset_immutable {
            "" "";
            default "immutable";
    }
    server {
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
    
            server_name example.com;
    
            ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
            ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
            ssl_dhparam /etc/ssl/certs/dhparam.pem;
    
            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_prefer_server_ciphers on;
            ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256;
            ssl_ecdh_curve secp384r1;
            ssl_session_timeout 10m;
            ssl_session_cache shared:SSL:10m;
            ssl_session_tickets off;
            ssl_stapling on;
            ssl_stapling_verify on;
            resolver 1.1.1.1 1.0.0.1 valid=300s;
            resolver_timeout 5s;
    
            access_log /var/www/nc.skdream.com/logs/access.log;
            error_log /var/www/nc.skdream.com/logs/error.log;
    
            root /var/www/nc.skdream.com/public/;
            #index index.php index.html;
    
            #Nextcloud
            # Prevent nginx HTTP Server Detection
            server_tokens off;
    
            # HSTS settings
            # WARNING: Only add the preload option once you read about
            # the consequences in https://hstspreload.org/. This option
            # will add the domain to a hardcoded list that is shipped
            # in all major browsers and getting removed from this list
            # could take several months.
            add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
    
            # set max upload size and increase upload timeout:
            client_max_body_size 512M;
            client_body_timeout 300s;
            fastcgi_buffers 64 4K;
    
            # Enable gzip but do not remove ETag headers
            gzip on;
            gzip_vary on;
            gzip_comp_level 4;
            gzip_min_length 256;
            gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
            gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
            # Pagespeed is not supported by Nextcloud, so if your server is built
            # with the `ngx_pagespeed` module, uncomment this line to disable it.
            #pagespeed off;
    
            # The settings allows you to optimize the HTTP2 bandwitdth.
            # See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
            # for tunning hints
            client_body_buffer_size 512k;
    
            # HTTP response headers borrowed from Nextcloud `.htaccess`
            add_header Referrer-Policy                   "no-referrer"       always;
            add_header X-Content-Type-Options            "nosniff"           always;
            #add_header X-Download-Options                "noopen"            always;
            add_header X-Frame-Options                   "SAMEORIGIN"        always;
            add_header X-Permitted-Cross-Domain-Policies "none"              always;
            add_header X-Robots-Tag                      "noindex, nofollow" always;
            add_header X-XSS-Protection                  "1; mode=block"     always;
    
            # Remove X-Powered-By, which is an information leak
            fastcgi_hide_header X-Powered-By;
    
            # Add .mjs as a file extension for javascript
            # Either include it in the default mime.types list
            # or include you can include that list explicitly and add the file extension
            # only for Nextcloud like below:
            include mime.types;
    
            # Specify how to handle directories -- specifying `/index.php$request_uri`
            # here as the fallback means that Nginx always exhibits the desired behaviour
            # when a client requests a path that corresponds to a directory that exists
            # on the server. In particular, if that directory contains an index.php file,
            # that file is correctly served; if it doesn't, then the request is passed to
            # the front-end controller. This consistent behaviour means that we don't need
            # to specify custom rules for certain paths (e.g. images and other assets,
            # `/updater`, `/ocs-provider`), and thus
            # `try_files $uri $uri/ /index.php$request_uri`
            # always provides the desired behaviour.
            index index.php index.html /index.php$request_uri;
            #types {
            #        text/javascript js mjs;
            #}
            # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
            location = / {
                    if ( $http_user_agent ~ ^DavClnt ) {
                            return 302 /remote.php/webdav/$is_args$args;
                    }
            }
    
            location = /robots.txt {
                    allow all;
                    log_not_found off;
                    access_log off;
            }
    
    
            # Make a regex exception for `/.well-known` so that clients can still
            # access it despite the existence of the regex rule
            # `location ~ /(\.|autotest|...)` which would otherwise handle requests
            # for `/.well-known`.
            location ^~ /.well-known {
                    # The rules in this block are an adaptation of the rules
                    # in `.htaccess` that concern `/.well-known`.
    
                    location = /.well-known/carddav { return 301 /remote.php/dav/; }
                    location = /.well-known/caldav  { return 301 /remote.php/dav/; }
    
                    location /.well-known/acme-challenge    { try_files $uri $uri/ =404; }
                    location /.well-known/pki-validation    { try_files $uri $uri/ =404; }
    
                    # Let Nextcloud's API for `/.well-known` URIs handle all other
                    # requests by passing them to the front-end controller.
                    return 301 /index.php$request_uri;
            }
    
    
            # Rules borrowed from `.htaccess` to hide certain paths from clients
            location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
            location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }
    
            # Ensure this block, which passes PHP files to the PHP process, is above the blocks
            # which handle static assets (as seen below). If this block is not declared first,
            # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
            # to the URI, resulting in a HTTP 500 error response.
    
            # to the URI, resulting in a HTTP 500 error response.
            location ~ \.php(?:$|/) {
                    # Required for legacy support
                    rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
    
                    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                    set $path_info $fastcgi_path_info;
    
                    try_files $fastcgi_script_name =404;
    
                    include fastcgi_params;
                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    fastcgi_param PATH_INFO $path_info;
                    fastcgi_param HTTPS on;
    
                    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
                    fastcgi_param front_controller_active true;     # Enable pretty urls
                    fastcgi_pass php-handler;
    
                    fastcgi_intercept_errors on;
                    fastcgi_request_buffering off;
    
                    fastcgi_max_temp_file_size 0;
            }
            # Javascript mimetype fixes for nginx
            # Note: The block below should be removed, and the js|mjs section should be
            # added to the block below this one. This is a temporary fix until Nginx 
            # upstream fixes the js mime-type
            location ~* \.(?:js|mjs)$ {
                types { 
                    text/javascript js mjs;
                } 
                default_type "text/javascript";
                try_files $uri /index.php$request_uri;
                add_header Cache-Control "public, max-age=15778463, $asset_immutable";
                access_log off;
            }
    
            # Serve static files
            location ~ \.(?:css|svg|gif|png|jpg|ico|wasm|tflite|map|ogg|flac)$ {
                try_files $uri /index.php$request_uri;
                add_header Cache-Control "public, max-age=15778463, $asset_immutable";
                access_log off;     # Optional: Don't log access to assets
    
                location ~ \.wasm$ {
                    default_type application/wasm;
                }
            }
            location ~ \.woff2?$ {
                    try_files $uri /index.php$request_uri;
                    expires 7d;         # Cache-Control policy borrowed from `.htaccess`
                    access_log off;     # Optional: Don't log access to assets
            }
    
            # Rule borrowed from `.htaccess`
            location /remote {
                    return 301 /remote.php$request_uri;
            }
    
            location / {
                    try_files $uri $uri/ /index.php$request_uri;
            }
    
    
    }
    
    server {
            listen 80;
            listen [::]:80;
    
            server_name example.com;
            # Prevent nginx HTTP Server Detection
            server_tokens off;
    
            return 301 https://example.com$request_uri;
    }

    심볼릭 링크를 설정하고 nginxt를 재시작합니다.

    sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
    sudo systemctl restart nginx

    3) DB 생성 및 권한 부여

    아래 명령어로 MariaDB에 접속합니다.

    mysql -u root -p

    MariaDB를 설치하지 않았다면 다음 글을 참고하세요 MariaDB 설치 및 관리(MySQL) – Thinknote

    Nextcloud에 사용할 데이터베이스를 생성합니다.

    CREATE DATABASE nextcloud;

    새로운 사용자를 생성합니다. 기존 사용자를 연결하려면 생략해도 됩니다.

    CREATE USER '[사용자 이름]'@'localhost' IDENTIFIED BY '[비밀번호]';

    생성한 사용자에게 새로운 데이터베이스의 권한을 부여합니다.

    GRANT ALL PRIVILEGES ON [데이터베이스 이름].* TO '[사용자 이름]'@'localhost';

    변경된 권한 설정을 적용합니다.

    FLUSH PRIVILEGES;
    exit;

    4) php 요구사항

    Nextcloud를 사용하기 위해서는 추가적인 php모듈이 해야 합니다. 아래는 Nextcloud manual 에 제시되어 있는 요구사항입니다.

    • PHP (see System requirements for a list of supported versions)
    • PHP module ctype
    • PHP module curl
    • PHP module dom
    • PHP module fileinfo (included with PHP)
    • PHP module filter (only on Mageia and FreeBSD)
    • PHP module GD
    • PHP module hash (only on FreeBSD)
    • PHP module JSON (included with PHP >= 8.0)
    • PHP module libxml (Linux package libxml2 must be >=2.7.0)
    • PHP module mbstring
    • PHP module openssl (included with PHP >= 8.0)
    • PHP module posix
    • PHP module session
    • PHP module SimpleXML
    • PHP module XMLReader
    • PHP module XMLWriter
    • PHP module zip
    • PHP module zlib

    아래 코드를 입력해서 설치되지 않은 모듈을 설치합니다. PHP8이 설치되지 않았다면 다음 글을 참고하세요. PHP 8 설치(ubuntu) – Thinknote

    sudo apt install php8.2-ctype php8.2-curl php8.2-dom php8.2-gd php8.2-mbstring php8.2-zip php8.2-intl php8.2-gmp php8.2-bcmath libmagickcore-6.q16-6-extra php8.2-apcu php8.2-bz2 php8.2-imagick php8.2-imap php8.2-ldap php8.2-mysql php8.2-smbclient php8.2-xml php8.2-zip

    php를 재시작합니다.

    sudo systemctl restart php8.2-fpm

    3. 웹 인스톨러 통한 설치

    자신의 도메인에서 웹 인스톨러에 접속해서 설치를 진행합니다.

    https://example.com/setup-nextcloud.php

    만약 Fatal error: Uncaught ValueError: Invalid or uninitialized Zip object in 에러가 발생하면 이는 압축 해제 경로가 /var/www/html로 되어있기 때문입니다. 이때는 직접 압축을 풀어서 설치해야 합니다. 압축이 풀려 있다면 도메인 url로 접속하면 됩니다.

    설치가 완료되었습니다.

    4. 보안 및 경고 확인

    관리자로 로그인하고 관리자 설정으로 들어갑니다. 이때 보안 및 설치 경고 메시지가 나온다면 항목별 해결방법을 참고하시기 바랍니다.

    1) 파일 무결성과 관련된 오류

    /etc/php/8.2/fpm/pool.d/www.conf 에서 clear_env = no의 주석을 해제합니다.

    sudo nano /etc/php/8.2/fpm/pool.d/www.conf 
    clear_env = no #주석해제

    2) 시스템 환경변수 getenv(‘path’)오류

    관리자 설정의 무결성과 관련된 파일 리스트를 확인하고 문제가 되는 파일을 삭제합니다. 그리고 아래 코드를 실행하여 무결성 문제가 해결 되었는지 확인합니다.

    sudo -u www-data php occ integrity:check-core

    3) PHP 메모리 제한

    php.ini에서 memory_limit값과 upload_max_filesize 을 512M 이상으로 설정합니다.

    Memory_limit = 1G
    upload_max_filesize = 1G

    4) 국가 전화번호 설정

    nextcloud config.php 파일에 다음 내용을 추가합니다.

    'default_phone_region' => 'kr'

    5) 트렌젝션 성능 향상 – memcached 구성

    memcached 구성 다음 글을 참고하시기 바랍니다. 메모리 caching APCu, Redis, Memcached 설치 – Thinknote

    트렌젝션 파일 잠금과 함께 memcached 를 사용하려면 redis도 설치해야 합니다.

    설치가 완료되면 nextcloud config.php 파일에 다음 내용을 추가합니다.

    'memcache.local' => '\\OC\\Memcache\\Redis',
    'memcache.distributed' => '\\OC\\Memcache\\Redis',
    'memcache.locking' => '\\OC\\Memcache\\Redis',
    'filelocking.enabled' => 'true',
    'redis' =>
        array (
            'host' => 'localhost',
            'port' => 0,
            'timeout' => 0.0,
    ),

    6) 보안 및 배경 작업 확인

    Thinknote

  • 메모리 caching APCu, Redis, Memcached 설치

    1. 메모리 캐싱 방법(APCu, Redis, Memcached)

    ubuntu에서 사용할 수 있는 메모리 캐싱 방법으로 APCu, Redis, Memcached 가 있습니다. 각각의 캐싱 도구는 다양한 용도와 요구 사항에 맞게 선택해야 합니다.

    • 예를 들어, APCu는 PHP 코드의 성능을 향상시킬 수 있지만 단일 서버에서만 사용 가능하므로 분산 환경에는 적합하지 않습니다.
    • Redis는 다양한 데이터 구조와 클러스터링 기능을 제공하여 복잡한 애플리케이션에 적합합니다.
    • Memcached는 분산 환경에서 대규모 처리량을 지원하기 위해 설계되었습니다.

    1) APCu (Alternative PHP Cache user caching)

    APCu는 PHP 확장 기능으로서 로컬 서버 내에서 데이터를 캐시하는 데 사용되며 단일 서버 환경에서 사용하기 적합합니다. APCu는 프로세스 간 데이터 공유가 불가능하며, 데이터는 해당 프로세스에서만 유지됩니다.

    1. PHP용 메모리 캐싱 시스템입니다.
    2. PHP 코드에 직접 접근하여 데이터를 캐싱할 수 있습니다.
    3. 단일 서버에서만 사용 가능하며 분산 환경에는 적합하지 않습니다.
    4. APCu는 기본적으로 메모리에 데이터를 저장하므로 빠른 읽기/쓰기 속도를 제공합니다.
    5. 하지만 APCu는 데이터 유지 및 복제를 지원하지 않으므로 서버 장애 시 데이터 손실 수 있습니다.

    2) Redis

    Redis는 오픈 소스 인메모리 데이터 구조 저장소로 다중 서버 환경에서 스케일 아웃이 가능하며, 데이터를 메모리에 저장하고 디스크에 지속적으로 저장할 수 있습니다. 다양한 데이터 구조 (문자열, 해시, 리스트, 세트 등)를 지원하며 Pub/Sub 메커니즘을 통해 메시지 브로커로도 사용할 수 있습니다.

    1. 단일 스레드로 작동하며, 이벤트 기반 아키텍처를 사용하여 동시성 문제를 해결합니다.
    2. 문자열, 해시, 목록, 세트, 정렬된 세트 등 다양한 데이터 구조를 지원합니다..
    3. Publish/Subscribe (Pub/Sub) 메커니즘을 지원하여 메시지 기반 아키텍처를 구축할 수 있습니다
    4. 마스터-슬레이브 복제 및 Redis 클러스터와 같은 분산 시스템을 지원합니다.
    5. 다양한 성능 모니터링 및 관리 도구를 제공하여 데이터베이스 인스턴스의 상태를 모니터링하고 성능을 최적화할 수 있습니다.

    3) Memcached

    Memcached는 분산 메모리 객체 캐시 시스템으로 다중 서버 환경에서 스케일 아웃이 가능하며, 데이터를 메모리에 저장합니다. 데이터는 키-값 형태로 저장되며, 복잡한 데이터 구조를 지원하지 않습니다.

    1. 분산 객체 캐싱 시스템입니다.
    2. 키-값 형태의 데이터를 저장하고 검색하는 데 사용됩니다.
    3. 분산 환경에서 사용하기 적합하며, 여러 서버 간에 데이터를 공유할 수 있습니다.
    4. Memcached는 단순한 키-값 저장소로서 복잡한 데이터 구조를 지원하지 않습니다.
    5. 메모리 사용량이 크고, 디스크에 데이터를 저장하지 않으므로 서버 장애 시 데이터 손실 수 있습니다.

    일반적으로 APCu, Redis 및 Memcached 모두 설치하고 운영할 수 있습니다.

    모든 시스템을 동시에 운영할 때는 서버 리소스 (메모리 및 CPU)를 고려해야 하며, 각 캐시 시스템의 설정과 운영 방법을 이해하고 최적화해야 합니다. 또한 데이터 일관성과 동기화 문제도 고려해야 합니다.

    2. APCu 캐싱

    1) APCu 설치

    APCu를 설치하기 위해 다음 명령어를 실행합니다.

    sudo apt install php8.2-apcu

    2) APCu 활성화(acpu.ini)

    PHP 설정 파일을 열기 위해 다음 명령어를 실행합니다. php 버전은 서버에 설치된 php 버전을 입력합니다.

    Apache 웹 서버를 사용한다면 /etc/php/8.2/apache2/php.ini을 수정해야 합니다.

    sudo nano /etc/php/8.2/apache2/php.ini

    PHP-FPM (PHP FastCGI Process Manager)에서 php를 사용한다면 sudo nano /etc/php/8.2/fpm/php.ini를 수정하거나 acpu.ini 파일을 수정합니다.
    만약 acpu.ini 파일이 없다면 /etc/php/8.2/mods-available/apcu.ini 파일을 생성하고 다음 내용을 붙여 넣습니다.

    sudo nano /etc/php/8.2/mods-available/apcu.ini
    extension = apcu.so
    apc.enabled = 1

    Read in English

    다음 명령어로 apcu 모듈을 활성화합니다.

     sudo phpenmod -v 8.2 apcu

    nginx 서버를 재시작하여 변경 사항이 적용되도록 합니다.

    sudo systemctl restart nginx

    3) APCu 실행 확인(acpu.ini)

    아래 명령어를 실행해서 phpinfo() 함수의 결과를 출력하고 APCu 관련 설정, 버전 정보, 디렉토리 경로 등을 확인할 수 있습니다.

    php -i | grep apcu

    1. Redis 캐싱

    1) Redis 설치

    Redis를 설치하기 위해 다음 명령어를 실행합니다. 설치가 완료되면 Redis 서버가 자동으로 시작됩니다

    sudo apt install redis-server

    2) Redis 상태 확인

    서비스 상태를 확인하기 위해 다음 명령어를 실행합니다.
    Redis 서버가 정상적으로 실행 중인지 확인한 후, 필요에 따라 Redis 구성 파일을 수정할 수 있습니다. 구성 파일은 /etc/redis/redis.conf 경로에 위치해 있습니다

    sudo systemctl status redis-server
    sudo usermod -a -G redis www-data
    

    3) 방화벽 설정(iptables)

    redis-server가 사용하는 6379 port 를 개방하고 iptable을 저장 및 리로드 합니다.

    sudo iptables -A INPUT -p tcp --dport 6379 -j ACCEPT
    sudo netfilter-persistent save
    sudo netfilter-persistent reload

    4) Redis와 php 연동

    Redis PHP 확장 모듈을 설치합니다.

    sudo apt install php8.2-redis

    nginx 서버를 재시작하여 변경 사항이 적용되도록 합니다.

    sudo systemctl restart nginx

    5) Redis 활성화(redis.ini)

    sudo nano /etc/php/8.2/mods-available/redis.ini에서 아래 코드를 추가합니다.

    sudo nano /etc/php/8.2/mods-available/redis.iniextension = redis.so

    PHP-FPM 서버를 재시작합니다.

    sudo systemctl restart php8.2-fpm

    새로운 PHP 파일을 생성하고 다음과 같은 코드를 작성하여 Redis와의 연결 및 작업을 확인할 수 있습니다(value 출력)

    <?php
    $redis = new Redis();
    $redis->connect('localhost', 6379);
    
    // 문자열 저장 및 조회 예제
    $redis->set("key", "value");
    echo $redis->get("key");
    
    // 해시 저장 및 조회 예제
    $redis->hSet("hash", "field", "value");
    echo $redis->hGet("hash", "field");
    
    // 연결 종료
    $redis->close();
    ?>

    2. Memcached 캐싱

    1) Memcached 설치

    Memcache를 설치하기 위해 다음 명령어를 실행합니다.

    sudo apt install memcached

    2) Memcached 서비스 시작

    다음 명령어를 실행해서 Memcached 서비스를 시작합니다.

    sudo systemctl start memcached
    sudo systemctl status memcached

    Memcached 서비스가 부팅시 자동으로 시작되도록 아래 코드를 실행합니다.

    sudo systemctl enable memcached

    3) 방화벽 설정(iptables)

    Memcached는 localhost(127.0.0.1)의 11211 포트에서 실행됩니다.
    Memcached가 실행되도록 iptables 11211 포트를 개방합니다.

    sudo iptables -A INPUT -p tcp --dport 11211 -j ACCEPT
    sudo netfilter-persistent save
    sudo netfilter-persistent reload

    추가로, Memcached를 사용하는 애플리케이션 구성을 위해 다음과 같은 설정 파일을 편집할 수 있습니다:

    • 메모리 할당량 수정: /etc/memcached.conf 파일에서 -m 옵션 값을 수정하여 할당량을 조정할 수 있습니다.
    • 바인딩 주소 수정: /etc/memcached.conf 파일에서 -l 옵션 값을 변경하여 다른 IP 주소로 바인딩할 수 있습니다.
    • 포트 수정: /etc/memcached.conf 파일에서 -p 옵션 값을 변경하여 다른 포트 번호로 설정할 수 있습니다.

    4) PHP 연동(php.ini)

    아래 명령어를 실행해서 패키지를 설치합니다.

    sudo apt install php8.2-memcached

    /etc/php/8.2/fpm/php.ini 파일 또는 /etc/php/8.2/mods-avaiable/memcached.ini 에서 extension=memcached.so 라인을 찾아 주석 해제하고 저장합니다.

    sudo nano /etc/php/8.2/mods-available/memcached.ini

    5) Memcached 작동 확인

    다음 코드를 사용하여 Memcached 서버에 연결하고 값을 저장하고 검색하며 테스트 할 수 있습니다.(value 출력 정상)

    <?php
    $memcached = new Memcached();
    $memcached->addServer('localhost', 11211);
    
    $memcached->set('key', 'value', 60); // 60초 동안 값 저장
    
    $value = $memcached->get('key');
    echo $value; // 저장된 값 출력
    ?>

    4. 추가 학습 자료

    APCu, Redis, Memcached와 관련된 공식 문서 및 참고 자료 링크입니다

    1) APCu

    2) Redis

    3) Memcached

    Thinknote

    함께 읽으면 좋은 글

  • 무료 HTTPS 설정(Let’s Encrypt, Cloudflare)

    1. HTTPS 설정 환경

    Let’s Encrypt와 Cloudflare를 함께 사용하여 HTTPS 연결을 설정할 수 있다

    1) Let’s Encrypt

    Let’s Encrypt는 무료로 SSL/TLS 인증서를 발급하는 인증 기관입니다. Ubuntu 시스템에서 Let’s Encrypt를 사용하면 웹 서버에 안전한 HTTPS 연결을 제공할 수 있습니다.

    1. 무료: Let’s Encrypt는 무료로 사용할 수 있는 공개 프로젝트입니다. 그래서 비용 문제 없이 SSL/TLS 인증서를 발급받을 수 있습니다.
    2. 자동화: Let’s Encrypt는 인증서 발급 및 갱신 프로세스를 자동화하여 편리하게 사용할 수 있도록 지원합니다. 이는 일반적으로 명령어 한 줄을 입력하는 것만으로 인증서를 발급하고 갱신할 수 있다는 의미입니다.
    3. 보안: Let’s Encrypt는 모든 연결에 대해 암호화된 HTTPS 연결을 제공함으로써 보안을 강화합니다. 이를 통해 사용자의 데이터와 개인 정보를 안전하게 보호할 수 있습니다.

    2) Cloudflare.com

    Cloudflare는 웹 보안 및 성능 최적화 서비스를 제공하는 회사입니다. 이 회사는 웹사이트의 속도, 보안 및 가용성을 향상시키기 위해 글로벌 네트워크를 통해 트래픽을 라우팅하고, 악성 행위로부터 보호하. 웹 콘텐츠를 압축 및 최적화하는 기능을 갖추고 있습니다.

    Cloudflare의 주요 기능은 이렇게 볼 수 있습니다

    1. CDN (Content Delivery Network): Cloudflare의 글로벌 네트워크를 통해 사용자들이 웹사이트에 더 빠르게 접근할 수 있도록 도와줍니다.
    2. 웹 방화벽: DDoS 공격, SQL 인젝션 등과 같은 악성 행위로부터 보호하기 위한 방화벽을 제공합니다.
    3. SSL/TLS 암호화: SSL/TLS 인증서를 사용하여 웹사이트를 안전하게 전송합니다.
    4. 성능 최적화: 캐싱, 이미지 최적화, 자바스크립트 최소화 등의 기술을 사용하여 웹사이트의 로딩 속도를 개선합니다.

    Cloudflare의 장점

    1. 높은 가용성: Cloudflare는 글로벌 네트워크를 통해 트래픽을 분산시키므로 웹사이트의 가용성이 향상됩니다.
    2. 보안 강화: DDoS 공격 및 다른 악성 행위로부터 보호하기 위한 강력한 웹 방화벽을 제공합니다.
    3. 성능 개선: 캐싱 및 최적화 기술을 사용하여 웹사이트의 로딩 속도를 개선합니다.

    2. Let’s Encrypy 패키지 설치 및 설정

    1) Let’s Encrypt 설치

    Certbot 설치: Certbot은 Let’s Encrypt의 공식 클라이언트로, 인증서 발급 및 관리에 필요한 도구입니다.

    다음 명령어로 Certbot을 설치합니다

    sudo apt update
    sudo apt install certbot

    python3-certbot-dns-cloudflare 패키지는 Certbot의 DNS-01 도메인 검증 방식을 사용하여 클라우드플레어(DNS 제공 업체) DNS 서버에 도메인 레코드를 자동으로 추가하고 관리하는 기능을 제공하며 다음 순서에 따라 작동합니다.

    1. Certbot은 도메인의 소유자임을 확인하기 위해 클라우드플레어 DNS 서버에 특정한 TXT 레코드를 추가하도록 요청합니다.
    2. python3-certbot-dns-cloudflare 패키지는 클라우드플레어 API를 사용하여 인증된 사용자 계정으로 로그인합니다.
    3. 패키지는 Certbot으로부터 전달받은 인증 요청 정보를 기반으로 클라우드플레어 DNS 서버에 TXT 레코드를 추가합니다.
    4. Certbot은 클라우드플레어 DNS 서버에 레코드가 반영되었는지 확인합니다.
    5. 인증이 성공적으로 완료되면 Certbot은 SSL/TLS 인증서를 발급받아 사용자가 지정한 경로로 저장합니다.

    다음 코드를 실행하여 python3-certbot-dns-cloudflare 를 설치합니다.

    sudo apt install python3-certbot-dns-cloudflare

    2) Cloudflare API 키 생성

    • Cloudflare 계정으로 로그인하고, “My Profile”로 이동합니다.
    • “API Tokens” 섹션으로 이동하고, “Create Token” 버튼을 클릭합니다.
    • “Use Template” 섹션에서 “Edit Zone DNS” 템플릿을 선택합니다.
    • Zone에 대한 액세스를 선택한 후, “Continue to Summary” 버튼을 클릭합니다.
    • Token 이름을 지정하고, 생성된 토큰 값을 안전한 곳에 저장합니다.

    Read in English

    3) API Token 저장

    /root/.secrets/certbot 디렉토리를 생성합니다.

    /root/.secrets/certbot/cloudflare.ini 파일을 생성합니다.

    sudo mkdir /root/.secrets/certbot
    sudo nano /root/.secrets/certbot/cloudflare.ini

    cloudflare.ini에 cloudflare 에서 확인한 token을 입력합니다.

    dns_cloudflare_email = cloudflare에_등록된_이메일
    dns_cloudflare_api_key = YOUR_CLOUDFLARE_API_TOKEN
    • example.com 을 자신의 도메인으로 변경해야 합니다.
    • /root/.secrets/certbot/cloudflare.ini는 아래와 같은 내용으로 생성되어야 합니다

    생성된 폴더와 파일의 권한을 변경합니다.

    sudo chmod 0700 /root/.secrets/certbot
    sudo chmod 0400 /root/.secrets/certbot/cloudflare.ini
    

    3. 인증서 발급

    1) 인증서 발급 코드

    인증서 발급을 원하는 도메인을 입력합니다. 여기서 서브 도메인을 인증한다면 서브 도메인을 입력합니다.

    sudo certbot certonly --dns-cloudflare --preferred-challenges dns-01 --dns-cloudflare-propagation-seconds 20 --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini -d example.com

    Enter email address (used for urgent renewal and security notices) (Enter ‘c’ to cancel): 자신의 이메일 주소를 입력합니다.(취소하려면 c)

    2) 코드 설명

    위의 코드는 Certbot을 사용하여 example.com 도메인에 대한 인증서를 생성하는 명령어입니다.

    1. certbot: Certbot 도구를 실행합니다.
    2. certonly: 인증서만 생성하고 웹 서버와 연결하지 않습니다. (인증서 발급만 수행)
    3. --dns-cloudflare: Cloudflare DNS에 대한 도메인 확인을 통해 인증서를 발급합니다.
    4. --preferred-challenges dns-01: DNS 기반의 도메인 확인 방식 중 하나인 dns-01을 사용합니다.
    5. --dns-cloudflare-propagation-seconds 20: Cloudflare DNS 업데이트가 완료되기까지 기다리는 시간(초)입니다. 여기에서는 20초로 설정되어 있습니다.
    6. --dns-cloudflare-credentials /root/.secrets/certbot/certbot-cloudflare.ini: Cloudflare API에 액세스하기 위한 인증 정보가 포함된 파일의 경로입니다. 여기에서는 /root/.secrets/certbot/cloudflare.ini 파일을 사용합니다.
    7. -d example.com: 인증서를 발급할 도메인 이름으로, 여기에서는 example.com이 사용됩니다.

    2) 발급 확인

    발급된 인증서는 /etc/letsencrypt/live 하위의 도메인 폴더에 생성됩니다.

    총 4개의 파일(cert.pem, chain.pem, fullchain.pem, privkey.pem)이 생성됩니다

    4. 추가 학습 자료

    Let’s Encrypt와 Certbot의 공식 문서 및 참고 자료 링크입니다

    Thinknote

    함께 읽으면 좋은 글

  • OpenSSL 설치

    1. OpenSSL 기능과 특징

    OpenSSL은 암호화와 보안 프로토콜을 구현하는 라이브러리 및 도구 모음입니다. 이는 주로 Linux 운영체제에서 사용되지만 다른 운영체제에서도 사용할 수 있습니다. Ubuntu 서버에 포함된 OpenSSL은 다음과 같은 기능과 특징을 가지고 있습니다:

    1. 암호화 및 해시 기능: OpenSSL은 다양한 암호화 알고리즘 (AES, DES, RSA 등) 및 해시 함수 (MD5, SHA-1, SHA-256 등)를 지원합니다. 이는 데이터의 보안을 유지하기 위해 사용자가 데이터를 안전하게 저장하거나 전송할 수 있게 합니다.
    2. SSL/TLS 프로토콜: OpenSSL은 SSL (Secure Sockets Layer) 및 TLS (Transport Layer Security) 프로토콜을 구현하는 데 사용됩니다. 이는 서버와 클라이언트 간의 통신을 암호화하여 데이터의 기밀성과 무결성을 보장하며, 중간자 공격으로부터 보호됩니다.
    3. 인증서 관리: OpenSSL은 X.509 인증서 형식을 지원하여 공개 키 인증서를 생성, 관리 및 검증 할 수 있습니다. 이는 서버와 클라이언트 간의 신뢰 관계를 확립하고, 전자 상거래 및 인증 시스템에서 사용됩니다.
    4. 암호화 키 및 CSR 생성: OpenSSL은 대칭 및 비대칭 암호화 키를 생성할 수 있습니다. 또한, 인증서 서명 요청 (CSR)을 생성하여 인증 기관에 보낼 수 있습니다. CSR은 서버 인증서 발급을 요청하기 위해 사용됩니다.
    5. 명령 줄 도구: OpenSSL은 명령 줄 도구를 포함하고 있어, 개발자 및 시스템 관리자가 암호화, 해시, 인증서 관리 등과 같은 작업을 수행 할 수 있습니다.
    6. 오픈 소스: OpenSSL은 오픈 소스 프로젝트로 공개되어 있으며, 많은 개발자들이 기여하고 있습니다. 이는 소스 코드에 대한 검증 및 보안 강화에 도움이 되며, 커뮤니티 지원과 업데이트를 받을 수 있는 장점이 있습니다.

    2. OpenSSL 설치

    1) OpenSSL 설치

    Ubuntu 서버의 OpenSSL은 위와 같은 기능과 특징을 제공하여 안전한 네트워크 통신을 구현하는 데 사용됩니다.

     sudo apt install openssl

    Read in English

    다음 명령어를 실행하여 OpenSSL을 설치합니다

    1) OpenSSL 버전 확인

    openssl version

    3. param 키 생성

    1) param 필요성

    Openssl을 사용하여 param 키를 생성하는 이유는 주로 다음과 같은 보안 알고리즘에 필요한 매개 변수를 생성하기 위해서입니다.

    1. Diffie-Hellman (DH) 키 교환: DH는 공개키 암호 시스템의 일종으로, 서로 다른 두 개의 개인 키를 공유하지 않고도 안전하게 통신을 할 수 있도록 합니다. DH에는 공유하는 매개 변수인 p와 g가 필요하며, 이러한 매개 변수는 OpenSSL을 사용하여 생성할 수 있습니다.
    2. RSA 암호화: RSA는 공개키 암호화 방식으로, 개인 키와 공개 키를 생성하기 위해 소수 p와 q를 사용합니다. OpenSSL을 사용하여 이러한 소수를 생성할 수 있습니다.

    2) DH 매개 변수 생성

    2048 비트 크기의 DH 매개 변수를 생성

    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

    4096 비트 크기의 DH 매개 변수를 생성

    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

    사용자의 요구에 따라 크기와 파일 이름을 변경할 수 있습니다. 또한 OpenSSL을 사용하여 다른 암호화 알고리즘에 필요한 매개 변수를 생성하는 방법도 있습니다.
    param 키는 OpenSSL에서 사용되는 Diffie-Hellman(DH) 키 교환 프로토콜에 필요한 매개 변수를 생성하는 데 사용됩니다. DH 프로토콜은 공개키 암호 시스템의 일종으로, 두 개체 간에 비밀 공유 키를 생성하기 위해 사용됩니다. 이러한 비밀 키는 보안된 통신을 위해 사용될 수 있습니다.

    4. 추가 학습 자료

    OpenSSL에 대해 더 많이 학습하고 싶다면 다음 자료들을 참고할 수 있습니다:

    Thinknote

    함께 읽으면 좋은 글

  • MariaDB 설치 및 관리(MySQL)

    1. ubuntu에 설치할 수 있는 데이터베이스 패키지

    1. MySQL: 유명한 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다.
    2. PostgreSQL: 강력한 오픈 소스 RDBMS로, 많은 기능과 확장성을 제공합니다.
    3. MongoDB: 문서 지향 NoSQL 데이터베이스입니다.
    4. SQLite: 경량의 오픈 소스 관계형 데이터베이스 엔진으로, 임베디드 시스템 및 작은 규모의 응용 프로그램에 적합합니다.
    5. Redis: 고성능 키-값 저장소로, 메모리 기반 데이터 구조 서버입니다.
    6. MariaDB: MySQL의 포크 버전으로, 호환성을 유지하면서 개선된 성능과 안정성을 제공합니다.

    2. MariaDB 이해

    MariaDB는 MySQL의 포크로 시작된 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다. MySQL과 완전히 호환되며, 사용자들은 기존의 MySQL 환경에서 MariaDB로 쉽게 마이그레이션할 수 있습니다. MariaDB는 많은 리눅스 배포판에서 기본적인 RDBMS로 사용되고 있습니다.

    1) MariaDB 특징

    • 성능: MariaDB는 대용량 데이터 처리에 뛰어난 성능을 제공합니다. 쿼리 최적화, 인덱싱 기능, 병렬 처리 등의 최적화 작업으로 성능 향상이 이루어졌습니다.
    • 확장성: MariaDB는 데이터베이스 서버를 수평 및 수직으로 확장할 수 있습니다. 마스터-슬레이브 복제 및 클러스터링과 같은 다양한 방식으로 확장성을 구현할 수 있습니다.
    • 보안: MariaDB는 데이터베이스 보안에 큰 중점을 두고 있습니다. SSL/TLS 암호화, 액세스 제어, 데이터 마스킹 등의 기능을 제공하여 데이터의 안전성을 보장합니다.
    • 개방성: MariaDB는 오픈 소스로 개발되었으며, 사용자들은 소스 코드에 접근하여 수정하고 개선할 수 있습니다. 또한 다양한 플러그인과 확장 기능을 제공하여 사용자의 요구에 맞게 커스터마이징할 수 있습니다.

    2) MariaDB 장점

    • MariaDB는 MySQL과 완전히 호환되므로, 기존의 MySQL 사용자들은 쉽게 마이그레이션할 수 있습니다.
    • MariaDB는 최적화된 쿼리 처리 및 인덱싱 기능으로 빠른 성능을 제공합니다.
    • MariaDB는 데이터베이스 서버를 유연하게 확장할 수 있습니다.
    • MariaDB는 많은 리눅스 배포판에서 안정적으로 사용되고 있으며, 오류 복구 및 내결함성을 위한 기능을 제공합니다.

    3) MariaDB 단점

    • MySQL에 비해 상대적으로 작은 커뮤니티를 가지고 있기 때문에, 문제 해결과 지원을 받기가 어려울 수 있습니다.
    • MariaDB는 MySQL과 호환되지만 일부 특정 기능에서 차이가 발생할 수 있으며, 이로 인해 일부 애플리케이션들이 제대로 동작하지 않을 수 있습니다.

    3. MariaDB 설치

    1) MariaDB 사전 준비

    ubuntu의 패키지를 업데이트 및 업그레이드를 진행합니다.

    sudo apt update
    sudo apt upgrade

    Read in English

    2) MariaDB 설치

    sudo apt install mariadb-server

    2) MariaDB 서비스 확인

    설치가 완료되면 MariaDB 서비스가 자동으로 시작됩니다. 서비스 상태를 확인하려면 다음 명령을 실행합니다:

    sudo systemctl status mariadb

    3) MariaDB 보안 스크립트 실행

    MariaDB를 보다 쉽게 구성하기 위해 다음 명령을 실행하여 보안 스크립트를 실행합니다:

    • Enter current password for root : 초기 설치시에는 패스워드가 없기에 enter를 실행합니다
    • Change the root password : Y를 입력하고 패스워드를 설정합니다.
    • Remove anonymou user: 익명 사용자를 제거하려면 Y를 입력합니다.
    • Disallow root login remotely: 원격 로그인을 활성화 하려면 Y, 비활성화 하려면 N를 입력합니다.
    • Remove test database and access to it: test 데이터베이스를 삭제하려면 Y를 입력합니다.
    • Reload privilege tables now: 변경 사항을 저장하려면 Y를 입력합니다.
    sudo mysql_secure_installation

    이제 MySQL 서버의 보안 설정이 완료되었습니다.

    Thinknote

    함께 읽으면 좋은 글

  • PHP R 연동 방법: 웹에서 R 스크립트를 호출하고 결과 받는 법

    PHP R 연동 방법: 웹에서 R 스크립트를 호출하고 결과 받는 법

    1. PHP와 R 코드 연동 실행

    PHP와 R 코드 연동: PHP와 R 코드를 연동해서 실행하는 것은 두 프로그래밍 언어의 장점을 결합하여 복잡한 웹 애플리케이션과 데이터 분석을 함께 처리할 수 있습니다. 하지만 여러 장단점이 존재하기에 개발 목표와 시나리오를 고려해서 PHP와 R 코드를 연동할 것인지 결정해야 합니다.

    Read in English

    php와 R 코드

    1) PHP와 R 코드 연동 장점

    1. 언어 전문성 활용: PHP는 웹 개발에, R은 데이터 분석에 강점을 가지고 있습니다. 두 언어의 각각의 장점을 활용할 수 있습니다.
    2. 코드 재사용: 이미 R로 작성된 데이터 분석 코드나 모델을 웹 애플리케이션에서 쉽게 재사용할 수 있습니다.
    3. 동적인 웹 콘텐츠 생성: PHP에서 R 코드를 실행하면 실시간 데이터 분석 결과를 웹사이트에 동적으로 표현할 수 있습니다.
    4. 복잡한 분석 가능: R은 통계 분석, 머신러닝, 그래프 생성 등 매우 다양한 데이터 분석 기능을 제공합니다.
    5. 시스템 리소스 효율성: 필요한 경우에만 R 코드를 실행하여 시스템 리소스를 효율적으로 활용할 수 있습니다.

    2) PHP와 R 코드 연동 단점

    1. 성능 이슈: PHP에서 R 코드를 실행하는 것은 일반적으로 느릴 수 있고, 대량의 데이터를 다루거나 복잡한 분석을 할 때에는 특히 성능에 문제가 될 수 있습니다.
    2. 보안 취약성: execshell_exec 같은 함수를 사용하면 서버가 취약해질 위험이 있습니다. 이러한 함수를 사용할 때는 신중해야 합니다.
    3. 환경 설정과 관리: R과 PHP를 함께 실행하려면 두 환경을 모두 잘 설정하고 유지해야 하며, 이로 인해 복잡성이 증가할 수 있습니다.
    4. 에러 처리: 두 언어간의 연동에서는 에러 처리가 복잡해질 수 있습니다. PHP와 R 양쪽에서 발생할 수 있는 에러를 모두 캐치하고 관리해야 합니다.
    5. 메모리 사용량: R은 메모리를 상당히 많이 사용하는 언어입니다. PHP 프로세스와 R 프로세스가 동시에 실행되면 메모리 사용량이 크게 증가할 수 있습니다.
    6. 버전 호환성: 시간이 지남에 따라 R 라이브러리나 PHP 패키지가 업데이트되고, 이로 인해 호환성 문제가 발생할 수 있습니다.

    2. exec 함수를 사용하여 PHP에서 R 코드 실행

    PHP의 exec() 함수를 사용하여 R 코드를 실행하는 것은 PHP에서 외부 프로그램을 실행할 수 있는 간단한 방법입니다. 이 방법은 일반적으로 PHP가 실행되는 서버에 R이 설치되어 있어야 하며, exec() 함수가 서버 설정에서 비활성화되지 않았는지 체크해 두세요.

    1) 개념

    exec() 함수는 PHP에서 외부 프로그램을 실행할 때 사용합니다. 이 함수를 사용하여 R 스크립트를 실행하려면, 명령 줄에서 R 스크립트를 실행하는 명령어를 인수로 전달하면 됩니다. 일반적으로 이 명령어는 Rscript입니다.

    exec("Rscript [R 스크립트 경로]", $output);

    2) 예제1

    예제1은 PHP의 exec() 함수를 사용하여 R 스크립트 simple_example.R을 실행하는 매우 간단한 예시입니다.

    R 스크립트 (simple_example.R):

    result <- 1 + 1
    cat(result)

    PHP 코드:

    <?php
    exec("Rscript simple_example.R", $output);
    echo "R output: " . implode("\n", $output);
    ?>

    2) 예제2

    예제2는 PHP에서 R 스크립트를 실행하여 선형 모델을 적합하고, 그 결과를 요약하여 텍스트 파일에 저장하는 과정을 드러납니다. 이후에 PHP 코드는 이 텍스트 파일을 읽어 출력합니다.

    R 스크립트 (linear_model.R):

    x <- c(1, 2, 3, 4, 5)
    y <- c(2, 4, 1, 8, 7)
    fit <- lm(y ~ x)
    summary_str <- capture.output(summary(fit))
    write(summary_str, "summary.txt")

    PHP 코드:

    <?php
    exec("Rscript linear_model.R");
    
    // R로부터 생성된 summary.txt 파일을 읽기
    $summary = file_get_contents("summary.txt");
    echo "R Summary:\n$summary";
    ?>

    3) 예제3

    예제3는 R 스크립트와 PHP가 CSV 파일을 읽고 쓰는 과정을 통해 상호작용하는 방법을 드러납니다. 이 예제에서는 특히 R 스크립트가 명령 줄 인자를 받아 동적으로 처리하는 방법을 설명합니다.

    R 스크립트 (data_processing.R):

    args <- commandArgs(trailingOnly = TRUE)
    input_file <- args[1]
    output_file <- args[2]
    
    data <- read.csv(input_file)
    data$sum <- rowSums(data[, c("col1", "col2")])
    
    write.csv(data, output_file)

    PHP 코드:

    <?php
    $input_file = "input.csv";
    $output_file = "output.csv";
    
    exec("Rscript data_processing.R $input_file $output_file");
    
    // R로부터 생성된 output.csv 파일을 읽기
    $output_data = file_get_contents("output.csv");
    echo "R Output Data:\n$output_data";
    ?>

    주의사항

    • exec() 함수는 서버에서 비활성화되지 않았는지 체크해 두세요.
    • 보안 문제: exec() 함수는 잘못 사용되면 서버의 보안에 문제를 일으킬 수 있으므로 주의가 해야 합니다.
    • 에러 처리: exec() 함수는 기본적으로 실패시에 PHP 경고를 출력하지 않으므로, 별도의 에러 처리 로직을 구현해야 할 수 있습니다.

    3. Rserve 패키지를 사용하여 PHP에서 R 코드 실행

    1) Rserve 개념

    Rserve는 R에서 제공하는 패키지 중 하나로, R을 서버로 운영하게 해주는 패키지입니다. 일반적으로 R은 대화형 통계 계산을 위한 도구로 사용되지만, Rserve를 통해 R을 서버로서 운영하고 다른 애플리케이션(예: PHP, Java, Python 등)에서 R 코드를 실행할 수 있습니다. 이러한 작업은 TCP/IP 프로토콜을 사용하여 이루어집니다.

    • TCP/IP 프로토콜 지원: 다른 언어나 프레임워크와 통신이 쉽습니다.
    • 다중 세션 지원: 여러 사용자가 동시에 R의 서비스를 사용할 수 있습니다.
    • 플랫폼 독립성: 다양한 운영 체제와 언어에서 사용할 수 있습니다.
    • 진입 장벽이 낮음: R에 익숙한 사용자는 비교적 쉽게 Rserve를 사용할 수 있습니다.

    2) 장단

    1. 언어 간의 통합 가능: R만의 특별한 데이터 분석 라이브러리나 기능을 다른 언어에서 쉽게 이용할 수 있습니다.
    2. 성능 최적화: R 작업을 별도의 서버에서 처리하므로 웹 서버의 부하를 줄일 수 있습니다.
    3. 코드 재사용성: 같은 R 코드를 여러 애플리케이션에서 재사용할 수 있습니다.
    4. 동시성: 여러 사용자가 동시에 R 분석을 수행할 수 있습니다.

    3) 단점

    1. 설정 복잡성: R과 Rserve, 그리고 다른 프로그래밍 언어 사이의 인터페이스를 설정해야 하는 복잡성이 있을 수 있습니다.
    2. 디버깅 어려움: R과 다른 언어 간의 연동은 디버깅을 복잡하게 만들 수 있습니다.
    3. 보안 취약성: TCP/IP를 통해 통신하기 때문에, 잘못 구성하면 보안 취약점이 될 수 있습니다.

    4) 기본 사용

    1. R에서 Rserve를 설치합니다:
      install.packages("Rserve")
    2. R에서 Rserve를 시작합니다:
      library(Rserve)
      Rserve()
    3. PHP Rserve 클라이언트를 설치합니다. composer.json 파일을 생성하고 아래 내용을 추가합니다.
      {
          "require": {
              "cturbelin/rserve-php": "^2.1"
          }
      }
    4. 터미널에서 composer instll을 실행하면 vendor폴더가 생성되고 관련 파일이 포함됩니다
    5. PHP 코드에서 R 함수를 호출합니다:
      <?php
      require './vendor/autoload.php';
      define('RSERVE_HOST', 'localhost');
      use Sentiweb\Rserve\Connection;
      use Sentiweb\Rserve\Parser\NativeArray;
      $cnx = new Connection(RSERVE_HOST);
      $r = $cnx->evalString('2+2'
      );
      echo $r;
      ?>
    6. 실행시 에러가 발생된다면 php-mbstring이 올바르게 설치되어 있는지를 체크해 두세요.

    5) 여러 줄 사용

    $r->evalString() 안에 여러 줄의 R 코드를 넣어 실행할 수 있습니다. R 코드를 문자열로 여러 줄에 걸쳐 작성하면 됩니다.

    <?php
    require './vendor/autoload.php';
    define('RSERVE_HOST', 'localhost');
    use Sentiweb\Rserve\Connection;
    use Sentiweb\Rserve\Parser\NativeArray;
    $cnx = new Connection(RSERVE_HOST);
    
    // 여러 줄의 R 코드
    $script = <<<RSCRIPT
    x <- c(1, 2, 3, 4, 5)
    y <- c(2, 4, 1, 8, 7)
    fit <- lm(y ~ x)
    summary_fit <- summary(fit)
    RSCRIPT;
    
    $r->evalString($script);
    
    $summary = $cnx->evalString('capture.output(summary_fit)');
    foreach($summary as $line) {
        echo $line . "\n";
    }
    ?>

    이 예제에서는 R 코드를 HereDoc (<<<RSCRIPT ... RSCRIPT;) 형식으로 작성하여 여러 줄을 포함시켰습니다. 그 후, evalString() 메서드를 호출하여 이 여러 줄의 코드를 한 번에 실행하고 있습니다.

    이렇게 하면 복잡한 R 스크립트도 PHP에서 실행할 수 있습니다.

    3. Rserve 패키지를 사용하여 PHP에서 R 코드 실행

    Rserve는 웹 서버나 다른 애플리케이션에서 복잡한 통계 분석이나 데이터 처리를 필요로 할 때 유용하게 사용될 수 있습니다. 하지만 사용 전에 위에서 언급한 장단점을 충분히 고려해야 합니다.

    R 프로그램을 다운로드하려면 R 프로그램 공식 웹사이트(https://www.r-project.org/)에서 다운로드 링크를 클릭하여 다운로드할 수 있습니다.

    R 프로그램 모두보기 :

    함께 읽으면 좋은 글

  • unnest_tokens 함수 사용법: R 텍스트 마이닝에서 단어로 나누는 방법

    unnest_tokens 함수 사용법: R 텍스트 마이닝에서 단어로 나누는 방법

    unnest_tokens () 함수는 R 프로그래밍 언어의 tidytext 패키지에 포함되어 있는 함수로, 텍스트 데이터를 토큰 단위로 분리합니다. 이 함수는 ‘tidy data’ 형식에 적합하게 텍스트를 처리하므로, 텍스트 마이닝 및 자연어 처리에 유용합니다. 이 함수는 각 토큰을 새로운 행으로 만들며, 텍스트가 포함된 열 외의 다른 열은 그대로 유지됩니다.

    Read in English

    unnest_tokens

    unnest_tokens 함수는 R 텍스트 마이닝에서 문장이나 문서를 단어 단위로 나누는 핵심 도구입니다. 텍스트 자료를 분석하려면 먼저 문장을 토큰으로 쪼개고, 단어 빈도나 감성 분석처럼 다음 단계로 연결할 수 있어야 합니다. 이 글은 tidytext 기반 토큰화 흐름과 unnest_tokens 함수의 사용법을 정리합니다.

    1. unnest_tokens() 개념

    unnest_tokens() 함수는 R의 tidytext 패키지에 포함되어 있으며, 텍스트 데이터를 토큰화(tokenization)하는 데 사용됩니다. 토큰화란 긴 텍스트 문자열을 더 작은 단위, 예를 들어 단어나 문장으로 분해하는 과정입니다.

    이 함수는 텍스트 데이터를 처리하고 분석하기 쉬운 형태로 변환하는 데 유용합니다. 예를 들어, 하나의 문서나 문장을 구성하는 단어들을 분리할 수 있습니다.

    1) 설치와 라이브러리 로딩

    install.packages("tidytext")
    library(tidytext)

    2) unnest_tokens 기본 사용법

    기본적인 함수의 형태는 이렇게 볼 수 있습니다.

    unnest_tokens(data, output_column, input_column, token = "words", ...)
    • data: 토큰화할 데이터 프레임.
    • output_column: 토큰을 저장할 새로운 열의 이름.
    • input_column: 토큰화할 텍스트가 들어있는 열의 이름.
    • token: 토큰의 유형 (기본값은 “words”).

    예제

    library(dplyr)
    library(tibble)
    
    # 예제 데이터
    data <- tibble(id = c(1, 2), text = c("I love R", "Data science is awesome"))
    
    # 단어로 토큰화
    tokenized_data <- data %>%
      unnest_tokens(word, text)
    
    # 결과 확인
    print(tokenized_data)

    이 예제에서는 id 열과 text 열을 가진 tibble 데이터 프레임을 사용했습니다. unnest_tokens() 함수를 적용하여 text 열의 텍스트를 단어 단위로 토큰화했고, 그 결과를 새로운 word 열에 저장했습니다.

    추가 옵션

    • drop : FALSE로 설정하면 입력 열을 결과에 포함합니다.
    • to_lower : FALSE로 설정하면 대/소문자를 구분합니다.
    • strip_numeric, strip_punct, strip_mark, collapse 등: 추가적인 텍스트 클리닝 옵션들.

    이 함수는 매우 유연하므로 다양한 텍스트 데이터에 적용할 수 있습니다. 여러 토큰화 옵션과 다른 tidytext 함수와 함께 사용하여 더 복잡한 텍스트 분석 작업을 수행할 수 있습니다.

    • 토큰(Token): 텍스트를 분석할 때 기본 단위가 되는 것으로, 보통 단어나 구절, 문장 등이 될 수 있습니다.
    • Tidy Text: 각 단어(토큰)가 하나의 행을 이루고, 문서나 다른 식별자와 함께 저장되는 텍스트 데이터 형식을 뜻합니다.

    2. unnest_tokens 매개변수

    unnest_tokens() 함수는 여러 가지 옵션을 가지고 있어 텍스트를 토큰화하는 과정을 세밀하게 조절할 수 있습니다. 아래에 몇 가지 주요 옵션을 설명하겠습니다.

    1) 기본 매개변수:

    1. data: 토큰화할 데이터 프레임.
    2. output_column: 토큰을 저장할 새 열의 이름.
    3. input_column: 토큰화할 텍스트가 들어 있는 열의 이름.
    4. token: 토큰의 유형 (예: “words”, “characters”, etc.)

    2) 추가적인 옵션:

    1. drop: 논리형. 입력 열을 결과에서 제거할지 여부. 기본값은 TRUE.
    2. to_lower: 논리형. 모든 문자를 소문자로 변환할지 여부. 기본값은 TRUE.
    3. strip_numeric: 논리형. 숫자를 제거할지 여부. 기본값은 FALSE.
    4. strip_punct: 논리형. 구두점을 제거할지 여부. 기본값은 FALSE.
    5. collapse: 문자열. 이 문자열로 토큰을 연결할지 여부. 기본값은 NULL.
    [ 예시 코드 ]
    library(dplyr)
    library(tidytext)
    
    # 예제 데이터
    data <- tibble(id = c(1, 2), text = c("I love R", "Data science is awesome"))
    
    # 단어로 토큰화, 원래 열을 유지, 대문자 유지
    tokenized_data <- data %>%
      unnest_tokens(word, text, drop = FALSE, to_lower = FALSE)
    
    # 결과 확인
    print(tokenized_data)

    3) 비고

    • drop = FALSE를 설정하면, 토큰화 후에도 원래의 input_column이 결과에 유지됩니다.
    • to_lower = FALSE를 설정하면, 대/소문자를 그대로 유지합니다.
    • strip_numeric = TRUE로 설정하면, 숫자가 제거됩니다.
    • strip_punct = TRUE로 설정하면, 구두점이 제거됩니다.

    이러한 옵션을 조합하여 토큰화의 정밀도를 높이거나, 전처리 과정을 단순화할 수 있습니다.

    • input: 토큰화할 텍스트가 들어있는 열의 이름입니다.
    • output: 토큰화된 결과를 저장할 새로운 열의 이름입니다.
    • token: 어떤 단위로 토큰화할지 결정하는 옵션입니다. ‘words’, ‘characters’, ‘ngrams’, ‘sentences’, ‘lines’, ‘paragraphs’, ‘regex’ 등이 있습니다.

    4) 생략

    unnest_tokens() 함수에서 inputoutput 매개변수는 생략 가능하긴 하지만, 그 경우 함수는 데이터 프레임의 첫 번째 열을 input으로, wordoutput 열 이름으로 기본 설정을 사용하게 됩니다. 그래서 다음과 같은 형태로도 사용할 수 있습니다:

    text %>%
      unnest_tokens(token = "sentences")

    하지만 이렇게 할 경우, 어떤 열이 토큰화되는지와 토큰이 어떤 열에 저장되는지 명확하게 코드만으로 이해하기 어려울 수 있습니다. 코드의 가독성과 유지 보수를 위해 명시적으로 inputoutput을 지정하는 것이 좋습니다.

    명시적으로 열 이름을 지정해주면 코드를 읽는 사람이나 나중에 코드를 수정할 때 해당 열이 무엇을 의미하는지 더 쉽게 알 수 있기 때문에 추천되는 방식입니다.

    R 프로그램을 다운로드하려면 R 프로그램 공식 웹사이트(https://www.r-project.org/)에서 다운로드 링크를 클릭하여 다운로드할 수 있습니다.

    R 프로그램 모두보기 :

    함께 읽으면 좋은 글

    핵심 확인 체크리스트

    • 분석할 텍스트 컬럼이 명확한가?
    • 문장·단어·n-gram 중 어떤 단위로 나눌지 정했는가?
    • 토큰화 후 불용어 제거와 빈도 분석 계획이 있는가?
    • 한글 텍스트 처리에서 형태소 분석이 필요한지 확인했는가?

    함께 읽으면 좋은 R통계 글

    FAQ

    unnest_tokens 함수는 어떤 역할을 하나요?

    unnest_tokens 함수는 긴 텍스트를 분석 가능한 작은 단위로 나눕니다. 문장, 단어, n-gram 등으로 분리한 결과를 데이터프레임 형태로 만들어 빈도 분석이나 시각화에 활용할 수 있습니다.

    R 텍스트 마이닝에서 토큰화가 왜 필요한가요?

    컴퓨터가 문서 전체를 바로 의미 단위로 분석하기는 어렵습니다. 토큰화는 텍스트를 단어 같은 분석 단위로 나누어 빈도, 공출현, 감성 점수 등을 계산할 수 있게 만드는 전처리 단계입니다.

    unnest_tokens 결과는 단어 빈도 분석과 어떻게 연결되나요?

    토큰화 결과는 보통 한 행에 하나의 단어가 들어가는 형태가 됩니다. 이후 count, group_by, arrange 같은 dplyr 함수를 사용하면 단어 빈도표나 상위 키워드 목록을 만들 수 있습니다.

  • Tibble 이해와 as_tibble() 함수

    Tibble 이해와 as_tibble() 함수

    1. Tibble 이란?

    Tibble 은 R에서 데이터를 다루기 위한 데이터 구조 중 하나로 R의 데이터 프레임(data.frame)을 좀 더 유용하게 확장한 것으로 보면 됩니다.

    Read in English

    tibble

    Tibble 은 tidyverse 패키지의 일부로 제공되며, 데이터 프레임과 호환성이 있습니다. Tibble은 데이터 출력이 보기 좋고, 부분적으로 큰 데이터를 처리할 때 유용하며, 변수 유형이나 변수 이름을 다룰 때 더 간편합니다.

    1) 주요 특징

    • 출력: Tibble은 콘솔에 출력될 때 가독성이 높습니다. 먼저 10개의 행만 보여주고, 전체 열을 보여주지 않을 수도 있습니다.
    • 열 데이터 유형: Tibble은 열 데이터 유형을 더 잘 유지합니다. 예를 들어, 문자형 데이터는 문자형으로 유지됩니다.
    • 열과 행 부분 선택: Tibble은 [[]] 또는 $을 사용할 때도 더 안정적입니다. 예를 들어, 존재하지 않는 열 이름을 요청하면 에러를 반환합니다.

    2) Tibble 생성하기

    Tibble을 생성하는 방법은 여러 가지입니다.

    • tibble() 함수를 사용하여 직접 생성:
    library(tibble) my_tibble <- tibble(x = 1:5, y = 1, z = x ^ 2 + y)
    • 기존의 데이터 프레임을 as_tibble() 함수로 변환:
    my_data_frame <- data.frame(x = 1:5, y = 1, z = x ^ 2 + y) my_tibble <- as_tibble(my_data_frame)
    • tibble() 함수를 사용하여 직접 생성: library(tibble) my_tibble <- tibble(x = 1:5, y = 1, z = x ^ 2 + y)
    • 기존의 데이터 프레임을 as_tibble() 함수로 변환: my_data_frame <- data.frame(x = 1:5, y = 1, z = x ^ 2 + y) my_tibble <- as_tibble(my_data_frame)

    3) Tibble 사용하기

    Tibble은 데이터 프레임과 거의 유사하게 작동하므로, 대부분의 데이터 프레임 함수와 호환됩니다.

    # 열 선택
    my_tibble$x
    # 행 선택
    my_tibble[1:2,]
    # dplyr 사용
    library(dplyr)
    my_tibble %>% filter(x > 2)

    4) Tibble 추가 기능

    Tibble은 또한 몇 가지 추가적인 기능과 옵션을 제공합니다. 예를 들어, 데이터 유형을 강제할 수 있고, 행과 열에 대한 메타 데이터를 추가할 수 있습니다.

    Tibble은 기존의 데이터 프레임보다 다루기 쉽고, 가독성이 높으며, 큰 데이터 셋을 효과적으로 다룰 수 있습니다.

    tibble은 R에서 데이터를 다룰 때 사용되는 데이터 프레임(data.frame)의 하위 클래스입니다. tibble은 tidyverse의 일부로, 다양한 방법으로 데이터 처리를 더 간편하고 효율적으로 해줍니다. as_tibble() 함수는 주어진 데이터 객체를 tibble 객체로 변환해줍니다.

    3) Tibble 데이터 타입 확인

    tibble 데이터 타입을 확인하기 위해서는 tibble 패키지를 설치해야 합니다

    install.packages("tibble")

    tibble 데이터는 is_tibble로 확인하면 된다. class(ti_iris)의 출력값 [1] “tbl_df” “tbl” “data.frame”는 ti_iris 객체가 여러 클래스를 가지고 있다는 것을 나타냅니다. R에서는 하나의 객체가 여러 클래스를 가질 수 있으며, 이는 객체의 상속 구조를 반영합니다.

    1. “tbl_df”: 이는 ti_iris가 tibble 형태의 데이터 프레임임을 나타냅니다. tbl_df는 tibble 패키지에서 정의된 클래스입니다.
    2. “tbl”: 이 클래스는 tbl_df의 상위 클래스로, tbl 객체의 기본적인 특성을 나타냅니다. 이것은 보통 tbl_df와 함께 나타나며, tibble 패키지에서 정의됩니다.
    3. “data.frame”: 이는 ti_iris가 기본적으로 일반적인 R 데이터 프레임이기도 하다는 것을 나타냅니다. data.frame은 R의 기본 클래스 중 하나입니다.
    is_tibble(ti_iris)
    TRUE
    class(ti_iris)
    [1] "tbl_df"     "tbl"        "data.frame"

    2. as_tibble() 함수 이해

    as_tibble() 함수는 다양한 데이터 객체(예: data.frame, matrix 등)를 tibble 형태로 변환합니다. tibble은 데이터 프레임과 유사하지만 몇 가지 중요한 차이점이 있습니다. 예를 들어, tibble은 데이터 출력을 더 깔끔하게 해주고, 변수 유형을 더 유연하게 다룰 수 있습니다.

    as_tibble() 함수는 데이터를 tibble 형태로 변환하는데 사용되며, 다양한 옵션을 지원합니다. 아래는 그 옵션들에 대한 자세한 설명입니다:

    1) x

    첫 번째 인자 x는 변환하려는 데이터입니다. 이것은 벡터, 리스트, 데이터 프레임, 행렬 등 여러 형태를 가질 수 있습니다.

    as_tibble(data.frame(x = 1:3, y = 4:6))

    2) .rows

    .rows 옵션은 불러올 행의 수 또는 범위를 지정합니다. 이를 사용하면 큰 데이터셋에서 일부 행만 선택할 수 있습니다.

    as_tibble(iris, .rows = 1:5)

    3) .name_repair

    .name_repair 옵션은 열 이름을 어떻게 다룰지 지정합니다. 이 옵션은 다음 값을 가질 수 있습니다:

    • “minimal”: 아무런 수정도 하지 않습니다.
    • “unique”: 열 이름을 고유하게 만듭니다.
    • “universal”: 유효한 열 이름으로 변환합니다.
    • “check_unique”: 열 이름이 고유한지 확인하고, 그렇지 않으면 에러를 발생시킵니다.
    as_tibble(data.frame(x = 1, x = 2), .name_repair = "unique")

    4) .col_names (deprecated)

    이 옵션은 이전 버전에서 열 이름을 지정하는 데 사용되었으나 현재는 사용되지 않습니다. 대신 .name_repair을 사용하세요.

    5) … (deprecated)

    이것은 추가적인 인자를 받기 위한 옵션으로, 현재는 사용되지 않습니다.

    예제:

    # .name_repair을 이용한 열 이름 수정
    as_tibble(data.frame(` ` = 1:3, x = c('a', 'b', 'c')), .name_repair = "universal")
    # .rows를 이용한 일부 행만 선택
    as_tibble(mtcars, .rows = 1:5)

    이러한 옵션들을 조합하면 매우 다양한 데이터 변환 작업을 수행할 수 있습니다.

    3. as_tibble() 함수 주요 사용법

    1) 기본 사용법

    • as_tibble(x, …)

    x: 대상 데이터 객체
    ...: 추가적인 옵션 인수

    2) 데이터 프레임을 tibble로 변환

    # tibble 패키지 로드
    library(tibble)
    # 데이터 프레임 생성
    df <- data.frame(name = c("Alice", "Bob", "Carol"),
                     age = c(30, 40, 50))
    # as_tibble로 변환
    df_tibble <- as_tibble(df)
    # 결과 출력
    print(df_tibble)

    3) 행렬을 tibble로 변환

    # 행렬 생성
    mat <- matrix(1:6, nrow = 2)
    # as_tibble로 변환
    mat_tibble <- as_tibble(mat)
    # 결과 출력
    print(mat_tibble)

    4) 리스트를 tibble로 변환

    리스트의 경우, 각 리스트 요소는 tibble의 각 열이 됩니다.

    # 리스트 생성
    lst <- list(name = c("Alice", "Bob"), age = c(30, 40))
    # as_tibble로 변환
    lst_tibble <- as_tibble(lst)
    # 결과 출력
    print(lst_tibble)

    4. as_tibble() 복잡한 예시

    1) 중첩된 데이터

    as_tibble 함수는 리스트의 리스트와 같은 중첩된 데이터 구조도 처리할 수 있습니다.

    # 중첩된 리스트
    nested_list <- list(
      meta = list(name = "sample", version = "1.0"),
      data = list(
        id = 1:3,
        value = c("a", "b", "c")
      )
    )
    # 중첩된 리스트를 tibble로 변환
    nested_tibble <- as_tibble(nested_list)
    print(nested_tibble)

    여기서 nested_tibble은 meta와 data라는 두 개의 열을 가지며, 각 열은 다시 리스트로 이루어져 있습니다.

    2) 데이터 프레임과 리스트의 조합

    데이터 프레임의 일부 열이 리스트로 이루어져 있을 때도 as_tibble 함수가 유용합니다.

    # 리스트를 포함한 데이터 프레임
    df_with_list <- data.frame(
      id = 1:3,
      meta = I(list(
        list(name = "Alice", age = 30),
        list(name = "Bob", age = 40),
        list(name = "Carol", age = 50)
      ))
    )
    # as_tibble로 변환
    tibble_with_list <- as_tibble(df_with_list)
    print(tibble_with_list)

    이렇게 as_tibble 함수는 다양한 옵션과 함께 복잡한 데이터 구조도 유연하게 다룰 수 있습니다. 복잡한 데이터 분석이나 전처리 작업에서 이 함수의 다양한 기능을 활용하면 더욱 효율적인 결과를 얻을 수 있습니다.

    R 프로그램을 다운로드하려면 R 프로그램 공식 웹사이트(https://www.r-project.org/)에서 다운로드 링크를 클릭하여 다운로드할 수 있습니다.

    R 프로그램 모두보기 :

    함께 읽으면 좋은 글

  • 불필요한 공백 제거 str_squish 함수

    불필요한 공백 제거 str_squish 함수

    불필요한 공백 제거를 위해서는 str_squish 함수를 사용합니다. str_squish 함수는 R 프로그래밍 언어의 stringr 패키지에 포함되어 있으며, 문자열에서 앞뒤 및 중간의 공백을 제거하는 기능을 수행합니다. 불필요한 공백 제거를 위해서 str_squish 함수의 개념과 주요 사용법에 대해 확인해 보겠습니다.

    Read in English

    불필요한 공백제거

    1. str_squish의 개념

    str_squish()는 대상 문자열의 시작과 끝에 있는 불필요한 공백을 제거하고, 문자열 내부에 연속된 공백은 하나의 공백으로 줄입니다. 예를 들어 ” Hello World “라는 문자열이 있다면, str_squish() 함수를 적용하면 “Hello World”로 변환됩니다.

    # stringr 패키지 로드
    library(stringr)
    
    # 예제
    str_squish("   Hello   World  ")
    # 출력: "Hello World"

    2. 주요 사용법

    기본 사용법

    • str_squish(string)

    string: 대상 문자열

    1) 벡터에 적용

    str_squish 함수는 문자열 벡터에도 적용할 수 있습니다. 이 경우 각 문자열 요소에 함수가 적용됩니다.

    # 예제
    str_squish(c("   Hello  ", "  World  "))
    # 출력: "Hello" "World"

    2) 데이터 프레임에 적용

    dplyr 패키지와 함께 str_squish 함수를 사용하면 데이터 프레임의 특정 열에 함수를 적용할 수 있습니다.

    # dplyr 패키지 로드
    library(dplyr)
    
    # 예제 데이터 프레임
    df <- data.frame(name = c("  Alice  ", "  Bob  ", "  Carol  "),
                     age = c(30, 40, 50))
    
    # str_squish 적용
    df <- df %>%
      mutate(name = str_squish(name))
    
    # 결과 출력
    print(df)

    3. 마치며

    str_squish() 함수는 텍스트 데이터를 정제할 때 매우 유용한 도구입니다. 이 함수를 활용하면 복잡한 문자열 처리 작업을 간단하게 해결할 수 있습니다. 데이터 분석이나 텍스트 마이닝 작업에서 자주 사용되므로, 이 함수의 활용법을 익혀두면 좋습니다.

    R 프로그램을 다운로드하려면 R 프로그램 공식 웹사이트(https://www.r-project.org/)에서 다운로드 링크를 클릭하여 다운로드할 수 있습니다.

    R 프로그램 모두보기

    함께 읽으면 좋은 글