✕

카테고리

기술 ∨

목록닫기 ▲
⊞ 𝄘 ⊟
Android WebView 예제
인터넷 접근 권한 허가 layout activity xml java webview java 속성 추가 코드(파일 업로드 등)
2026. 09. 02.
2026. 09. 02. 조회수 표시생략
[Python] venv(가상환경) 사용법
1. 가상환경의 필요성 Python 프로젝트에서 패키지를 설치했을 때 패키지들 끼리 충돌 이슈를 겪지 않기 위해 개발환경 세팅에 많은 시간을 소모합니다. 불필요한 리소스 낭비를 막기 위해...
2026. 04. 07.
2026. 04. 07. 조회수 표시생략
[Let’s Encrypt] 와일드카드 인증서 발급 & Cloudflare 자동화 방법
1. 개요 Let’s Encrypt 와일드카드 인증서(*.domain.com)는 보안상 DNS-01 챌린지 방식만 지원합니다. 기존의 수동 방식(Manual)은 갱신 때마다 DNS TXT 레코드를 직접 수정해야 하는 번거로움이 있어, Cloudflare...
2025. 04. 28.
2025. 04. 28. 조회수 표시생략
mysql 설정 my.cnf
[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0skip-external-locking # 외부(TCP/IP) 잠금비활성skip-name-resolve  # 필수. 대신 도메인 기준으로 사용 못한다.# wait_timeout=200  # 커넥션 종료후 언제까지 기다릴지...
2024. 09. 01.
2024. 09. 01. 조회수 표시생략
Let’s encrypt 인증서 발급할 때 유의사항
Let’s encrypt는 Apache2나 Nginx를 운영할 때 SSL 인증서를 무료로 발급해 주는 툴이다. 구글, 모질라 재단 등에서 후원하고 있는 프로젝트이기도 하다. Let’s encrypt는 리눅스 터미널에서 명령어를...
2024. 08. 18.
2024. 08. 18. 조회수 표시생략
1 2 3 4

Android WebView 예제

인터넷 접근 권한 허가

 <uses-permission android:name="android.permission.INTERNET" />

layout activity xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".WebViewDemo">

    <WebView
        android:id="@+id/wvLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

java webview

package com.example.webview;

public class WebViewDemo extends AppCompatActivity {

    private WebView mWebView;
    private WebSettings mWebSettings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_demo);

        mWebView = findViewById(R.id.wvLayout);
        mWebView.loadUrl("https://mydomain.com/"); //연결할 url

java 속성 추가 코드(파일 업로드 등)

package com.example.webview;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebViewDemo extends AppCompatActivity {

    private WebView mWebView;
    private WebSettings mWebSettings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_demo);

        mWebView = findViewById(R.id.wvLayout);
        mWebView.loadUrl("https://mydomain.com/"); //연결할 url
        mWebView.setWebViewClient(new WebViewClient()); // 현재 앱을 나가서 새로운 브라우저를 열지 않도록 함.

        mWebSettings = mWebView.getSettings(); // 웹뷰에서 webSettings를 사용할 수 있도록 함.
        mWebSettings.setJavaScriptEnabled(true); //웹뷰에서 javascript를 사용하도록 설정
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(false); //멀티윈도우 띄우는 것
        mWebSettings.setAllowFileAccess(true); //파일 엑세스
        mWebSettings.setLoadWithOverviewMode(true); // 메타태그
        mWebSettings.setUseWideViewPort(true); //화면 사이즈 맞추기
        mWebSettings.setSupportZoom(true); // 화면 줌 사용 여부
        mWebSettings.setBuiltInZoomControls(true); //화면 확대 축소 사용 여부
        mWebSettings.setDisplayZoomControls(true); //화면 확대 축소시, webview에서 확대/축소 컨트롤 표시 여부
        mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 브라우저 캐시 사용 재정의 value : LOAD_DEFAULT, LOAD_NORMAL, LOAD_CACHE_ELSE_NETWORK, LOAD_NO_CACHE, or LOAD_CACHE_ONLY
        mWebSettings.setDefaultFixedFontSize(14); //기본 고정 글꼴 크기, value : 1~72 사이의 숫자

    }
}

