SlideShare a Scribd company logo
HOONS닷넷
오픈소스 프로젝트 Part1.
     부제: “ASP.NET MVC로 구현하는 HOONS닷넷”




                    전호진
강사소개

       전호진

       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로 정의
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)
     {
         ...생략....
     }
  }
Controller에서는 Interface 사용
Controller
  IMemberRepository memberRepository;
  memberRepository.AddMember(account);




             Controller            Controller     Controller




느슨한 결합                              <interface>         <Concrete>
                                    Repository          Repository
문제해결?
Controller
  IMemberRepository memberRepository = new MemberRepository();
  memberRepository.AddMember(account);




             Controller             Controller               Controller




의존성                  <interface>                    <Concrete>
                     Repository                     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
 Castle Windsor
                            Unity




- 의존성 관리(생성자, 세터, 매개변수)

- 개체 수명 관리(싱글톤, 트랜지언트, 객체 풀, 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 controllerType)
     {
       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 HoonsControllerFactory());
 }
의존성을 제거 했더니?
역할이 명확히 분리(유지보수!)

자동화된 테스트 작성이 쉬워짐
Unit Test 자동화
- 요구사항 정의서에 따라 테스트를 구성하여, 요구사항을 빠짐없이 구현

- 모듈 수정 시 테스트를 통해 기존 코드 안정성 확보

- 빠른 단위테스트
훈스닷넷 프로젝트 살펴보기
Q&A
crynut84@gmail.com
http://crynut84.tistory.com

More Related Content

PPTX
[웹기반시스템 3조] mvc
PPTX
Spring mvc
PPT
Spring MVC
PDF
Spring@mvc웹호스팅
PPTX
SpringMVC 전체 흐름 알아보기
PDF
아키텍트가 바라보는 Spring framework
PPTX
세미나 Spring mybatis
PDF
자바 서블릿과 세션 (Java Servlet, Session)
[웹기반시스템 3조] mvc
Spring mvc
Spring MVC
Spring@mvc웹호스팅
SpringMVC 전체 흐름 알아보기
아키텍트가 바라보는 Spring framework
세미나 Spring mybatis
자바 서블릿과 세션 (Java Servlet, Session)

What's hot (20)

PDF
03.[참고]개발환경 교육교재
PDF
03.[참고]표준프레임워크기반 개발방법
PPT
Servlet3
PDF
[오픈소스컨설팅]Spring MVC
PPTX
3.Spring IoC&DI(spring ioc실습, XML기반)
PDF
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
PPTX
Servlet Architecture
PDF
Spring 4.x Web Application 살펴보기
PPTX
HeadFisrt Servlet&JSP Chapter 3
 
PDF
HeadFisrt Servlet&JSP Chapter 2
 
PDF
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
PDF
05.실행환경 교육교재(업무처리,연계통합)
PDF
04.실행환경 교육교재(화면처리)
PPTX
AngularJS의 개발방식에 대하여
PDF
07.실행환경 교육교재(표준프레임워크 세부 적용기준)
PPTX
Mvc pattern
PDF
04.실행환경 실습교재(화면처리)
PDF
01.모바일 프레임워크 이론
03.[참고]개발환경 교육교재
03.[참고]표준프레임워크기반 개발방법
Servlet3
[오픈소스컨설팅]Spring MVC
3.Spring IoC&DI(spring ioc실습, XML기반)
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
Servlet Architecture
Spring 4.x Web Application 살펴보기
HeadFisrt Servlet&JSP Chapter 3
 
HeadFisrt Servlet&JSP Chapter 2
 
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
05.실행환경 교육교재(업무처리,연계통합)
04.실행환경 교육교재(화면처리)
AngularJS의 개발방식에 대하여
07.실행환경 교육교재(표준프레임워크 세부 적용기준)
Mvc pattern
04.실행환경 실습교재(화면처리)
01.모바일 프레임워크 이론
Ad

Viewers also liked (9)

PDF
[Td 2015]asp.net 5 깊게 파고들기(박용준)
PDF
Using Microsoft Azure as cloud file server
PPTX
The Future of C# and .NET Framework
PPTX
C#을 이용한 task 병렬화와 비동기 패턴
PPTX
크로스플랫폼으로 다시 태어난 ASP.NET Core
PDF
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
PDF
Facebook Architecture - Breaking it Open
PDF
facebook architecture for 600M users
PDF
F# and SignalR for a FastWeb
[Td 2015]asp.net 5 깊게 파고들기(박용준)
Using Microsoft Azure as cloud file server
The Future of C# and .NET Framework
C#을 이용한 task 병렬화와 비동기 패턴
크로스플랫폼으로 다시 태어난 ASP.NET Core
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
Facebook Architecture - Breaking it Open
facebook architecture for 600M users
F# and SignalR for a FastWeb
Ad

Similar to HOONS닷넷 오픈소스 프로젝트 Part1. (20)

