tag: 개발 이야기

PHP 네임스페이스

PHP에서 네임스페이스 문법 소개. `namespace`, `use` 사용하기.

2015년 4월 15일

PHP 5.3에서 새로운 기능으로 네임스페이스가 추가되었다. (= 이미 오래된 기능이다.) 많은 현대 언어는 이미 이 기능을 추가한지 오래지만 PHP는 조금 늦게 추가되었다. 최근에 개발되는 대다수의 PHP 라이브러리는 네임스페이스로 패키징해 composer, League 등을 통해 제공되고 있어 현대 PHP를 사용하려고 한다면 필수적으로 알아야 하는 기능이다.

PHP에서는 같은 이름을 가진 두 클래스를 동시에 사용할 수 없다. 클래스는 항상 유일해야만 한다. 이 제한으로 인해 서드파티 라이브러리에서 User라는 클래스명을 사용하고 있을 때는 User라는 클래스명을 사용할 수 없었다. 이렇게 간단한 클래스명을 사용하지 못하는건 불편하다.

PHP 네임스페이스는 위와 같은 클래스명 중복 문제를 해결한다. 그 뿐 아니라 코드를 패키징하거나 벤더명을 지정해 소유권을 표시하는데도 사용할 수 있다.

전역 네임스페이스

여기 간단한 클래스가 있다.

<?php
class Edward
{

}

별로 특별한 부분이 없다. 다음과 같이 사용할 수 있다.

<?php

$edward = new Edward();

이 상황에서 이 클래스는 전역 네임스페이스를 가졌다고 볼 수 있다. 즉 이 클래스는 네임스페이스 없이 존재한다. 그냥 일반 클래스와 같다.

단순한 네임스페이스

이제 네임스페이스 밑으로 클래스를 만들어보자.

<?php
namespace Haruair;

class Edward
{

}

위에서 만든 클래스와 유사하지만 작은 차이가 있다. namespace 라는 지시문이 추가되었다. namespace Haruair;는 여기서 작성한 모든 PHP 코드가 Haruair 네임스페이스와 관련이 되어 있음을 뜻하고 이 파일에서 생성한 클래스가 모두 Haruair 네임스페이스에 포함되어 있음을 뜻한다. 네임스페이스를 통해 클래스를 생성하면 다음과 같이 사용할 수 있다.

<?php
$edward = new Haurair\Edward();

위 코드와 같이 네임스페이스와 함께 클래스를 선언할 수 있다. 네임스페이스와 클래스 사이에는 백슬래시()로 구분이 된다. 위와 같은 방법으로 네임스페이스로 클래스를 다룰 수 있다.

이와 같은 방법으로 여러 단계의 위계를 활용하고 있는 경우를 많이 볼 수 있다.

This\Namespace\And\Class\Combination\Is\Silly\But\Works

의존성 원칙

PHP는 현재의 namespace에 따라 상대적으로 동작한다.

<?php
namespace Haruair;

$edward = new Edward();

Haruair 네임스페이스 내에서 개체를 생성했다. 동일한 네임스페이스에 속해 있는 상황이기 때문에 Haurair\EdwardEdward로 호출해 사용할 수 있다.

이런 상황에서 반대로 생각해볼 수 있는 부분은 네임스페이스 내부에서 상위 또는 최상위에 있는 네임스페이스나 클래스는 어떻게 접근할 지에 대해서다.

PHP는 클래스명 앞에 백스래시()를 넣어 전역 클래스 또는 글로벌 네임스페이스를 사용하고 있음을 명시적으로 선언할 수 있다.

<?php
$edward = new \Edward();

만약 다른 네임스페이스에 속한 클래스인 Drink\CokeHaruair 네임스페이스 내에서 사용한다면 앞서 예제와 같이 작성할 수 있다.

<?php
namespace Haruair;

$coke = new \Drink\Coke();

매번 전체 위계를 입력하는 것이 번거롭다면 use를 활용할 수 있다.

<?php
namespace Haruair;

use Drink\Coke;

$coke = new Coke();

use를 활용하면 다른 네임스페이스에 있는 하나의 클래스를 현재 네임스페이스 내에서 사용할 수 있게 해준다. 동일한 클래스명을 불러오게 되는 경우가 온다면 다음과 같이 활용할 수 있다.

<?php
namespace Haruair;

use Drink\Pepsi as BlueCoke;

