나른한 일요일

짜리몽땅개발자·2021년 10월 24일
0

충분한 잠

어제 충분한 잠을 잤음에도 불구하고 나른함을 느끼는건 뭔가 몸이 이상하다는 증후이다. 그래서 약을 먹고 자고 다시 체력을 보충하고 다시 일어나서 앉아서 동강을 듣는데 계속 몸은 이상하다. 그리고 입맛또한 없다. 그래도 뭔가 신선한걸 먹어야 겠다는 생각에 피자를 한판 시켜서 반을 먹으니 이제 좀 정신이 들은거 같은데 그래도 좀 찝찝하다.

정신차리기

다시금 정신을 차리기 위해 좀 누워서 유튜브를 보다가 공기가 찬거 같아 히터를 틀고, 이렇게 앉아서 글을 몇자 적어 본다. 인간은 어떻게 될지 모르기 때문에 매 순간순간을 소중하게 보내야 한다. 그렇기 때문에 지금 살아 있는 삶에 대해서 감사하게 생각하며 살아 가야 한다.
뭔가 속았다는 느낌이 들긴 했지만 그래도 함께 보낸 시간이 있어 그리움이 밀려오는 것은 사실이다. 같이 있으면 힘이 되고 갈라서면 적이 되는 이 세상은 냉정하다. 그래서 애초부터 너무 친하게 지내면 나중에 원수가 되기 때문에 그냥 어중간한 간격으로 지내는게 옳다.

다가올 겨울에 대한 준비

이제 곧 겨울이 온다. 겨울에는 뭔가 해야 하는데 계속 이렇게 축 쳐지고 하루하루가 왜케 귀찮고 나태해지는지 모르겠다. 요행을 바라는 것인가? 너무 편해서 그런가? 그래서 더더욱 냉정하게 나에게 잣대를 들이 될려고 노력한다. 그 잣대라는 것은 공부를 강제로 프론트, 백앤드, DB까지 누가 시키지 않아도 해보고 짜보고 쳐보고 디버깅 해보고 하는 것이다. 스스로 뭔가를 한다는 것에 의의를 둬야 하기 때문에 더욱더 강력하게 평가하고 검증 하는 것 같다.

jpa 비즈니스 로직

도메인 모델 패턴

  • 도메인쪽에 비즈니스 로직을 때려 박는 것
  • 장점: 서비스에서 그냥 호출해서 쓰면 끝 이라 도메인만 나중에 확인 하면 됨.
  • 단점: ?

트랜잭션 스크립트 패턴

  • 업무가 복잡해 지면 어쩔 수 없이 넣을 수밖에 없는 경우가 있다고 함.
  • 위 케이스는 아마도 퍼시스턴스가 DB 뿐만 아니라 큐나 메모리 같은 것을 동기화 하거나 할때 일어나지 않을까 생각해 본다.

jpa 동적쿼리 구현

  • 문자열을 연결해서 쿼리를 만든다.
  public List<Order> findAllByString(OrderSearch orderSearch) {

        // 동적쿼리 지옥이 시작된다.

        // 실무에서는 아래와 같이 절대 하지 않는다.
        // 문자더하기를 하면 개발하기 힘들어 진다. 버그가 생길 우려가 있다.
        String jpql = "select o from Order o join o.member m";
        boolean isFirstCondition = true;
        // 주문상태 검색
        if (orderSearch.getOrderStatus() != null) {
            if (isFirstCondition) {
                jpql += " where";
                isFirstCondition = false;
            } else {
                jpql += " and";
            }
        }
        jpql += " o.status = :status";

        // 회원 이름 검색
        if (StringUtils.hasText(orderSearch.getMemberName())) {
            if (isFirstCondition) {
                jpql += " where";
                isFirstCondition = false;
            } else {
                jpql += " and ";
            }
            jpql += " m.name like :name";
        }

        TypedQuery<Order> query = em.createQuery(jpql, Order.class)
                .setMaxResults(1000);// 최대 1000건

        if (orderSearch.getOrderStatus() != null) {
            query = query.setParameter("status", orderSearch.getOrderStatus());
        }
        if (StringUtils.hasText(orderSearch.getMemberName())) {
            query = query.setParameter("name", orderSearch.getMemberName());
        }

        return query.getResultList();
    }
  • criteria 를 이용한 동적쿼리 구현
    public List<Order> findAllByCriteria(OrderSearch orderSearch) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Order> cq = cb.createQuery(Order.class);
        Root<Order> o = cq.from(Order.class);
        Join<Object, Object> m = o.join("member", JoinType.INNER);

        List<Predicate> criteria = new ArrayList<>();

        // 주문상태 검색
        if (orderSearch.getOrderStatus() != null) {
            Predicate status = cb.equal(o.get("status"), orderSearch.getOrderStatus());
            criteria.add(status);
        }
        // 회원 이름 검색
        if (StringUtils.hasText(orderSearch.getMemberName())) {
            Predicate name = cb.like(m.get("name"), "%" + orderSearch.getMemberName() + "%");
            criteria.add(name);
        }

        cq.where(cb.and(criteria.toArray(new Predicate[criteria.size()])));
        TypedQuery<Order> query = em.createQuery(cq).setMaxResults(1000);

        return query.getResultList();
    }

무엇을 하든 결과는 그리 이쁘지 않다. 그래서 끝판왕은 querydsl 이라고 하는데 난 이미 배웠지만 또 어떻게 설명하나 보자 라는 식으로 다시금 보고 있다.
아직으 설명은 안해주고, 화면 붙이는 것부터 해줄려고 한다. 그래도 나름 체계적으로 알려줄려고 노력하는 모습이 아름답다.

느낀점

동강을 보면서 참 쉽게 잘 설명한다. 김영한이라는 사람은 뭔가 사람을 홀리게 하는 그런 능력이 있는 것 같다. 계속 꼬시는데 꼬임에 넘어갈것 같은 느낌이 종종 든다.
그래도 꿋꿋하게 안넘어가고 버틸려고 노력했다. 동강을 켜 놓고 타자를 똑같이 치는데도 tdd를 해보면 계속 오류가 난다. 그만큼 나에게는 좋은 기회다. 디버깅을 할 수 있는 기회 말이다.
그래서 너무 기분이 좋다. 고쳐서 성공하면 그 쾌감은 말로 표현하기 힘들다.

profile
시간은 돈과 바꿀 수 있다.

0개의 댓글