<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Hwigyeom</title>
    <link>https://hwigyeom.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 21 Aug 2026 05:53:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hwigyeom</managingEditor>
    <image>
      <title>Hwigyeom</title>
      <url>https://tistory1.daumcdn.net/tistory/1950499/attach/9432a231f1d743808bf94bb32bdd875f</url>
      <link>https://hwigyeom.tistory.com</link>
    </image>
    <item>
      <title>C# 6.0 신규 기능 살펴보기</title>
      <link>https://hwigyeom.tistory.com/entry/C-60-%EC%8B%A0%EA%B7%9C-%EA%B8%B0%EB%8A%A5-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</link>
      <description>&lt;p&gt;C# 6.0은 이전&amp;nbsp;C#의 업데이트처럼 하나의 주요 기능에 초점을 맞추고 있는 것이 아니라 이전 버전에는 포함되지 않았던 작은 개선사항들이 포함되어 있습니다.&lt;br /&gt;그런 면에서 본다면 메이저 업데이트라기 보다는 마이너 업데이트에 가까운 것이 아닌가 합니다만, 이번에 컴파일러(Roslyn)가 완전히 변경되었으므로 C# 6.0으로 나온 듯 합니다.
&lt;/p&gt;
&lt;p&gt;새로 추가된 사항들은 C# 언어로 코딩 하는데 있어 코드가 좀더 간결해지고 가독성이 높아지도록 하여 예외 발생 가능성을 줄이는데 목표가 있지 않나 싶습니다.&lt;br /&gt;신규로 추가된 기능들은 대부분이 클래스 멤버의 선언 및 구문의 표현에 관련된 내용입니다.&lt;br /&gt;그럼 하나씩 살펴 보시죠.
&lt;/p&gt;&lt;h1&gt;nameof 연산자
&lt;/h1&gt;&lt;p&gt;nameof 연산자는 연산자에 할당된 속성이나 변수의 이름을 컴파일 시 문자열로 변경해주는 역할을 합니다.&lt;br /&gt;얼핏 생각하면 아무런 효용성도 없는 기능처럼 보일 수도 있습니다. nameof(Field) 로 하는 것 보다는 &quot;Field&quot; 라고 적는 게 더 직관적일 수 있어 보이니깐요.&lt;br /&gt;하지만 아래 예제를 한번 보시죠.
&lt;/p&gt;
&lt;code data-gist-id=&quot;f6f99f4a23d9098b33cc&quot; data-gist-file=&quot;use_literal.cs&quot;&gt;&lt;/code&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color:white&quot;&gt;위 코드처럼&lt;/span&gt;
		&lt;span style=&quot;background-color:white&quot;&gt;파라미터로&lt;/span&gt;
		&lt;span style=&quot;background-color:white&quot;&gt;전달된&lt;/span&gt;
		&lt;span style=&quot;background-color:white&quot;&gt;값이&lt;/span&gt; null등의 유효하지 않은 값이 전달된 경우 ArgumentException 이나 ArgumentNullException을 발생시키는 경우가 자주 있습니다.&lt;br /&gt;그런데 일정 시간이 지난 후 appendString 이라는 파라미터의 이름을 appStr 로 변경한다면, ArgumentException 생성자에 전달하는 파라미터 이름 문자열도 변경해주어야 하지만, 쉽게 놓칠수 있는 부분이기도 하지요.
&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/25034E41564C0A4529&quot; /&gt;
	&lt;/p&gt;
&lt;p&gt;Visual Studio 에서 제공하는 리팩터링 기능을 이용(appendString 을 appStr로 변경 후 Shift + Alt + F10)한다면 변수로 사용되는 부분을 일괄적으로 변경이 가능해 유용하지만, 문자열로 되어 있는 ArgumentNullException의 생성자 부분은 자동으로 변경해주지 못합니다.
&lt;/p&gt;
&lt;p&gt;하지만, 아래와 같이 nameof 키워드를 이용하여 코드를 작성하고, 리팩터링 기능을 이용하면 
&lt;/p&gt;
&lt;code data-gist-id=&quot;f6f99f4a23d9098b33cc&quot; data-gist-file=&quot;use_nameof.cs&quot; data-gist-highlight-line=&quot;5,9&quot;&gt;&lt;/code&gt;
&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2732EA45564C0A461D&quot; /&gt;
	&lt;/p&gt;
