c#의 장점은 클래스 형태, 변수 타입등이 정확히 일치하지 않으면, 컴파일 자체가 일치하지 않으면, 명확히 오류를 발생 시키므로, javascript 등과 같이 데이터형 및 오타 등으로인한 오류가 숨어있을 가능성이 매우 적습니다. 하지만, 이를 위해 치르는 비용 또한 만만치 않은데, 약간만 틀려도 다른 클래스를 정의하거나, 추상 클래스, 상속등 코드가 커지는 단점 또한 발생합니다. 특히 완전히 다른 클래스 중 일부만 같지도 않고, 비슷하면, 모두 다른 클래스로, 만들어 관리해야 할지 모릅니다.
그렇게 된다면, 파일이 너무 크고, 관리해야할 포인트, 업데이트 및 유지 보수 비용에 막대하게 늘어 날 것 입니다. 이를 간단히 해결하는 방법으로, 어트리뷰트와 리플렉션을 사용하는 방법이 있습니다. 사실 c#의 매우 이른시기에 포함되었지만, 그렇게 흥미를 끄는 키워드는 아닌듯 합니다. 하지만, 이 기능을 잘 사용한다면, 분명 많은 노력과 시간을 줄일 수 있습니다.
저는 맥에서 비주얼 스튜디오 코드를 사용하지만, 윈도우에서 비주얼 스튜디오를 사용하시는 분들도 무리없이 따라 오실 수 있을 것 이라 봅니다.
비주얼 스튜디오를 열어 Open Folder를 눌러 앞서 만든 폴더를 선택해 주도록 합니다.
주메뉴에서 보기 > 통합 터미널을 선택하여, 터미널을 열어 주도록 합니다.
콘솔에 dotnet new console 이라고 입력합니다. 그려면 아래와 같이 프로젝트가 초기화 되며, 처음 호출되는 메소드인 program.cs 파일도 자동으로 생성되어 집니다.
그냥 컴파일 후 시작하려면, 터미널에 dotnet run 이라고 입력하면됩니다.
오류를 찾기 위한 구성을 만들어 주려면 디버그 버튼과 화살표 버튼을 누른 후 .NET Core를 선택해 주도록 합니다.
그러면 구성이 추가되었습니다. 한 번 더, 디버그 > 삼각형 버튼을 눌러 주도록 합니다. 그러면 아래와 같이 DEBUG CONSOLE에 Hello World! 문자열이 찍히는 것을 확인할 수 있습니다.
2. Attribute 만들기.
Attribute를 만드는 것은 간단합니다. 클래스를 만들고, Attribute를 상속하기만 하면됩니다. 주의할 점은 클래스 명에, Attribute를 붙여 끝내야한다는 것입니다. 그렇게 하지 않아도 된다고 하는 데, 공식문서에서는 그렇게 하라고 합니다.
소스는 아래와 같습니다.
using System;
public class myAgeAttribute : Attribute
{
// 초기화 시 입력받은 값들을 저장합니다.
public int age = 0;
// 생성자 입니다.
public myAgeAttribute( int _age )
{
// 입력받은 값들을 저장합니다.
age = _age;
}
}
Attribute를 적용할 때는, Attribute클래스 명에서, Attribute를 제외하고 사용하면 됩니다. 저는 테스트를 위해 ex1, ex2라는 클래스를 만들었고, Attribute를 적용한 메소드가 적용하지 않은 메소드를 적절히 섞어 두었습니다.
*ex1
using System;
class ex1
{
[myAge(16)]
static public void myAge( int _age )
{
Console.WriteLine( string.Format("my Age : {0}", _age) );
}
static public void noAge( int _age )
{
Console.WriteLine( "호출 안되는 메소드" );
}
}
*ex2
using System;
class ex2
{
[myAge(18)]
static public void yourAge( int _age )
{
Console.WriteLine( string.Format("Your Age : {0}", _age) );
}
[myAge(3)]
static public void horseAge( int _age )
{
Console.WriteLine( string.Format("Horse Age : {0}", _age) );
}
static public void hideAge( int _age )
{
Console.WriteLine( "호출 안되는 메소드." );
}
}
그리고, 테스트를 위해 program.cs 파일을 약간 고쳐 줍니다. 어셈블리는 모듈 (.dll) 단위가 프로그램 상에 로드될 때, 어셈블리를 형성하게 됩니다. c#에서는 주로 프로젝트 단위가 되는데, 스스로 만든 클래스는 어떤 프로젝트에 포함되어 있는지 우리 스스로가 알고 있습니다. 대게의 경우 자신이 만든 클래스는 자신이 생성한 하나 혹은 2개의 프로젝트에 들어 있을 것 이므로, 자신이 생성한 클래스 중 하나의 어셈블리를 가지고 오면, 자신이 만든 모든 어셈블리 일 것 입니다. (프로젝트가 2개인 경우라도 적절히 찾으실수 있을 것 입니다.)
아래 소스는 이런식으로 어셈블리를 찾아 와 모든 타입(클래스, 인터페이스등)에 myAgeAttribute가 붙어 있는 메소드를 찾아 Attribute에 설정된 값으로, 해당 메소드를 실행시켜 줍니다. 대게 실행하려면, 인스턴스화 되어야 하지만, 우리는 static 메소드만 만들었으므로, 인스턴스화 할 필요 없이 바로 실행해 주는 것이 가능했습니다.
using System;
using System.Reflection;
namespace reflection
{
class Program
{
static void Main(string[] args)
{
// 어셈블리를 찾아 옵니다.
Assembly myAssem = typeof(myAgeAttribute).Assembly;
// 어셈블리에 포함된 모든 타입 (인터페이스, 클래스 등)을 찾아 옵니다.
var types = myAssem.GetTypes();
foreach( var _abc in types )
{
// 해당 타입의 메소드를 찾아 옵니다.
var methods = _abc.GetMethods();
foreach( var _curMethodinfor in methods )
{
// myAgeAttribute가 있는 객체를 모두 찾아 옵니다.
var attributes = _curMethodinfor.GetCustomAttributes<myAgeAttribute>();
foreach( var nn in attributes )
{
// 해당 어트리 뷰트가 있는 경우만, 메소드를 실행해 주도록 합니다.
_curMethodinfor.Invoke( null, new object[]{ nn.age } );
}
}
}
}
}
}
위 사이트에 가서, 알맞은 환경을 선택한 뒤 다운로드 받으면 된다. 몽고 DB를 다운로드 받으면, 압축이 풀리지 않은 상태로 다운로드가 되는 데, 다운로드 한뒤 더블클릭을 하면 압축이 풀어 지고, 별도의 설치과정은 필요하지 않다.
그럼에도 이 문서를 만들게 된 것은 약간의 설치 과정이 필요하기 때문이다.
이 문서는 다운로드된 파일들 속 README.txt 파일의 내용을 참고해 작성되었다.
2. 설치파일 이동 및 패스 걸기.
몽고 DB를 이동 시킬 위치 : /usr/local/mongodb
원칙적으로 어떤 폴더로 이동 시켜도 상관은 없다. 대체로 설치파일들은 /usr/local 폴더로 이동시키므로, 나도 여기에 폴더를 만들고 이동 시켰을 뿐이다.
다운로드 파일속에 /bin 폴더속에 실제 몽고DB의 유틸리티 파일들이 들어 있다. 이 파일들만 여기에 옮겨도 좋고, 다운받은 구조 그대로 /usr/local/mongodb 속으로 옮겨도 상관이 없다. 이 문서는 /usr/local/mongodb 폴더속으로 이동을 완료하였다.
이렇게 생성하고 이 폴더에서 몽고DB를 실행하면 사실상 설치는 끝이다. 하지만, 작업이 불편할 것 이므로, 패스를 걸어 주자. 자신의 홈 디렉터리 (cd ~로 이동할 수 있는 폴더)로 이동한 뒤, shift + command + .을 동시에 눌러 감춰진 파일들이 표시되도록 하면, .bash_profile 파일이 있을 것 입니다. (없으면 만들어 주면됩니다.) 이것을 편집기를 이용해 열어 줍니다.
가장 아랫줄에, export PATH=$PATH:/usr/local/mongodb/bin 라고 추가한뒤 파일을 지정합니다. (이 때 sudo 권한을 요구할 수도 있삽니다.)
터미널을 닫고 다시 연뒤 몽고db 헬프를 사용해 보도록 합니다.
$ mongod -help
몽고db 사용 설명이 표시된다면, 패스가 잘 설정된 것 입니다.
3. 실행 폴더 만들기. (/data/db)
이 부분은 readme 파일에 설명이 들어 있지 않지만, 하지 않으면, 몽고db를 실행해도, shutting down with code:100 이라는 메세지를 내며 실행되지 않습니다.
먼저 폴더를 만들어 줍니다. $ sudo mkdir -p /data/db
그리고, 권한을 줘야 하는데, 먼저 자신의 유저명을 확인합니다.
$ whoami
이렇게 해서 알게된 자신의 계정 이름을 확인해, 아래 명령어를 적절하게 써 넣어 줍니다.
$ sudo chown username /data/db
4. 몽고 db 실행.
$ mongod
이 한 줄로 몽고 DB 실행은 끝 입니다. mongod 는 데이터 베이스 이고, mongo 는 mongo db에 실제 커맨드를 날리며 실행해 보는 javasciprt sehll 입니다. 혼동하지 않도록 합니다. 여기서 몽고 db 실행이 되지 않는다면, 4번 과정이 잘 되었는지 확인해 보세요.
실행 후 웹 브라우저를 열어. http://localhost:27017 이라 입력하면, 아래와 같은 메시지를 볼 수 있습니다.
5. compass 설치
$ install_compass
이렇게 한 줄 입력하면, compass 다운로드를 시작한다. 그리고 설치 까지 마무리 된다.
6. 권한을 가진 유저만 사용할 수 있도록 설정.
처음 몽고DB를 설치하면, 누구나 DB에 접근해, 작업이 가능하다. 테스트는 문제가 없지만, 실사용에서는 권한별 사용이 가능하도록, 설정을 하고 사용해야 한다.
1) 권한가진 접속자만 허용하기 전, 계정 추가. (변경후에 사용할 관리자 계정을 하나 추가하도록 하자.).
터미널을 열어 mongo 콘솔로 접속하자.
$ mongo
터미널 프롬프트가 > 로 바뀌면 콘솔로 접속한 상태. 2줄을 입력해 관리자를 추가하자.
> use admin > db.createUser({ user:'이름', pwd: '비밀번호', role:['root']})
2) 권한 가진 접속자만 접속 허용.
주로 vim을 사용할텐데, 어떤 에디터든 상관이 없습니다. /usr/local/etc/mongod.conf 파일을 열어(없으면 생성), 아래 2줄을 추가하고 종료합니다.
npm의 외부 모듈 설치는 간단합니다. 터미널을 열어 일단 모듈을 읽어드릴, js 파일이 있는 폴더로 이동합니다. 저는 '/test' 폴더로 이동 이곳에 npm을 이용 외부 모듈을 설치했습니다. 저는 맥 사용자 이므로, 맥의 터미널을 사용했지만, 윈도우의 경우 [명령 프롬프트]를 이용하시면됩니다. 이 포스트는 윈도우용 설명을 보고 만들었습니다. 즉, 완전히 방법이 똑 같습니다.
아래 단 두줄로 간단히 nconf 라는 외부 모듈이 설치되었습니다. cd /test npm install nconf
설치를 마치면, '/test' 폴더의 하위에 'node_moduels' 라는 폴더가 생기가, nconf라는 외부 모듈이 다운 받아 졌음을 확인할 수 있습니다. 나머지 폴더들은 새로 생긴 것들은 인데, nconf 모듈 실행에 필요한 모듈들로 생각됩니다.
맥에도 MS Office가 깔리는 날이 오다니, 정말 감격 스럽습니다. 부트캠프로 개발을 하고 있었는데, 이제 맥에서 다 개발하고 있습니다. 사용해 보니 윈도우 office와 완전히 동일해 감짝 놀랐고, 맥이 오히려 보기 편했습니다. (똑 같은데, 윈도우 쪽이 더 화려해 보입니다.)
참고 문서 https://support.office.com/ko-kr/article/개발-도구-탭을-사용-하-여-만들거나-Mac-용-Excel-2016에서-매크로-삭제-5bd3dfb9-39d7-496a-a812-1b5e8e81d96a
개발 메뉴 꺼내기
처음 엑셀을 실행하면, 개발 메뉴가 없을 수 있습니다. (저도 없더라구요.), 맥과 윈도우는 꺼내는 방법이 다릅니다. 제가 맥에서 하고 있기도 하고, 윈도우는 개발 메뉴 꺼내는 방법이 많으므로, 맥에서 꺼내는 방법을 설명합니다.
[ Excel > 기본설정 ] 메뉴를 선택합니다.
기본 설정 창이 뜨면, [보기] 버튼을 눌러 줍니다.
보기 창이 뜨면, 아래 부분에 [개발 도구 탭] 이라는 체크박스를 선택하고, 창을 닫습니다.
그럼 아래와 같이 개발 도구 탭이 나타난 것을 확인할 수 있습니다.
매크로 만들기
원래의 매크로는 같은 작업을 반복해야 할 때, 행동을 기록해, 언제든지 복구하는 기능을 하는 기능 입니다. 하지만, 매크로 녹화 자체가 VBA 코드로 메소드를 새로 만들어 주는 작업을 하고, 동시에, 우리가 필요로하는 기능을 만들어 실행할 때 엔트리 포인트가 됩니다.
먼저 [매크로 기록] 을 클릭합니다.
그럼 매크로 생성 창이 뜨는 데 아래와 같이 입력하고, 확인을 눌러 줍니다. 여기서 2가지 기억해야할 것은 [ testMacro ]라는 이름으로 매크로가 [ option + cmd + z ] 버튼을 동시에 누를 때 실행하도록 설정했다는 것 입니다.
그리고 매크로 기록이 시작되지만, 우리는 매크로 기능을 사용할 것이 아니므로, 바로 [ 기록 중지 ]를 눌러 줍니다.
그 다음, [ Visual Basic ] 버튼을 눌러 Visual Basic Editor 창을 호출한뒤, 왼쪽의 [ Module1 ]을 선택해 주면, 매크로 코드들을 확인할 수 있습니다. 우리는 바로 기록을 중지 하였으므로, 내용이 하나도 없는 매크로를 확인할 수 있습니다.
매크로의 코드를 아래와 같이 약간 수정해 보도록 합시다. ( msgbox "Hello" ) 한 줄만 추가하면 됩니다.
그리고 창을 닫고, [ option + cmd + z ] 를 동시에 누르면 아래와 같은 창을 만날 수 있습니다.
그리고, 매크로가 포함된 파일은 [ Excel 매크로 사용 통합 문서 (.xlsm) ] 형식으로 저장해야 합니다.
* 이런 방법으로 매크로를 수정해 나간다면, 여러분들이 원하시는 매크로를 만들어 갈 수 있으리라 믿습니다.
그래서, 거의 울며겨자 먹기로, 부트캠프를 쓰게 되었는데, 이제 MS에서 오피스도 개발해주고, VSCode로 인해 PHP 등의 개발도 한결 수월해 졌습니다. MySql 또한 Work Bench라는 GUI툴을 지원해줘, 맥에서 아무런 불편함 없이 모든 개발이 가능해 졌습니다.
이 포스트는 제가 맥에 개발환경을 구축하며, 이 후 참고하려고 남기는 것 입니다. 하지만 여러분들에게도 많은 도움이 되었으면 좋겠습니다.
참고 문서 http://aspdotnet.tistory.com/1848 http://uiandwe.tistory.com/1034
자신의 Mac OS 버전 확인하기
맥 상단 메뉴의 [사과 마크]를 눌러 [이 Mac에 관하여]를 선택하면, 맥에 관한 정보를 확인할 수 있습니다.
아래는 제 맥의 버전 입니다.
맥 다운로드
설치 경로 : https://downloads.mysql.com/archives/community/
설치
DMG Archive를 선택하면, dmg 파일이 다운로드 되는 데, 더블 클릭을 해서 실행합니다. 그러면 하나의 .pkg 파일이 들어 있는데, 이 파일을 실행합니다.
그럼 아래와 같은 설치 파일이 뜨는 데, 그냥 몇 번 계속을 눌러주면 자동으로 실행됩니다.
주의 할 점은 설치가 완료되면, 마지막에 루트 비밀 번호를 알려 주는 창이 뜹니다. (설치 중 오류가 난 줄 알고, 놀람) 꼭 메모해 둡니다. (자동으로 생성되는 값 이므로 여러분은 다를 겁니다.)
설치 위치 확인 및 실행 종료.
설치 위치는 기본적으로, [ /usr/local/ ] 폴더에 설치됩니다. 저 같은 경우는 잘 설치되었는지 확인해 보니, mysql 폴더가 2개 였습니다. mysql 폴더는 단축 아이콘 이므로 걱정하지 않아도 됩니다.
서버의 시작과 종료는 시스템 환경 설정을 통해서 할 수 있습니다.
[Start MySQL Server]를 눌러, 서버를 실행합니다.
mysql 동작 확인
이제 서버가 잘 동작하는지 확인해야 할 차례, 터미널을 열어 mysql을 실행합니다.
터미널을 열고 mysql이 있는 경로로 이동합니다. cd /usr/local/mysql/bin
mysql을 실행합니다. sudo ./mysql -p설치시 발급 받은 패스워드.
이렇게 입력하면, 또 패스워드를 물어 옵니다. 이 때는 맥을 켰을 때 로그인 하기 위한 암호를 입력해 줍니다.
위와 같이 [ mysql> ]을 확인할 수 있다면, 잘 설치된 경우 입니다.
임시로 발급된 비밀번호가 복잡하기 때문에, 사용하는 것을 권장합니다. 하지만, 자신만의 번호를 원한다면, 아래와 같이 변경하면됩니다. set password = password('비밀번호'); 저는 예로 표시하기 위해 쉽게 1234로 했지만, 여러분은 복잡하고 보안이 좋은 암호를 선택하시기 바랍니다.