2015. 9. 18. 19:54

잡설

나는 Entity Framework는 그저 Link to SQL의 확장 정도로 인식해 왔다. 하지만 많은 유튜브 동영상 강좌를 보니 생각보다 다양한 하고 복잡한 프로그래밍 방식을 제공하는 것 같았다. 본인 프로그래밍 방식은 RDBMS에 프로시저 등을 생성하고 코드단에서 그 프로시저들을 호출하는 형태로 작업을 많이 해왔다. 그래서 최소한의 필요 데이터 만을 가져오는 것을 지향해서 테이블 단위의 Model을 생성하기 보다는 그때 그때 필요에 의해 모델들을 생성하다 보니 중복되는 code들이 늘어나는 것을 느꼈다. 특히 Relation에 엮여있는 테이블들의 데이터는 어떤 액션을 하느냐에 따라서 더 그런거 같더라.. 포스팅을 하는 지금 다시 생각해 보면 내가 한 코드단 모델링 방식은 잘 못 설계한 것이라는 생각이 든다. 잡설은 여기까지 하고 Entity Framework에 대한 사용법을 정리해보고자 한다.


Pre-Requisite

Entity Framework Power Tools 설치 (선택된 데이터베이스의 스키마를 자동으로 c#코드로 제너레이션 해준다.)

 - https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d (VS2015 지원안함)

 - https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838


Development Method

 - Database first: 데이터베이스에 접속하여 스키마를 통하여 모델과 엔티티를 자동생성

 - Model First: 비쥬얼 스튜디오에서 모델을 직접 설계하고 관계도를 만들면 엔티티가 자동생성 (ERD와 비슷)

 - Code First: 자동 생성 없이 엔티티와 DBContext를 상속받은 클래스를 개발자가 직접 작성


Package Manager Console

# entity framework 설치 (Nuget을 사용할 수 있다.)

PM> install-package entityframework


# 데이터베이스의 스키마 정보가 c# 코드로 생성(자동 제너레이션)

PM> enable-migrations


# 데이터베이스의 스키마와 c#코드상에 스키마 정보를 비교하여 변경된 스키마 정보를 yyyyMMddHHmmss_FileName이라는 c#파일로 생성

PM> add-migration FileName


# 아래 명령어를 통하여 변경된 스키마를 데이터베이스에 적용

PM> Update-Database


# 데이터베이스에 적용된 스키마 롤백 (선택된 파일의 상태때로 되돌아 간다. 즉, 선택 파일 이후에 변경되었던 스키마 정보는 모두 롤백된다.)

PM> Update-Database -targetmigration 마이그레이션파일명(.cs제외)


# 최초의 스키마 정보에서부터 타켓으로 변경된 스키마 정보(yyyyMMddHHmmss_FileName)가 스크립트로 생성

PM> Update-Database -Script -SourceMigration: @InitialDatabase - TargetMigration: yyyyMMddHHmmss_FileName


DbContext

public class Employee

{

  public string Id {get; set;}

  public string Name {get; set;}

}


public class EmployeeDBContext : DbContext

{

  public DbSet<Employee> Employees {get; set;}


  protected override void OnModelCreating(DbModelBuilder modelBuilder)

  {

    // 여기에 Entity의 컬럼 속성 및 테이블/프로시져 맵핑 등을 설정할 수 있다.

    // 테이블명이 복수형으로 만들어지는 것을 방지

    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    // Employee에 DB에 프로시져 자동 생성 및 맵핑

    modelBuilder.Entity<Employee>().MapToStoredProcedures

    (p => p.Insert(i => i.HasName("insertEmployee"))

               .Update(i => i.HasName("UpdateEmployee"))

               .Delete(i => i.HasName("DeleteEmployee")));

    base.OnModelCreating(modelBuilder)

  }

}


Pattern

 - Repositories Pattern

 - Unit of Work


DB Initializer

// DB 초기화 클래스 생성

public class DBInitializer : DropCreateDatabaseIfModelChanges<EmployeeDBContext>

{

  protected override void Seed(EmployeeDBContext context)

  {

    // 여기에 Context에 DataSet<Entity>로 선언된 프로퍼티의 기준 데이터를 생성해 줄 수 있다.

    base.Seed(context); 

  }

}

// Main() 함수나 Global.asax 의 실행부에 아래 함수를 호출하거나

System.Data.Entity.Database.SetInitializer(new DBInitializer());

// 또는 app.config나 web.config의 <entityframwork>에서 설정이 가능하다.

  <entityFramework>

    <contexts>

      <context type="Context Class Name, DLL Name">

        <databaseInitializer type="DBInitializer, DLL Name" />

      </context>

    </contexts>



Attribute

[SoftDelete("Property Name")]

모델 클래스에 SoftDelete()라는 속성을 선언하면 DB에 쿼리를 만드는 시점 Command Tree Interceptor 에서 그 쿼리를 가로채 실제 요청쿼리에 맞게 변환작업을 할 수 있게 한다.

이 기능이 구현하기 위해서는 Custom Attribute class 와 IDbCommandTreeInterceptor 인터페이스를 상속받은 class를 만들어 주어야 한다.


[DisplayFormat(DataFormatString = "{0:C0}")]



Tutorial

http://www.entityframeworktutorial.net/code-first/entity-framework-code-first.aspx


참조

https://www.youtube.com/playlist?list=PL6n9fhu94yhUPBSX-E2aJCnCR3-_6zBZx

https://www.youtube.com/watch?v=iwEG1M2ONrw

https://www.youtube.com/watch?v=vspEYmp6zWc

https://www.youtube.com/watch?v=i9Il79a2uBU

Posted by CoolDragon
2015. 9. 16. 17:28
본인이 느끼는 LESS의 큰 장점은 아래가 아닐까 싶다.
  1. Variables: 변수 선언이 가능
  2. Mixins: 공통적으로 사용될 클래스나 #태그ID 를 변수처럼 선언하여 그 변수를 다른 클래스나 #태그ID의 속성으로 쉽게 적용
  3. Nested Rule(Cascading): 태그나 클래스들을 계층적인 구조로 작업할 수 있어 하위 관계에 있는 태크나 클래스가 무엇인지 쉽게 확인이 가능
  4. Operation: 수학식 연산 작업이 가능
  5. Function: 다양한 내장 함수를 제공


다만 이런 장점이 극대화되기 위해선 개발자와 퍼블리셔 또는 디자이너간의 협업이 중요할 것으로 생각된다.

퍼블리셔(웹디자이너)가 원 그대로 CSS 파일을 전달해 주고 그것을 다시 개발자가 LESS 구조로 변환하는 작업은 시간 낭비가 되지 않을까 싶다.

백엔드 오피스툴 작업처럼 디자이너 없이 HTML, CSS를 개발자가 직접 작업하는 경우나 위의 경우처럼 개발자와 웹디자이너의 LESS 학습으 통하여 작업되는 경우 CSS를 조금 더 직관적이며  프로그램적인 시선으로 바라볼 수 있지 않을까 싶다.


웹 페이지에 LESS에서 제공하는 javascript파일 include하여 런타임에 컴파일(?)을 하거나 grunt와 같은 기능으로 less파일을 css파일로 쉽게 변환이 가능하다.


더 많은 기능과 자세한 사용법은 LESS 사이트에서 확인해 볼 수 있다.

Posted by CoolDragon
2015. 9. 8. 02:53

server variable

$_SERVER['HTTPS’]

$_SERVER['HTTP_HOST’]

// 외에 엄청 많음.


POST / GET

array $_GET  // GET 방식에 의해 넘겨진 form tag data

array $_POST() // POST 방식에 의해 넘겨진 form tag data


internal function

bool empty(value) // value가 비어있는가?

bool isset(value) // value가 null인가?

bool is_array(array) // 배열인가?

bool count(array) // 배열 갯수

bool preg_match(pattern_string, comparing_value) // regular expression

bool in_array(value, array) // array안에 value라는 값이 포함되어있는지 체크

bool ctype_digit(value) // value 가 숫자인지 체크

string impload(separator, array) // 배열을 하나의 문자열로 만들어준다.

array explode($delimiter, $string, [$limit]) // 문자열을 배열로 변경시켜준다.

header(‘Location: file명’); // 페이지를 file명 페이지로 리다이렉션 시켜준다. 

htmlspecialchars() <— 받은 문자 그대로 보여준다. (XSS를 막는 방법 중 하나)
// 그 외에 많겠쬬?


echo, printf , sprintf, var_dump

echo “Hello World!”; // 문자열을 브라우저에 찍는다.

printf(’number=%d string=%s’, 5, ‘abcde’) // 브라우저에 메시지를 찍는다. ehco와 비슷

$value = sprintf(’number=%d string=%s’, 5, ‘abcde’) // 만들어진 문자열을 리턴해준다.

var_dump() // 디버깅을 위하여 변수값 찍어보기


Form Tag

form태그 중 <select> 태그가 multiple 속정이 있을 경우 name속성 끝에 []을 지정하여 배열 선택이 될 수 있다고 명시해주어야 한다.

예) <select name=“language[]” multiple />

html코드에서는 name속성에 []을 포함시켰지만 서버 코드에서는 값을 가져오려고 할 때에는 []을 제외한 name만 사용한다.

예) printf(‘%s’, impload(‘ ’,  $_POST(“language”))) 


File include

readfile(‘~~~.templ.html')

include ‘xxx.php'

include_once ‘xxx.php'

require ‘xxx.php'

require_once ‘xxx.php'


Encryption

$pwd = password_hash(original_password, PASSWORD_DEFAULT);

$ok = password_verify(original_password, $p);


php operator

연산자 $A === $B 는? $A와 $B가 같고, 같은 자료형이면 TRUE

연산자 $A !== $B 는? $A와 $B가 같지 않거나, 같은 자료형이 아니면 TURE


use session

session_start(); // 세션을 사용하기전에 먼저 명령어 실행되어야 한다.

$_SESSION[‘key’] = ‘value’;


php with MySql

$db = new mysqli(‘localhost’, ‘username’, ‘password’, ‘database name’) or die(“Unable to connect”);

$db = mysqli_connect(“localhost”, “username”, “password”, “database name");

$query = sprintf(“insert into table(col1) values (‘%s’)”, mysql_real_escape_string($db, ‘value1’)); // avoid sql injection

mysqli_query($db, $query);

$result - mysqli_query($db, “SELECT * FROM table”);

foreach ($result as $row) {

$value = $row[“col1”];

}

$row = mysqli_fetch_assoc($result);

if ($row) {$col1 = $row[“col1”]; }

mysql_close($db);


Posted by CoolDragon
2015. 9. 5. 04:08
잡설
LinkedIn처럼 상단 메뉴를 고정시키고 마우스를 아래로 스크롤을 내리면 서브메뉴가 사라지고 다시 가장 상단페이지로 올라가면 (Top=0) 가면 다시 서브메뉴가 나타나도록 하는게 어떤건지 해보고자 한다.


index.html


후기

한동안 Front-UI쪽은 거의 안하다보니 많은 명령어도 많이 실제 코드는 별거 없지만 잊어버려 삽질했네순수 javascript로 해보고 싶었는데 그렇게 하려면 작업 시간이 많이 소요될거 같아서 jquery 의 도움을 받아서 해결(?) ㅋㅋ . 그나저나 mouseover와 out 이벤트가 직접 브라우저에서 열면 되는데 jsfiddle에서는 안되네.. 원하는 결과는 얻었지만 이렇게 말고 더 이쁘게 하는거 없나..

Posted by CoolDragon
2015. 8. 31. 01:42

1. install

$ sudo apt-get update

$ sudo apt-get upgrade -y

$ sudo apt-get install golang -y

$ sudo apt-get install git -y


# create project directory

$ mkdir $HOME/go

$ mkdir $HOME/go/bin


2. Setting path

$ echo "export GOROOT=/usr/lib/go" >> /home/vagrant/.bashrc

$ echo "export GOBIN=/usr/bin/go" >> /home/vagrant/.bashrc

$ echo "export GOPATH=$HOME/go" >> /home/vagrant/.bashrc

$ echo "export PATH=$PATH:$GOPATH/bin:$GOROOT/bin" >> /home/vagrant/.bashrc


3. Download library

go get {URL}

$ go get github.com/gorilla/mux

$ go get github.com/gorilla/sessions


4. Sample

keyvalue.go

- http://localhost:8080/mapstore/set/{key}/{value}

- http://localhost:8080/mapstore/get/{key}

Posted by CoolDragon
2015. 7. 25. 17:20

1) 개요

mvc를 지원하는 front-end 자바스크립트 프레임워크


2) 다운로드

https://angularjs.org/


3) 플렁커

