NLog는 풍부한 로그 라우팅 및 관리 기능을 가진 .NET 용 무료 로깅 플랫폼이다. 고품질 로그를 쉽게 생성하고 관리할 수 있다. 원하는 형식을 파일이나 데이터베이스에 같은 대상으로 보낼 수 있다. 다른 진단 로깅 라이브러리로는 Serilog가 있는데 ‘Worker Services in .NET Core 3.0’ 포스팅에서 소개하였고 이번 글에서는 NLog Wiki의 ‘Getting started with .NET Core 2 Console application’ 글을 참고하여 사용법을 간단하게 작성해보았다.
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="file" xsi:type="File"
layout="[${date:format=HH\:mm\:ss} ${level:uppercase=true:padding=5}] : ${message} ${callsite:className=false:fileName=true:includeSourcePath=false:methodName=false}[${threadid}]"
fileName="${basedir}/logs/${date:format=yyyyMM}/log_${date:format=yyyyMMdd}.txt"
concurrentWrites="true" />
<target name="n" xsi:type="OutputDebugString"
layout="${message} [${level:uppercase=true}]${callsite:className=false:fileName=true:includeSourcePath=false:methodName=false}[${threadid}]" />
</targets>
<rules>
<logger name="*" minlevel="trace" writeTo="file" />
<logger name="*" minlevel="trace" writeTo="n" />
</rules>
</nlog>
Blazor는 닷넷(.NET)을 사용하여 대화형 클라이언트 쪽 웹 UI를 빌드하기 위한 프레임워크이다. 내부적으로 WebAssembly(wasm), SignalR 기술을 사용한다. 웹어셈블리(WebAssembly, 간단히 Wasm)는 실행 프로그램 및 그와 일치하는 텍스트 어셈블리어, 그리고 이러한 프로그램과 호스트 환경 간 통신을 용이케 하는 인터페이스를 위한 이식 가능한 이진 코드 포맷을 정의하는 개방형 표준이다. 웹어셈블리의 주목적은 웹 페이지에서 고성능의 애플리케이션을 가능케 하는 것이지만 포맷은 다른 환경에서도 실행 및 연동되도록 설계되어 있다(wiki).
Blazor는 JavaScript 대신 C#으로 코드를 작성하고 Blazor WebAssembly, Blazor Server의 2가지 형태의 템플릿을 제공하는 데 첫 번째는 웹브라우저 안에 WebAssembly를 포함하고 두 번째 템플릿은 서버에서 WebAssembly를 렌더링하고 SignalR 연결(JavaScript interop)을 통해 웹브라우저(DOM)와 통신한다. 최신 웹브라우저가 아닌 경우는 두 번째 템플릿으로 개발하는 게 호환성이 좋다.
JSON은 최신 웹 및 모바일 애플리케이션에서 데이터를 교환하는 데 사용되는 일반적인 텍스트 데이터 형식이다. 예전 JSON이 일반화되기 전에는 XML 형태로 문서를 주고받았고 지금도 XML 형식은 데이터의 검증이 필요한 곳에서 스키마를 사용하여 무결성을 검증할 뿐만 아니라 표준 ‘XML Web Services’의 기본 데이터 형식이기도 하다. 이번 글에서는 SQL Server(2019)에서 개발언어의 도움 없이 T-SQL 자체만으로 XML, JSON 형식을 다루는 몇 가지 예제를 소개한다.
select b.BoardNO,
b.UserNO,
b.Contents,
b.HitCount,
format(b.RegDate, 'yyyyMMdd') as RegDate,
b.PublicIP,
b.LocalIP,
u.UserName,
u.DeptNO,
null as nullTest
from TBoard b
join TUser u on u.UserNO = b.UserNO
for xml path('board'), root('boards'), elements xsinil