$pepsi = new BlueCoke();

위와 같이 as 키워드를 쓰면 Drink\Pepsi 클래스에 별칭 BlueCoke를 지정해 사용할 수 있다. 같은 이름의 클래스 여럿을 동시에 사용한다 해도 문제 없다.

<?php
namespace Facebook;

use Twitter\User as TwitterUser;

class User {}

$twitter_user = new TwitterUser();
$facebook_user = new User();

Twitter 네임스페이스에 있는 UserTwitterUser 별칭으로 불러오면서 충돌을 회피했다. 이와 같이 충돌을 피하고 의도와 필요에 따라 기능을 모아서 사용할 수 있다.

use는 필요한 만큼 넣어서 사용할 수 있다.

<?php
namespace Haruair;

use Twitter\Follower;
use Facebook\WallPost;
use Cyworld\WallPost as CyPost;

구조

네임스페이스는 단순히 충돌을 피하기 위해서만 사용하는 것이 아니라 조직이나 소유권을 표기하기 위해 사용하기도 한다.

오픈소스 라이브러리를 만든다고 가정하자. 내가 만든 코드를 다른 사람이 사용한다면 분명 좋을 것이다. 다만 내 코드를 사용하는 사람들에게 불편함을 주지 않았으면 좋겠다. 클래스명이 충돌하게 되면 엄청나게 불편할 것이 확실하다. 그래서 다음과 같이 네임스페이스를 구분하기로 했다.

Haruair\Blog\Content\Post
Haruair\Blog\Content\Page
Haruair\Blog\Tag

여기서 내 아이디를 사용해서 이 코드가 누가 만들었는지 표시하는 것과 동시에 내 라이브러리 안에 만들어 코드를 사용하고자 하는 사람의 코드와 충돌하지 않도록 돕는다. 내 기초 네임스페이스에 여러개의 서브 네임스페이스를 만들어 내부 구조를 잡았다.

Composer를 사용하면 PSR-0, PSR-4를 통해 정해진 규칙에 따라 네임스페이스를 통해 클래스 정의를 자동으로 불러오는 등의 작업을 할 수 있다. 위 두 문서에서 이 유용한 방식을 확인해보는 것을 강력하게 추천한다.

제한

PHP가 제공하는 네임스페이스에는 한계가 있다. 다른 언어들에서의 구현과는 거의 유사하지만 약간 다른 점이 존재한다. Java의 경우, wildcard(*)를 이용해 해당 네임스페이스에 속해 있는 모든 클래스를 한번에 불러올 수 있다. 또한 Java에서의 import는 앞서 살펴 본 use와 같은 역할을 해서 패키지나 네임스페이스 내에 있는 클래스를 쉽게 이용할 수 있게 돕는다. 다음은 Java의 예시다.

import haruair.blog.*;

위와 같은 코드로 haruair.blog의 모든 패키지를 로드할 수 있다.

PHP는 이와 같은 방법으로 불러올 수 없다. 대신 상위의 네임스페이스를 use로 불러와 유사하게 사용할 수 있다.

<?php
namespace weirdmeetup;

use Haruair\Blog as Cms;

$post = new Cms\Content\Post;
$page = new Cms\Content\Page;
$tag = new Cms\Tag;

한 네임스페이스에서 많은 클래스를 동시에 사용할 때 위 방법이 도움이 된다.

더 읽을 거리

C#6의 새로운 기능 요약

VS2015 Preview에서 확인할 수 있는 C# 6의 새로운 특징을 예제와 함께 정리

2015년 4월 9일

msdn 블로그에 게시된 New Features in C# 6포스트를 요약했다. C# 6는 VS 2015 프리뷰와 함께 제공된 버전으로 여러가지 문법 특징이 추가되었다. 이 포스트는 요약이라 내용이 좀 부실할 수 있는데 상세한 내용은 위 포스트를 참고하자.

표현식

nameof

새로운 형태의 문자열로 프로그램 요소의 이름을 간혹 알아내야 할 상황을 마주하는데 그때 사용할 수 있는 표현식이다. 점 표기법(dot notation)을 사용한 경우 가장 마지막 식별자를 반환한다.

if (x == null) throw new ArgumentNullException(nameof(x));
WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode"

person이 스코프 내에서 타입이 아닌 변수라면 두번째 코드는 허용되지 않는다.

문자열 인터폴레이션

