Whiteship's Note


5시에 들어온 미션~

모하니?/Coding : 2008. 7. 30. 17:57


1. 상품 그리드에 $ 가 보이는데, 찾아서 없애기
2. 상품 정보 엑셀로 업로드 했더니, 바코드가 설명 필드로 들어가버렸네. 수정.
3. 바코드 유/무 검색 조건이 이상하게 말을 잘 안 듣네.

미션이 들어온 시간은 5시 1분, 지금은 5시 47분.

1. $ 찾아서 없애기
우선 상품 그리드 말고 다른 그리드에도 저 $가 보이는지 몇 개 걸쳐가며 확인해본 결과, 상품 그리드에만 표시가 되고 있음. 그래서 IE에서 소스 보기 누른 다음, Ctrl+F로 $를 찾아봤더니, EL들 몇 개 지나가고, 맨~~~ 아래 </html> 이 끝나고 $ 하나가 썰렁하게 놓여있는거 발견!! 이클립스에서 Ctrl + Shift + R 눌러서 해당 JSP 찾아간 다음에 맨 아래에서 $ 삭제.

2. ExcelUpload 구현한 메소드로 들어가서, 엑셀 컬럼 읽어서 객체에 세팅하는 부분 발견. 코드를 보니까, 바코드 필드가 설명 필드 앞에 추가가 되서, 발생한 문제, 양식함에 만들어둔 양식에는 바코드 필드가 없어서 괜찮을 줄 알았는데, 그리드에서 바로 엑셀 다운로드 한 담에 그걸 양식삼아서 업로드 하느라 발생한 문제. 이 경우는 "양식함이 그리드와 똑같다" 라는  "사용자 경험" 때문에 나온 것이므로 이 경험을 유지시켜주기 위해서 양식함과 업로드 로직을 수정하는게 좋을 듯 싶어서. 후다닥 작업. 테스트.

3. 바코드 유/무는

if(params.getHasBarcode() == YesNoType.YES)
   c.add(Restrictions.isNotNull("suppbarcode"));
else if(params.getHasBarcode() == YesNoType.NO)
   c.add(Restrictions.isNull("suppbarcode"));

이렇게 코딩을 해놨는데, 썩 좋치가 않았구나. 해당 필드가 엑셀에서 읽어와서 null 이라아니라 그냥 공백 "" 경우에는 조건에 제대로 안걸려서 무조건 전부 not null 이니.. 이건 뭐.. 어떻게 할까 잠시 고민...
Exel에서 읽을 때 공백이면 null로 채워주는 메소드를 ExcelUtil에 하나 추가하고 바코드는 그걸로 읽어오자. 캬캬.

끝~~
top

Write a comment.


assertThat()으로 null 여부 확인하기

모하니?/Coding : 2008. 7. 30. 14:34


JUnit 4.4 전에는 assertNotNull(dao); 이런식으로 확인했었습니다.

그러나 4.4부터 assertThat()을 사용해서 다음과 같이 테스트 할 수 있습니다.
assertThat(dao, is(notNullValue()));

여기서 is를 빼면 어법이 좀 그렇긴 하지만.. 그래도 동작합니다.
assertThat(dao, notNullValue());

