REST+CoC 기반 자바 웹 빠 른 개발 프레임 워 크 구축

'웹 개발 민첩 의 길'이라는 책의 앞의 몇 장 에서 데 이브 는 루비 온 레일 스 여행 을 간단하게 시작 하고 시 계 를 만 들 며 루비 명령 행 을 실행 하여 scaffold 비 계 를 만 드 는 방법 을 자랑 했다.그리고 코드 를 한 마디 쓰 면 시계 나 자원 에 대한 CRUD 조작 기능 의 실현 을 완성 할 수 있다.이것 은 나의 흥 미 를 불 러 일 으 켰 다.자바 로 이 일 을 더욱 간단하게 완성 할 수 있 을 까?
      저 는우 리 는 틀 을 어떻게 대해 야 합 니까?에서 JDBC 버 전의 Base 류 와 Hibernate 버 전의 Base 류 를 실 현 했 습 니 다.RoR 을 모방 한 Active Record 를 가 져 왔 습 니 다.그러면 우리 가 프로 그래 밍 할 때 Base 의 하위 클래스 만 실현 하면 CRUD 를 완성 할 수 있 습 니 다.
      제 필 설 문 제 는 Rest 입 니 다.더 정확히 말하자면 ROA 와 관련 된 것 입 니 다.또한 Spring MVC 가 관례 에 대한 우선(Convention over Configuration,CoC)원칙 의 실현 을 보고 있 습 니 다.
      웹 구조의 네 가지 요소
      레일 스 든 스프링 MVC 든 모두 MVC 로 이 루어 졌 기 때문에 제 연구 도 MVC 모델 을 바탕 으로 할 것 입 니 다.그러면 각각 M,V,C 를 주목 하고 url 과 C 를 매 핑 하 는 Router(또는 Struts 의 매 핑 파일)를 주목 합 니 다.
      먼저 M 입 니 다.저 는 M 을 만 들 고 싶 지 않 습 니 다.그러면 자동 으로 생 성 됩 니 다.어떻게 하면 자동 으로 생 성 될 수 있 습 니까?데이터 베이스 에 따라 자동 으로 생 성 됩 니 다.그리고 저 는 Active Record 모드 의 클래스 를 생 성 합 니 다.그 러 니까 과거 처럼 해시 맵 만 들 고 넘 어 갈 수 있 는 게 아니 야.이 어 ASM 3.1 과 ClassLoader 의 지식 을 살 펴 보 니 이 를 실현 할 수 있 었 다.다음 과 같다.
     먼저 전체 테스트:
     @Test
	public void gerneratorClass() {
		try {
			Map<String,Object> fields=new HashMap<String,Object>();
			fields.put("id", 1l);
			fields.put("name", "wanxing");
			EntityGernerator.generateEntity("Student",fields );
			EntityGernerator.invoke("add");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

    이 실현 을 생각해 보 았 습 니 다.Entity Gernerator 의 generateEntity 방법 은 클 라 스 를 만 드 는 것 인지,아니면 실례 화 된 대상 을 만 드 는 것 인지,그리고 invoke 방법 도 있 습 니 다.이것 은 옳지 않 습 니 다.네,클 라 스 만 생 성하 고 사명 을 끝 내 는 것 같 습 니 다.근 데 나중에 바 꿔.
    실 현 된 코드 는 매우 간단 하 다.바로 ASM 3.1 을 이용 하면 된다.두 가지 성명 이 필요 합 니 다.
    1.필요 에 따라 생 성 클래스 의 부모 클래스 를 설정 할 수 있 습 니 다.
    2.클래스 속성 만 만 만 들 수 있 고 방법 을 만 들 수 없습니다.방법의 실현 이 너무 복잡 하기 때문에 JVM 명령 으로 죽은 사람 을 쓰 는 것 이 아니 라 동적 언어 로 전환 하 는 것 이 좋 습 니 다.그리고 유용 한 부 류 를 계승 하여 자신의 사명 을 완 성 했 습 니 다.
 
    V 와 C 는 모두 통용 되 는 것 을 사용 할 수 있 는데,마치 통용 DAO 를 사용 하 는 것 과 같다.V 에 대해 특별한 점 이 있 습 니 다.바로 FrontController 입 니 다.이 는 각 Controller 를 배치 하 는 것 입 니 다.URI 와 Controller 의 Mapping 에 따라 Roy Fielding 박사 가 자원 에 대한 정의 에 부합 합 니 다.자원 은 개념 적 인 맵 입 니 다.서버 는 식별 자(표지 이 맵)를 받 아 현재 의 맵 실현(mapping implementation,일반적으로 특정 집합 과 관련 된 트 리 의 깊이 와/또는 해시 표 의 조합)에서 현재 이 자원 을 처리 하 는 프로세서 가 실 현 된 것 을 발견 한 다음 처리 기 는 요청 한 내용 에 따라 적당 한 동작+응답 을 선택 합 니 다.RoR 에 서 는 Router 라 고 합 니 다.또 V 에 서 는 HTTP 요청 에 따라 적절 한 프 리 젠 테 이 션 을 되 돌 릴 수 있다.
 
    REST 와 CoC
    '관례 우선 원칙'에 따라 많은 일 을 할 수 있 습 니 다.예 를 들 어 Blog 류 는 BlogController 에 대응 하고 대응/blog 입 니 다.우 리 는 이 원칙 을 상기 네 가지 요소 에 실현 할 수 있다.M,V,C 와 Router.그 다음 에 상기 대응 관계 에 따라 간단 한 개발 구 조 를 형성 하고 우리 가 해 야 할 일 은 다음 과 같다.
    1 데이터베이스 Schema 만 들 기,예 를 들 어 표 블 로그 만 들 기
    2 데이터베이스 연결 설정,어떤 데이터 베 이 스 를 사용 할 지 선택
    3 Tomcat 을 시작 하여 브 라 우 저의 주소 표시 줄 에 입력http://localhost:8080/blog/newBlog 를 만 듭 니 다(blog 를 쓴 폼 을 되 돌려 줍 니 다).http://localhost:8080/blog/12문장 보이 기;http://localhost:8080/blog/edit수정 폼 을 되 돌려 줍 니 다.http://localhost:8080/blog/list모든 블 로 그 를 되 돌려 주 고 q?time=2009-05-08 또는http://localhost:8080/2009-05-08/blog/list,시간 에 따라 조회 하면 후자 의 문 제 는 Blog 표 에 두 개의 필드 가 있 으 면 시간 이 어 쩔 수 없다 는 것 이다.그러나 우 리 는 그것 이 한 시간 밖 에 없 을 때 기본 적 인 결 과 를 약속 할 수 있다.이것 이 바로'관례 우선'역할 이다.
 
 
     이 URL 을 입력 하면 시스템 이 정상적으로 작 동 할 수 있다 는 것 을 증명 할 뿐이다.그리고 HTML 페이지 를 맞 춰 서 원 하 는 곳 에 링크 를 넣 거나 버튼 으로 대응 하 는 서 비 스 를 제공 할 수 있 습 니 다.모든 서 비 스 는 REST 입 니 다.RCP 클 라 이언 트 나 Delphi 를 사용 할 수 있 습 니 다.
 
     시스템 은 뒤에서 묵묵히 데이터베이스 Schema 에 따라 Blog 류 를 만 든 다음 에 다른 것 은 모두 통용 되 는 구성 요소 입 니 다.Blog 류,예 를 들 어 GenericController.setModel(T model)을 넣 고 Blog 류 의 인 스 턴 스 를 넣 습 니 다.
 
     유연성 과 확장 성 
    만약 에 그렇다 면 이 시스템 은 실제 적 으로 너무 가치 있 는 일 을 할 수 없다(이것 은 데이터베이스 밖의 얇 은 층 일 뿐이다).'관례 우선'은'관례 결정'이 아니다.우 리 는 Developer 가 자신의 개성 화 된 구성 요 소 를 개발 하여 더욱 강력 한 기능 을 완성 하도록 해 야 한다.
    그렇다면 다음 과 같은 논리 가 있어 야 한다.
    1.M:우선 classpath 에 url 에서 찾 는 실체 가 있 는 지 확인 합 니 다(예 를 들 어 blog,우 리 는 그것 이 자원 이 라 고 말 할 수 없습니다.자원 은 맵 입 니 다).이 실 체 는 Developer 가 만 든 것 입 니 다.없 으 면 데이터베이스 에서 blog 라 는 표를 찾 아 블 로그 류 를 만 듭 니 다(파일 시스템 에서 이 class 를 만 들 지 않 습 니 다).없 으 면 not found 로 돌아 갑 니 다.
    2.C:우선 Router 의 기본 정의 에 따라 BlogController 를 찾 아 classpath 에 존재 하 는 지 확인 하고 없 으 면 Controller Generator 로 BlogController 를 생 성 합 니 다.
    3.V:현재 기본 경로 에서 페이지(jsp 또는 html)를 찾 습 니 다.없 으 면 블 로그 페이지 흐름(Stream)을 만들어 클 라 이언 트 에 게 되 돌려 줍 니 다.
    4.Router:기본 값 은/blog 대응 BlogController 입 니 다.물론 맵 관 계 를 수정 하기 위해 Router 파일 을 만 들 수 있 습 니 다.
 
    “"관례 가 우선 입 니 다."그럼 이 관례 는 누구의 관례 입 니까?사실 Router 의 개발 자 맞 춤 형 제작 은 시스템 이 네 개의 웹 구조 요소 사이 에 자신의'관례'를 구축 하 는 것 을 지원 할 수 있다 는 것 을 나타 낸다.예 를 들 어 모든 시계 이름 에 T 를 더 하 는 것 이다.Blog,하지만 생 성 유형 은 Blog 이 고 Controller 는 BlogAction(누 군 가 는 Action 이 라 고 부 르 는 것 을 좋아 합 니 다)입 니 다.OK,괜 찮 습 니 다.
 
    기술 세부 사항
    우 리 는 M 으로 돌아 가 토론 했다.이 M 은 ORM 의 책임 도 져 야 하고 DVM(Domain View Mapping)의 직책 도 져 야 합 니 다.즉,저 는 제 대상 에서 다른 대상 과 연결 되 기 를 바 랍 니 다.그리고 저 는 UI 에 필드 이름 이 아 닌 정확 한 중국어 이름 을 표시 하고 싶 습 니 다.
    먼저 ORM,관련 관계(계승 은 자동 생 성 을 기대 하지 마 세 요)를 말 합 니 다.저 는 데이터베이스 시트 의 주 외 키 관계 에 따라 생 성 한 다음 에 ASM 동적 으로 주 해 를 추가 할 수 있 습 니 다(아니면 Hibernate 기반).제 가 지금 유일 하 게 확실 하지 않 은 것 은 ASM 으로 생 성 된 속성 입 니 다.유형 은 다른 종류 일 수 있 습 니까?정 답 은 가능 합 니 다.내 장 된 자바 타 입 과 같 습 니 다.
    그 다음 에 HTML 이나 XML 을 생 성하 여 필드 를 정확하게 표시 할 수 있 는 Label 을 만 들 려 고 합 니 다.이것 은 표 의 주석 을 추출 한 다음 에 ASM 동적 으로 주석 을 추가 할 수 있 습 니 다.
 
 
 
    Just Play
    기초 데이터 에 대한 간단 한 유지 보수 나 시스템 디자인 이 원래 OO 모델 을 원 하지 않 는 다 면 이 기초 구 조 는 유용 하 다.진정 으로 복잡 한 대형 기업 응용 에 직면 하면 복잡 한 대상 도 를 실현 하 는 것 을 막 지 않 는 것 이 좋다.
     여기까지 쓰 고 나 는 처음으로 내 가 왜 자바 를 써 야 하 는 지 느 꼈 다.그래서 마지막 으로 저 는'Just Play'라 고 말 할 수 밖 에 없습니다.Dave 가 말 한 것 처럼 진정한 프로젝트 에서 코드 생 성 은 보기 에는 그렇게 유용 하지 않 지만 적어도 좋 은 비계 가 생 겼 습 니 다~~~
 
    몇 가지 오 해 를 해명 하 다.
    1.이 구 조 는 코드 에 의 해 자바 를 생 성 한 다음 에 생 성 된 코드 를 바탕 으로 수정 하 는 것 이 아니다.메모리 에 바이트 코드 를 만 드 는 것 입 니 다!이 는 레일 스 같은 것 과 는 다르다.
    2 현재 있 는 프레임 워 크 에 비해 설정 가능 한'관례'를 별도로 고려 하 였 습 니 다.
    3 REST 스타일,클 라 이언 트 는 브 라 우 저 뿐만 아니 라 자바 에 도 국한 되 지 않 습 니 다.

좋은 웹페이지 즐겨찾기