전체 글 93

[Ubuntu] 05. 홈 서버 자동화 - GitHub Actions로 Docker 자동 배포 구축

지난 글까지는 ASP.NET Core 게임 서버를 Ubuntu 홈 서버에 직접 배포했고, EF Core Migration과 SQL Server 문제까지 정리했다.그때 배포는 이런 식이었다.cd ~/docker/game/git pulldocker build -t survivalgame:test .cd ~/docker/composedocker compose up -d --force-recreate survivalgame처음에는 이 방식도 나쁘지 않았다. 서버에 직접 들어가서 로그를 보고, 컨테이너 상태를 확인하면서 배포하니까 오히려 확실하다는 느낌도 있었다. 그런데 몇 번 반복해 보니 바로 단점이 보였다.코드를 조금 고칠 때마다 서버에 접속하고, git pull 하고, 이미지 빌드하고, Compose를 다시..

study/server 2026.07.13

[Blazor Web App] 04. 로그인 폼 리팩토링 2 - LoginService와 DI로 로그인 로직 분리하기

지난 글에서는 로그인 입력값을 LoginRequest 모델로 묶었다.처음에는 Home.razor 안에 userId, password 변수가 따로 있었다.private string userId = "";private string password = "";이걸 아래처럼 바꿨다.private LoginRequest loginRequest = new(); 그리고 입력창도 LoginRequest 객체에 연결했다. 이제 아이디와 비밀번호는 따로 흩어진 변수가 아니라, 로그인 요청 데이터라는 하나의 묶음으로 관리된다.이번에는 여기서 한 단계 더 나아가서 Home.razor 안에 있던 로그인 검증 로직을 LoginService 클래스로 분리했다.왜 Service로 분리하려고 했나?처음에는 Home.razor 안에서 로..

language/blazor 2026.07.12

[모바일프로그래밍] 01. 뷰와 기본 위젯

안드로이드 앱 화면에 보이는 버튼, 글자, 입력창은 모두 같은 뿌리에서 나온다. 바로 View라는 클래스다. 오늘은 안드로이드 UI의 근간인 뷰와 뷰그룹의 개념, 자주 쓰는 기본 위젯, 그리고 위젯의 공통 속성을 정리했다.1. 뷰(View)와 뷰그룹(ViewGroup)화면의 모든 것은 View다안드로이드 화면을 이루는 모든 요소는 View 클래스를 상속받는다. 이렇게 화면에 배치되는 UI 요소를 통틀어 위젯(widget)이라 부른다.View: 버튼·텍스트처럼 실제로 보이는 화면 요소ViewGroup: 다른 위젯을 담는 그릇 역할의 위젯. 레이아웃이 여기에 속한다. 화면에서 보이는 버튼은 "버튼 위젯"이고, 코드에서는 Button 클래스의 객체다. 화면의 요소와 코드의 객체가 일대일로 대응한다고 보면 된다..

[Blazor Web App] 03. 로그인 폼 리팩토링 1 - LoginRequest 모델로 입력값 묶기

지난번에는 Blazor로 간단한 로그인 폼을 만들었다.아이디 입력창, 비밀번호 입력창, 로그인 버튼을 만들고 @bind, @onclick을 이용해서 입력값을 C# 변수와 연결했다.처음에는 Home.razor 안에 아이디와 비밀번호 변수를 따로 두었다.private string userId = "";private string password = "";그리고 로그인 버튼을 누르면 Login() 함수에서 직접 입력값을 검사했다.private void Login(){ if (string.IsNullOrWhiteSpace(userId)) { loginMessage = "아이디를 입력하세요."; messageClass = "login-message error-message"; ..

language/blazor 2026.07.10

[C언어] 02. 기본 변수와 입력

프로그램은 결국 데이터를 다루는 일이고, 그 데이터를 담는 그릇이 변수다. 오늘은 변수가 무엇이고 어떻게 선언·저장·출력하는지, 그리고 사용자에게서 값을 입력받는 scanf까지 정리했다.1. 변수와 자료형변수란?프로그램이 사용하는 데이터를 일시적으로 저장하기 위한 메모리 공간이다. 변수에는 값, 이름, 자료형(크기), 주소가 따라붙는다.C에서 변수는 쓰기 전에 반드시 자료형과 함께 선언해야 한다. 선언은 "이런 타입의 변수를 쓰겠다"고 컴파일러에 미리 알리는 일이고, 컴파일러는 이를 보고 알맞은 크기의 메모리를 확보한다.대표적인 자료형은 정수형 int, 실수형 double, 문자형 char 등이다. (참고로 C에는 원래 논리형 bool이 따로 없어, 정수 0/1로 참거짓을 표현했다.) 변수 이름(식별자)..

language/c 2026.07.10

[데이터베이스] 03. 데이터 모델링 (개체-관계 모델)