&lt;p&gt;ArgumentNullException 생성자에서도 변수를 이용하므로 변경 대상에 포함됩니다. 이 부분은 컴파일 시 문자열로 변경되니 실질적인 코드는 문자열로 지정했을 때와 동일합니다.&lt;br /&gt;짧은 코드보다는 길고 복잡한 코드에서 변수나 속성의 이름을 변경 시 주의 부족으로 누락할 수 있는 부분을 깨끗하게 처리해줄 수 있는 유용한 기능입니다.
&lt;/p&gt;&lt;h1&gt;null 조건부 연산자
&lt;/h1&gt;&lt;p&gt;변수의 형식이 참조 형식일 때 인스턴스가 초기화하지 않은 상태의 변수는 null 값을 가집니다. null 값을 가지고 있는 변수를 사용하려 들면 개발자들이 가장 자주 만나는 런타임 예외 중의 하나인 NullReferenceException을 만나게 되죠. 방지하는 방법은 null 검사를 수행하는 방어적인 코딩을 하는 것입니다. 문제는 null 검사를 수행하는 단순한 코드가 계속 중복적으로 나오게 되는 점이죠.
&lt;/p&gt;
&lt;code data-gist-id=&quot;c0914387baf2c762a119&quot; data-gist-file=&quot;if_null_check.cs&quot;&gt;&lt;/code&gt;
&lt;p&gt;방어적인 코드로 런타임 시 발생할 수 있는 오류를 최소화할 수는 있지만, null 체크를 위해서 코드가 길어지다 보니 핵심 코드를 파악하기가 쉽지 않아 지는 문제점이 있습니다.
&lt;/p&gt;
&lt;p&gt;C# 6.0에서는 null 조건부 연산자(?. 또는 ?[)를 통해서 null 체크가 가능합니다. ?.는 멤버에 액세스 하기 전에 수행하고, ?[는 인덱스 작업을 수행하기 전에 수행합니다. &lt;br /&gt;null 조건부 연산자 좌측의 항목이 null 일 경우 null 조건부 연산자 좌측의 코드를 실행하지 않고 null을 반환합니다.&lt;br /&gt;그리고 여러 개의 null 조건부 연산자를 중첩적으로 사용할 수도 있습니다. 다수의 null 체크를 한 줄에 표현할 수 도 있습니다. &lt;br /&gt;Null 조건부 연산자를 이용한다면 위 코드는 아래와 같이 간단하게 표현이 가능해 집니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;c0914387baf2c762a119&quot; data-gist-file=&quot;null_condition.cs&quot; data-gist-highlight-line=&quot;3&quot;&gt;&lt;/code&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;ComicBook이 null 이라면 뒤의 내용은 실행하지 않고 null을 반환하며, Images 컬렉션이 null 일 경우에도 인덱스를 이용한 접근은 실행하지 않고 null을 반환하게 됩니다.&lt;br /&gt;null 병합 연산자(??)는 이전 버전의 C#에서도 사용할 수 있던 것으로 연산자 좌측 피 연산자가 null이 아닐 경우에는 좌측 피 연산자를 반환하고, 연산자 좌측 피연산자가 null 일 경우 연산자 우측 피연산자를 결과로 반환하는 것으로 null 조건부 연산자와 함께 사용하면 상당히 코드를 간결하게 만들 수 있습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;c0914387baf2c762a119&quot; data-gist-file=&quot;null_condition_default.cs&quot; data-gist-highlight-line=&quot;3&quot;&gt;&lt;/code&gt;
&lt;p&gt;&lt;/p&gt;&lt;h1&gt;문자열 보간
&lt;/h1&gt;&lt;p&gt;문자열의 특정 위치에 지정한 단어 또는 문장을 삽입하여 문장을 완성시키는 일은 개발 시 정말 자주 만나게 되는 이슈 중 하나입니다.&lt;br /&gt;이제까지 C#에서는 string.format 함수를 이용하거나 문자열 병합을 이용하여 이 같은 문제를 해결해 왔습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;8134eed9a8f32b999451&quot; data-gist-file=&quot;formatString.cs&quot;&gt;&lt;/code&gt;
&lt;p&gt;string.format 함수를 이용하는 방법은 인덱스를 이용하므로 중간에 삽입해야 하는 문자열이 추가되거나 할 경우 인덱스를 조정해야 합니다. 물론, 인덱스를 조정하지 않고 사용할 수도 있겠지만, 유지보수성이 나빠지게 됩니다.
&lt;/p&gt;
&lt;p&gt;문자열 보간을 이용하게 되면 변수명을 포맷 문자열에 바로 활용하므로&amp;nbsp;문자열 작업을 아주 직관적으로 수행할 수 있습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;8134eed9a8f32b999451&quot; data-gist-file=&quot;stringInterpolation.cs&quot; data-gist-highlight-line=&quot;7,8&quot;&gt;&lt;/code&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;문자열 보간에는 각 형식에 맞는 형식 문자일 뿐만 아니라 보간식 내에 조건식을 추가할 수도 있습니다.
&lt;/p&gt;
&lt;p&gt;문자열 보간을 사용하고자 하는 문자열은 $ 문자로 시작해야 합니다.
&lt;/p&gt;&lt;h1&gt;자동 속성의 향상
&lt;/h1&gt;&lt;p&gt;C# 3.0 이전에는 클래스에 멤버 변수를 선언하고 캡슐화를 위해서 그 멤버 변수를 노출하는 getter 와 setter 속성을 따로 만들어줘야 하던 코드가 C# 3.0에서 컴파일 시에 내부에서 자동으로 멤버 변수를 선언하도록 해주는 자동 속성(자동 구현 속성)이 추가되면서 단순한 속성 추가를 위한 코드의 양이 상당히 많이 줄어들었습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;12a8ea17ed37a1e683dc&quot; data-gist-file=&quot;member-getter-setter.cs&quot;&gt;&lt;/code&gt;
&lt;p&gt;이런 코드가 자동 속성을 이용하게 되면 아래와 같이 간결해집니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;12a8ea17ed37a1e683dc&quot; data-gist-file=&quot;auto-implement-property.cs&quot;&gt;&lt;/code&gt;
&lt;p&gt;자동 속성을 이용하다 보면 아쉬운 점이 자동 속성에 초기값까지 한번에 할당할 수 있었으면 좋겠다는 거였습니다.&lt;br /&gt;초기화를 위해서는 생성자에서 속성에 초기값을 설정하거나 예전 방식으로 멤버 변수와 속성을 따로 구현해야 했었죠.
&lt;/p&gt;
&lt;p&gt;이번 C# 6.0에서는 자동 속성에 바로 값을 할당하여 초기화하는 것이 가능해 졌습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;12a8ea17ed37a1e683dc&quot; data-gist-file=&quot;auto-implement-prop-init.cs&quot; data-gist-highlight-line=&quot;3,4,5&quot;&gt;&lt;/code&gt;
&lt;p&gt;그리고, 또 다른 추가 기능은 getter 하나만 존재하는 자동 속성이 생겼다는 것입니다.&lt;br /&gt;외부에서 getter 에만 접근이 가능하고 setter에 접근을 하지 못하는 자동 속성을 만들 때 이전에는 setter 를 private 등의 접근 제한자를 이용해서 노출 범위를 지정하여 사용했었습니다. 하지만, C# 6.0부터는 getter 하나만 존재하는 자동 속성을 만드는 것이 가능해진 겁니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;12a8ea17ed37a1e683dc&quot; data-gist-file=&quot;auto-impletement-prop-readonly.cs&quot; data-gist-highlight-line=&quot;3,6&quot;&gt;&lt;/code&gt;
&lt;p&gt;위 코드를 보면 Key 속성이 getter 만 지정되어 있습니다. 그리고 Update 속성은 setter가 private으로 설정되어 있죠.&lt;br /&gt;두 가지 코드의 다른 점은 무엇일까요?&lt;br /&gt;getter 만 있는 자동 속성은 컴파일 시 생성자를 제외한 다른 모든 위치에서 값의 변경이 불가능한 readonly로 멤버 변수가 선언되는 겁니다.&lt;br /&gt;즉, private setter가 있는 Update속성은 클래스 내부에서는 언제든 값의 수정이 가능하지만 getter 만 있는 Key는 생성자가 호출되어 객체가 초기화된 이후에는 어느 코드에서도 값을 설정하거나 변경할 수 없는 것입니다.
&lt;/p&gt;&lt;h1&gt;catch 와 finally 블록에서 await 지원
&lt;/h1&gt;&lt;p&gt;C# 5.0에서 추가된 async 와 await덕분에 비동기 개발이 아주 쉬워졌습니다. 컴파일러가 개발자 대신 각 비동기 메서드의 callback 메서드의 생성과 호출을 관리해 주는 덕분에 하나의 async 메서드 내부에서 다양한 비동기 메서드의 호출을 마치 동기 방식의 코드처럼 사용할 수 있게 되었습니다.
&lt;/p&gt;
&lt;p&gt;하지만, 불행히도 이제까지는 catch 와 finally 블록 내부에서는 await 키워드를 지원하지 않았습니다. 그래서 아래와 같이 catch 나 finally 외부에서 처리하는 방식을 사용해야만 했었습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;9270ab6a6a4b1fc3af5e&quot; data-gist-file=&quot;outside-await.cs&quot;&gt;&lt;/code&gt;
&lt;p&gt;C# 6.0부터는 catch 나 finally 블록 내부에서도 await 키워드의 사용이 가능해졌습니다. 위 코드는 아래처럼 catch 블록 내에서 await처리가 가능해져 예외 정보를 try-catch 블록 외부로 가지고 나와서 처리할 필요 없이 catch 블록 내에서 처리가 가능해 졌습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;9270ab6a6a4b1fc3af5e&quot; data-gist-file=&quot;catch-await.cs&quot; data-gist-highlight-line=&quot;11&quot;&gt;&lt;/code&gt;
&lt;p&gt;&lt;/p&gt;&lt;h1&gt;예외 필터
&lt;/h1&gt;&lt;p&gt;이번에 살펴볼 내용은 예외 필터입니다. 예외 필터는 Visual Basic 이나 F# 등의 언어에서는 이미 지원하고 있던 기능이었지만 C#에서는 지원되지 않았던 기능이었는데 C# 6.0에서 드디어 지원하게 되었습니다.
&lt;/p&gt;
&lt;p&gt;기존에는 발생한 예외의 속성 값에 따라 다르게 예외 처리하려면 해당하는 예외의 형식을 catch 조건으로 사용하고 catch 블록 내에서 속성 값을 비교하여 처리해야 했지만, 이제는 catch 조건에서 속성 값까지 필터링하는 것이 가능해졌습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;e26aae2b6deb85c720e7&quot; data-gist-file=&quot;exception-filter.cs&quot; data-gist-highlight-line=&quot;5&quot;&gt;&lt;/code&gt;
&lt;p&gt;위 코드는 try 블록 내부에서 ArgumentException형식의 예외가 발생하였을 때 예외의 ParamName 속성의 값이 date 일 때만 catch 블록에서 처리하고, 그 외의 경우에는 예외가 계속 전파되도록 하는 코드입니다.&lt;br /&gt;이 코드를 기존 방식으로 코딩을 한다면 아래와 같이 될 것입니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;e26aae2b6deb85c720e7&quot; data-gist-file=&quot;exception-old.cs&quot;&gt;&lt;/code&gt;
&lt;p&gt;필터 조건 절이 복잡하다면 메서드를 활용할 수 도 있습니다. 이때는 필터 조건 메서드에서 true 를 반환하면 catch 블록 내로 진입하며, false를 반환할 경우 블록 내로 진입하지 않습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;e26aae2b6deb85c720e7&quot; data-gist-file=&quot;use-method-filter.cs&quot; data-gist-highlight-line=&quot;7,13&quot;&gt;&lt;/code&gt;
&lt;h1&gt;Using static
&lt;/h1&gt;&lt;p&gt;특정 형식의 정적 멤버를 사용할 때 형식 명을 지정하지 않아도 바로 정적 메서드에 접근할 수 있도록 해주는 것이 Using static 입니다.&lt;br /&gt;C# 에서 using 은 해당 파일 내에서 사용할 형식들의 네임스페이스 명을 생략할 수 있도록 해주는 기능인데 반해, using static은 특정 클래스의 정적 메서드를 클래스 명을 생략하고 사용할 수 있도록 해주는 기능입니다. 그러므로, using static 뒤에는 네임스페이스가 아닌 클래스 명이 와야 하야합니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;1c7ef41b1c9c7ddfb3ff&quot; data-gist-highlight-line=&quot;2,8&quot;&gt;&lt;/code&gt;
&lt;p&gt;위  코드인 두 가지 메서드의 내용은 동일합니다. 위쪽 메서드에서는 using static 을 이용하여 Math 클래스의 정적 메서드인 Pow 와 정적 속성인 PI를 현재 클래스 내부에 있는 것처럼 사용하고 있는 것을 볼 수 있습니다.
&lt;/p&gt;&lt;h1&gt;인덱스 초기화
&lt;/h1&gt;&lt;p&gt;객체나 컬렉션을 선언적으로 초기화하는 방법은 상당히 유용한 C#의 기능 중 하나입니다. 선언적 초기화 방법 중 Dictionary 초기화 방법은 어떻게 보면 Dictionary의 사용방법과는 좀 상이한 방식으로 해야 했습니다. &lt;br /&gt;아래는 이전에 사용하던 Dictionary 초기화 방법입니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;0a903be71907905da5d6&quot; data-gist-file=&quot;dictionary-initialize.cs&quot;&gt;&lt;/code&gt;
&lt;p&gt;인덱서로 접근하여 사용하는 Dictionary의 사용 방식과도 다르고 JSON 형식과도 좀 다릅니다.&lt;br /&gt;아래는 C# 6.0에서 새로 추가된 방법입니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;0a903be71907905da5d6&quot; data-gist-file=&quot;index-initializer.cs&quot; data-gist-highlight-line=&quot;3-6&quot;&gt;&lt;/code&gt;
&lt;p&gt;새로운 방법은 Dictionary를 사용하는 방식과 유사하여 기존 방식보다는 더 직관적이고 우아한 방법이지 않을까 싶습니다.&lt;br /&gt;이 새로운 방식은 Dictionary뿐만이 아니라 키를 이용하여 값에 접근하는 인덱서가 존재하는 컬렉션 방식에는 모두 적용할 수 있습니다.
&lt;/p&gt;&lt;h1&gt;람다식을 이용한 함수 구현(Expression-bodied function members)
&lt;/h1&gt;&lt;p&gt;이제 간단한 로직을 가진 함수의 경우 람다식을 이용하여 간결하게 표현할 수 있게 되었습니다.
&lt;/p&gt;
&lt;code data-gist-id=&quot;e55b491f96ac44d8e441&quot;&gt;&lt;/code&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;위 코드에서 Name 은 속성의 getter를 람다식으로 구현한 것이며, 아래는 함수를 람다식으로 구현한 것입니다.&lt;br /&gt;이 방식은 연산자나 오버로딩에서도 동일하게 적용됩니다.
&lt;/p&gt;&lt;h1&gt;마치며
&lt;/h1&gt;&lt;p&gt;개발 언어는 그 언어를 이용하는 개발자들의 요구에 의해서 계속 발전해 갈 수 밖에 없습니다. &lt;br /&gt;C# 언어가 처음 나왔을 때는 저는 너무 엄격하다 할 만큼 형식을 명기하는 것을 중요시 한다고 생각했던 기억이 있습니다. 하지만, C# 3.0 에 암시적 형식인 var가 추가된 이후에는 컴파일러가 너무 많은 걸 알아서 해줘서 C# 을 새로 배우는 사람들에게는 자신이 사용하는 인스턴스가 실제로는 어떤 클래스가 인스턴스화 된 건지 생각해보는 기회마저 빼앗아 가는 거 같아서 과연 좋은 것인가 하는 생각도 했었답니다.
&lt;/p&gt;
&lt;p&gt;이처럼 보는 관점에 따라서는 언어의 새로운 기능들은 양면성을 가진다고 생각합니다. &lt;br /&gt;새로운 기능과 기술을 개발에 적용하는 건 상당히 권장할 만한 일이지만, 그 이전에 전제되어야 하는 건 현업에 적용할 때는 구성원들과 충분한 논의를 거쳐 합의가 이뤄진 이후에 적용해야 하는 거라고 생각합니다. 이렇게 쓰고 보니 새로운 기술을 쓰지 말라고 하는 것 같은데 그건 아니라는 거 다들 잘 알고 계시죠?
&lt;/p&gt;
&lt;p&gt;그럼 다음에 뵙겠습니다.&lt;/p&gt;</description>
      <category>C#</category>
      <author>hwigyeom</author>
      <guid isPermaLink="true">https://hwigyeom.tistory.com/3</guid>
      <comments>https://hwigyeom.tistory.com/entry/C-60-%EC%8B%A0%EA%B7%9C-%EA%B8%B0%EB%8A%A5-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0#entry3comment</comments>
      <pubDate>Wed, 18 Nov 2015 14:19:02 +0900</pubDate>
    </item>
    <item>
      <title>Windows 에 Redis 설치하기</title>
      <link>https://hwigyeom.tistory.com/entry/Windows-%EC%97%90-Redis-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-1</link>
      <description>&lt;p&gt;&lt;a href=&quot;http://redis.io&quot; target=&quot;_blank&quot;&gt;Redis(레디스)&lt;/a&gt;는 고성능 키-값 형식의 저장소로서 문자열, 리스트, 해시, 셋, 정렬된 셋 형식의 데이터를 지원하는 BSD 라이선스 기반의 오픈소스 NoSQL 입니다.
