실력 향상을 위해서는

다른 사람의 코드를 많이 보는 것이 중요한데

괜찮은 프로그램 소스를 얻는 것이 쉽지가 않다.

인터넷에서 찾을 수 있는 것들 중

Mybatis에서 Spring 기반으로 제작한 샘플인 JPetStore가

작지만 많은 것을 포함하고 있어

얻는 것이 많을 것 같아서 정리해 봤다.

가장 유명한 샘플이라고 생각한다.


JPetStore는 Spring 4와 Mybatis 3, HSQLDB를 이용하여

애완동물을 파는 기본적인 쇼핑몰을 구축한 샘플로

Mybatis에서 제공하는 샘플이 있고(jpetstore),

다양한 기술들을 소개하기 위해 변형해서 만든 샘플들이 있다.

 약어

주소

 DBMS

 특징

jpetstore (기본)

https://github.com/mybatis/jpetstore-6

 HSQLDB

MyBatis 3, Spring 4 and Stripes

spring-jpetstore

https://github.com/making/spring-jpetstore

 H2

Spring, Spring MVC, MyBatis 3, and Spring Security

vaadin-jpetstore

https://github.com/igor-baiborodine/jpetstore-6-vaadin-spring-boot

 HSQLDB

Vaadin and Spring Boot with JavaConfig

gradle-jpetstore

https://github.com/hanmomhanda/Spring4-jpetstore6-MyBatis3

 HSQLDB

Spring4, MyBatis3, gradle

tomee-jpetstore

https://github.com/AndyGee/jpetstore-6-tomee

 HSQLDB

jpetstore + tomee


표에 있는 것을 모두 상세하게 정리할 수는 없고

몇 가지 기능과 구조를 중심으로 정리했다.

먼저, 기본적인 설명은 http://www.mybatis.org/jpetstore-6/ko/에 잘 정리되어 있다.

Spring과 Mybatis에 대한 기본적인 설명은 다 있는 것 같다.

기본적인 사이트 구성을 알고 싶은 경우

데모 사이트에서 확인할 수 있다.


먼저, 기본인 jpetstore(표의 약어)는

소형 DBMS인 HSQLDB를 대상으로

국내에서는 잘 사용하지 않는 Stripes를 이용한 예제이다.

Stripes를 사용했기 때문에 일반적인 Spring 코드와 많은 차이가 있다.


spring-jpetstore는 Spring MVC를 기반으로 하고,

Spring Security를 사용하여 jpetstore의 보안 문제를 해결하였다.


vaadin-jpetstore은 기본 기능에 vaadin을 적용한 것으로

데모 사이트가 운영되어 있어 설치 없이 사용해 볼 수 있다.

개인적으로 Java로 웹 페이지를 컨트롤 한다는 개념이 욕심이라는 생각에

사용해 보지 않았지만,

자바스크립트 프론트엔드 애플리케이션을 자바로 만들고 싶다면 확인해 보는 것도 좋을 것 같다.


gradle-jpetstore과 tomee-jpetstore는 기본 jpetstore에

gradle과 tomee를 적용한 것으로

소스에 큰 차이가 없다.

gradle-jpetstore는 gradle를 설치하고 실행하면 문제가 없고,

tomee-jpetstore도 일종의 WAS인 tomee만 설치하면 될 것 같은데

일이 커지는 것 같아서 테스트 해보지 않았다.


HSQLDB는 Java 기반의 소형 RDBMS이고,

H2는 HSQLDB의 후속 버전이다.

위 예제들은 내장되어 작동하기 때문에

별도의 설치나 접속 정보 설정없이 웹 실행과 동시에 사용할 수 있다.


이상의 5가지 외에도 다양한 버전이 있을 수 있다.

(개인적으로 몇 시간 검색해서 찾은 결과일 뿐이다)

이러한 유사한 기능을 제공하는 소스 코드를 살펴보고

실행해 보는 것도 공부가 되는 것 같아서 정리해 봤다.


나아가 자신의 버전을 만든다면 실력 향상에 도움이 될 것 같다.

JQuery나 Bootstrap 등으로 개발해 보거나

제품 등록 기능, 판매 현황 등의 기능이 없는데

기능을 보강해 보는 것도 재미 있을 것 같다.


'Java > JPetStore' 카테고리의 다른 글

2. JPetStore 설치  (2) 2016.11.06
3. JPetStore - 쇼핑몰 구조  (0) 2016.11.06
4. JPetStore - 코드 둘러보기  (1) 2016.11.06

앞서 정리한 내용 중

기본 jpetstore와 spring-jpetstore, gradle-jpetstore를 설치해 본다.


MyBatis에서 제공하는 JPetStore의 기본 예제를 설치한다.

설치법이 https://github.com/mybatis/jpetstore-6에 제공되지만