번거로웠던 String.Format()을 간편하게 작성할 수 있다.

var s = String.Format("{0} is {1} year{{s}} old", p.Name, p.Age);
s = "\{p.Name} is \{p.Age} year{s} old";
s = "\{p.Name,20} is \{p.Age:D3} year{s} old"; // 형식 지정
s = "\{p.Name,20} is \{p.Age:D3} year{(p.Age == 1 ? "" : "s")} old"; // 표현식도 쓸 수 있음

Note. 프리뷰 이후 문법이 변경되었다. s = $"{p.Name,20} is {p.Age:D3} year{{s}} old";

Null 조건부 연산자

체이닝 등 호출이 연속적으로 이뤄지는 상황에서 null 확인을 더 쉽게 만드는 연산자다.

int? length = customers?.Length; // customers가 null이면 null 반환
Customer first = customers?[0]; // customers가 null이면 null 반환

// null 병합 연산자인 ??와 함께 사용. customers가 null 일 때, 값은 0
int length = customers?Length ?? 0;

// 뒤에 따라오는 멤버 접근, 엘리먼트 접근 등은 customers가 null이 아닐 때만 호출
int? first = customers?[0].Orders.Count();

// 위와 동일한 표현
int? first = (customers != null) ? customers[0].Orders.Count() : null;

int? first = customers?[0].Orders?.Count(); // 연속으로 사용 가능

다만 ?을 사용한 직후에는 문법적으로 모호함이 있어서 바로 호출을 할 수 없다. 그래서 바로 대리자를 호출할 경우 다음과 같이 작성해야 한다.

if(predicate?(e) ?? false) { ... } // 에러 발생
if(predicate?.Inkobe(e) ?? false) { ... }

이벤트를 작동할 때 다음과 같이 작성할 수 있다.

PropertyChanged?.Invoke(this, args);

이 문법은 스레드 안정성을 보장하는데 좌측을 평가한 후 값을 임시로 저장하기 때문이다.

인덱스 이니셜라이저

개체 이니셜라이저를 확장에 다음과 같이 인덱스를 넣을 수 있게 되었다. 표현식 하나로 JSON 개체를 만들 때 유용하다.

var numbers = new Dictionary<int, string> {
  [7] = "seven",
  [9] = "nine",
  [13] = "thirteen",
};

확장 Add 메소드

확장 Add 메소드를 컬렉션 이니셜라이저에서 사용할 수 있다. 예전엔 인스턴스 메소드만 Add를 호출할 수 있었다.

오버로드 향상

오버로드 확인(resolution)이 향상되었다. 상세 내역은 소개되지 않았고 nullable 값 타입을 받을지 말지, 메소드 그룹을 대리자로 받는 등의 향상이 있을 것이라고 한다.

표현문

예외 필터

CLR 호환으로 VB와 F#에만 있던 기능이 이제 추가되었다.

try { ... }
catch (MyException e) if (myfilter(e))
{
  ...
} // if 문이 참일 때만 `catch` 블럭이 실행된다.

필터는 일반적이고 수용할 수 있는 형태로 “오용”을 할 수 있다. 파생작업을 위해 다음과 같이 사용할 수 있다.

private static bool Log(Exception e) { /* log it */; return false; }
...
try { ... }
catch (Exception e) if (Log(e)) {}

catch/finally 블럭에서의 Await

Resource res = null;
try
{
    res = await Resource.OpenAsync( ... ); // 원래 되던 부분
}
catch(ResourceException e)
{
  await Resource.LogAsync(res, e); // 이제 가능한 부분
}
finally
{
  if (res != null) await res.ColseAsync(); // 여기서도 가능
}

맴버 선언

자동 프로퍼티 이니셜라이저

필드에 이니셜라이져 하는 것과 비슷하다. 이 방법으로 이니셜라이징 하면 setter를 거치지 않고 내부 형식 바로 저장이 된다.

public class Customer
{
  public string First { get; set; } = "Jane";
  public string Last { get; set; } = "Doe";
}

Getter only 자동 프로퍼티

setter 없이 자동 프로퍼티를 사용하는게 허용된다. 이 방식은 readonly로 암묵적인 선언이 된다.

public class Customer
{
  public string First { get; } = "Jane";
  public string Last { get; } = "Doe";
}

위와 같이 초기화 하지 않는 경우에는 다음과 같이 타입 생성자에서 선언하면 값이 내부 형식에 바로 저장된다.