&lt;/p&gt;&lt;p&gt;인스턴스 메시지나 게임 관련 데이터처럼 오래 저장할 필요가 없는 단순한 데이터를 빠르게 처리하는데 적합한 데이터 저장소이며, 데이터를 램(RAM)에 저장하고 디스크에 변경 사항을 기록하는 구조를 사용합니다.&lt;br/&gt;메모리를 저장 공간으로 사용하므로 저장 공간에 제약이 있다는 약점이 있지만, 덕분에 데이터 조작을 매우 빠르게 할 수 있다는 장점이 있으며, 데이터는 키-값 형식으로 문자열, 리스트, 해시, 셋, 정렬된 셋 형식을 저장할 수 있습니다.
&lt;/p&gt;&lt;h2&gt;Windows 에 Redis 설치하기
&lt;/h2&gt;&lt;p&gt;Redis 는 공식적으로 Windows를 지원하지 않지만, Microsoft Open Tech 그룹에서 64비트 기반으로 포팅하여 개발 및 유지보수를 진행하고 있습니다.&lt;br/&gt;64 비트만 지원하는 이유는 32 비트는 지원 가능한 메모리가 4G로 제한이 있으므로 메모리에 데이터를 저장하는 인 메모리 데이터베이스에는 부적합하기 때문일 겁니다.
&lt;/p&gt;&lt;p&gt;공식 사이트는 &lt;a href=&quot;https://msopentech.com/opentech-projects/redis/&quot;&gt;https://msopentech.com/opentech-projects/redis/&lt;/a&gt; 이며, Windows 버전 Redis는 MS Open Tech 그룹의 GitHub 저장소(&lt;a href=&quot;https://github.com/MSOpenTech/redis&quot;&gt;https://github.com/MSOpenTech/redis&lt;/a&gt;)에서 관리되고 있습니다.
&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;font-family:맑은 고딕&quot;&gt;Window용 Redis 설치
&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;설치 미디어나 바이너리 파일은 &lt;a href=&quot;https://github.com/MSOpenTech/redis/releases&quot;&gt;&lt;span style=&quot;font-family:맑은 고딕&quot;&gt;https://github.com/MSOpenTech/redis/releases&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color:black; font-family:맑은 고딕&quot;&gt; 에서 다운로드가 가능하니 다운로드 해주십시오.
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;설치 파일(msi)이나 바이너리 파일이 포함된 압축 파일을 다운로드 하여 원하는 경로에 설치를 진행하시면 됩니다.&lt;br/&gt;설치 파일로 설치할 경우에는 포트 지정, 방화벽 예외 등록, PATH 등록, 서비스 등록 등을 일괄적으로 해주므로 간편하게 설치를 완료할 수 있습니다.
&lt;/p&gt;&lt;p&gt;설치가 완료되면 설치 디렉토리는 아래와 같은 구조입니다.
&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/214E3D4356383E3109&quot; alt=&quot;&quot;/&gt;
	&lt;/p&gt;&lt;h3&gt;테스트 하기
