전체 글 47

MySQL에 C#의 DateTime.MaxValue를 넣을 수 없는 이유

ASP.NET과 SQLKata를 활용하여 게임 개발을 하고 있다. 시스템 상에서 우편을 보내는 기능 개발 중, 결제된 상품을 포함한 우편을 전송할 때는 만료 기한을 무제한으로 설정해야 할 필요가 생겼다. 이는 우편이 만료 기한이 지남에 따라 자동 삭제되지 않게 하기 위해서였다. 이를 위해 DateTime.MaxValue를 우편 만료 기한으로 설정한 뒤, SQLKata로 삽입 쿼리를 넣었다. 그리고 예외 발생! Visual Studio 상으로 확인했을 때 만료 기한의 값은 내가 의도한 DateTime.MaxValue의 값을 가리키고 있었다. 그렇다면 DateTime.MaxValue 값을 MySQL에 넣을 때 예외가 발생했다는 뜻인데... DateTime.MaxValue는 9999년 12월 31일 23:59..

Framework/.NET 2023.05.08

ASP.NET에서의 MySQL VS Redis

MySQL과 Redis의 차이가 무엇일까? 여러 가지가 있겠지만, 데이터가 저장되는 위치와 스레드의 개수가 가장 큰 차이라고 생각한다. 데이터가 저장되는 위치 관점에서 바라보자. MySQL은 관계형 데이터베이스이며, 디스크에 데이터가 저장된다. Redis는 NoSQL이며, 메모리에 데이터가 저장된다. 스레드 개수 관점에서 바라보자. MySQL은 스레드 풀을 통해 멀티 스레드 사용이 가능하다. Redis는 싱글 스레드를 사용한다. 이러한 차이로 인해 ASP.NET 프로그램을 개발할 때 각 DB를 활용하는 방식이 달라진다. MySQL을 활용하는 서비스는 다음과 같이 등록한다. 데이터베이스에서 멀티 스레드를 활용할 수 있으므로 하나의 요청 안에서 인스턴스가 여러 번 생성되는 Transient 생명주기를 활용한..

Framework/.NET 2023.05.03

[ASP.NET Core로 Web API 만들기] 2. SqlKata로 비동기 CRUD 구현하기

이 게시물은 Visual Studio, MySQL 환경에서의 .NET 7과 SqlKata 2.4.0에 관해 설명합니다. 다른 버전을 사용할 경우 게시글의 설명과 다를 수 있습니다. 이 글은 https://github.com/sqlkata/querybuilder를 참고하여 작성되었습니다. 목차 1. SqlKata란? 2. Create 3. Read 4. Update 5. Delete 이번 글에서는 SqlKata에 대해 알아보고, 이를 활용하여 ASP.NET Core 환경에서 CRUD를 구현하는 방법을 알아보겠습니다. 1. SqlKata란 C#으로 사용 가능한 SQL 쿼리 빌더입니다. 고수준의 API를 제공하여 사용자 입장에서 편리하게 사용할 수 있습니다. SQL에 익숙하지 않은 사용자도 어렵지 않게 사용 ..

Framework/.NET 2023.04.25

[ASP.NET Core로 Web API 만들기] 1. ASP.NET Core에 대해

이 게시물은 .NET 7에 관해 설명합니다. 다른 버전을 사용할 경우 게시글의 설명과 다를 수 있습니다. 이 글은 마이크로소프트 설명서를 참고하여 작성되었습니다. 목차 1. ASP.NET Core의 구성 2. 의존성 주입(DI) 3. 서비스의 생명 주기 4. 미들웨어 5. Attribute 1. ASP.NET Core의 구성 Program.cs 애플리케이션의 진입점입니다. 앱에서 요구하는 서비스가 구성됩니다. 앱의 요청 처리 파이프라인이 미들웨어 구성 요소로 정의됩니다. WebApplication.CreateBuilder var builder = WebApplication.CreateBuilder(args); ASP.NET Core 웹 앱은 위 코드를 생성합니다. 이 코드에서 WebApplication...

Framework/.NET 2023.04.22

컴투스 서버캠퍼스 1기 지원 및 합격, 그리고 발대식 후기

내가 게임 서버 개발에 관심이 있단 걸 아시던 지인 분이 서버캠퍼스에 대해 알려 주셔서 지원하게 되었다. 서버 캠퍼스 1기는 C# .NET로 API를 개발하는 것에 대해 배운다. 더보기 잠깐 개인적인 얘기를 하자면, 나는 대학에 다니면서 게임 개발 동아리에 속해 있었고, 게임 개발에 관심이 많았다. 실제로 PM/기획 포지션을 맡아 게임 개발을 해보기도 하고, 후배들에게 기획 교육을 하기도 했다. 대학 저학년 때는 렌더링 프로그래머가 되고 싶었고, 재능의 한계를 느껴 포기하기도 했다. 그 당시 내가 생각하던 게임 개발자는 게임에 정말 진심이어서 게임 개발 외에는 눈에 들어오지 않는 정도로 열정이 있는 사람이었다. 나는 그런 사람이 아니라고 생각했다. 그러다 웹 백엔드 개발을 하게 됐다. 학교에서 JSP로 ..

