만들고 운영하며 배운 기술 노트
Flutter, 앱 운영, 서버, 스크래핑, AI까지. 15개 이상의 앱을 실제로 운영하며 얻은 실무 기록.
- 웹·SEO 3개 언어 블로그를 411줄짜리 Python 정적 사이트 생성기로 만들기 Hugo 대신 직접 만든 이유와, hreflang·noindex 옛 글·광고 자리·JSON-LD·안전한 증분 FTP 배포를 어떻게 처리하는지.
- 서버·인프라 PHP에서 prepared statement로 바꾸면 JSON 타입이 바뀐다 mysqli의 query()를 prepared statement로 바꾸면 json_encode에서 "7"이 7이 된다. PHP 8.5 + MariaDB 11.8 실측과, 구버전 Flutter 앱이 죽는 이유.
- 서버·인프라 LiteSpeed .htaccess로 한글 URL 리라이트하기: 실측으로 확인한 것 패턴은 인코딩 전일까 후일까, 공백은 어떻게 쓸까, 301은 쿼리스트링을 남길까. 운영 중인 LiteSpeed에 요청 23번을 보내 확인한 결과와 안전한 실험 방법.
- 서버·인프라 호스팅 계정 이전 후 조용히 깨져 있던 다섯 가지 계정을 옮긴 뒤에도 모든 페이지가 200이었다. 그런데 FTP 루트, 크론 경로, Python venv, 실행 권한, 크론의 '분' 설정이 소리 없이 깨져 있었다.
- Flutter 앱 16개를 8주 만에 최신 Flutter로 옮기며 깨진 것들 2026년 5~7월, 웹뷰 래퍼였던 앱 6개를 네이티브 Flutter로, 오래된 Flutter 앱 10개를 최신으로 바꿨다. 빌드 오류, 심사 반려, 되돌린 변경의 기록.
- 앱 출시·운영 공유 호스팅의 PHP 크론으로 FCM 예약 푸시 보내기 Flutter 앱 8개에 당첨 결과 알림을 5분 주기 PHP 크론과 FCM HTTP v1로 보낸다. 데이터가 나왔을 때만, 하루 한 번, 그리고 200을 믿지 않는다.
- Flutter Dart http 클라이언트는 POST의 301을 따라가지 않는다: 실측과 해결 Flutter 앱의 검색이 서버의 301 때문에 조용히 실패하고 있었다. Dart 3.11과 http 1.6이 리다이렉트 코드마다 어떻게 동작하는지 curl과 비교하고, 검증한 해결법을 정리했다.
- 서버·인프라 호스팅 CDN이 API 응답과 301까지 캐시하고 있었다 라우팅을 바꾼 뒤 API URL 4개가 CDN에서 옛 301을 계속 돌려줬다. Hostinger CDN이 무엇을 캐시하는지 헤더별로 실측하고, 속지 않는 검증 방법을 정리했다.
- 앱 출시·운영 앱 개인정보처리방침은 기억이 아니라 매니페스트로 쓴다 스토어 등록 24건이 예시 문구가 남은 템플릿을 가리키고 있었다. 앱 17개의 방침을 pubspec, Info.plist, 병합된 Android 매니페스트로 다시 만든 기록.
- 앱 출시·운영 Flutter 앱 17개의 AdMob 빈도를 자체 서버에서 조절하기 Firebase Remote Config를 141줄짜리 PHP 엔드포인트로 바꾼 이유, 앱 쪽 대비책, 그리고 다시 빌드하지 않고 광고 간격을 바꿨을 때 CTR이 어떻게 움직였는지.
- 웹·SEO 앱스토어 등록 URL을 끊지 않고 WordPress를 정적 사이트로 옮기기 스토어 등록 24건이 WordPress 페이지를 개인정보처리방침 URL로 쓰고 있었다. LiteSpeed에서 등록 URL을 모두 200으로 유지한 채 5분 만에 전환한 기록.
- 서버·인프라 구버전 앱을 멈추지 않고 레거시 PHP API 정리하기 API 폴더 8개, PHP 파일 102개, 깊이가 다른 include 네 가지, 강제 업데이트할 수 없는 앱. 내부 리라이트와 응답 비교로 /api/v1 아래로 옮긴 과정.
- AI·LLM AI 코딩 에이전트에게 운영 서버를 맡겼을 때 실제로 버틴 안전장치 AI 에이전트가 하룻밤에 운영 사이트와 앱 API 8개를 옮겼다. 에이전트가 낸 실수, 그것을 잡아낸 검사, 사람에게 남긴 일을 정리했다.
- C# 강좌 LINQ(링크) group by , join 우선 첫번재 from 에서 학생 리스트로 범위를 지정하고 두번째 from에서 학생 리스트 내에 점수(Score)를 데이터 범위를 지정하였다. (from 에서 범위를 지정하는 대상은 배열이나 컬렉션이…
- C# 강좌 LINQ(링크) from,where,orderby,select 말이 참 어렵다. 그냥 쉽게 말해 ” 데이터에 대해 질문하는 언어” 라고 볼수 있다.
- C# 강좌 람다식(Lamda Expression) 메소드는 크게 매개변수와 내부 식, 반환값으로 구성 되어있는데 이들만 가지고 메소드를 계산식으로 표현한다.
- C# 강좌 Func,Action 델리게이트 다음의 내용은 델리게이트와 무명 메소드, 람다식을 알아야 이해할 수 있으므로 이전 강좌를(C# 고급강좌) 한번 보시길 바랍니다.
- C# 강좌 이벤트(Event) 이벤트 변수도 생성할수 있습니다. 이벤트 변수는 간단히 event 한정자만 붙여주면 됩니다.
- C# 강좌 무명 형식, 무명 메소드 그런데 C#에는 독특하게 이름이 없는 형식(타입)이 존재합니다.
- C# 강좌 일반화 컬렉션 컬렉션은 데이터의 어떤 타입도 전부 object 타입으로 저장하기 때문에 데이터에 접근할때마다 본래 타입으로의 형식 변환이 무수하게 일어나며, 이는 곧 성능의 저하로 나타납니다.
- C# 강좌 델리게이트 (Delegate) 콜백, 체인 대리라는 말은 보통 내가 해야할 일을 다른 누군가에 위임하는 것을 말한다.
- C# 강좌 프로퍼티(Property) 문제는 클래스의 변수가 많아질수록 Set(), Get() 함수가 가득해지기 때문에 가독성이 떨어지며, 변수를 더 추가할 때마다 매번 Set(), Get() 함수를 추가해줘야 하는 불편함이 있다. 은…
- C# 강좌 일반화 프로그래밍 이전에는 int, float, string들 다른 개념으로 보고 다른 코드를 사용하였다면, 이제는 이들을 변수라는 하나의 개념으로 보고 하나의 코드로 만들어 줄 수 있겠다.
- C# 강좌 컬렉션(Collection) C#의 컬렉션을 사용하기 위해서는 컬렉션 네임 스페이스를 참조 해야합니다. 예) using System.Collections;
- C# 강좌 레지스트리(Registry) 이번 강좌에서 다루게 될 내용은, C#에서 제공하는 레지스트리 클래스를 이용한 레지스트리 읽기, 레지스트리 쓰기, 레지스트리 관리에 대해 간단히 알아보려고 합니다. 우선 레지스트리 클래스를 이용하려…
- C# 강좌 링크(LINQ) LINQ라고 들어보셨나요? 여기서 LINQ는 Language-Integrated Query의 약자로, 이는 통합된 질의 언어를 말합니다. 여기서 질의의 사전적 정의는 “의심나거나 모르는 점을 물음”…
- C# 강좌 파일 입출력(File Input/Output) 우선은 File, FileInfo, FileStream 클래스부터 알아보도록 할까요?
- C# 강좌 프로퍼티(Property) 프로퍼티(Property)는 속성이란 의미를 가지고 있습니다. 이 프로퍼티를 사용하게 되면, 속성 값을 반환하거나 새 값을 할당할 수 있습니다. 우리가 클래스를 하나 만들다가 필드를 public으로…
- C# 강좌 리플렉션과 애트리뷰트(Reflection and attributes) 설명을 보아하니, 리플렉션(Reflection)이 어떤 역할을 하는 녀석인지 감이 오시나요? 우선, 직접 저 메소드들을 사용해가며 결과를 확인해보도록 합시다.
- C# 강좌 구조체(Structures) 위의 예제를 보시면, 클래스처럼 멤버 변수를 가질수도 있고, 메소드 역시 가질 수 있습니다. 한번, 구조체를 사용하여 학생의 이름과 국어, 수학, 사회, 과학, 영어 점수를 담는 구조체를 정의해보도…
- C# 강좌 메소드(Method) 위 코드는, square라는 녀석에게 값을 넘겨주고, 임시로 a라는 변수에 값을 기억시킵니다. 그리고 이 a 변수를 가지고 제곱하여 출력하는 코드입니다. 대충 메소드를 어떻게 정의하는지 보이시나요?…
- C# 강좌 반복문(while, do, for, foreach) 위와 같은 형태에서 조건식은 if문과 마찬가지로 true 또는 false가 반환되어야 합니다. while문의 특징은 조건식이 참일때동안 계속해서 반복하여 코드를 실행합니다. 만약에 반복하다 조건식이…
- C# 강좌 인터페이스(Interface) 자, 이제 이런 인터페이스를 어떻게 정의하고 어떻게 사용되는지 예제를 통해 알아보도록 합시다. 우선 아래는 interface 키워드를 사용하여 인터페이스를 정의하는 예입니다.
- C# 강좌 확장 메소드, 분할 클래스, 중첩 클래스 선언 형식을 보시면, 정적(static) 클래스를 먼저 정의하고 그 안에 확장 메소드가 정의되었습니다. 확장 메소드 역시 정적(static) 메소드여야 합니다. 그리고 메소드의 첫번째 매개변수에서…
- C# 강좌 예외 처리(Exception handling) 이러한 예외 발생으로 프로그램이 종료되는 것을 막기위해 예외를 처리하는 것을 ‘예외 처리(Exception handling)이라고 합니다. 이제 앞으로 배울 try~catch문을 이용하여 예외를 우…
- C# 강좌 델리게이트와 이벤트(Delegates and Events) 위의 선언 형식을 보아하니, 델리게이트가 메소드같이 생겼죠? 델리게이트는 위에서 말한 대로, 메소드의 참조를 포함합니다. ‘메소드를 참조한다니, 그럼 메소드를 매개변수로 넘길 수 있다는 말인가요?’…
- C# 강좌 무한 루프, 제어문(continue, break, goto) 위의 예를 보시면, 조건식에 참(true)이 오므로, 항상 참이되어 영역 내의 코드를 무한 반복합니다. 그렇다면, 이 무한 루프는 어떻게 쓰일까요? 아래는 무한 루프가 사용된 예입니다.
- C# 강좌 생성자와 소멸자(Constructor and Destructor) 생성자의 선언 형식을 살펴보면, 생성자의 이름이 클래스의 이름과 똑같습니다. 그리고 이 생성자는 ‘매개변수’도 가질 수 있으며, 반환되는 값도 없고, 반환 타입도 없습니다. 그리고 한가지, 여기서…
- C# 강좌 컬렉션(Collection) 코드를 보시면 12~17행에서 ShowArrayList라는 메소드가 정의되었습니다. 매개변수로는 ArrayList 객체를 받죠. 이 객체를 받고 나서는 foreach문을 통해 요소를 하나하나 출력시…
- C# 강좌 클래스의 상속(Class inheritance) C#에서, 클래스를 다른 클래스로 상속하려면 다음과 같이 클래스 이름 뒤에 콜론을 추가하고 상속하려는 클래스를 덧붙이시면 됩니다.
- C# 강좌 클래스(Class) 객체만을 다루는 책이 있을정도로 객체를 완벽히 이해하기에는 많은 어려움이 있습니다.
- C# 강좌 배열(Array) 배열이란, 동일한 타입의 변수를 모아놓은 데이터 집합이라고 말할수 있습니다. 예를 들어서, 우리가 각 반 학생들의 한달 독서량을 변수에 담는다고 가정하면 아래와 같이 변수를 선언해야 합니다.
- C# 강좌 접근 제한자(Access Modifier), this 이해를 돕기위해 예를 하나 들겠습니다. 예를 들어, 다음과 같은 클래스가 있다고 가정해봅시다.
- C# 강좌 폼에 OK 버튼 취소 버튼을 달기 폼에 OK 버튼 또는 취소 버튼을 다이얼로그에 표시하는 방법을 소개합니다. 버튼을 클릭하면 폼이 닫히고 어떤 버튼이 눌렸는지를 취득 할수 있도록합니다. 또한 Enter 키를 누르면 OK 버튼이…
- Win32 / MFC 윈도우의 캡션을 설정하거나 가져오는 SetWindowText, GetWindowText 자, 먼저 SetWindowText API 함수와, GetWindowText API 함수의 원형부터 살펴보도록 합시다.
- Win32 / MFC 특정 윈도우의 핸들에 메시지를 전달하는 SendMessage SendMessage API에 대해 알아보기 전에, SendMessage의 함수 원형을 먼저 살펴보도록 합시다.
- Win32 / MFC 키의 상태를 확인하는 GetKeyState, GetAsyncKeyState 우선은 GetAsyncKeyState API에 대해 알아보기 전에 API의 원형을 먼저 살펴봅시다!
- Win32 / MFC 자신의 위치를 얻어오는 GetCurrentDirectory, GetModuleFileName 실행중인 파일의 현재 작업 디렉토리를 얻어오는 GetCurrentDirectory API부터 알아보도록 하겠습니다. 아래는 GetCurrentDirectory API 함수의 원형입니다.
- Win32 / MFC 최상위의 핸들을 찾는 FindWindow 먼저, FindWindow API에 대해 알아보기 전에 이 API의 원형을 한번 살펴보도록 합시다.
- Win32 / MFC 윈도우를 생성하고 표시하자! CreateWindow, ShowWindow 자 먼저, CreateWindow의 함수 원형을 살펴보도록 합시다.
- 정규 표현식 하위 표현식(Subexpression) 위의 일치된 텍스트를 보시면, 예상과는 다르게 abcabc가 아닌 abcc가 일치되었습니다. 무엇이 잘못되었나 살펴보았더니, {2}는 앞에 등장한 문자의 범위를 지정하는 녀석입니다. {2} 앞에 있…
- 정규 표현식 전후방탐색(lookaround) 위에 쓰인 정규 표현식을 살펴보자면, 아무 문자가 한번 이상 연속적으로 등장하고 콜론(:) 문자가 등장하는 문자열 중에서, 콜론(:) 문자는 일치하는 영역에서 제외됩니다. 만약, 전방 탐색 기호를…
- 정규 표현식 역참조(backreferences) 역참조(backreferences)란 무엇일까요? 말 그대로 역으로 참조하는 것을 나타냅니다. 정규 표현식에서는 패턴의 일부를 하위 표현식으로 묶으면, 첫번째로 나타나는 부분 문자열을 찾은 뒤에 역…
- C# 강좌 VisualStudio 2019 설치 C#란, C++의연산력(computing power)과 Visual Basic의 편의성(convenience)을 결합하기 위한 목적으로 마이크로소프트사에서 개발한 객체지향 프로그래밍 언어입니다. C…
- C# 강좌 변수, 데이터 형식, 상수 C#에서 변수를 선언하는 방법은 간단합니다. 데이터 형식과 식별자만 있으면 됩니다. 여기서 선언이란 ‘변수를 만든다’와 같은 의미로 쓰이는데 ‘선언하다’라는 말을 자주 씁니다. 데이터 형식은 정수,…
- C# 강좌 연산자(Operators) C#에선 산술 연산자, 증감 연산자, 조건 연산자, 관계 연산자, 논리 연산자 등 여러가지의 연산자를 제공합니다. 오늘은, 아래 표에 정리된 연산자들에 대해서 배워보도록 하겠습니다.
- C# 강좌 조건문(if, else, switch) 이 예제의 조건식에서 true 또는 false를 반환하는 논리 연산자나 관계 연산자가 자주 등장합니다. 조건식에 올 수 있는건 true 또는 false의 값을 가지는 bool 형식이여야 합니다. 예…
- C# 강좌 폼이 하나 밖에 표시되지 않도록하고 액세스하는 방법 Visual Basic 6.0 사용자의 대부분이 VB.NET의 폼을 표시하는 차이에 당황하게 될것입니다. VB6에서는 폼을 만들고 코드에서 (폼 이름) .Show 만으로도 폼을 열수있었습니다. 게다…
- 정규 표현식 정규 표현식(Regular Expression, Regex)란 무엇인가? 혹시 정규 표현식(Regular Expression, Regex)라고 들어보신적이 있으신가요? 이 정규 표현식은 텍스트를 검색하거나, 혹은 치환하거나 어떠한 문자열을 추출하고자 할때 주로 쓰이는 녀…
- 정규 표현식 간단한 문자열 찾기 이번에는 평범한 텍스트를 이용해서 검색을 해보도록 하겠습니다. (평범한 텍스트도 정규 표현식이 될 수 있음) 아래를 한번 보도록 합시다.
- 정규 표현식 연속된 문자 찾기 정규 표현식을 차례대로 살펴보도록 합시다. \w는 즉, a-zA-Z0-9_, 그리고 그 다음 등장하는 메타 문자 +는 문자가 하나 이상일 때 일치시키는 녀석입니다. 하나 이상 일치해야 하기 때문에,…
- 정규 표현식 수량자(Quantifier) 위의 수량자들을 차례대로 알아보도록 합시다. 우선 첫번째 수량자인 {n} 입니다. 이 수량자가 뒤에 따라오면, 앞에 있는 문자 집합 혹은 문자가 n번 연속해서 일치하는지 확인합니다. 주의하셔야 할…
- 정규 표현식 메타 문자(meta character) 정규 표현식에서의 메타 문자(meta character)는 특별한 존재입니다. 메타 문자 그 자체는 특별한 녀석이며, 이미 사전에 약속되어진 문자를 뜻합니다. (특수한 문자나 다름이 없음) 사전에…
- 정규 표현식 문자 집합(character set) 이번에는 어떤 문자든 통하는 . 문자와는 달리, 대괄호()를 사용하여 문자 집합을 표현해보도록 할 것입니다. 문자 집합의 예를 한번 살펴보고, 문자 집합이 어떤 것인지 한번 생각해봅시다.
- 알고리즘·자료구조 트리(Tree) 위 그림을 보니, 무언가 나무처럼 쭉 뻗어 나오는 것 같지 않나요? 여기에선 위로 뻗어나가는 모양이 아니라, 아래로 뻗어가는 모양이지만요. 여기서는 A가 뿌리, 즉 루트 노드입니다. 그리고 B, D…
- 알고리즘·자료구조 스택(Stack) 오늘 알아보게 될 스택(Stack)이란 자료구조는 선입 후출(First In, Last Out: FILO), 후입 선출(Last In, First Out: LIFO)의 구조를 가지고 있습니다. 예를…
- 알고리즘·자료구조 링크드 큐(Linked Queue) 위의 그림을 보시면, 전단에 있는 노드를 제거했을 때 단순히 전단의 위치를 다음 노드로 넘기면 됩니다. 그러곤 그게 끝입니다. 삽입도 이와 비슷합니다. 후단의 nextNode에 새로 추가되는 노드의…
- 알고리즘·자료구조 링크드 리스트(Linked List) 가장 먼저 링크드 리스트(Linked List)란 녀석에 대해 설명을 하도록 하겠습니다. 이 링크드 리스트(Linked List)는 노드(Node)라는 요소로 구성되어 있습니다. 즉, 노드를 연결하…
- 알고리즘·자료구조 힙(Heap) 오늘은 ‘힙(Heap)’이란 자료구조에 대해서 알아보려고 합니다. 이 힙(Heap)이란 자료구조는 위키백과에 따르면 ‘특별한 트리를 기본으로 하는 자료구조이다.’라고 설명되어 있습니다. 여기서 특별…
- 알고리즘·자료구조 더블 링크드 리스트(Doubly Linked List) 위의 그림에서 노드를 보시면 이전 노드를 가리키는 포인터(PrevLink)와, 데이터(Data), 그리고 다음 노드를 가리키는 포인터(NextLink)로 구성되어 있습니다. (이미 다 아시겠지만,…
- 알고리즘·자료구조 순환 큐(Circular Queue) 우리가 리스트(List)에서는 가장 앞에 있는 노드를 헤드(Head), 가장 뒤에 있는 노드를 테일(Tail)이라고 했었죠? 이번에 배우게 될 큐(Queue)에서는 가장 앞에 있는 요소를 전단(Fr…
- 알고리즘·자료구조 환형 링크드 리스트(Circular Linked List) 위의 그림을 보면 알 수 있듯이, 원형 단순 연결 리스트는 단순 연결 리스트에서 머리와 꼬리를 연결했다는 것을 알 수 있습니다. 여기에서는 꼬리란 개념이 사라집니다. 원형 단순 연결 리스트에서의 노…
- 알고리즘·자료구조 정렬 알고리즘(sorting algorithm) 버블 정렬은 자신과 인접한 데이터와 비교하여 정렬하는 방식입니다. 위의 예를 보시면 첫번째로 84와 69를 비교하여 84가 더 큰걸 확인하고 위치를 바꾸었습니다. 또다시 84와 76을 비교하여 84…
- 알고리즘·자료구조 순차 탐색(Sequential Search) 이 강좌에서 알게될 ‘순차 탐색(Sequential Search)’는 바로 데이터가 모인 데이터 배열이 있으면 이 데이터 배열의 처음부터 끝까지 차례대로 비교하여 원하는 데이터를 찾아내는 알고리즘입…
- 알고리즘·자료구조 탐욕 알고리즘(Greedy Algorithm) 오늘 알아볼 알고리즘은 ‘탐욕 알고리즘(Greedy Algorithm)’ 입니다. 알고리즘의 이름 그대로, 상당히 욕심이 많은 알고리즘 입니다. 탐욕 알고리즘이 어떤 알고리즘이냐면, 매 순간마다 최…
- 알고리즘·자료구조 깊이 우선 탐색(DFS, Depth First Search) 그래프에선 어떻게 이동할까요? 자, 우선 그래프를 보도록 합시다.
- 알고리즘·자료구조 이진 탐색 트리(Binary Search Tree) 이번에는 이진 탐색(Binary Search)이 적용된 이진 트리(Binary Tree)에 대해서 알아볼 것입니다. 이진 트리(Binary Tree)에 대해 더 상세한 설명을 보고싶으시면 아래 링크…
- 알고리즘·자료구조 이진 탐색(Binary Search): 2021년 코드를 다시 돌려 보니 정렬된 배열을 반씩 줄여 가며 찾는 이진 탐색. 2021년 예제를 지금 컴파일하니 에러가 났고, 비교 횟수 설명도 1회씩 틀렸다. 실측으로 고친 보강판.
- 알고리즘·자료구조 너비 우선 탐색(BFS, Breadth First Search) 통하여 재귀 호출을 이용한 반면에, 너비 우선 탐색은 방문한 정점의 위치를 기억하기 위해 큐를 이용합니다. 너비 우선 탐색은 예를 들면, 위에서 말한대로와 같이 깊이를 더해가며 방문을 하며 찾으려는…
- C# 강좌 메인 폼에서 서브 폼을 표시하는 방법과 종류 (modal, modeless) 여기서 우리는 메인 폼에서 서브 폼을 표시하는 방법을 소개 하겠습니다. 새로운 프로젝트 생성 -> 윈도우 폼 (vb.net , C#)을 생성해주세요.
일치하는 글이 없습니다