&lt;/h3&gt;&lt;p&gt;설치 파일로 설치하신 경우 이미 서비스에 등록을 하셨다면 서버 및 클라이언트 동작여부를 테스트를 위해 잠시 서비스를 중지합니다. 
&lt;/p&gt;&lt;p&gt;실행 창(Windows Key + R)에서&lt;br/&gt;&lt;span style=&quot;font-family:D2Coding&quot;&gt;NET STOP Redis&lt;br/&gt;&lt;/span&gt;를 입력하여 Redis 서비스를 중지해 주세요. 
&lt;/p&gt;&lt;p&gt;이제, Redis 설치 경로에서 redis-server.exe 파일을 실행해 보면 아래와 같이 Redis 서버가 실행되는 것을 확인할 수 있습니다.&lt;br/&gt;Redis 서버가 서비스로 등록되어 실행되고 있지 않다면, Redis를 이용하고자 할 때는 항상 redis-server.exe가 실행되고 있어야 합니다.&lt;br/&gt;redis-server.exe 파일을 실행하면 아래와 같은 화면을 볼 수 있습니다.&lt;br/&gt;기본으로 사용하는 포트와 프로세스 아이디 현재 동작방식(stand alone mode)등을 알 수 있으며 현재 사용하도록 지정된 설정파일이 없어 기본 설정을 이용한다는 것을 알 수 있습니다.
&lt;/p&gt;&lt;p&gt;
		&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/22553C4456383E3212&quot; alt=&quot;&quot;/&gt;
	&lt;/p&gt;&lt;p&gt;설정파일을 지정하여 redis-server를 실행하고자 한다면&lt;br/&gt;&lt;span style=&quot;color:white; font-family:D2Coding; background-color:black&quot;&gt;redis-server redis.windows.conf&lt;br/&gt;&lt;/span&gt;와 같이 설정 파일의 경로를 지정해주시면 됩니다.