처음엔 이렇게 작성했었습니다.
assertThat(dao, is(not(null));

하지만 위에 코드는 안 됩니다. null이 값이 아니기 때문에, 값 비교 하는데 null 때문에 NullPointerException이 발생합니다.

Maven을 사용하고 계시다면..

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.1</version>
        </dependency>

이렇게 라이브러리를 추가해주신 다음에 해야 합니다. static import를 추가해두면 편하겠죠.

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

top

Write a comment.


하이버네이트 Criteria 다루기 - 중복일까 아닐까

모하니?/Coding : 2008. 7. 30. 13:31


    @Override
    public List<T> search(P params, OrderPage orderPage) {
        // total rowcount
        orderPage.setRowcount((Integer) (addRestrictions(
                getSession().createCriteria(this.persistentClass), params)
                .setProjection(Projections.rowCount()).uniqueResult()));

        // pages list
        Criteria c = addRestrictions(getSession().createCriteria(
                this.persistentClass), params);
        orderPage.applyPage(c);
        orderPage.applyOrder(c);

        return c.list();
    }

    /**
     * template method for search
     *
     * @param c
     * @param params
     * @return
     */
    protected Criteria addRestrictions(Criteria c, P params) {
        return c;
    }

위 코드에서 중복이 보이시나요? 안 보이신 다구요?

    @Override
   public List<T> search(P params, OrderPage orderPage) {
       // total rowcount
       orderPage.setRowcount((Integer) (addRestrictions(
               getSession().createCriteria(this.persistentClass), params)
               .setProjection(Projections.rowCount()).uniqueResult()));

       // pages list
       Criteria c = addRestrictions(getSession().createCriteria(
               this.persistentClass), params);
       orderPage.applyPage(c);
       orderPage.applyOrder(c);

       return c.list();
   }

어떤가요. 중복 이죠? 그러나..

Criteria c = addRestrictions(getSession().createCriteria(
               this.persistentClass), params);
orderPage.setRowcount((Integer) (c.setProjection(Projections.rowCount()).uniqueResult()));
orderPage.applyPage(c);
orderPage.applyOrder(c);

대강 이런 식으로 리팩터링 해보면 하이버네이트는 요상한 쿼리와 함께 에러를 뱉어냅니다.

전체 Row 갯수를 반환하는 Criteria(쿼리는 select count(*).. )이런식으로 시작)를 다시 Order와 Page 처리를 할 때 사용하면 이상한 쿼리(select count(*).. order by ... 이게 이상한 이유는 order by에서 사용한 컬럼이 group by에 있어야 하는데 groupd by를 정의한 적이 없거니와, 사실 두 번째 쿼리는 count(*)가 없어야 하는데 앞에서 만들어둔 Criteria에 이어 붙인 꼴이 되어서 이상해졌습니다.)가 되버립니다.

중복처럼 보이지만 제거하면 코드가 깨지는... 요상한 경우. 이거 어떻게 처리하는게 좋을까요? 전 요리 조리 해보다가 그냥 뒀습니다.
top

  1. 백가 2008.07.30 18:39 PERM. MOD/DEL REPLY

    pages list 를 먼저 구하고 total rowcount를 나중에 처리해도 똑같은 현상인가요?

    얼핏 보기에는 .setProjection(Projections.rowCount()).uniqueResult() 에서 무언가 c의 상태를 변화시킴으로 해서
    orderPage.applyPage(c);
    orderPage.applyOrder(c);
    에서 요구하는 c의 상태와는 다른 c 가 되는 모양으로 보입니다만.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.07.30 21:09 PERM MOD/DEL

    네.. 그렇게 해봤죠.ㅋㅋ 그렇게 해도 비슷한 HQL이 생성되서 에러가 납니다.

    applyPage와 applyOrder에서도 쿼리를 손보기 때문에, 결과는 같습니다.

Write a comment.


20080730 GMP

모하니?/GMPing : 2008. 7. 30. 10:15


News

ill-~ : ~이 부족한(ex. ill-housed 주거환경이 안 좋은)

Around the world, woman are far more likely then man to be pool, ill-housed, undereducated, and vitimized by war and discrimination.

Screen English

I can't explain this.
Let him explain.
Remember the woman at the bookstore? Here she is.
You told me to go after her. and I didn't.
It was not planned.
I know how this looks.

Pop's English

Hey, grab your clothes and get gone.
You'd better hurry up. because spring coollers come on.
Girl I love you. you are the one. This is just looks like a re-run.
Please what else is on.

Talk Play Learn

I prefer A to B. (나는 B 보다 A가 좋아요.)
I prefer girls to boys.
I prefer sea food to meat.
I prefer summer to winter.
I prefer snailmail to email.
I prefer baseball to soccer.
I prefer urban life to rurul life.
I prefer aisle seats to window seats.

바쁜데 짬을 내다 = squeez in


'모하니? > GMPing' 카테고리의 다른 글

20080819 GMP  (0) 2008.08.19
20080813 GMP  (0) 2008.08.13
20080807 GMP  (0) 2008.08.07
20080801 GMP  (0) 2008.08.01
20080731 GMP  (0) 2008.07.31
20080730 GMP  (0) 2008.07.30
20080728 GMP  (0) 2008.07.28
20080724 GMP  (0) 2008.07.24
20080721 GMP  (0) 2008.07.21
20080718 GMP  (0) 2008.07.18
20080717 GMP  (0) 2008.07.17
top

TAG GMP

Write a comment.