plnkr.co

angular.js 를 이용하여 작성된 스크립트를 쉽게 UI와 함께 테스트를 해볼 있는 사이트 이다.


4) 기타

https://angular.io

http://courseware.codeschool.com/shaping-up-with-angular-js/Slides/level01-05.pdf

위의 PDF 문서에서 angularjs 가 지원하는 모든(?) 기능을 훑어볼 수 있다.

Posted by CoolDragon
2015. 7. 17. 05:55

1) 다운로드

  이 경로에서 설치하려는 OS 에 맞는 버전을 다운로드 받는다. https://www.apachefriends.org/download.html

  나는 우분투에 설치를 하고자 "xampp-linux-x64-5.6.8-0-installer.run" 버전을 선택하였다.


2) 권한부여

  다운로드 받은 파일을 해당 서버로 복사하고 파일을 실행하기 위한 권한을 부여한다.

$ wget https://www.apachefriends.org/xampp-files/5.6.8/xampp-linux-x64-5.6.8-0-installer.run

$ sudo chmod +x xampp-linux-x64-5.6.8-0-installer.run

  wget을 통하여 파일을 다운로드 받거나 파일을 다운로드 받고  scp 명령어과 같은 방법을 통하여 서버로 복사를 할 수 있다.

3) 설치

$ sudo ./xampp-linux-x64-5.6.8-0-installer.run

  설치과정에 물어보는 것이 많은데 모두  Y 를 누르면 설치가 완료될 것이다. 완료 후 /opt/ 하위 경로에 lampp 디렉토리가 추가되어있는 것을 확인할 수 있다.