[Python] venv(가상환경) 사용법

1. 가상환경의 필요성

Python 프로젝트에서 패키지를 설치했을 때 패키지들 끼리 충돌 이슈를 겪지 않기 위해 개발환경 세팅에 많은 시간을 소모합니다.

불필요한 리소스 낭비를 막기 위해 각 프로젝트마다 최적의 가상환경을 세팅하면 패키지가 전역에 깔리지 않게 됩니다.

2. venv 사용법

venv는 파이썬에 내장되어 있으므로 별도 설치가 필요 없습니다.

작업 중인 프로젝트 경로에 생성되기 때문에, 가상환경을 세팅할 폴더로 이동한 뒤 사용하면 됩니다.

가상환경을 설치할 경로로 이동

cd 가상환경을 설치할 경로

가상환경 생성

python -m venv 가상환경이름

가상환경 활성화 (활성화를 해야 가상환경이 켜짐)

source 가상환경이름/bin/activate

가상환경 비활성화 (가상환경 끄기)

deactivate

설치된 패키지 리스트 txt 파일로 변환

github에 가상환경 폴더를 ignore하고 푸시하고 싶을 때 패키지 리스트를 txt 파일로 변환할 수 있습니다.

pip freeze > requirements.txt

변환된 txt 파일로 패키지 설치하기

pip install -r 파일이름.txt

[Let’s Encrypt] 와일드카드 인증서 발급 & Cloudflare 자동화 방법

1. 개요

Let’s Encrypt 와일드카드 인증서(*.domain.com)는 보안상 DNS-01 챌린지 방식만 지원합니다. 기존의 수동 방식(Manual)은 갱신 때마다 DNS TXT 레코드를 직접 수정해야 하는 번거로움이 있어, Cloudflare API를 이용한 완전 자동화 설정을 권장합니다.

2. 주요 시행착오와 해결 방법

  • 명령어 오류: 블로그 등에서 명령어를 복사할 때 하이픈(-)이 긴 대시 (-)로, 따옴표(“)가 둥근 따옴표로 바뀌어 인식되지 않는 문제가 발생할 수 있습니다. 반드시 표준 ASCII 문자를 사용해야 합니다.
  • 수동 방식의 한계: _acme-challengs 레코드를 중복 등록하거나, DNS 전파 시간을 기다리지 않고 엔터를 누를 경우 NXDOMAIN 또는 Incorrect TXT record 에러가 발생합니다.
  • 알고리즘의 충돌: 기존 인증서가 ECDSA 방식일 때 새 명령어가 RSA를 시도하면 충돌이 발생합니다. –key-type ecdsa 옵션을 명시하여 해결할 수 있습니다.

3. Cloudflare DNS 플러그인 자동화 단계

3.1 패키지 업데이트 및 Certbot 설치

Let’s encrypt는 certbot를 통해 인증서를 발급해야 합니다. 아직 관련 패키지가 설치되어 있지 않았다면, 패키지 설치를 진행합니다.

// 패키지 업데이트
apt-get install update
// 패키지 설치
apt-get install certbot -y
3.2 플러그인 설치
apt-get install python3-certbot-dns-cloudflare
3.3 API 토큰 설정

Cloudflare 대시보드에서 Zone:DNS:Edit 권한을 가진 토큰을 생성한 뒤 서버에 저장합니다.

  • 파일 경로: 예) ~/.secrets/certbot/cloudflare.ini
  • 파일 내용: 예:) dns_cloudflare_api_token = YOUR_API_TOKEN
  • 보안 설정: chmod 600 ~/.secrets/certbot/cloudflare.ini
3.4 인증서 발급 및 자동 갱신 설정
certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
  --cert-name mydomain.com \
  --key-type ecdsa \
  -d "mydomain.com" -d "*.mydomain.com" \
  --preferred-challenges dns \
  --non-interactive \
  --agree-tos \
  -m  [email protected]
3.5 기존 수동/Standalone 인증서 전환 팁

기존에 manual이나 standalone 방식으로 발급받은 인증서가 있다면 certbot renew 시 에러가 발생합니다. 이때는 위 명령어를 –force-renewal 옵션과 함께 실행하여 인증서의 갱신 메커니즘 자체를 dns-cloudflare로 교체해 주어야 합니다.