테이블을 곧장 만들기 전에, "현실 세계의 무엇을 어떻게 데이터로 옮길 것인가"를 먼저 설계해야 한다. 이 설계 과정이 데이터 모델링이고, 그 첫 단추가 개체-관계(ER, Entity-Relationship) 모델이다.코드를 짜기 전에 그림을 그리는 단계라 처음엔 가볍게 봤는데, 여기서 구조를 잘못 잡으면 나중에 테이블·쿼리·정규화가 전부 어긋난다는 걸 알고 생각이 달라졌다. 오늘은 현실을 데이터로 번역하는 이 첫 단계를 정리했다.1. 데이터 모델링과 데이터 모델모델링은 추상도를 단계적으로 낮추며 진행된다. 현실에서 개념으로, 다시 논리로 내려가는 순서다. 단계데이터 모델결과물개념적개체-관계 모델(ER)E-R 다이어그램(ERD)논리적관계 데이터 모델릴레이션(테이블) 스키마 이 글은 첫 단계인 개념적 모델..

data/database 2026.07.09

[C#] 01. C#과 닷넷 생태계, 첫 프로그램

C#은 C, C++ 같은 컴파일 언어의 성능과 자바스크립트, 파이썬, PHP 같은 인터프리터 언어의 편의를 함께 노린 언어다. 자바와 비슷한 위치에 있는 하이브리드 언어라고 보면 된다.그런데 C#을 제대로 이해하려면 언어 문법 이전에 그 언어가 올라타 있는 닷넷(.NET)이라는 플랫폼을 먼저 봐야 한다. 이 글에서는 C#이 어떤 언어인지, 닷넷 생태계가 어떻게 구성되는지, 그리고 첫 프로그램을 어떻게 쓰는지를 정리한다.1. C#이라는 언어C#은 마이크로소프트가 만든 객체 지향 프로그래밍 언어이자, 마이크로소프트의 닷넷 플랫폼을 기반으로 도는 여러 언어 중 하나다. 특징을 먼저 훑어보면 이렇다.절차적 스타일, 객체 지향 스타일, 함수형 스타일을 모두 지원하는 다중 패러다임 언어전역 함수나 전역 변수가 없고..

language/c# 2026.07.08

[컴퓨터구조] 02. 데이터의 표현

컴퓨터는 0과 1만 안다. 그렇다면 음수, 소수, 한글은 어떻게 표현할까? 오늘은 정수(2의 보수), 실수(부동소수점), 문자(ASCII·유니코드)가 비트로 어떻게 표현되는지, 그리고 오류를 어떻게 잡아내는지를 정리했다.1. 자료 표현 단위단위크기비트(bit)0 또는 1바이트(byte)8비트워드(word)CPU가 한 번에 처리하는 비트 묶음 표현 대상에 따라 방식이 다르다. 정수는 2의 보수, 실수는 부동소수점(IEEE 754), 문자는 ASCII·유니코드를 쓴다.2. 음수 표현: 2의 보수음수를 표현하는 방식은 여러 가지지만, 실제 컴퓨터는 2의 보수를 쓴다. 최상위 비트(MSB, Most Significant Bit)가 부호를 나타낸다(0은 양수, 1은 음수). 방식특징부호-크기MSB가 부호, 나머지..

[Blazor Web App] 02. 첫 로그인 폼 만들기 - @bind, @onclick, 입력 검증, CSS 분리, 모델 바인딩까지

오늘 작업 목표이번에는 Blazor 기본 페이지인 Home.razor를 직접 수정하면서 간단한 로그인 폼을 만들었다.실제 로그인 기능을 완성한 것은 아니다. 아직 DB도 붙이지 않았고, 서버 인증도 하지 않았다. 오늘 한 작업은 로그인 화면에서 가장 앞단에 해당하는 부분이다.아이디 입력↓비밀번호 입력↓로그인 버튼 클릭↓입력값 검증↓성공 / 오류 메시지 출력↓입력값을 LoginRequest 클래스로 묶기 처음에는 그냥 변수 두 개를 만들고 입력값을 받으면 된다고 생각했다. 그런데 조금만 진행해도 아이디, 비밀번호, 메시지, CSS class 같은 값들이 한 파일에 계속 늘어났다.그래서 이번 글에서는 아주 작은 로그인 폼을 만들면서도, 나중에 실제 로그인 처리로 확장하기 좋게 입력값을 클래스로 묶는 데까지 ..

language/blazor 2026.07.07

[인터넷보안] 02. 시스템 보안

시스템 보안은 운영체제와 그 위에서 도는 프로그램, 그리고 자원에 접근하는 사용자들을 지키는 일이다. "누가 들어오는가(인증), 무엇을 할 수 있는가(권한), 무슨 일이 있었는가(로그)"라는 흐름이 그 뼈대다. 오늘은 계정·세션·접근 제어·권한·로그 관리, 그리고 모바일 보안까지 정리했다.1. 계정 관리: 식별과 인증보안의 출발점은 "이 사용자가 정말 그 사람인가"를 확인하는 인증이다. 인증 수단은 크게 네 가지로 나뉜다.방법예알고 있는 것패스워드가지고 있는 것신분증, OTP자신의 모습지문·홍채 등 생체 정보위치하는 곳접속 위치 확인, 콜백 다중 인증(MFA)이 강한 이유한 가지 수단은 뚫리면 끝이다. 패스워드(아는 것)는 유출될 수 있고, 휴대폰(가진 것)은 도난당할 수 있다. 그래서 서로 다른 범주의..