태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

축하해! 넌 루 피자가게 튜토리얼을 끝마쳤어. 이제 너의 프로젝에 루를 적용할 좋은 시점에 이라구. 이 레퍼런스 가이드의 다음 몇몇 챕터를 읽으면

루를 어떻게 쓸지 더 많이 이해할수있을거야. 만일 너가 일반적으로 많이 사용되는 루 애드온에 더 알고 싶다면 우리는 다음의 특정 섹션들을 추천해:


Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
http://gokgo.tistory.com/script/powerEditor/pages/
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지



2.13. 백업과 디플로이하기

매우 유용한 명령어 또하나가 backup 명령어야. 이 명령어를 치면 너의 현재 workspace의 모든 소드에 대한 백업을 만들어줘. 로그파일과 스크립트 로그피일을 포함해서(타겟 디렉토리는 제외):

~.web roo> backup
Created ROOT/pizzashop_2009-12-30_11:23:37.zip
Backup completed in 516 ms
~.web roo>

마지막으로 너는 아마 어플리케이션을 웹컨테이너에 하나의 제품으로 디플로이하고싶겠지. 이걸 할려면 너는 perform package 명령어를 통해 쉽게 WAR 압축파일을 만들수 있지:

~.web roo> perform package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building pizzashop
[INFO]    task-segment: [package]
[INFO] ------------------------------------------------------------------------
...
[INFO] [war:war {execution: default-war}]
[INFO] Exploding webapp...
[INFO] Assembling webapp pizzashop in /Users/sschmidt/pizza/target/
pizzashop-0.1.0-SNAPSHOT [INFO] Copy webapp webResources to /Users/sschmidt/pizza/target/
pizzashop-0.1.0-SNAPSHOT [INFO] Generating war /Users/sschmidt/pizza/target/
pizzashop-0.1.0-SNAPSHOT.war [INFO] Building war: /Users/sschmidt/pizza/target/
pizzashop-0.1.0-SNAPSHOT.war [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 17 seconds [INFO] Finished at: Wed Dec 30 11:36:40 EST 2009 [INFO] Final Memory: 26M/79M [INFO] ------------------------------------------------------------------------ ~.web roo>

이 명령어는 너가 웹 컨테이너에 제품을 쉽게 복사할수있는 WAR 파일을 만들어줘.





 


Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
http://gokgo.tistory.com/script/powerEditor/pages/
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지




2.12. 셀레니움 테스트

루는 Selenium 테스트 스크립트를 생성하는 코어 애드온(core addon)을 제공하지. 넌 selenium test 명령어로 셀레니움 테스트 스크립트를 만들수있어. 스트립트는 각 컨트롤러별로 생성할수있고 하나의 테스트 기반에 통합되:

~.web roo> selenium test --controller ~.web.ToppingController
~.web roo> selenium test --controller ~.web.BaseController
~.web roo> selenium test --controller ~.web.PizzaController
~.web roo> selenium test --controller ~.web.PizzaOrderController

생성된 테스트들은 src/main/webapp/selenium 폴더에 있고 다음의 메이븐 명령어를 통해 실행할수있어 (루 쉘이 아닌 커맨드 라인에서 실행하는거야):

pizza> mvn selenium:selenese

메이븐 셀레니움 애드온이 실행하면서 파이어폭스 브라우저에 새 인스턴스가 시작될거고, 루가 생성한 데이터로 피자가게 웹 UI에 대한 테스트를 수행하지

제발 좀 pom.xml 파일에서 메이븐 셀레니움 플러그인을 설정해야하는걸 잊지말라구.
너가 파이어폭스 웹브라우저에 이미 환경설정을 해뒀다는걸 가정하고, 메이븐 셀레니움 플러그인 또한 너의 어플리케이션은 이미 단계6에서 했던대로 시작해두었다는걸 가정하고 실행하는거야.

마지막으로 어플리케이션에서 사용되는 지역(locales)에 관한 제약이 있어. 자세한건 알려진 문제 섹션에 언급해두었어.





Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
http://gokgo.tistory.com/script/powerEditor/pages/
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지



2.11. 웹UI의 Look & Feel 커스터마이징하기

Web UI들을 생성한 루는 다양한 방법으로 이를 커스터마이징할수있어. 설치된 웹-티어 구조물들에 대한 너의 방식을 찾으려면 다음의 표를 봐:

루 웹UI의 룩앤필을 커스터마이즈하는 가장 쉬운 방법은 CSS와 이미지 리소스를 필요한대로 바꾸는거야.

다음의 룩앤필은 피자가게 어플리케이션이라는 특정한 목적을 위해 만들어진거야:

스프링 루는 또한 스프링 프레임웍이 제공하는 테마기능을 설정함으로서 쉽게 이 기능을 활용할수있어.

더 높은 차원의 커스터마이징이 필요하면 너는 기본 타일즈(Tiles) 템플릿(WEB-INF/layouts/default.jspx)을 변경하고 JSP 페이지 (WEB-INF/views/*.jspx)에 적용하면되. 스프링 루 1.1 릴리즈부턴 jspx artifacts을 유저에 의해 적용가능하게 되었어. 루는 여전히 도메인 layer의 변경을 감지하고 적용하지. JSP Views 섹션의 자세히 설명을 봐.

더 나아가 스프링 루 1.1 릴리즈는 scaffolded jspx 파일들을 90% 줄였을 뿐아니라 페이지 커스터마이징을 위한 최고로 유연한 방식을 지원하는 JSP 태그집합들(set of JSP tags)을 포함하고있어. 루는 프로젝의 구제적 요구사항을 만족시킬수있는 커스마이징과 접근성을 가지는 이들 태그를 유저 프로젝에 설치할거야.

예를 들면, 통합된 Spring JS/ Dojo artifactos를 적절히 쉽게 제거하면서 너가 선택한 JS 프레임웍으로 대체해버리지. 이런 변경들은 너가 커스터마이즈한 태그들이 루에 의해 설치된 기본 태그들을 대체하기 위해 너가 만든 간단한 애드온을 다른 프로젝에도 설치가능하게 만들어줘






Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
http://gokgo.tistory.com/script/powerEditor/pages/
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지



2.10. 어플리케이션에 보안적용하기

피자가게 주인과 토론끝에 우리는 웹의 전면부의 특정화면의 접근을 제어할 필요가 생겼어. 어플리케이션의 특정 화면에의 접근을 보호하려면 security setup 명령어를 통해 Spring Security 애드온을 설치하면 가능하지:

~.web roo> security setup
Managed ROOT/pom.xml
Created SRC_MAIN_RESOURCES/META-INF/spring/applicationContext-security.xml
Created SRC_MAIN_WEBAPP/WEB-INF/views/login.jspx
Managed SRC_MAIN_WEBAPP/WEB-INF/views/views.xml
Managed SRC_MAIN_WEBAPP/WEB-INF/web.xml
Managed SRC_MAIN_WEBAPP/WEB-INF/spring/webmvc-config.xml

루쉘은 너가 웹 레이어를 생성할때까지 security setup 명령어를 숨겨둘거라는걸 알아둬. 위를 보면 security setup 명령어는 pom.xml 파일을 손봐.

이것은 추가적인 의존성이 프로젝에 필요하다는걸 의미해. STS workspace에 이 의존성을 추가하려면 넌 perform eclipse 명령어를 다시 수행하고로젝을 refresh해야해.
(만일 너가 STS나 m2eclipse를 쓰고있다면, 너의 프로젝에 Spring Security 추가하는것은 자동으로 찾아서 하기때문에 "perform eclipse" 명령어를 건너띄어야해)

피자가게 어플리케이션에서 ToppingBase,그리고 Pizza 소스들을 보호하려려 
src/main/resources/META-INF/spring 폴더에 있는 
applicationContext-security.xml 파일을 열고 다음과 같이 고치면 되:

<!-- HTTP security configurations -->
<http auto-config="true" use-expressions="true">
   <form-login login-processing-url="/static/j_spring_security_check" 
login-page="/login"
authentication-failure-url="/login?login_error=t"/> <logout logout-url="/static/j_spring_security_logout"/> <!-- Configure these elements to secure URIs in your application --> <intercept-url pattern="/pizzas/**" access="hasRole('ROLE_ADMIN')"/> <intercept-url pattern="/toppings/**" access="hasRole('ROLE_ADMIN')"/> <intercept-url pattern="/bases/**" access="hasRole('ROLE_ADMIN')"/> <intercept-url pattern="/resources/**" access="permitAll" /> <intercept-url pattern="/static/**" access="permitAll" /> <intercept-url pattern="/**" access="permitAll" /> </http>

다음 단계로, Spring Security JSP 태그 라이브러리를 써서 menu.jspx 파일에서 연관된 메뉴 아이템의 접근을 제한해야해:

<div xmlns:jsp="..." 
xmlns:sec="http://www.springframework.org/security/tags"
id="menu" version="2.0"> <jsp:directive.page contentType="text/html;charset=UTF-8"/> <jsp:output omit-xml-declaration="yes"/> <menu:menu id="_menu" z="nZaf43BjUg1iM0v70HJVEsXDopc="> <sec:authorize ifAllGranted="ROLE_ADMIN"> <menu:category id="c_topping" z="Xm13w68rCIyzL6WIzqBtcpfiNQU="> <menu:item id="i_topping_new" .../> <menu:item id="i_topping_list" .../> </menu:category> <menu:category id="c_base" z="yTpmmNMm/hWoy3yf+aPcdUX2At8="> <menu:item id="i_base_new" .../> <menu:item id="i_base_list" .../> </menu:category> <menu:category id="c_pizza" z="mXqKC1ELexS039/pkkCrZVcSry0="> <menu:item id="i_pizza_new" .../> <menu:item id="i_pizza_list" .../> </menu:category> </sec:authorize> <menu:category id="c_pizzaorder" z="gBYiBODEJrzQe3q+el5ktXISc4U="> <menu:item id="i_pizzaorder_new" .../> <menu:item id="i_pizzaorder_list" .../> </menu:category> </menu:menu> </div>

이렇게 하면 피자 주문페이지 (View) 는 누구나 접근해서 볼수있게 남겨둬. 확실한건 피자주문 페이지에 삭제와 업데이트 기능은 바람직하지않다는거야.

가장 쉽게 이걸 하려면 PizzaOrderController.java 소스에 @RooWebScaffold 애노테이션을 적용하는거지:

@RooWebScaffold(path = "pizzaorder", 
                formBackingObject = PizzaOrder.class, 
                delete=false, 
                update=false)

이걸로 루쉘은 PizzaOrderController에서 delete와 update 메소드를 지울거야. 또한 관련된 페이지들(View artifacts)에도 적용해주지.

이 단계가 끝나면서, 너는 어플리케이션을 재시작하면 'admin' 사용자가 http://localhost:8080/pizzashop/login 인증을 통해 접근할수있어.




Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
http://gokgo.tistory.com/script/powerEditor/pages/
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지





2.9. 6 단계: 웹서버 로딩하기

프로젝개발간 너의 어플리케이션을 웹 컨테이너에 디플로이하려면, 몇가지 옵션이 있어:

  • 쉘에서 명령어로 디플로이 (WAR 압축이 필요없음):

    • 톰캣 컨테이너에 디플로이하려면, 프로젝 루트에서 'mvn tomcat:run' 실행 
      (루 쉘안에서가 아님)

    • Jetty 컨테이너에 디플로이하려면, 프로젝 루트에서 'mvn jetty:run' 실행
      (루 쉘안에서가 아님)

  • STS에서 설정한 통합된 웹 컨테이너에 디플로이:

    • STS 서버 보기(Server view)에서 원하는 웹컨테이너에 프로젝을 드래그함

    • 프로젝에서 오른쪽 클릭, 원하는 웹컨테이너에 'Run As > Run on Server' 선택

너가 선호하는 디플로이 방식을 선택하고, 웹컨테이너가 시작되었다면 다음의 URL에 어플리케이션이 떠있을거야 http://localhost:8080/pizzashop







Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
http://gokgo.tistory.com/script/powerEditor/pages/
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지



2.8. 5 단계: 웹티어 만들기 - Creating A Web Tier

다음단계로 우리는 피자가세 어플리케이션의 웹 티어를 만들어고 싶어. 이거는 web mvc 명령어로 가능하지. 

컨트롤러와 모든 관련된 웹 구조물들을 만들어주는 가장 편리한 방법은 web mvc setup 명령어에 이어 web mvc all 명령어를 치는거야:

~.domain.PizzaOrder roo> web mvc setup

~.domain.PizzaOrder roo> web mvc all --package ~.web

이 명령어는 한 도메인 엔티티들과 각각 엔테티를 위한 Spring MVC 컨트롤러 기반 생성을 위해 피자 가게 프로젝을 조사(Scan)할거야.

--package 속성은 컨트롤러가 설치되어야할 패키지를 가르킬때 필요해. 이 명령어는 너의 일반적인 루 쉘이나 STS에서 띄우는 루 쉘로 부터 사용될수있어.

STS에서 통합된 루 쉘을 사용하려면 피자가게 어플리케이션에서 오른쪽 클릭해서 'Spring Tools > Open Roo Shell'를 선택하면 되.

web mvc setup 명령어를 통해 프로젝의 본질이 보통의 자바 프로젝에서 STS의 웹 프로젝으로 바뀐다는걸 알아둬. 이 명령어는 또한 Spring MVC, Tiles 등등같은 부가적인 의존성을 너의 프로젝에 추가하지. STS에서 프로젝의 클래스패스(classpath)를 업데잇하려면, 너는 'perform eclipse'을 다시 수행한뒤 STS에서 해당 프로젝을 Refresh해야해.

보여지기 위한 구조물(View Scaffolding)을 위해 새로 추가된 모든 웹 구조물들은 src/main/webapp 폴더밑에서 찾아볼수있어. 이 폴더는 그래픽, CSS, JSP, Tiles 설정 등등이 포함되어있지. 이 폴더들의 목적은 UI 커스터마이징하기 섹션 에서 요약해두었어.

루가 생성한 Spring MVC 컨트롤러는 Spring 프레임웍 v3의 새 기능을 최대한 반영하려고 했기때문에 REST 패턴을 따르지.

다음의 URI - 루가 생성한 컨트롤러에서 적용되는 리소스 맵핑:




Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
http://gokgo.tistory.com/script/powerEditor/pages/
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지



2.7. 4 단계: IDE 사용하기

물론 루 프로젝은 너가 선호하는 IDE를 사용할수있지만, 우리는 SpringSource Tool Suite (STS)를 쓰기를 권장해 이건 SpringSource 사이트에서 무료로 아운받아 쓸수있다고. 만일 SpringSource Tool Suite이 쓰기 싫다면 이 레퍼런스 가이드의 IDE usage 섹션을 참고하길 바래.

루 프로젝은 기본적으로 어떤 IDE특성화된 설정을 포함하고 있지않지만 이것이 너의 IDE가 기본적으로 너의 피자가게 프로젝을 import할수있다는걸 의미하는 것은 아냐. 루쉘은 우리가 IDE 특성화된 workspace 설정을 만드는걸 도와줄거야 perform eclipse 명령어를 통해서 말이지.

그러나 만일 m2eclipse plugin이 설치되어있다면 이 명령어릉 사용해서는 안되. 만일 STS 사용자라면 m2eclipse 플러그인이 이미 설치되어있는것이니까  "perform eclipse" 명령어를 건너뛰어주길바래. STS나 m2eclipse를 안쓰는 사람들만 다음 명령어를 사용해줘:

~.domain.PizzaOrder roo> perform eclipse
...
[INFO] Preparing eclipse:eclipse
[INFO] [aspectj:compile {execution: default}]
[INFO] [eclipse:eclipse {execution: default-cli}]
[INFO] Adding support for WTP version 2.0.
[INFO] Using Eclipse Workspace: null
[INFO] Adding default classpath container: 
org.eclipse.jdt.launching.JRE_CONTAINER [INFO] Wrote settings to /Users/sschmidt/pizza/.settings/
org.eclipse.jdt.core.prefs [INFO] Wrote Eclipse project for "pizzashop" to /Users/sschmidt/pizza. ... [INFO] ---------------------------------------------------------------------- [INFO] BUILD SUCCESSFUL [INFO] ---------------------------------------------------------------------- [INFO] Total time: 3 seconds [INFO] Finished at: Tue Dec 29 16:11:38 EST 2009 [INFO] Final Memory: 24M/79M [INFO] ----------------------------------------------------------------------

처음으로 이 명령어를 칠때 메이븐이 의존성과 그 소스들을 너의 로컬 저장소로 다운로드하니까 시간이 걸릴거라는걸 알아둬. 일단 이 명령어가 완료되면 'File > Import > General > Existing Projects into Workspace'를 클릭함으로서 너의 프로젝을 STS에 임포트할 수 있어. 프로젝을 STS로 임포트하면 자바소스를 볼수있지. 예를 들면 pizzashop 프로젝에서 오른쪽 클릭해서 'Run As > JUnit Test'를 선택함으로써 JUnit 테스트를 실행할수있어.

만약 STS를 쓰거나 그냥 Eclipse기반 IDE에 m2eclipse를 설치했다면, 먼저번에 언급한것처럼 perform eclipse 명령어를 그냥 건너뛰면되.

이 경우엔 넌 간단히 STS나 Eclipse에서 'File > Import > General > Maven Projects' 메뉴 옵션을 선택하기만 하면되.

이 문서의 Application Architecture 장은 루 프로젝이 AspectJ Intertype declarations를 확장하여 효과적으로 쓰는지 자세히 설명해놓았지만, STS에서 제공해주는 코드 완성기능을 써도되. 코드 완성이 어떻게 동작하는지 보려면 가지고 있는 통합테스트를 열고 테스트하려면 testMarkerMethod() 메소드를 사용하면되. 예를 들면 너는 BaseIntegrationTest.java 소스파일을 열고 이렇게 한번 해봐:

STS에서 보여지는 대부분의 메소드들은 사실상 자바 소스라기보단 AspectJ ITD의 일부야. 그러니까 컴파일할때 자바 bytecode로 삽입되지


 


Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & 2.6. 스프링루 시작하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지


2.6. 3단계: 통합 테스트

일단 너의 도메인 모델의 첫번째 단계를 다 만들었으니 이게 동작하는지 당연히 보고싶겠지. 운좋게도 우리는 루가 우리의 도메인 객체를 만드는 동한 통합테스트도 만들게 해두었잖아. 힌트: 너가 도메인 모델을 개발하는 동안 어떤 통합테스트도 안만들었어도, 여전히 test integration 명령어를 통해 쉽게 만들어낼수있어. 일단 테스트가 만들어져있다면, perform tests 명령어로 테스트해볼까:

~.domain.PizzaOrder roo> perform tests
...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.springsource.roo.pizzashop.domain.PizzaOrderIntegrationTest
Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.413 sec
Running com.springsource.roo.pizzashop.domain.ToppingIntegrationTest
Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.148 sec
Running com.springsource.roo.pizzashop.domain.PizzaIntegrationTest
Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.14 sec
Running com.springsource.roo.pizzashop.domain.BaseIntegrationTest
Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.097 sec

Results :

Tests run: 36, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 17 seconds
[INFO] Finished at: Tue Dec 29 15:58:04 EST 2009
[INFO] Final Memory: 25M/79M
[INFO] ------------------------------------------------------------------------

보는것처럼 통합테스트를 실행하려고 루는 메이븐 명령어를 불러와 (mvn test를 돌리는것과 같지). 모든 테스트를 성공하면 4개의 도메인 객체에 대해 전부 36개의 통합 테스트의 결과물로서 루는 도메인 객체당 9개의 통합테스트를 생성해.





Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지


2.5. 2 단계 : 엔티티와 필드 생성하기

이제 우리의 클래스 다이어그램에 그려본 도메인 객체와 필드들을 만들어야할때야. 첫째로 우리는 entity jpa 명령어를 써서 실제 도메인 객체를 만들어야. entity jpa 명령어는 여러 optional attributes 를 가질수있고 최소 하나의 --class 속성을 가져야만해.

필수인 --class 속성 뿐만 아니라 우리는  --testAutomatically속성으로 도메인 객체의 편리한 통합테스트를 만들었어.

이제 Topping 도메인 객체를 시작해보자:

com.springsource.roo.pizzashop roo> hint
You can create entities either via Roo or your IDE.
Using the Roo shell is fast and easy, especially thanks to the TAB completion.

Start by typing 'ent' and then hitting TAB twice.
Enter the --name in the form '~.domain.MyEntityClassName'
In Roo, '~' means the --topLevelPackage you specified via 'create project'.

After specify a --name argument, press SPACE then TAB. Note nothing appears.
Because nothing appears, it means you've entered all mandatory arguments.
However, optional arguments do exist for this command (and most others in Roo).
To see the optional arguments, type '--' and then hit TAB. Mostly you won't
need any optional arguments, but let's select the --testAutomatically option
and hit ENTER. You can always use this approach to view optional arguments.

After creating an entity, use 'hint' for the next suggestion.
com.springsource.roo.pizzashop roo>
com.springsource.roo.pizzashop roo> 
entity jpa --class ~.domain.Topping --testAutomatically Created SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain Created SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain/Topping.java Created SRC_TEST_JAVA/com/springsource/roo/pizzashop/domain Created SRC_TEST_JAVA/com/springsource/roo/pizzashop/domain/
ToppingDataOnDemand.java Created SRC_TEST_JAVA/com/springsource/roo/pizzashop/domain/
ToppingIntegrationTest.java Created SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain/
Topping_Roo_Configurable.aj Created SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain/
Topping_Roo_JpaEntity.aj Created SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain/
Topping_Roo_JpaActiveRecord.aj Created SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain/
Topping_Roo_ToString.aj Created SRC_TEST_JAVA/com/springsource/roo/pizzashop/domain/
ToppingIntegrationTest_Roo_Configurable.aj Created SRC_TEST_JAVA/com/springsource/roo/pizzashop/domain/
ToppingDataOnDemand_Roo_DataOnDemand.aj Created SRC_TEST_JAVA/com/springsource/roo/pizzashop/domain/
ToppingIntegrationTest_Roo_IntegrationTest.aj Created SRC_TEST_JAVA/com/springsource/roo/pizzashop/domain/
ToppingDataOnDemand_Roo_Configurable.aj

자바와 AspectJ 소스들 생성외에도 루쉘의 entity jpa 명령어가 너가 일찌기 정의한 최상위 패키지의 프로젝내에 적절한 폴더구조도 만들어준다는걸 알아차렸을거야. 우리가 '~' 문자를 써서 프로젝의 최상위 패키지를 대신하는것도 알수있겠지. 이렇게 긴 명령어를 줄이기 위한 편리함들 제공해주지만, 너는 루쉘로 최상위 패키지 전체를 탭 자동완성으로 할수있어.

다음단계로 우리는 Topping 도메인 클래스를 위해 '이름' 필드를 추가해야겠지. 이거는 다음의 field 명령어를 통해 얻을수있어:

~.domain.Topping roo> hint
You can add fields to your entities using either Roo or your IDE.

To add a new field, type 'field' and then hit TAB. Be sure to select
your entity and provide a legal Java field name. Use TAB to find an entity
name, and '~' to refer to the top level package. Also remember to use TAB
to access each mandatory argument for the command.

After completing the mandatory arguments, press SPACE, type '--' and then 
TAB. The optional arguments shown reflect official JSR 303 Validation constraints. Feel free to use an optional argument, or delete '--' and hit ENTER. If creating multiple fields, use the UP arrow to access command history. After adding your fields, type 'hint' for the next suggestion. To learn about setting up many-to-one fields, type 'hint relationships'. ~.domain.Topping roo> ~.domain.Topping roo> field string --fieldName name --notNull --sizeMin 2 Managed SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain/Topping.java Created SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain/
Topping_Roo_JavaBean.aj Managed SRC_TEST_JAVA/com/springsource/roo/pizzashop/domain/
ToppingDataOnDemand_Roo_DataOnDemand.aj Managed SRC_MAIN_JAVA/com/springsource/roo/pizzashop/domain/
Topping_Roo_ToString.aj

As explained in the documentation by typing the hint 명령어를 친 문서에서 설명한대로, --notNull이나 --sizeMin 2와 같은 optional attributes를 써서 쉽게 fields에 constraints을 추가했어. 이 속성들은 루가 너의 자바 소스에 field 정의를 추가할수있는 표준 JSR-303 애노테이션의 결과물이야.

또한 너는 루쉘이 너가 field 명령어를 사용하고 있는 동안 현재 context를 알고있다는걸 알수있을거야. 루쉘은 너가 Topping 엔티티를 막 생성했고 그러므로 field 명령어가 Topping 자바 소스에 적용되어야한다는걸 알고있어. 루의 현재 Context는 쉘안에서 실행하는해 (설명은 빨간 사각형안에 있어):

만일 너가 다른 타켓의 타입에 필드를 추가 하고싶다면, --class 속성을 프로젝의 어떤 타입으로 완성하려고 탭을 허용한 field 명령어의 일부로서 명시할수있어

다음 단계로 너는 Base 와 Pizza 도메인 객체를 만들거야 다음의 명령어와 비슷한 방식이 될거야 (쉘 출력물은 생각했어):

entity jpa --class ~.domain.Base --testAutomatically 
field string --fieldName name --notNull --sizeMin 2
entity jpa --class ~.domain.Pizza --testAutomatically 
field string --fieldName name --notNull --sizeMin 2
field number --fieldName price --type java.lang.Float

피자 도메인 클래스에 이름과 가격 필드를 추가한 후 우리는 Base와 Topping에 이들의 관계를 엮을 필요가 있어. (하나의 피자는 여려개의 Topping을질수있고, 하나의 Topping은 여러개의 피자에 쓰일수있으니) 피자와 토핑사이에 m:m relationship을 가지고 시작해보자.

이거한 다수:다수관계 (many-to-many relationship)을 만들수있게 루는 field set 명령어를 제공해줘:

~.domain.Pizza roo> field set --fieldName toppings --type ~.domain.Topping

만일 우리의 피자 도메인 엔티티의 이 맵핑을 만들기위해 필요한 정확한 JPA애노테이션에 대한 지식이 없다 하더라도 이 관계를 정의하기 쉽지.

비슷한 방법으로 Pizza와 Base 도메인 엔티티간의 m:1 관계를 정의할수있어 field reference 명령어를 써서 말이지:

~.domain.Pizza roo> field reference --fieldName base --type ~.domain.Base

비슷하게 우리는 계속 피자 주문 PizzaOrder 도메인 객체를 만들고 field date 와 field number 명령어를 조율해서 필드를 추가할수있어:

entity jpa --class ~.domain.PizzaOrder --testAutomatically 
field string --fieldName name --notNull --sizeMin 2
field string --fieldName address --sizeMax 30
field number --fieldName total --type java.lang.Float 
field date --fieldName deliveryDate --type java.util.Date
field set --fieldName pizzas --type ~.domain.Pizza

이걸로 초기 버전의 도메인 모델의 완성했으니 이 단계를 마칠께.








Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지
 
  

2.4. 1 단계: 일반적인 프로젝 시작하기

이제껏 우리는 우리가 개발할 프로젝의 첫 아이디어와 요구사항들을 취합하기 위해 우리의 고객인 피자가게 주인과 애기했어. JSK와 Spring Roo 그리고 Maven을 설치하고 우리의 프로젝을 위한 새 디렉토리를 만들어보자:

> mkdir pizza
> cd pizza
pizza>

다음으로 스프링 루를 시작하고 'hint'를 쳐보면 루쉘로부터 자세한 가이드를 얻을수있을거야:

pizza> roo
    ____  ____  ____  
   / __ \/ __ \/ __ \ 
  / /_/ / / / / / / / 
 / _, _/ /_/ / /_/ /  
/_/ |_|\____/\____/    1.0.0.RELEASE [rev XXX]


Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
roo>
roo> hint
Welcome to Roo! We hope you enjoy your stay!

Before you can use many features of Roo, you need to start a new project.

To do this, type 'project' (without the quotes) and then hit TAB.

Enter a --topLevelPackage like 'com.mycompany.projectname' (no quotes).
When you've finished completing your --topLevelPackage, press ENTER.
Your new project will then be created in the current working directory.

Note that Roo frequently allows the use of TAB, so press TAB regularly.
Once your project is created, type 'hint' and ENTER for the next suggestion.
You're also welcome to visit http://forum.springframework.org for Roo help.
roo>

루쉘안에는 몇가지 아주 유용한 기능들이 있어. 
hint를 쳐보면 이 명령어가 너가 첫 프로젝을 완성하기 위해 단계별로 해야할것을 가이드 해주는걸 알수있을거야. 또 help를 쳐보면, 현재 단계에서 해야할 모든 명령어들의 목록이 보여질거야.
우리의 경우는 아직 새 프로젝을 만들지도 않았으니까 help 명령어는 오직 현재 단계에서 가능한 최상위 레벨의 명령어들만 보여지겠지. 실제 프로젝을 만드려면 우리는 project 명령어를 사용해야해:

roo> project --topLevelPackage com.springsource.roo.pizzashop
Created /Users/sschmidt/Development/workspaces/test9/pom.xml
Created SRC_MAIN_JAVA
Created SRC_MAIN_RESOURCES
Created SRC_TEST_JAVA
Created SRC_TEST_RESOURCES
Created SRC_MAIN_WEBAPP
Created SRC_MAIN_RESOURCES/META-INF/spring
Created SRC_MAIN_RESOURCES/META-INF/spring/applicationContext.xml
Created SRC_MAIN_RESOURCES/META-INF/spring/log4j.properties
com.springsource.roo.pizzashop roo>

project명령어를 쓰면, 루는 메이븐 스타일의 디렉토리 구조 뿐만아니라 메이븐 pom.xml 파일을 만들어줘. 너가 입력한 최상위 패키지는 이 명령어로 pom.xml 안에 <groupId>로 사용되어지지.

나중에 입력할 루 명령어인 "~"는 이 최상위 패키지(top-level-package)의 줄임을 뜻하게되지. (너가 루를 로드하는 매 순간 pom.xml를 통해 루쉘에 읽혀져)

다음의 폴더 구조가 이제 너의 파일 시스템에 만들어져있을거야:

메이븐을 잘 알고 있는 사람이라면 이 폴더구조가 너의 메인 프로젝 리소스와 테스트를 위해 폴더를 구분해서 만드는 표준 메이븐 방식이라는걸 알아차렸을거야. 루는 디폴트 어플리케이션 컨텍스트(default application context)와 log4j configuration도 설치해줘. 결과적으로 프로젝 pom 파일은 피자가게 프로젝을 시작하는데 필요한 모든 요구되는 의존성과 설정들을 포함하고 있는거지.

일단 루가 프로젝 구조를 생성하면, 너는 더 나아가 어플리케이션에 persistence 설정을 할수있어. 루는 ORM을 가능하게 해주는 편리한 추상화를 지원하는 자바 Persistence API (JPA)를 지원해. JPA는 너의 persistent 도메인 객체 (엔티티)와 엔티티간의 데이터베이스 테이블사이의 맵핑을 책임지지.

너의 프로젝안에 persistence configuration을 설치하고 변경하기 위해 persistence setup 명령어를 사용할수있어 (note: <TAB> 을 가능한한 자주 써버릇해; 명령어와 옵션을 자동완성해줄거야 뿐만아니라 관련된 도움말도 얻을수있을거야):

com.springsource.roo.pizzashop roo> hint
Roo requires the installation of a JPA provider and associated database.

Type 'jpa setup' and then hit TAB three times.
We suggest you type 'H' then TAB to complete "HIBERNATE".
After the --provider, press TAB twice for database choices.
For testing purposes, type (or TAB) HYPERSONIC_IN_MEMORY.
If you press TAB again, you'll see there are no more options.
As such, you're ready to press ENTER to execute the command.

Once JPA is installed, type 'hint' and ENTER for the next suggestion.
com.springsource.roo.pizzashop roo>
com.springsource.roo.pizzashop roo> 
jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY Created SRC_MAIN_RESOURCES/META-INF/persistence.xml Created SRC_MAIN_RESOURCES/META-INF/spring/database.properties Managed SRC_MAIN_RESOURCES/META-INF/spring/applicationContext.xml Managed ROOT/pom.xml com.springsource.roo.pizzashop roo>

이 경우 우리는 ORM 제공자로 하이버네이트를 설치했어. 하이버네이트는 루가 현재 지원하는 3가지 ORB제공자중 하나야. EclipseLink와 OpenJPA가 다른 선택이 될수있지. 비슷한 설정으로 우린 Hypersoinc 메모리 데이터베이스를 설치했고 설정했어
 

제품 설정내에서 어플리케이션을 테스트 또는 설치할 준비하려면 jpa setup 명령어를 다시 반복할수있어. 루는 Postgres, MySQL, Microsoft SQL Server, Oracle, DB2, Sybase, H2, Hypersonic 등등의 데이터베이스 제품을 위해 TAB 자동완성을 지원해줘.
 

또 다른 중요한 단계는 SRC_MAIN_RESOURCES/META-INF/persistence.xml 파일을 편집하고 너의 JPA 제공자의 DDL (schema management) 설정을정하는거야. 이걸로 어플리케이션의 재시작간에 데이터를 보호하지. 이걸 위해서, 루는 자동적으로 JPA제공자의 해당 파일안에 코맨트함으로서 유효한 설정들을 목록화해줘. 기본 JPA제공자는 매번 다시 로드할때마다 모든 데이터베이스 테이블을 지워버릴거라는걸 알아둬. 넌 확실히 이 설정을 변경해야 할거야.
 

오라클과 DB2 JDBC 드라이버는 공개 메이븐 리파지토리에서 이용할수없어는것도 알아둬.

루는 이 드라이버들이 선택되면 표준의 의존성들을 설치할거야 그러나 너는 아마 너의 데이터베이스 버젼에 따라 패키지 이름이나 버전 이름을 스스로 적용해야할거야. 너의 로컬 메이븐 리파지토리내에 드라이버를 설치하기위한 메이븐 명령어는 다음과 같아: mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.2 -Dpackaging=jar -Dfile=/path/to/file (오라클 드라이버의 예)


 



Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지

 

2.3. 튜토리얼 어플리케이션 상세설명

스프링 루로 어플리케이션을 개발하는걸 보여주려고 우리는 피자가게를 위한 웹사이트를 만들어거야. 루 피자가게 어플리케이션의 요구사항은 루 피자가게의 점원에 의해 새 피자 종류를 입력해야하는거야. 피자는 하나의 기본판(base)과 하나이상의 토핑(topping)으로 만들어지지. 더 나아가 가게 주인은 고객이 주문할수있는 온라인 주문하는 기능을 원하고있어.

피자가게 주인과 짧은 토론후, 우리는 초기 도메인 모델을 위한 클래스 다이어그램을 만들었어:

클래스 다이어그램은 피자가게가 가지고 있는 문제들을 간단한 모델로 표현했지만, 피자가게 주인에게 어플리케이션의 초기 프로토타입을 보여주기위한 아주 좋은 출발점이 되지. 후에 튜토리얼은 스프링 루의 고급기능을 보여주기 위해 이 도메인 모델을 확장할거야 



Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지

 

2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션

이 장의 튜토리얼뿐만 아니라 우리의 블로그에 별도의 단계별 튜토리얼 하나를 올려두었어. 이 블로그는 웨딩 초대장 어플리케이션을 단계별로 커버하지. 여기에 루와 루가 수용할수있는 다음과 같은 재미난 기능들을 반영해서 계속 업데이트하고 있어:

  • JPA 엔티티 등들 가지는 표준 MVC 웹어플리케이션 

  • 커스터마이즈할수있는 로그인 페이지를 포함한 스프링 시큐리티 사용예 

  • SMTP를 통한 이메일 보내기 

  • JUnit과 셀레니움을 통한 테스트 

  • 이클립스의 사용예 

  • 디플로이용 WAR 만들기


웨딩 초대장 튜토리얼은 여기서 찾아볼수있어 
http://blog.springsource.com/2009/05/27/roo-part-2/









Posted by K 얼바인
2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지


2.1. 뭘 배울수있나?

이 튜토리얼에서 너는 하나의 완전한 웹 어플리케이션을 루를 사용해서 처음부터 만드는걸 배울거야. 우리가 개발할 어플리케이션은 루가 제공해주는 많은 핵심 기능들을 보여주게 될거야. 구체적으로 다음의 루 쉘을 쓰는 법을 배울거야:

  • 프로젝 생성 

  • 도메인 객체의 생성 및 개발 (JPA 엔티티) 

  • 도메인 객체에 다을 타입의 속성필드 추가하기 

  • 도메인 객체가 관계설정하기 

  • 통합 테스트의 자동 생성 

  • IDE에 프로젝을 import하기 위해 workspace artifacts 만들기 

  • 웹 티어의 자동 scaffolding 

  • 웹 컨테이너에 어플리케이션 돌리기 

  • 어플리케이션의 다른 뷰의 보안 접근 및 제어 설정 

  • 비지니스 도메인을 위한 웹UI의 커스터마이징 룩앤필 

  • 셀레니움 테스트 만들고 실행하기 

  • 어플리케이션 디플로이 및 백업 



 

Posted by K 얼바인

2장 스프링 루 시작하기: 튜토리얼

 이 장에서 우리는 좀 빠르게 어플리케이션 하나를 차근차근 만들어볼거야. 그걸로 너는 일반적인 프로젝에서 어떻게 루를 사용하는지 볼 수 있을거야. 

자세한 기능들과 부가적인 절차들에 대한 설명은 이 메뉴얼의 다른 섹션에 남겨둘께

2. 스프링 루 시작하기 : 튜토리얼
2.1. 뭘 배울수있나? 
2.2. 또다른 튜토리얼: 웨딩 초대장 어플리케이션
2.3. 튜토리얼 어플리케이션 상세설명
2.4. 1단계: 일반적인 프로젝 시작하기
2.5. 2단계: 엔티티와 필드 생성하기
2.6. 3단계: 통합테스트
2.7. 4단계: IDE 사용하기
2.8. 5단계: 웹티어 만들기
2.9. 6단계: 웹서버 로딩하기
2.10. 어플리케이션에 보안적용하기
2.11. 웹UI의 Look & Feel 커스터마이징하기
2.12. 셀레니움 테스트 
2.13. 백업과 디플로이하기
2.14. 이제 뭐하지
 

 

Posted by K 얼바인


티스토리 툴바