UI를 개발하다 보면 문자열을 많이 사용할 수밖에 없는데 별생각 없이 코딩하다 여기저기 너저분한 문자열들을 볼 수 있게 됩니다. 여기서는 존댓말, 저기서는 반말, YES일 때도 있고 OK 일 때도 있습니다. 여러 번 사용되는 문자열은 가급적 runtime 코드 외부로 빼는 것이 유리합니다. 몇 가지 방법에 대해 공유합니다.
고정 문자열 관리
const
절대 변경되지 않는 문자열일 경우, const가 적절합니다.
public static class Messages
{
public const string ErrorFileNotFound = "The file not be found.";
public const string SuccessMessage = "완료.";
}
Console.WriteLine(Messages.ErrorFileNotFound);
the file not found. 라는 문자열보다 Error이라는 단어만 봐도 느낌이 옵니다.
static readonly
문자열이 런타임 중에 설정(생성자에서 초기화 가능) 되거나, 변경될 가능성이 있다면 static readonly를 사용하는 것이 좋습니다. 런타임에 값을 설정할 수 있지만, 이후에는 변경되지 않도록 보장됩니다.
public static class Configuration
{
public static readonly string ApiEndpoint = "https://api.example.com/v1/test";
public static readonly string DefaultLanguage = "Korean";
}
사용법은 const와 동일합니다.
리소스 파일 (.resx)
다국어 지원이 필요한 경우나 문자열을 한 곳에서 관리하고자 할 때는 리소스 파일을 사용하는 것이 가장 좋습니다.. resx.resx 파일은 모든 고정 문자열을 파일에서 관리하며, 다른 언어로의 번역도 쉽게 지원합니다.
언어 변환이 수월한 점이 가장 큰 장점입니다.
string greeting = Resources.GreetingMessage;
. resx에 등록하면 위와 같이 사용할 수 있습니다.
appsettings.json
제가 최근에 가장 많이 사용하는 방법입니다.
프로그램 실행 시에 적용할 수 있고 소스코드의 수정 및 컴파일 없이 적용된다는 점이 가장 큰 장점입니다.
json 포맷을 사용해서 가독성도 뛰어나고 확장성도 높습니다.
appsettings.json
{
"Messages": {
"WelcomeMessage": "HELLO!",
"ExitMessage": "BYE!"
}
}
appsettings.json 파일에 문자열을 저장합니다.
이 파일은 실행 경로에 있어야 합니다.
Startup.cs
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(Configuration.GetSection("Messages"));
}
}
Startup.cs 파일에 위 내용을 추가합니다.
POCO 클래스 생성
public class AppSettings
{
public string WelcomeMessage { get; set; }
public string ExitMessage { get; set; }
}
json의 값을 받아올 매핑용 클래스를 생성합니다.
사용법
public class HomeController : Controller
{
private readonly AppSettings _appSettings;
public HomeController(IOptions<AppSettings> appSettings)
{
_appSettings = appSettings.Value;
}
public IActionResult Index()
{
ViewBag.WelcomeMessage = _appSettings.WelcomeMessage;
return View();
}
}
위의 경우는 ASP.NET Core에서 사용법이며. NET에서는 이 전에 포스팅한 블로그를 참고하시면 되겠습니다.
2023.07.24 - [C#] - WPF .NET 7 에서 NLog 사용법 (json)
Enum과 Dictionary 조합
문자열이 특정 키와 연관되거나 좀 더 구조적인 명명을 하고 싶을 때는 enum과 Dictionary를 조합하여 관리하는 것도 좋습니다.
public enum MessageKey
{
Welcome,
Exit
}
public static class Messages
{
private static readonly Dictionary<MessageKey, string> messages = new Dictionary<MessageKey, string>
{
{ MessageKey.Welcome, "WelcomE!" },
{ MessageKey.Exit, "Exit!" }
};
public static string GetMessage(MessageKey key)
{
return messages[key];
}
}
결론
고정 문자열을 효과적으로 관리하는 것은 코드의 품질을 높이고, 유지보수를 쉽게 만드는 중요한 요소입니다. 코드를 보기 좋으면 반은 먹고 들어가는 것 같습니다.
- 변경 가능성 여부에 따라 **const**와 **static readonly**를 적절히 사용
- 다국어 지원 및 중앙 집중화된 문자열 관리가 필요하다면 리소스 파일
- 유연한 문자열 관리가 필요하면 appsettings.json
- 좀 더 있어 보이려면 enum과 Dictionary 조합