3.6 최종 확인

설정이 완료된 후 아래 명령어를 실행하여 모든 도메인이 성공적으로 업데이트되는지 확인합니다.

certbot renew --dry-run

결과: “Congratulations, all simulated renewals succeeded:” 메시지가 나오면 정상적으로 인증서가 갱신되었습니다.

mysql 설정 my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-external-locking # 외부(TCP/IP) 잠금비활성
skip-name-resolve  # 필수. 대신 도메인 기준으로 사용 못한다.
# wait_timeout=200  # 커넥션 종료후 언제까지 기다릴지 설정. 보통은 알아서 사라진다. 기본 28800 . sleep 이 너무 많을 경우 설정
max_connections=200 # 최대 접속자수 시스템 필요량에 맞춰 설정

table_open_cache=800 # 기본 64. 모든 쓰레드에서 오픈할 수 있는 테이블 수, ulimit 에서 open file 도 같이 수정 필요. 낮은 버전은 table_cache 라는 이름을 사용한다. ( max_connections * N )
max_allowed_packet=16M # 적으면 긴 쿼리 날릴 때문제가 된다.16M 정도로 (설마 10MB이상으로 쿼리  날릴일 없겠지?)
# max_connections * (sort_buffer_size+read_buffer_size) 만큼 메모리가 사용될 수 있다.

sort_buffer_size=2M   # 소팅용 버퍼

read_buffer_size=2M  # 데이터 읽기용 버퍼
ft_min_word_len=2  # fultext 사용시 한글 사용할 경우, 2정도로 설정하라

key_buffer_size=268435456 # 기본 8M이다. MyISAM 인덱스용. MyISAM 중심이라면 이 값을 많이 늘려라. 메모리 50% 이상도 생각해봐라.
innodb_buffer_pool_size=4G  # 기본은 8M이다. 서버의 메모리에 맞춰서 설정 innoDB 중심이면 메모리의 80%까지 설정
innodb_log_file_size=256M # 기본 5M이다.
innodb_buffer_pool_size 의 10~25% 정도로 설정
innodb_file_per_table=1  # 기본 0(off) 이다. 설정하면 테이블 단위로
innoDB의 파일이 생긴다. (설정안하면 하나의 파일이 너무 커지니 설정하라)
slow_query_log=1 #슬로우쿼리 사용 설정. 디스크 I/O가 많이 예상되거나 너무 긴 쿼리가 많을경우 off(0) 해라slow_query_log_file=/var/run/mysqld/mysqld-slow.log #슬로우쿼리 파일 위치
long_query_time=2          # 슬로추 쿼리 기준 시간 2초 ~ 5초

tmp_table_size=64M  # 기본값:16M. 디스크 임시 테이블 크기

max_connect_error=10000  # 기본값: 10. 10000번 접속이 이상하면 접근 차단

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Let’s encrypt 인증서 발급할 때 유의사항

Let’s encrypt는 Apache2나 Nginx를 운영할 때 SSL 인증서를 무료로 발급해 주는 툴이다. 구글, 모질라 재단 등에서 후원하고 있는 프로젝트이기도 하다.

Let’s encrypt는 리눅스 터미널에서 명령어를 사용해야 하는데, 인증서 발급 시 유의사항이 있다.

Cleaning up challenges
Problem binding to port 80: Could not bind to IPv4 or IPv6.

80포트가 이미 사용 중이라서 certbot 명령어를 사용해 인증서를 발급 받을 수 없다고 출력이 되었다.

이 경우 아파치나 엔진엑스가 실행 중이라면 위와 같은 문구가 출력될 수가 있는 것이다. 따라서 아파치나 엔진엑스를 죽여주면 된다.

예: service apache2 stop (엔진 엑스를 사용중이라면 service nginx start)

서버 엔진이 죽었다면, 다시 certbot 명령을 사용해서 인증서를 발급받으면 된다. 만약 인증서를 발급받았다면, 다시 서버엔진을 실행해 주어야 한다.

예: service apche2 start (엔진 엑스를 사용중이라면 service nginx start)