Diary 2023.04.18

HTTP: 리다이렉션과 부하 균형

도서 HTTP 완벽 가이드를 읽고 알게 된 지식을 정리한 글입니다. 이번에는 리다이렉션 기법들과 해당 기법들이 부하 균형을 맞추는 방법에 대해 알아봅니다. 1. 왜 리다이렉트인가? 리다이렉션은 다음의 장점을 가진다. 신뢰성 개선 -> 한 서버에서 실패한 경우 다른 서버를 이용할 수 있기 때문에 신뢰성이 개선된다. 지연 최소화 -> 클라이언트가 보다 가까운 리소스에 접근할 수 있게 되기 때문에 응답시간이 줄어든다. 네트워크 대역폭 절약 -> 목적지 서버 분산을 통해 네트워크 대역폭을 절약한다. 리다이렉션이란 최적의 분산된 콘텐츠를 찾는 것을 도와주는 기법의 집합이다. 대부분의 리다이렉션 장치들은 부하 균형(들어오는 메시지의 부하를 서버 집합에 분산하는 것)을 포함한다. 반대로 모든 부하 균형도 리다이렉션을..

CS/Network 2023.04.10

HTTP: 엔터티와 인코딩

도서 HTTP 완벽 가이드를 읽고 알게 된 지식을 정리한 글입니다. 엔터티 HTTP 메시지를 인터넷 운송 시스템의 컨테이너라고 생각한다면, HTTP 엔터티는 메시지의 실질적인 화물이다. 엔터티 본문 가공되지 않은 데이터만을 담고 있다. 때문에 엔터티 헤더에서 엔터티 본문 데이터의 의미에 대해 설명한다. 여기에는 Content-Type, Content-Length, Content-Language, Content-Encoding, Content-Location, Content-Range, Content-MD5, Last-Modified, Expires, Allow, ETag, Cache-Control 등이 있다. Content-Length 메시지의 엔터티 본문의 크기를 바이트 단위로 나타낸다. 만약 인코딩된..

CS/Network 2023.03.27

HTTP: 보안 HTTP

도서 HTTP 완벽 가이드를 읽고 알게 된 지식을 정리한 글입니다. 비밀키 암호화 공개키 암호 암호 알고리즘은 누구에게나 열려 있지만, 키는 닫혀 있다. 비밀 키 암호 대칭 키 암호라고도 불린다. 발송자와 수신자 모두 동일한 키를 갖는다. 인코딩할 때 키 == 디코딩할 때 키 공개키 암호 두 개의 비대칭 키를 사용한다. 인코딩 키는 모두에게 공개되어 있다. 메시지를 디코딩하는 능력은 소유자에게만 보유한다. RSA는 유명한 공개 키 암호 방식이다. 그래서...? 공개 키 암호 방식은 더 안전하지만 알고리즘 계산이 느리기 때문에, 실제로는 두 가지 방식을 섞은 것을 쓴다. 예를 들어, 노드들 간의 안전한 의사소통 채널을 수립할 때는 공개 키 암호화 방식를 사용하고, 이후에 전송 데이터를 암호화할 때는 대칭 ..

CS/Network 2023.03.24

인덱스를 통한 목록 조회 성능 개선

https://github.com/kkumta/Time-Deal-Shop/pull/38 Closes #37 refactor: product 테이블에 closeDate 인덱스 추가 by kkumta · Pull Request #38 · kkumta/Time-Deal-Shop 상품 구매 마감일을 기준으로 하는 상품 목록 조회 성능을 개선했습니다. 구체적으로, 상품 구매 마감일을 기준으로 하는 상품 목록 조회 API의 응답 속도를 1/2 가량으로 단축했습니다. github.com 해당 작업과 관련된 회고입니다. 타임딜 서버를 개발하면서, 많은 상품이 존재하는 경우 상품 목록 조회 속도가 생각보다 느리다는 것을 확인했습니다. 그러다 이런 경우에 어떻게 조회 성능을 개선할 수 있을지 고민해봤고, 인덱스를 떠올리게..

HTTP: 기본 인증

도서 HTTP 완벽 가이드를 읽고 알게 된 지식을 정리한 글입니다. 인증이란 사용자 스스로를 증명하는 것이다. HTTP의 기본 인증 방식을 다뤄본다. 기본 인증 예 사용자가 게시판에 글을 쓰는 페이지에 요청한다. 서버가 글쓰기 페이지에 접근하는 데 필요한 인증 정보를 요구한다. 브라우저가 사용자를 로그인 페이지로 리다이렉트시킨다. 사용자가 로그인을 완료하면, 브라우저는 그것들을 이어 붙인 뒤 인코딩한다. 서버가 사용자 이름과 비밀번호를 디코딩하여 그 값이 정확한지 검사한 후, 문제가 없다면 200 OK 상태 코드와 함께 글쓰는 페이지를 반환한다. 인증과 관련된 헤더 헤더 이름 헤더 설명 WWW-Authenticate realm은 요청 받은 문서 집합의 이름을 따옴표로 감싼 것으로, 사용자는 이 정보를 보..

CS/Network 2023.03.20