7월, 2017의 게시물 표시

(트러블 슈팅) JPA사용시 EnumType 입력 문제

JPA를 사용하면서 Repository단에서 Recommend.LIKE라는 EnumType을 입력했는데 디비에서 이를 문자열로 받지 못했다. 이를 위해서는 도메인 클래스에서 아래를 해주어야 한다. 그러면 String형으로 인식 @Enumerated (EnumType. STRING )

(QueryDSL) 빈 생성

QItem item = QItem.item; List<ItemDTO> result = query.from(item).list( Projections.bean(ItemDTO.class, item.name.as("username"), item.price);

(QueryDSL) 프로젝션과 결과반환

QItem item = QItem.item; List<Tuple> result = query.from(item).list(item.name, item.price); //List<Tuple> result = query.from(item).list(new QTuple(item.name, item.price)); 같다.

(QueryDSL) 서브쿼리

서브쿼리 결과가 하나면 unique(), 여러건이면 list() 를 사용할 수 있다. QItem item = QItem.item; QItem itemSub = new QItem("itemSub"); query.from(item) .where(item.price.eq(     new JPASubQuery().from(itemSub).unique(itemSub.price.max()) )) .list(item); query.from(item) .where(item.in( new JPASubQuery().from(itemSub) .where(item.name.eq(itemSub.name)) .list(itemSub) )) .list(item);

(QueryDSL) 조인

조인은 innerJoint(join), leftJoin, rightJoin, fullJoin을 사용할 수 있고 추가로 JPQL의 on과 성능 최적화를 위한 fetch조인도 사용할 수 있다. 조인의 기본문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 쿼리 타입을 지정하면 된다. join(조인 대상, 별칭으로 사용할 쿼리타입) 예) QOrder order = QOrder.order; QMember member = QMember.member; QOrderItem orderItem = QOrderItem.orderItem; query.from(order) .join(order.member, member) .leftJoin(order.orderItems, orderItem) .list(order); query.from(order) .leftjoin(order.orderItems, orderItem) on(orderItem.count.gt(2)) .list(order); <패치조인사용> query.from(order) .innerJoin(order.member, member).fetch() .leftJoin(order.orderItems, orderItem).fetch() .list(order);

(QueryDSL) 결과조회, 페이징과 정렬

uniqueResult() : 조회결과가 한 건일때 사용한다. 조회 결과가 없으면 null을 반환하고 결과가 하나이상이면 com.mysema.query.NonUniqueResultException예외가 발생 singleResult() : uniqueResult() 와 같지만 결과가 하나 이상이면 처음 데이터를 반환한다. list() : 결과가 하나 이상일 때 사용한다. 결과가 없으면 빈 컬렉션을 반환한다. <페이징과 정렬> QItem qItem = QItem.item; query.from(item) .where(item.price.gt(20000)) .orderBy(item.price.desc(), item.stockQuantity.asc()) .offset(10).limit(20) .list(item); 또는 QueryModifiers를 사용할 수 있다. QueryModifiers queryModifiers = new QueryModifiers(20L, 10L); List<Item> list = query.from(item) .restrict(queryModifiers) .list(item); 실제 페이징 처리를 하려면 검색된 전체 데이터 수를 알아야한다. 이떄는 List() 대신에 listResults()를 사용한다. SearchResults<Item> result = query.from(item) .where(item.price.gt(10000)) .offset(10).limit(20) .listResults(item); long total = result.getTotal(); long limit = result.getLimit(); long offset = result.getOffset(); List<Item> results = result.getResu

(QueryDSL) where 에서 사용하는 메소드

item.price.between(1000, 2000); item.price.contains("상품1"); item.price.startsWith("고급")

(트러블 슈팅) 데이터 불일치 문제 Null Pointer Exception 발생

* 이 상황은 설문No를 포함하고 있지만 해당 설문에 해당하는 List자료형을 갖지 않는 데이터 불일치문제이다. 이러한 문제는 누군가 수동으로 데이터를 조작하지 않는 한 발생하지만 않지만 혹시 모를 상황을 위해 안전코드를 만든다. 예) (poll.getNo() !=null && ValidationUtil.isNotEmpty(poll.getList())) { }

(트러블 슈팅) 이미지 Url 저장시 캐쉬문제

* 해당상황은 애플리케이션 단에서 이미지 서버에 이미지를 등록하고 이미지URL만을 받아오는 상황이다. 문제는 이미지 서버가 캐쉬되어있고 최근 이미지를 삭제하고 새로운 이미지를 등록하게 되면 삭제된 이미지가 화면에 보여지고 있다는 것이다. 이에 DB에 이미지 URL + 타임스탬프 값을 포함시켜 저장하여 위 트러블 슈팅을 해결

(자바8) 쇼트서킷 평가

떄로는 전체 스트림을 평가하지 않더라도 결과를 반환할 수 있다. 예를들어, 여러 and 연산으로 연결된 커다란 불린 표현식을 평가한다고 가정하자. 표현식에서 하나라도 거짓이라는 결과가 나오면 나머지 표현식의 결과와 상관없이 전체 결과도 거짓이 된다. 이러한 상황을 쇼트서킷 이라고 부른다. allMatch, noneMatch, findFirst, findAny 등의 연산은 모든 스트림을 처리하지 않고도 결과를 반환할 수 있다. limit도 쇼트 서킷이다.