&lt;/p&gt;&lt;p&gt;클라이언트를 이용하여 서버로 접근을 해보려면 서버가 실행되고 있는 상태에서 redis-cli.exe 파일을 실행하시면 됩니다.
&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/212A804856383E3212&quot; alt=&quot;&quot;/&gt;
	&lt;/p&gt;&lt;p&gt;redis-cli 를 아무런 옵션을 주지 않고 실행하면 로컬(127.0.0.1) 서버에 기본 포트인 6379 포트를 이용하여 접속하게 됩니다.&lt;br/&gt;ping 을 입력하면 Redis 서버는 PONG 을 반환합니다.
&lt;/p&gt;&lt;p&gt;원격 서버에 접속하거나 기본 포트(6379)가 아닌 포트를 이용하는 경우 아래 명령을 이용하여 접속할 수 있습니다.&lt;br/&gt;&lt;span style=&quot;color:white; font-family:D2Coding; background-color:black&quot;&gt;redis-cli –h host –p port –p password
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2652F94356383E3416&quot; alt=&quot;&quot;/&gt;
	&lt;/p&gt;&lt;p&gt;간단하게 set 명령어를 이용하여 name 이라는 키에 값으로 문자열을 넣어봤습니다.&lt;br/&gt;문자열 중간에 공백 문자가 있으므로 겹 따옴표로 문자열을 감싸주었습니다. 공백 문자가 없을 경우에는 겹 따옴표는 생략해도 됩니다.&lt;br/&gt;그리고, get 명령어로 name 이라는 키의 값을 가져옵니다.&lt;br/&gt;Redis 에서 실행할 수 있는 명령어의 목록은 &lt;a href=&quot;http://redis.io/commands&quot;&gt;http://redis.io/commands&lt;/a&gt; 에서 확인할 수 있습니다.