public class Customer
{
  public string Name { get; };
  public Customer(string first, string last)
  {
    Name = first + " " + last;
  }
}

이 문법은 표현 타입을 더 간소하게 만든다. 하지만 변형 가능한 타입과 불변 타입의 차이가 없어진다. 변형 가능한 클래스도 상관이 없다면 자동 프로퍼티를 기본으로 사용하는 것도 좋다. 여기다 getter only 자동 프로퍼티는 변형 가능한 타입과 불변 타입을 더 비슷하게 만든다.

표현-본문 함수 멤버

표현-본문 함수 멤버는 메소드와 프로퍼티, 다른 종류의 함수 멤버들의 본문을 블럭이 아닌 람다처럼 표현식을 바로 쓸 수 있도록 지원한다. 실제로 람다처럼 람다 화살표로 작성한다. 블럭 본문에 단일 반환값을 가진 형태와 동일하다.

public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
public static Complex operator +(Complex a, Complex b) => a.Add(b);
public static implicit operator string(Person p) => $"{p.First} {p.Last}";

void를 반환하는 메소드, Task를 반환하는 비동기 메소드에서도 동일하게 사용할 수 있지만, 이 경우에는 람다에서와 같이 꼭 문 표현식(statement expression)이 사용해야 한다.

public void Print() => Console.WriteLine(First + " " + Last);

프로퍼티와 인덱서도 다음과 같이 쓸 수 있다. get 키워드가 없는 대신 표현식 본문 문법에 따라 암묵적으로 사용된다.

public string Name => First + " " + Last;
public Customer this[long id] => store.LookupCustomer(id);

파라미터 없는 구조체 생성자

파라미터 없는 구조체 생성자가 허용되었다. 다음 구조체에서 new Person()은 선언된 생성자에 따라 기본값을 제공한다. default(Person)로 기본값을 사용하거나 new Person[...] 형태로 배열을 사용하면 해당 생성자는 실행되지 않는다. 명시적으로 구조체 타입과 함께 new 키워드를 사용했을 때만 해당된다.

struct Person
{
  public string Name { get; }
  public int Age { get; }
  public person(string name, int age) { Name = name; Age = age; }
  public Person() : this("Jane Doe", 37){ }
}

임포트

using static

using 으로 정적 멤버 타입을 스코프에서 직접 사용할 수 있다. 프리뷰에서는 정적 클래스의 멤버만 불러올 수 있다.

using System.Console;
using System.Math;

class Program
{
  static void Main()
  {
    WriteLine(Sqrt(3*3 + 4*4));
  }
}

Note. 다음과 같이 디자인이 변경되었다.

  1. using에서 using static으로 변경
  2. 구조체나 enum과 같은 멤버의 비정적 타입을 임포트 할 수 있음
  3. VB 모듈의 멤버나 F#의 최상위 함수를 임포트 할 수 있음
  4. 최상위 스코프에서 확장 메소드는 임포트 할 수 없음. 확장을 해온 원 클래스는 불러오지 않고 확장 메소드만 불러오면 안되기 때문.

위 모든 기능들은 VS 2015 프리뷰에서 확인할 수 있다.


이 글을 뒤늦게 확인하고 C#6의 문법적인 변경점을 살펴봤다. (아직 기본적인 문법도 잘 모르긴 하지만.) C# 개발은 얼마 해보지 못했는데 문자열 인터폴레이션만 봐도 편리한 기능들이 많이 나오는구나 느낄 수 있었다. 이번 달 아니면 다음 달 내로 베타가 시작될 것 같은데 기대된다.

블로그 테마 변경

나름 한국어 신경 쓴 워프 테마, GitHub에서 받을 수 있어요.

2015년 4월 5일

반년 만에 블로그 테마를 변경했다. 고해상도 디바이스가 많아져서 그런지 요즘 대부분의 블로그 테마들이 큰 서체 사이즈와 넓은 레이아웃으로 많이 나오고 있다. 반년 정도 사용한 hamingway 테마로 변경했을 때에도 비슷한 테마를 여럿 적용해봤는데 그나마 한국어 컨텐츠가 괜찮은 가독성으로 보여 hamingway 테마를 선택했었다.