4) XAMPP 실행/중지/재시작

$ sudo /opt/lampp/lampp start

$ sudo /opt/lampp/lampp stop

$ sudo /opt/lampp/lampp restart


5) 테스트

  로컬에서만 설치여부를 확인하고자 할 경우에는 특별히 문제가 없다. 다만 다른 PC에서 XAMPP를 열고자 할 경우에는 접근권한이 없다.

  이럴 경우 반드시 방화벽의 80 포트가 열려있는지 확인하고 "/opt/lampp/etc/extra/httpd-xampp.conf" 파일에서 아래처럼 수정해주어야 한다.

sudo vi /opt/lampp/etc/extra/httpd-xampp.conf

...

<LocationMatch ...>

# Require local

ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var

</LocationMatch>

이제 리모트에서도 브라우저로 페이지를 열수가 있다. (http://192.168.xxx.xxx/xampp)



참조) http://www.unixmen.com/how-to-install-xampp-stack-on-ubuntu-15-04/

Posted by CoolDragon
2015. 7. 2. 02:29
Posted by CoolDragon
2015. 6. 10. 03:39

Download the following Nuget Packages

  • xUnit.net
  • xUnix.net [Runner: Visual Studio]
  • AutoFixture
  • AutoFixture with xUnix.net data theories
  • Moq

Main Class and Interface
  • AutoFixture
  • var fixture = new Fixture();
  • Create<T>()
  • CreateMany<T>()
  • AddManyTo()
  • Inject()
  • Build<>()
  • With(), Without()
  • Do()
  • OmitAutoProperties()
  • Customizations.Add(ISpecimenBuilder inherited object)
  • ISpecimenBuilder



Posted by CoolDragon
2014. 7. 12. 17:30

There is a sample.


TestHandleBars.zip


reference : http://handlebarsjs.com


Posted by CoolDragon