&lt;/p&gt;&lt;p&gt;이렇게 Redis 서버가 정상적으로 동작하는 것을 확인하였습니다.
&lt;/p&gt;&lt;p&gt;설치 파일로 설치하여 이미 서비스에 등록되어 있다면 중지했던 서비스를 새로 시작하기 위해서 실행 중인 redis-server창을 종료하신 후에 실행 창에서&lt;br/&gt;&lt;span style=&quot;font-family:D2Coding&quot;&gt;NET START Redis&lt;br/&gt;&lt;/span&gt;를 실행해 주시기 바랍니다.
&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;h3&gt;Redis Windows 서비스로 등록하기
&lt;/h3&gt;&lt;p&gt;바이너리 압축파일을 다운로드 받았을 경우 서비스로 등록하여 사용하고자 하신다면 아래와 같이 해주시면 됩니다.
&lt;/p&gt;&lt;p&gt;우선, Redis를 설치한 경로에서 명령 프롬프트 창을 열어 주신 후&lt;br/&gt;&lt;span style=&quot;color:white; font-family:D2Coding; background-color:black&quot;&gt;redis-server --service-install redis.windows.conf --loglevel notice&lt;br/&gt;&lt;/span&gt;를 입력하여 서비스로 등록할 수 있습니다.
&lt;/p&gt;&lt;p&gt;등록된 서비스를 시작/중지할 때는&lt;br/&gt;&lt;span style=&quot;color:white; font-family:D2Coding; background-color:black&quot;&gt;redis-server --service-start&lt;br/&gt;redis-server --service-stop&lt;br/&gt;&lt;/span&gt;를 이용하시면 되며,
&lt;/p&gt;&lt;p&gt;서비스 등록을 해제할 때는 &lt;br/&gt;&lt;span style=&quot;color:white; font-family:D2Coding; background-color:black&quot;&gt;redis-server --service-uninstall&lt;br/&gt;&lt;/span&gt;로 등록을 취소할 수 있습니다.
&lt;/p&gt;&lt;p&gt;등록을 해제하실 때는 자동으로 서비스가 중지되진 않으므로, 등록해제 전 이나 후에 --service-stop 으로 서비스를 중지해주시면 됩니다.
&lt;/p&gt;&lt;p&gt;아래 결과를 보시면 --service-install 옵션을 이용하여 redis.windows.conf 설정파일을 이용하도록 설정하여 redis-server를 윈도우 서비스로 등록하였으며, 서비스 실행에 이용되는 계정은 NetworkService 임을 확인하실 수 있습니다.
&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2106394956383E3517&quot; alt=&quot;&quot;/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2714E44B56383E3606&quot; alt=&quot;&quot;/&gt;
	&lt;/p&gt;&lt;p&gt;서비스로 등록 후에 서비스 창에 Redis 라는 이름으로 등록이 되었음을 확인 할 수 있습니다.