이 테마를 오래 사용하다보니 불편한 점도 있었다. 대다수의 테마에서 공통적으로 느껴지는 부분인데 스크롤을 내려가며 컨텐츠를 읽다보면 sidebar가 있던 공간이 계속 공백으로 남아있기 때문에 균형감 없는 레이아웃으로 글을 읽게 된다. 또한 영어로 작성된 컨텐츠는 모든 브라우저에서 단어를 분리해 행 전환이 되는 단어 분리(word-break)가 발생하지 않지만 아직까지 CJK언어권의 단어 분리 옵션은 일부 브라우저만 지원한다.1 이런 상황과 맞물려 좁은 컬럼과 큰 서체의 사용은 한국어 문서의 가독성을 많이 떨어뜨리게 된다.

WordPress haruair theme

이번 테마는 roots.io의 Sage를 기반 테마로 사용해서 레이아웃, 서체, 행간과 자간 등을 변경해서 만들었다. 이 기반 테마는 bootstrap으로 구성되어 있는데 dist 되어있는 minified css를 활용하는 것이 아니라 bower로 전체 코드를 받아와 less를 직접 사용할 수 있는 장점이 있다. 테마의 구조가 직관적인 편이고 gulp를 이용한 빌드 및 watch 설정이 이미 다 되어 있기 때문에 기존에 있던 많은 starter theme과는 다르게 번거로운 작업이 필요하지 않았다.

  • one column으로 강제되어 있지만 2-column으로도 사용 가능
  • 영문은 ubuntu, 국문은 나눔바른고딕 기본으로 사용
  • 기본 서체의 크기를 키우고 행간과 자간을 한국어에 맞게 조절
  • 포스트 제목 아래에 headline을 삽입할 수 있도록 custom field 추가
  • 포스트 하단에 author box 추가
  • 테블릿 이하 해상도에서 서체 크기 조정

Ubuntu는 웹폰트로 추가되어 있는 반면 나눔고딕은 그렇지 않다. 나눔바른고딕은 웹폰트로 사용하기에 아직 무거운 느낌이고 기본 서체를 사용해도 그렇게 못봐주는 느낌은 아니라서 해당 폰트가 설치되어 있을 때만 나오고 그 외에는 애플고딕이나 바른고딕으로 출력된다.

