hoons닷넷 오픈소스 프로젝트 part1
Post on 07-Dec-2014
2.273 Views
Preview:
DESCRIPTION
TRANSCRIPT
부제 : “ASP.NET MVC 로 구현하는 HOONS 닷넷”
HOONS 닷넷오픈소스 프로젝트 Part1.
전호진
전호진
HOONS 닷넷 시삽 (2010~)( 주 ) 필라넷
강사소개
crynut84@gmail.com
http://crynut84.tistory.com
진행순서 ASP.NET MVC 소개
MVC 의 장점 살리기
HOONS.NET 살펴보기
ASP.NET MVC 소개
ASP.NET 의 두가지 개발 모델
WebForm VS MVC WebForm
- Winform 과 유사한 이벤트 기반의 프로그래밍- 도구상자의 Drag&Drop ( 서버컨트롤 )- ViewState 를 이용한 상태관리- 포스트백
MVC
- View Model Controller 로 관심의 분리- ViewState 가 없음 .- 원하는 HTML 코드 생성 ( 웹표준 )- RESTfull- 관심의 분리로 자동화된 단위 테스트 작성에 유리
MVC 동작 원리
라우팅 시스템- WebForm : http://hoons.kr/Board.aspx?page=2&Name=Free- MVC : http://hoons.kr/Board/Free/1- SEO 최적화 .- IIS 의 물리적인 파일 구조 노출안함 .
System.Web.Routing
routes.MapRoute( "BoardList", // 경로 이름 "Board/{BoardKindCode}/{Page}", // BoardIdx 는 글 읽을 때 해당 new { controller = "Board", BoardKindCode = "", action="List",Page = 1 }, new string[] { "HOONS.WEB.Controllers" } // 매개 변수 기본값);
Razor 뷰엔진
Razor 뷰엔진
Razor 뷰엔진
MVC 도 ASP 처럼 .
@구문을 이용한 스파게티 코드
유지보수
MVC 에서 주목한것은 ?
View Model Controller 로 관심의 분리
MVC 의 장점을 살리자
MVC 를 MVC 답게
역할에 충실하자 ( 관계의 분리 )Model-View-Controller
뷰 모델 , 도메인 모델
HTTP 요청에 따라 모델을컨트롤 ( 비지니스 로직 ) 하여 뷰 선정
컨트롤러에서 전달 받은 Model 을 브라우저에 렌더링( 데이터를 표현하는 로직 )
역할에 충실하자 ( 저장소 분리 ) 리파지터리 ( 저장소 ) - CRUD
역할에 충실하자 ( 저장소 분리 ) 컨트롤러에서 리파지터리를 이용해 CRUD
/// <summary> /// 회원가입 /// </summary> /// <param name="account"></param> /// <param name="collection"></param> /// <returns></returns> [HttpPost] public ActionResult Join(Member account, FormCollection collection) { account.UserBirth = collection["txtYear"] + collection["txtMonth"] + collection["txtDay"]; account.UserPassword = CrytographyUtil.MD5Encrypt("0000");
memberRepository.AddMember(account); return RedirectToAction("JoinComplete", "Account"); }
의존성을 제거하자
리파지터리로 DataSource 를 추상화 했더니 ..
웹 서비스로 바꿔 주세요 .
리파지터리를 Interface 로 정의
public interface IMemberRepository { IQueryable<Member> Members { get; } bool AddMember(Member member); bool DeleteMember(Member member); bool UpdateMember(Member member); }
public class MemberRepository : IMemberRepository { public bool AddMember(Member member) { ... 생략 .... }}
Interface
실제 구현
Controller 에서는 Interface 사용
IMemberRepository memberRepository;memberRepository.AddMember(account);
Controller
Con-troller
Con-troller
Con-troller
<inter-face>
Repository
<Con-crete>
Repository
느슨한 결합
문제해결 ?
IMemberRepository memberRepository = new MemberRepository();memberRepository.AddMember(account);
Controller
Con-troller
Con-troller
Con-troller
<inter-face>
Repository
<Con-crete>
Repository
의존성
문제해결 ? 직접 생성하지 않고 인터페이스의
구현객체를 얻을 순 없을까 ?
DI(Dependency Injection) 의존성 주입
의존 객체를 외부에서 전달 받음
public class AccountController : Controller { // 멤버 리파지터리 인터페이스 private IMemberRepository memberRepository;
public AccountController(IMemberRepository memberRepository) { // 생성자를 통해 의존객체 전달 this.memberRepository = memberRepository; } //... 생략 ...
DI(Dependency Injection)
DI(Dependency Injection)
NInject Spring.NET
UnityCastle Windsor
- 의존성 관리 ( 생성자 , 세터 , 매개변수 )
- 개체 수명 관리 ( 싱글톤 , 트랜지언트 , 객체 풀 , HTTP 요청 )
NInject 적용 하기
NInject 적용이 쉽다 .
ControllerFactory 생성
public class HoonsControllerFactory : DefaultControllerFactory { private readonly IKernel kernel;
public HoonsControllerFactory() { this.kernel = new StandardKernel(); AddBindins(); }
protected override IController GetControllerInstance(RequestContext requestContext, Type controller-Type) { return controllerType == null ? null : kernel.Get(controllerType) as IController; }
private void AddBindins() { kernel.Bind<IMenuRepository>().To<MenuRepository>(); kernel.Bind<IMemberRepository>().To<MemberRepository>(); } }
NInject 적용 하기
MVC Framework 에 등록 (Global.asax)
protected void Application_Start() { ... 생략 ... //MVC ControllerFactory 를 NInject 로 설정 ControllerBuilder.Current.SetControllerFactory(new HoonsCon-trollerFactory()); }
의존성을 제거 했더니 ?
역할이 명확히 분리 ( 유지보수 !)
자동화된 테스트 작성이 쉬워짐
Unit Test 자동화
- 요구사항 정의서에 따라 테스트를 구성하여 , 요구사항을 빠짐없이 구현
- 모듈 수정 시 테스트를 통해 기존 코드 안정성 확보
- 빠른 단위테스트
훈스닷넷 프로젝트 살펴보기
Q&A
crynut84@gmail.com
http://crynut84.tistory.com
top related