이 설치법은 git 명령어를 이용하여 설치하는 것으로 다소 어렵게 느껴진다.

개인적으로 Eclipse가 더 사용하기 쉬워

Eclipse Neon에 JDK 1.8로 설치했다.

Eclipse Neon부터는 Maven이 포함되어 있지만

다른 버전은 Maven을 설치해야 한다.

이하의 내용은 일반적 github import와 거의 유사하다.

다만, 일반 프로젝트로 받아서 Maven Project로 변환(6, 8번)하는 차이가 있어

변환 부분만 참고하고 import 해도 된다.


1. Eclipse에서 파일 메뉴나 Project Explorer에서 마우스 오른쪽 버튼을 눌러 import를 실행한다.

- Git의 [Projects from Git]을 선택하고 다음을 진행한다.

2. [Clone URI]을 선택한다.

3. JpetStore의 기본 프로젝트 주소를 입력한다.

- https://github.com/mybatis/jpetstore-6.git

4. 그냥 다음을 진행한다.

5. [Browse]버튼을 눌러 현재 Eclipse의 workspace를 지정한다.

- 여기서는 D 드라이브에 jpetstore 폴더를 지정했다.

6. [import as general project]를 선택한다.

- JPetStore가 일반 프로젝트로 등록되어 있기 때문이다.

7. [Finish]버튼을 눌러 종료 한다.

8. GitHub에서 소스를 다운 받고 나면, jpetstore-6 프로젝트가 생성되지만

   src와 travis폴더만 생성된 일반 프로젝트이다.

   따라서, 다음 그림과 같이 프로젝트를 선택하고 마우스 오른쪽 버튼을 눌러

   Configure > Convert to Maven Project를 실행한다.

9. 그림과 같이 Maven 웹 프로젝트로 변환된다.

- bin 폴더는 필요없는 폴더라 삭제해도 된다.

10. 프로젝트를 선택하고, 마우스 오른쪽 버튼을 눌러 Properties창을 실행한다.

- 오른쪽 트리에서 [Java Build Path]을 선택하고, Libraries 탭을 선택한다.

- JRE System Libaray [JavaSE-16]을 선택하고 [Edit]버튼을 선택한다.

11. Alternate JRE를 선택해서 PC에 설치된 Java를 지정한다.

- 여기서는 JDK 1.8

12. Java Compiler > Compiler Compiance level에 PC에 설치된 Java를 지정한다.

13. Project Facets > Java에 PC에 설치된 Java를 지정한다.

14. 프로젝트를 선택하고, 마우스 오른쪽 버튼을 눌러 Run As의 [Maven clean]을 실행한다.

- 다시 프로젝트에서 [Maven Install]을 실행한다.

- PC 성능에 따라 다르지만 제법 많은 시간이 소요 될 수 있다.

- 오류가 발생할 수 있는데, 오류 메시지를 확인하고 해당 파일을 찾아서 지운 후

  다시 Maven Clean / Install을 실행하면 된다.

다음 그림과 같이 Maven Install 후 [BUILD SUCCESS]가 되어야 한다.

그렇지 않은 경우 오류 메시지를 확인해서 처리해야 하다.

오류 중 tools.jar 가 없다는 오류가 발생할 경우에는 여기를 참조하면 된다.

그 외에 특정 jar파일이 없다고 하는 경우에는

Maven의 레파지토리(.m2)에 가서 해당 jar가 있는 폴더를 삭제하고

clean / install을 진행하면 된다.


15. Tomcat 서버에 프로젝트를 추가하고 실행한다.