아직 어색한 부분이나 변경해야 하는 부분이 많이 있지만 차차 수정할 생각으로 일단 적용했다. 해당 테마는 GitHub에서 받을 수 있으며 테마를 설치할 때에도 의존성 설치 및 빌드 과정이 요구되어 bower, npm 등을 구동할 수 있어야 한다. 로컬에서 작업한 후 gulp build로 모든 파일을 컴파일해서 올리는 방법도 가능하다. 자세한 설치 방법은 Sage README에서 확인할 수 있다.

  • Firefox는 CJK 언어를 위해 word-break: keep-all 을 지원하며 IE도 비슷한 방식으로 단어 분리를 방지할 수 있다. 
  • Visual Studio 2013 소소한 팁 모음

    2015년 3월 21일

    요즘 Microsoft Virtual Academy 를 통해 제공되는 여러 강의를 듣고 있다. 모든 강의가 영어로 제공되어 있어 아쉽긴 하지만 우린 직접 하는 그림(?)을 보고 따라 할 수 있으니까 만약 관심이 있다면 살펴보는 것도 좋겠다.

    C#을 가장 처음 접한 때는 @justinchronicle님이 운영한 .Net MVC Web Frameworks 스터디 였는데 그 경험으로 회사에서도 C#으로 프로젝트를 진행해보는 등 많은 도움이 되었다. 스터디가 프레임워크 위주라서 C# 자체에 대해 너무 피상적으로만 알고 있다는 생각이 들었던 터라 요 얼마간은 제대로 공부해야겠다 마음 먹고 MVA에서 C# 관련 강의를 보고 있다.

    C# 개발을 하면서 Visual Studio를 사용해왔긴 했지만 너무 기본적인 기능만 활용하고 있다는 생각이 들어 MVA에 올라온 강의 중 What’s New In Visual Studio 2013 in JumpStart를 잠깐 보게 되었는데 유용한 기능들이 많아 간단하게 정리했다.

    VS 테마 변경하기

    개발 도구를 사용하다보면 생산성을 높이기 위해서(가독성이나… 기분을 전환하거나ㅎ) 테마를 변경하게 되는 경우가 종종 있다. Visual Studio에서도 Color Theme을 변경할 수 있는 기능이 있다.

    Tools > Options 에서 Environment 섹션을 클릭하면 Color Theme을 선택할 수 있는 옵션이 있다. 기본적으로 제공되는 테마는 Black, White, Blue 세가지인데 Visual Studio를 설치하는 과정에서 선택하게 되어 있기 때문에 직접 변경하게 되는 일은 거의 없다.

    이 외에 새로운 테마를 사용하고 싶다면 Visual Studio Gallery에서 제공하는 Visual Studio 2013 Color Theme Editor를 활용할 수 있다. 해당 확장을 설치하면 기본적으로 추가적인 테마가 제공되며 또 자신의 취향에 맞는 테마를 쉽게 만들어 낼 수 있다.

    다음과 같이 추가된 테마를 확인할 수 있다.

    Color Theme Options

    Solarized (Dark)를 적용했다.

    Theme Changed

    행 번호 표시하기

    이미 많은 분들이 켜서 사용하고 있는 옵션인데 Tools > Options > Text Editor 에서 활성화 하고 싶은 언어의 General 섹션을 클릭하면 Line Numbers 옵션이 있다.

    스크롤바 맵모드 사용하기

    Sublime Text에서 제공되는 것과 같은 스크롤바 맵모드를 활용할 수 있다. Tools > Options > Text Editor 에서 활성화 하고 싶은 언어의 Scroll Bars 섹션을 클릭하면 Behavior에서 스크롤 모드를 변경할 수 있다. 여기서 map 모드로 변경하고 적용하면 맵모드를 확인할 수 있다.

    Scroll Map Mode Options

    활성화 된 스크롤맵에 마우스 커서를 올리면 코드를 바로 확인할 수 있는 Preview Tooltip 도 지원한다.

    주석 켜고 끄기

    해당 코드를 주석으로 바꾸고 싶으면 영역을 선택하고 Ctrl + K, Ctrl + C 로 주석을 달 수 있다. 반대로 주석을 없에고 싶으면 Ctrl + K, Ctrl + U.

    문서 포메팅하기, 들여쓰기 자동 지정하기

    VS는 코드 작성할 때 기본적으로 설정된 코딩 컨벤션에 맞게 잘 동작하지만 가끔 애매하게 제대로 되지 않을 때가 있다. 그럴 때 Format Document를 사용할 수 있다. 단축키는 Ctrl + K, Ctrl + D. 문서 전체가 아닌 선택된 영역만 하고 싶다면 Ctrl + K, Ctrl + F.

    Format Document

    현재 행을 다른 행으로 이동하기

    코드를 작성하다가 코드의 위치를 옮기고 싶다면 복사 붙여넣기를 해도 되지만 간단하게 Alt + 위, 아래 단축키를 사용할 수 있다. 여러 행을 선택하면 한번에 이동도 가능하다.

    Peek Definition

    C#은 여러 클래스가 많은 파일에 산재되어 있어 직접 작성한 코드라도 해당 위치를 찾을 때 불편한 경우가 종종 있다. 이럴 때 Peek Definition을 활용할 수 있다. 현재 작성된 메소드나 인스턴스, 클래스에서 Alt + F12를 누르면 작은 창으로 해당 코드를 바로 열어볼 수 있다.

    Pick Definition

    열린 작은 창 안에서도 해당 단축키로 계속 탐색이 가능하고 그 자리에서 바로 코드를 수정 및 저장하는 것도 가능하다. 창을 닫으려면 ESC를 누르면 된다.

    이전에 복사한 내용 붙여넣기

    내용을 복사해 붙여넣는 도중에 다른 내용을 복사하면 이전에 가지고 있던 내용을 잃어버리게 된다. 만약 그 이전에 있던 내용을 붙여넣고 싶다면 Ctrl + Shift + V 를 반복해서 입력하면 된다.


    Visual Studio는 알아가면 알수록 강력한 기능이 많아 사용하는 재미가 있는 도구인 것 같다. 조만간 나올 VS 2015도 기대되고, 더욱 자유자재로 쓸 수 있도록 부지런히 공부해야겠다.

    Visual Studio 2013 무료로 사용하기

    2015년 3월 20일

    마이크로소프트에서 제공하는 IDE인 Visual Studio는 다양한 언어과 강력한 기능을 제공하고 있다. 이 IDE는 상황에 맞게 구입해서 사용할 수 있도록 다양한 버전으로 제공되고 있었는데 예전부터 Visual Studio Express 라는 이름으로 기능이 다소 제한된 무료 버전을 제공하고 있었다. (DreamSpark를 통해서 사용 할 수 있던 버전이 바로 이 버전.)

    가장 최근 Express 버전인 Visual Studio 2013 Express도 각 타겟 플랫폼에 따라 for Web, for Windows, for Windows Desktop로 분류해 제공해왔는데, 2014년 11월, 대부분의 제약 사항이 없어진 Visual Studio 2013 Community가 공개되었다.

    • Express 버전에서 제한 되었던 IDE 확장 기능을 Visual Studio Gallery를 통해 사용할 수 있음
    • 크로스 플랫폼 지원
    • 교육용 및 개인 개발자 상용으로 사용 가능
    • 기업도 PC 250대 이상 또는 연매출 미화 1백만 달러 이상이 아닌 경우 5명까지 사용 가능

    이 버전의 VS는 Visual Studio 2013 Community 안내 페이지에서 받을 수 있다.

    요즘은 생산성 좋은 IDE도 많이 생겨서 선택의 폭이 많이 넓어졌긴 했지만 그래도 VS의 강력하고 안정적인 기능들은 언제 봐도 든든한 기분이 든다. C#, VB 외에도 PHP, JavaScript 등 다양한 언어에 대한 지원도 많아졌고 npm, bower, composer 등을 편리하게 사용할 수 있는 확장도 있어 새로운 개발도구를 찾고 있는 윈도 사용자라면 사용해보는 것도 좋겠다.

    윈도 환경의 개발 커뮤니티도 하루가 다르게 변화하고 있고(MS에서 github에 코드를 공개해놓고 작업한다던가) 게다가 Windows 10와 VS2015 릴리즈가 올해 예정되어 있어 예전에 비해 체감하게 되는 온도가 많이 다른 것 같다. 더 재미있는 도구들이 많이 나왔으면 하는 기대감이 든다.

    워드프레스 유지보수 모드 (Maintenance mode)

    2015년 3월 16일

    워드프레스에서 유지보수를 위해 사이트를 일시적으로 차단할 경우가 있다면 유지보수 모드(Maintenance mode)를 활용할 수 있다.

    사용자로서 워드프레스를 이용하게 될 때에는 이 모드를 보게 되는 일이 거의 없다. 만약 보게 된다면 워드프레스 플러그인, 테마, 코어를 업데이트 하는 도중에 사이트에 접속하게 되는 경우다. 설치 과정을 눈여겨 본 사용자라면 유지보수 모드를 켜고 설치 과정이 진행된 후 완료 되면 다시 유지보수 모드가 해제되는 것을 확인할 수 있다.

    만약 업데이트 중에 페이지를 벗어나게 된다면 유지보수 모드가 해제되지 않아 사이트가 닫힌 상태로 유지된다. 이럴 때에는 직접 유지보수 모드를 직접 해제해야 한다.

    maintenance mode

    워드프레스 웹사이트에서 다음과 같은 화면을 본다면 유지보수 모드가 켜져있는 상태다.

    유지보수 모드 켜고 끄기

    유지보수 모드는 워드프레스 최상위 폴더에 .maintenance라는 이름으로 빈 텍스트 파일을 생성하면 활성화 된다. 유지보수 모드를 끄려면 이 파일을 지우면 된다.

    .Maintenance file

    유지보수 페이지 변경하기

    유지보수 페이지를 좀 더 친절하게 변경하고 싶다면 wp-content/maintenance.php 파일을 만들어 해당 내용을 작성하면 된다. 기본적으로 출력되는 유지보수 페이지는 503 Service Unavailable 를 반환한다는 사실을 참고하자.

    <?php
      $protocol = $_SERVER["SERVER_PROTOCOL"];
      if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol )
        $protocol = 'HTTP/1.0';
      header( "$protocol 503 Service Unavailable", true, 503 );
      header( 'Content-Type: text/html; charset=utf-8' );
      header( 'Retry-After: 600' );
    ?>
    <!DOCTYPE html>
    <html lang="ko">
    <head>
      <meta charset="utf-8">
      <title>Haruair.com 점검중</title>
    </head>
    <body>
      <h1>현재 웹사이트 점검중입니다. 잠시 후에 다시 접속해주시기 바랍니다.</h1>
    </body>
    </html>