&lt;/p&gt;&lt;p&gt;서비스 이름을 변경하여 등록하고자 할 때는 &lt;br/&gt;&lt;span style=&quot;color:white; font-family:D2Coding; background-color:black&quot;&gt;redis-server --service-install -service-name MyRedisServer&lt;br/&gt;&lt;/span&gt;와 같이 서비스 명을 지정할 수 있습니다.
&lt;/p&gt;&lt;p&gt;포트까지 변경하고자 한다면 &lt;br/&gt;&lt;span style=&quot;color:white; font-family:D2Coding; background-color:black&quot;&gt;redis-server --service-install -service-name MyRedisServer -port 10001&lt;br/&gt;&lt;/span&gt;이름을 지정한 서비스를 시작할 때는&lt;br/&gt;&lt;span style=&quot;color:white; font-family:D2Coding; background-color:black&quot;&gt;redis-server –service-start -service-name MyRedisServer&lt;br/&gt;&lt;/span&gt;와 같이 서비스 이름을 지정해주시면 됩니다.&lt;br/&gt;서비스 중지 및 해제도 -service-name 옵션을 이용하시면 됩니다.
&lt;/p&gt;&lt;p&gt;위와 같은 방식으로 하나의 서버에 여러 개의 이름이 다른 Redis 인스턴스를 등록하여 실행하실 수도 있습니다.
&lt;/p&gt;&lt;p&gt;여기까지 Windows에서 Redis 를 설치하는 방법에 대해여 알아봤습니다.&lt;br/&gt;Redis 활용에 대한 자세한 내용은 다음 포스트에서 찾아 뵙겠습니다.&lt;/p&gt;</description>
      <category>Redis</category>
      <author>hwigyeom</author>
      <guid isPermaLink="true">https://hwigyeom.tistory.com/2</guid>
      <comments>https://hwigyeom.tistory.com/entry/Windows-%EC%97%90-Redis-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-1#entry2comment</comments>
      <pubDate>Tue, 3 Nov 2015 09:51:50 +0900</pubDate>
    </item>
  </channel>
</rss>