PDF
MVVM Pattern for Android
PPTX
Spring di chapter1
PPTX
Umc.Core Frameworks
PPTX
Sql 중심 코드 탈피 발표자료
PPTX
Sql 중심 코드 탈피
PPTX
[스프링 스터디 3일차] @MVC
PDF
2023.06.12 발표 자료 : JPA / 스프링 구조
PDF
Spring Framework - Inversion of Control Container
PDF
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
PDF
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
PPTX
DI - Dependency Injection
PDF
보다 나은 웹 어플리케이션 설계
PPTX
Software Architect day - 웹 프레임워크 종결 - metaworks3
PPTX
멋쟁이사자처럼_백엔드_멘토_강의자료_MVC 패턴과 영속성 컨텍스트.pptx
PPTX
Dependency Injection 소개
PDF
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
PDF
DDD 구현기초 (거의 Final 버전)
PPTX
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
PPTX
[Spring]오브젝트와 의존관계
PPTX
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
MVVM Pattern for Android
Spring di chapter1
Umc.Core Frameworks
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피
[스프링 스터디 3일차] @MVC
2023.06.12 발표 자료 : JPA / 스프링 구조
Spring Framework - Inversion of Control Container
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
DI - Dependency Injection
보다 나은 웹 어플리케이션 설계
Software Architect day - 웹 프레임워크 종결 - metaworks3
멋쟁이사자처럼_백엔드_멘토_강의자료_MVC 패턴과 영속성 컨텍스트.pptx
Dependency Injection 소개
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
DDD 구현기초 (거의 Final 버전)
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
[Spring]오브젝트와 의존관계
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함

HOONS닷넷 오픈소스 프로젝트 Part1.

  • 1. HOONS닷넷 오픈소스 프로젝트 Part1. 부제: “ASP.NET MVC로 구현하는 HOONS닷넷” 전호진
  • 2. 강사소개 전호진 HOONS닷넷 시삽(2010~) (주)필라넷 crynut84@gmail.com http://crynut84.tistory.com
  • 3. 진행순서  ASP.NET MVC 소개  MVC의 장점 살리기  HOONS.NET 살펴보기
  • 6. WebForm VS MVC  WebForm - Winform과 유사한 이벤트 기반의 프로그래밍 - 도구상자의 Drag&Drop (서버컨트롤) - ViewState를 이용한 상태관리 - 포스트백  MVC - View Model Controller로 관심의 분리 - ViewState가 없음. - 원하는 HTML 코드 생성(웹표준) - RESTfull - 관심의 분리로 자동화된 단위 테스트 작성에 유리
  • 8. 라우팅 시스템 - 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" } // 매개 변수 기본값 );
  • 12. MVC도 ASP처럼. @구문을 이용한 스파게티 코드
  • 14. MVC에서 주목한것은? View Model Controller로 관심의 분리
  • 17. 역할에 충실하자(관계의 분리) Model-View-Controller 뷰 모델, 도메인 모델 컨트롤러에서 전달 받은 HTTP 요청에 따라 모델을 Model을 브라우저에 렌더링 컨트롤(비지니스 로직)하여 (데이터를 표현하는 로직) 뷰 선정
  • 18. 역할에 충실하자(저장소 분리)  리파지터리(저장소) - CRUD
  • 19. 역할에 충실하자(저장소 분리)  컨트롤러에서 리파지터리를 이용해 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"); }
  • 20. 의존성을 제거하자 리파지터리로 DataSource를 추상화 했더니.. 웹 서비스로 바꿔 주세요.
  • 21. 리파지터리를 Interface로 정의 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) { ...생략.... } }
  • 22. Controller에서는 Interface 사용 Controller IMemberRepository memberRepository; memberRepository.AddMember(account); Controller Controller Controller 느슨한 결합 <interface> <Concrete> Repository Repository
  • 23. 문제해결? Controller IMemberRepository memberRepository = new MemberRepository(); memberRepository.AddMember(account); Controller Controller Controller 의존성 <interface> <Concrete> Repository Repository
  • 24. 문제해결?  직접 생성하지 않고 인터페이스의 구현객체 를 얻을 순 없을까?
  • 25. DI(Dependency Injection)  의존성 주입 의존 객체를 외부에서 전달 받음 public class AccountController : Controller { //멤버 리파지터리 인터페이스 private IMemberRepository memberRepository; public AccountController(IMemberRepository memberRepository) { //생성자를 통해 의존객체 전달 this.memberRepository = memberRepository; } //... 생략...
  • 27. DI(Dependency Injection) NInject Spring.NET Castle Windsor Unity - 의존성 관리(생성자, 세터, 매개변수) - 개체 수명 관리(싱글톤, 트랜지언트, 객체 풀, HTTP요청)
  • 29. NInject 적용이 쉽다. ControllerFactory 생성 public class HoonsControllerFactory : DefaultControllerFactory { private readonly IKernel kernel; public HoonsControllerFactory() { this.kernel = new StandardKernel(); AddBindins(); } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return controllerType == null ? null : kernel.Get(controllerType) as IController; } private void AddBindins() { kernel.Bind<IMenuRepository>().To<MenuRepository>(); kernel.Bind<IMemberRepository>().To<MemberRepository>(); } }
  • 30. NInject 적용 하기 MVC Framework에 등록(Global.asax) protected void Application_Start() { ... 생략 ... //MVC ControllerFactory를 NInject로 설정 ControllerBuilder.Current.SetControllerFactory(new HoonsControllerFactory()); }
  • 31. 의존성을 제거 했더니? 역할이 명확히 분리(유지보수!) 자동화된 테스트 작성이 쉬워짐
  • 32. Unit Test 자동화 - 요구사항 정의서에 따라 테스트를 구성하여, 요구사항을 빠짐없이 구현 - 모듈 수정 시 테스트를 통해 기존 코드 안정성 확보 - 빠른 단위테스트
  • 34. Q&A