[Dev] BackEnd
- Getting Started with ASP.NET vNext and Visual Studio 14 2014.08.04
- ASP.NET MVC4, Mysql 연동 (ORM : Entity Framework6) 2014.06.20 2
- HTML Status 필요한 부분만 요약 2014.06.19
- C# 1.0에서 4.0까지의 변화를 정리한 글입니다^^ 2014.06.10
- ASP.NET MVC4 File Upload 방법 2014.03.25
- C#에서 HttpWebRequest POST 요청 데이터 인코딩 처리 2014.02.28
- C# FTP 파일 전송 코드 2014.02.12 1
- Repository Pattern (리파지터리 패턴) 2014.01.16
Getting Started with ASP.NET vNext and Visual Studio 14
ASP.NET MVC4, Mysql 연동 (ORM : Entity Framework6)
새로운 MVC 프로젝트를 개발하면서 이번에는 MySql DB 서버와 연동을 하게 되었다.
- VisualStudio 2012
- .NET Framework 4.0, ASP.NET MVC4, EntityFramework 6
저번에도 한번 진행을 하였으나 MySql의 버전이 너무 낮은 관계로 MysqlClient가 아닌 ODBC로 연동을 할 수 밖에 없었다. (http://whiteblank.tistory.com/trackback/138 참고)
MySql에서 프로시저까지 만들어준다면야 땡큐~ 지만 그렇게 해줄 가능성은 매우 희박하다. 그리고 MSSQL에 동일 테이블을 생성하여 Job을 통해 특정시간마다 데이터를 가져와서 해당 DB를 액세스 하여 사용할 수 있지만 아직 결정된 부분이 없기 때문에 아래 두가지 경우를 생각하게 되었다.
첫번째, MSSQL에서 Linked Server로 Mysql를 Openquery로 데이터를 끌어와 프로시저를 만든 이후 웹서버에서 MSSQL의 프로시저를 호출
두번째, 웹서버에서 직접적으로 쿼리문을 사용하여 데이터를 가져오는 방식
어떠한 방법이 좋을까 생각하다가 두번째 방법을 사용하기로 했다.
그러면 프로젝트를 어떻게 설정해야할까!!
1. NuGet 패키지에서 MySql DLL을 추가한다.
# MySql 관련 dll은 Entity Framework6 이상만 지원한다!!!!
2. Web.config 설정
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> </entityFramework> |
<connectionStrings> <add name="conn" connectionString="Data Source=; Initial Catalog=;User ID=; Password;" providerName="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken="c5687fc88969c44d" /> </connectionStrings> |
<system.data> <DbProviderFactories> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </DbProviderFactories> </system.data> |
3. MySql DB Context 정의
MyDbContext.cs 추가
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MyContext : DbContext
{
public MyContext()
: base("conn")
{ }
}
4. Data Access
public ActionResult Index()
{
using (var context = new MyContext())
{
List<MerchantModels> list = context.Database.SqlQuery<MerchantModels>("SELECT * FROM TB_DISCOUNT_MERCHANT").ToList();
}
return View();
}
이렇게 하면 MySql의 테이블에 접근이 가능해진다.
우선 내가 급하게 사용을 해야하기 때문에 설명보다 내가 작성한 코드를 우선적으로 써내려왔다.
HTML Status 필요한 부분만 요약
4xx Client Error | ||
400 | Bad Request | 클라이언트의 잘못된 요청으로 처리할 수 없음 |
401 | Unauthorized | 클라이언트의 인증 실패 |
402 |
Payment required |
예약됨 |
403 | Forbidden | 접근이 거부된 문서를 요청함 |
404 | Not found | 문서를 찾을 수 없음 |
405 | Method not allowed | 리소스를 허용안함 |
5xx Server Error | ||
500 | Internal Server Error | 내부서버 오류 (잘못된 스크립트 실행시) |
501 |
Not Implemented | 클라이언트에서 서버가 수행할 수 없는 행동을 요구함 |
502 | Bad Gateway | 서버의 과부하 상태 |
503 | Server Unavailable | 외부 서비스가 죽었거나 현재 멈춤 상태 |
C# 1.0에서 4.0까지의 변화를 정리한 글입니다^^
ASP.NET MVC4 File Upload 방법
이전에 한번 클라이언트에서 서버로 파일을 업로드하고 이것을 외부 FTP 서버로 전송하는 글을 쓴적이 있다.
여기서 한가지 문제점이 있었다.
private bool UploadToFTP(HttpPostedFile fileToUpload)
{
try
{
string uploadUrl = @ftp://블라블라블라;
string uploadFileName = fileToUpload.FileName;
................
}
}
이런식으로 HttpPostedFile 파라미터를 이용 해서 클라이언트의 input file 태그에서 선택된 파일을 받아올 수 있다고
설명을 했다.
하지만 다중 File Upload일 경우 하나라도 파일을 선택을 하지 않을시 fileToUpload의 파라미터값이
null로 들어오는 문제점이 있었다.
이것을 해결 하기 위한 방법은 메소드 내부에 Request.Files를 사용하면 된다.
클라이언트에서 업로드한 파일의 컬렉션을 multipart MIME 형식으로 가져오게 되며,
모든 input file 태그에서 파일을 선택하지 않아도 잘 동작한다.
private bool UploadToFTP()
{
try
{
HttpFileCollectionBase files = Request.Files;
foreach (string file in files)
{
HttpPostedFileBase f = files[file] as HttpPostedFileBase;
................
}
}
}
여기서 이 두가지의 차이를 명심해야 한다.
첫번째 HttpPostedFileBase를 파라미터를 받을 경우
Client에서 Input file의 name이 모두 같아야 한다~ 이것에 서버 메소드의 Parameter 이름이 된다.!!
두번째 Request.Files를 이용할 경우
Client에서 Input file의 name이 같으면 안된다.!!
C#에서 HttpWebRequest POST 요청 데이터 인코딩 처리
HttpWebRequest를 이용해서 데이터 전송 코드를 작성했는데 요청 데이터가 깨지는 현상이 발생했다.
바로 일본어를 넘겨줘야 하는데 넘어온 파라미터 데이터를 Encoding.UTF8.GetBytes()를 이용해서 인코딩을 했으나
요청을 받는 서버에서는 일본어가 깨져서 들어가는 것을 확인했다.
구글링 결과 파라미터 값만 인코딩한다고 되는 문제가 아니였다.
HttpWebRequest의 인스턴스의 ContentType에도 "charset=UTF-8"로 설정을 해줘야 했다.!!!
아 몇시간 동안의 삽질이 있었는지 이제서야 깨지지 않고 잘 들어간다.
일본어도 들어가니 한글도 잘 들어가겠지??
C# FTP 파일 전송 코드
HttpPostedFile 타입으로 매개변수를 받아 그대로 외부 서버로 FTP 전송을 하기 위해서 아래와 같은 코드로
작성을 해야한다.
서버 내부의 파일을 가지고 FTP 전송하는 방법이랑 조금 다르다ㅜㅜ
private bool UploadToFTP(HttpPostedFile fileToUpload)
{
try
{
string uploadUrl = @ftp://블라블라블라;
string uploadFileName = fileToUpload.FileName;
Stream streamObj = fileToUpload.InputStream;
Byte[] buffer = new Byte[fileToUpload.ContentLength];
streamObj.Read(buffer, 0, buffer.Length);
streamObj.Close();
streamObj = null;
string ftpUrl = string.Format("{0}/{1}", uploadUrl, uploadFileName);
FtpWebRequest requestObj = FtpWebRequest.Create(ftpUrl) as FtpWebRequest;
requestObj.Method = WebRequestMethods.Ftp.UploadFile;
requestObj.Credentials = new NetworkCredential("userid", "password");
Stream requestStream = requestObj.GetRequestStream();
requestStream.Write(buffer, 0, buffer.Length);
requestStream.Flush();
requestStream.Close();
requestObj = null;
return true;
}
catch
{
return false;
}
}
Repository Pattern (리파지터리 패턴)
http://vandbt.tistory.com/27 블로그에서 참조한 글입니다.^^
리파지터리 패턴은 그 복합성 때문에 완벽히 이해하고 적용할 수 있기까지 매우 어려운 패턴이라 생각됩니다. 여러번에 걸쳐 이 주제를 포스팅 하는 이유가 바로 그 때문입니다. 여러 문서를 학습하거나 구현에 적용할 때에는 관련된 해결해야 하는 문제들이 등장하게 되죠. 패턴이 잘못 사용되지 않도록 하기위해서는 그 패턴이 가지는 정확한 목적을 이해하는 것이 가장 우선시 되는 것이죠.
Repository는 저장소 라는 용어로 데이터소스에 대한 관리(CRUD)를 어떻게 추상화 하느냐에 대한 패턴입니다.
문맥:
목표:
솔루션:
구현상세:
고려사항:
참고
리파지터리 패턴 구현에는 마틴파울러의 데이터 매퍼 패턴 (Data Mapper pattern)이 함께 사용됩니다.
리파이터리 패턴 구현에는 마틴파울러의 질의객체 (Query Object) 라는 개념이 사용됩니다.
동적, 재사용가능, Single point decision 을 위해서는 명세서 패턴 (Specification pattern) 이 함께 사용됩니다.
질의의 개별 조건에는 Criteria 라는 개념이 사용됩니다.