16. 웹 브라우저에서 [http://localhost:8080/jpetstore/] 입력해서 접속한다.


spring-jpetstore는 GitHub 주소만 바꿔서 위와 같은 방식으로 실행하면 된다.

gradle-jpetstore는 Maven 프로젝트로 제공되기 때문에

Maven Project로 변환(6, 8번)하는 과정을 진행할 필요가 없다.

그림과 같이 Eclipse프로젝트로 다운 받으면 된다.

Gradle는 당연이 설치되어 있어야 한다.


'Java > JPetStore' 카테고리의 다른 글

1. JPetStore  (2) 2016.11.06
3. JPetStore - 쇼핑몰 구조  (0) 2016.11.06
4. JPetStore - 코드 둘러보기  (1) 2016.11.06

개발에 있어서 가장 중요한 문서는

프로세스 명세서, 화면 설계서, 데이터 베이스 구조(ERD)라고 생각한다.

최소한 이 3가지는 있어야 개발 할 수 있다고 생각하고

이 3가지를 정리하면 웬만한 프로그램도 이해할 수 있다고 생각한다.

화면 설계서는 웹에서 실행시켜보는 것으로 대체하고

나머지 2가지에 대해서 정리했다.


JPetStore는 다음 그림에서 보는 것 같이

일반적인 쇼핑몰과 동일한 기능을 제공하고 있다.


먼저, 쇼핑몰에서 동물에 대한 분류(개, 고양이 등)를 선택하고,

세부 설정에 따라 원하는 동물을 찾아들어 간다.

(검색을 이용 할 수도 있다.)

맘에 드는 동물에 대한 정보를 본 후 ,

카트에 담기(Add to Cart)를 눌러 장바구니(cart)에 담는다.

(화면과 다음 흐름을 맞춰서 보면 이해 하기 쉽다.)


장바구니에서 주문을 하면(Proceed to Checkout)

로그인 창이 나타난다.

로그인 정보는 ID와 비밀번호를 j2ee와 j2ee로 동일하게 입력하면 된다.

(또는 ACID / ACID)

로그인을 하고 결제(주문) 정보를 입력하면

완료 메시지와 구매 리스트를 볼 수 있는 구조로 개발 되었다.

이 흐름은 다음 그림과 같은 URL로 되어 있다.

위 그림과 같이 클릭해 보면

웹 브라우저의 주소 입력창에 나타나는

URL (파마메터 포함)이 다음 그림과 같은 것을 알수 있다.

이 구조로 소스를 찾아보면

개발 흐름을 쉽게 파악할 수 있을 것이다.


다음으로 사용된 데이터 베이스 구조를 살펴 보면(ERD)

다음 그림과 같다.

resource/database/jpetstore-hsqldb-schema.sql파일의 내용을

AmaterasERD로 정리했다.

왼쪽에는 동물 분류와 세부 정보, 오른쪽에는 구매자 정보, 중앙에 주문 정보를 배치했다.

위 그림은 논리모드(Logical Mode),

아래 그림은 물리 모드(Physical Mode)를 갈무리 한 것이다.

주문 테이블(order)에서 ship(ship addr, shipcity...)은

직역으로 선적자로 적었지만 의미상 수신자,

bill(billaddr, billcidy...는 계산자로 번역했지만

주문자로 이해하는 것이 맞다.

전체적인 테이블 구조는 일반적이라

관계(Relation) 중심으로 기억해 두면 될 것 같다.

jpetstore.erd

 

다만, 로그인 관리(signon) 테이블을

계정(account)테이블과 별도로 구성하고

사용자 아이디를

로그인 테이블에서는 username,

계정 테이블에서는 userid로 다르게 명명하고

길이(length)도 25와 80으로 다르게 부여한 것은 이상하다.

같게 기능을 하고 같은 값을 사용하는 것을

왜 다르게 구현했는지...







'Java > JPetStore' 카테고리의 다른 글

1. JPetStore  (2) 2016.11.06
2. JPetStore 설치  (2) 2016.11.06
4. JPetStore - 코드 둘러보기  (1) 2016.11.06

먼저, 기본적인 설명은 http://www.mybatis.org/jpetstore-6/ko/에 잘 정리되어 있다.

여기서는 jpetstore와 spring-jpetstore의 차이를

두 가지로 정리하면서 코드를 둘러봤다.


먼저, JPetStore 예제들은 기본적으로

다음 그림과 같이 MVC(Model–View–Controller)를 지키고 있다.


사용자에 의해 Action(Control)이 호출되고,

데이터 가공이 필요하면 서비스를 통해 DBMS를 제어하고

적절한 가공을 해서 JSP(HTML)로 변환해서

클라이언트(웹브라우저)에게 전송하는 구조를 가지고 있다.


이상의 그림은 MVC에 맞춰서 그렸다기 보다는

jpetstore의 구성 클래스가 존재하는 디렉토리 명 중심으로 작성하였다.


예로, 위 그림에 맞추어

jpetstore의 동물에 대한 분류 화면을 대상으로 함수들을 정리했다.

분류의 첫 화면(http://localhost:8080/jpetstore/actions/Catalog.action)은

HTML로 구성되어 서비스와 매퍼가 사용되지 않아서 넘어가고

상세 분류(Catalog.action?viewCategory=&categoryId=FISH)화면을 대상으로 한다.


Stripes로 인해 URL이 다소 특이하지만

Stripes에 대해서는 찾아보길 바라고 여기서는 간단하게 정리한다.

Spring MVC에서는 viewCategory.action으로 호출하게 되는데

viewCategory 컨트롤이 작성된 클래스의 파라메터처럼 호출한다.

쇼핑몰 구조에서 정리한 동물분류와 관련된 모든 기능은

CatalogActionBean.java에 각각의 함수로 구현되고,

상세 분류(viewCategory)처럼 파라메터로 호출된다.

위 그림에 맞추어 실제 코드를 확인해 보길 바라고,

사용자가 동물 분류중 하나를 선택하면

CatalogActionBean.java에 있는 viewCategory Action이 실행된다.

viewCategory Action에서는 파라메터로

사용자가 선택한 동물 분류(categoryId)가 넘어 오고,

이 분류를 파라메터로 분류별 동물 리스트(getProductListByCategory)를

데이터 베이스에서 찾아온다(CatalogService).

(코드에서는 제품-product-로 사용했는데 동물을 제품으로 부르기...)


spring-jpetstore도 위 그림에 맞추어

다음과 같이 정리했다.

spring-jpetstore는 Spring MVC에 맞추어 개발되어

Action이 아닌 Controller란 말을 사용한다.

viewCategory에 흔히 보는 @RequestMapping도 사용되었다.

웹사이트에서 접속된 URL을 확인하면

다음과 같이 직접 호출된다.

http://localhost:8080/spring-jpetstore/catalog/viewCategory?categoryId=FISH


jpetstore와 spring-jpetstore의 두번째 차이는 로그인 처리이다.


jpetstore에서 원하는 동물을 카트에 넣고

결제를 하려고 하면 다음과 같은 로그인 창이 나타난다.

로그인을 하고 결제를 한뒤,

페이지 상단에 있는 Sign Out 버튼을 이용하여 로그아웃한다.

즉, 로그인 되지 않은 상태에서

자신의 정보를 수정하거나(http://localhost:8080/jpetstore/actions/Account.action?editAccountForm=)

주문 내역을(http://localhost:8080/jpetstore/actions/Order.action?listOrders=)

직접 접속할 경우 빈 값이나 오류 페이지를 보게 된다.

jpetstore는로그인 체크를 하지 않은 것이다.

이처럼 사용자가 로그인을 하지 않은 경우 로그인 페이지로 이동하도록 해야 한다.

다음 코드와 같이 결제를 하려고 할때(newOrderForm)에만

로그인 체크를 하고 있다.

  public Resolution newOrderForm() {
    HttpSession session = context.getRequest().getSession();
    AccountActionBean accountBean = (AccountActionBean) session.getAttribute("/actions/Account.action");
    CartActionBean cartBean = (CartActionBean) session.getAttribute("/actions/Cart.action");

    clear();
    if (accountBean == null || !accountBean.isAuthenticated()) {
      setMessage("You must sign on before attempting to check out.  Please sign on and try checking out again.");
      return new ForwardResolution(AccountActionBean.class);

    } else if (cartBean != null) {
      order.initOrder(accountBean.getAccount(), cartBean.getCart());
      return new ForwardResolution(NEW_ORDER);
    } else {
      setMessage("An order could not be created because a cart could not be found.");
      return new ForwardResolution(ERROR);
    }
  }


반면, spring-jpetstore는 다음 코드에 나타난 것과 같이

로그인 체크를 하고 있지 않다.

    @RequestMapping("newOrderForm")
    public String newOrderForm(OrderForm orderForm, Model model) {
        UserDetails userDetails = (UserDetails) SecurityContextHolder
                .getContext().getAuthentication().getPrincipal();
        Account account = userDetails.getAccount();

        Order order = new Order();
        order.initOrder(account, cart);
        beanMapper.map(order, orderForm);
        model.addAttribute(order);

        return "order/NewOrderForm";
    }

spring-jpetstore는 Spring Security를 적용하여

spring-security.xml에 로그인이 필요한 페이지를 지정하고 있다.

    <sec:http auto-config="true" use-expressions="true">
        <sec:form-login login-page="/account/signonForm"
            login-processing-url="/account/signon"
            authentication-failure-url="/account/signonForm?error=true" />
        <sec:logout delete-cookies="JSESSIONID" logout-url="/account/signoff"
            logout-success-url="/" />
        <sec:intercept-url pattern="/account/editAccount*"
            access="isAuthenticated()" />
        <sec:intercept-url pattern="/order/**" access="isAuthenticated()" />
    </sec:http>

따라서 계정정보 수정(editAccount)이나 주문(order) 등의 페이지를 실행할 때,

로그인을 하지 않은 경우 로그인 창이 실행된다.


이외에 jpetstore에는 JUnit을 이용하여

데이터를 가지고 오는 서비스와 관련된 부분에

단위 테스트가 적용되어 있다.

그림과 같이 테스트할 파일을 선택하고

Run As > JUnit Test로 간단하게 실행해서

정상 실행 되는지 확인해 보자 (그림 중앙 하단).

'Java > JPetStore' 카테고리의 다른 글

1. JPetStore  (2) 2016.11.06
2. JPetStore 설치  (2) 2016.11.06
3. JPetStore - 쇼핑몰 구조  (0) 2016.11.06

+ Recent posts