앙앙이
2k
2018-07-11 23:31:24 작성 2018-07-11 23:46:32 수정됨
5
590

mybatis 에서 jooq 변경후 사용후기


 개인적으로 DB 를 잘하지 못합니다.


서버쪽에서 DB 를 다룰때 mybatis 를 사용하다가 

servlet 처럼 동적 클래스로 서버 비지니스 로직을 다루다 보니

동적 클래스는 순수 jdbc 가 가장 궁합이 좋다는 결론에 도달하게 되어

jooq 로 변경하였습니다.

mybatis 같은 경우 설정파일 변경시 재 로드하는 문제가 어려웠었는데

그런거 없으니 좋네요.


jooq 물론 제약 사항이 있지만 이거 물건이네요.

DB 를 잘 모르기때문에 설계 변경을 자주합니다.

테이블 변경할때 마다 mybatis 는 정말로 피곤 그 자체였습니다.

반면에 jooq 는 잦은 테이블 변경에도 어디 어디 고쳐야 하는지 즉각적으로 알수 있어 좋네요.


mysql 사용시 쿼리문을 설정 파일로 넣다 보니

작성할때는 쉽지만 시간이 지난후에는 쿼리문 찾기 3만리이고

설정문에 넣어둔 쿼리문이 이곳 저곳에서 사용되어질 수 있어

사용되는곳을 파악하는데 시간이 너무 걸리는 부작용이 있어

결국 전체적으로 코드 읽기와 수정이 힘들어 졌습니다.


jooq 는 sql 쿼리문 원형이 보존되어 있으니 기본 mysql 소스 보다 훨씬 수월하게 읽혀지고

수정도 쉽게 할 수 있어 좋네요.


jooq 단점이라면 순수 jdbc 단점을 그대로 물려받아 코드양이 많습니다.

그리고 jooq 학습 시간이 필요합니다.

DB 설계가 자주 변경되는 곳이라면 mybatis 보다 충분히 사용할 가치가 있다고 생각합니다.

0
0
  • 댓글 5

  • 방황하는젊은이
    708
    2018-07-12 19:50:12 작성 2018-07-12 19:50:46 수정됨


    @Repository
    @Transactional(readOnly = true)
    public class CustomerRepository {
    
      private final DSLContext dslContext;
    
      public CustomerRepository(DSLContext dslContext) {
        this.dslContext = dslContext;
      }
    
      @Transactional
      public void save(String name, String email) {
        this.dslContext.insertInto(Customer.CUSTOMER)
          .columns(Customer.CUSTOMER.NAME, Customer.CUSTOMER.EMAIL)
          .values(name, email).execute();
      }
    
      public Optional<CustomerDTO> findOne(Integer seq) {
        final Map<Record, Result<Record>> recordResultMap = this.dslContext.select().from(Customer.CUSTOMER)
          .leftJoin(Product.PRODUCT)
          .on(Customer.CUSTOMER.ID.eq(Product.PRODUCT.CUSTOMER_ID))
          .where(Customer.CUSTOMER.ID.eq(seq))
          .fetch()
          .intoGroups(Customer.CUSTOMER.fields());
        return getCollect(recordResultMap).findFirst();
      }
    
      private Stream<CustomerDTO> getCollect(Map<Record, Result<Record>> recordResultMap) {
        return recordResultMap
          .values()
          .stream()
          .map(records -> {
            final Record3<Integer, String, String> record3 = records.into(Customer.CUSTOMER.ID, Customer.CUSTOMER.NAME, Customer.CUSTOMER.EMAIL).get(0);
            final Integer customerId = record3.value1();
            final String name = record3.value2();
            final String email = record3.value3();
            List<ProductDTO> products = records.sortAsc(Customer.CUSTOMER.ID).into(ProductDTO.class)
              .stream()
              .filter(productDTO -> productDTO.getId() != null)
              .collect(toList());
            return new CustomerDTO(customerId, name, email, products);
          });
      }

    SQL 을 잘 모른다면 쓸만할것 같긴한데... 그래도 저는 MYBATIS 가 더 난거 같다는 생각이 듭니다...

    결국 SQL 이 수정되어야 한다면 JAVA 코드가 수정되어야 하는 단점이 가장 큰 단점 같네요.


    원문 : http://wonwoo.ml/index.php/post/1632

    0
  • 앙앙이
    2k
    2018-07-12 20:28:41

    // 방황하는젊은이

      mybatis 에서 java 코드 수정 없이 SQL 문 수정만 해서 끝나는 경우가 있긴 합니다.

    하지만 mybatis 라도 SQL 문 수정시 java 코드 수정해야 하는 경우가 있습니다.


      저의 경우 mybatis 에 대한 이해도가 떨어져서 그런지

    SQL 문 수정할때 대부분의 경우 java 코드도 같이 수정해야 했습니다.


    mybatis 에서 SQL 문 수정할때 java 코드도 같이 수정하는 경우는 상황에 따라 달라지는거라

    그거 가지고 jooq 보다 myabtis 가 더 좋다고 다시 mybatis 로 돌아갈 매력으로는 충분하지 않습니다.

    0
  • 앙앙이
    2k
    2018-07-12 20:47:20

    // 방황하는젊은이

    mybatis 에서는 hash 로도 vo 로도 매핑할 수 있는데요.

    저 같은 경우 vo 광신도 인지라 vo 로 했는데요.

    vo 변경시 mybatis 설정 파일은 무엇이 잘못되었는지 알려주지 않습니다.

    이건 마치 순수 jdbc 에서 테이블 변경할때 마주치는 그런 좌절감입니다.


    VO 광신도 입장에서 IDE 는 VO 를 지지해 주는 강력한 도구입니다.


    mybatis 같은 경우 VO 변경시 어떤 문제가 있는지 알수 있게 해주는 IDE 와 같은 어떠한 도구가 없다면 참 어렵습니다.


    0
  • 방황하는젊은이
    708
    2018-07-17 15:52:42

    앙앙이 / 판단의 기준은 개인의 몫이 되면 될듯합니다. VO 보다는 DTO 가 의미적으론 더 맞는 표현일꺼 같습니다.

    님께서 mybatis 를 사용안하셔도 저랑은 관계없습니다. 전 그저 제 기준으로 본 점을 말씀드렸을 뿐이니까요.

    jooq 든 jpa 든 hibernate 든.. 프로젝트 성향에 맞게 쓰면 그만이지 뭐가 정답이다 란게 있을까요 ??



    1
  • 앙앙이
    2k
    2018-07-17 20:05:14

    // 방황하는젊은이

      정답이 없다는 말씀에 공감을 합니다.


    jooq 예쁘게 봐주세요 ^^


    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.