1. 일반적인 경우의 MyBatis Insert. 어떤 로직을 거쳐 생성된 객체 100만개를 DB에 insert 해야 하는 상황이다. private List getMemoList() { List list = new ArrayList(); // 100만번 loop를 돌아 100만개의 요소를 생성해 list에 add 한다. for (int i = 0; i < 1_000_000; i++) { MemoDTO memo = new MemoDTO(); memo.setMemberId(1); memo.setMemo("메모 테스트 입니다!메모 테스트 입니다!"); list.add(memo); } return list; } 위와 같이 MemoDTO 객체를 100만개 임의로 생성해서 List에 넣었다. 위 객체를 DB에 in..
보통은 Column 값에 따라 조회조건을 다르게 하려고 하면 UNION을 사용한다. 그러나 UNION을 사용하면, 컬럼별로 적용해야 하는 조회조건이 늘어날 수록, UNION 해야 하는 SELECT 쿼리의 갯수도 같이 늘어난다. 다른방법이 있는데 아래와 같이 and or 조건을 사용하는 것이다. - 주소가 서울인 레코드의 경우에만 20살 이상의 남성을 검색하고, 타 지역의 경우엔 전부 검색을 원할 때는? where (city = '서울' and age >= 20 and sex = 'man') OR (city != '서울') 이렇게 하면 각 조건마다 union 을 사용 한 것과 같은 효과를 낸다.
가장 최근 데이터를 조회 하려면? - select max(id), name, age from T1 group by name, age; 정답. 만약, group by에 빠진 컬럼이 있다면? - select max(id), name, age from T1 group by name; 이렇게 age가 group by 에서 빠지게 되면 이름과 age가 정상적으로 맵핑되지 않는다. case 1. 그럼 조인할 때는? select max(t1.id), t1.name, t2.address ... from t1 inner join t2 on t1.id = t2.id group by t1.name, t2.address .... 이렇게 컬럼 갯수가 많아지면, 조회하는 컬럼 전체를 group by로 지정하기 어려움. 그러면 이..
MyBatis 쿼리가 위와 같이 불편하게 출력되고 있습니다. 한줄짜리 쿼리로그는 ? 를 아래 Parameters 에 출력된 '메모(String)'로 수동으로 넣어서 쿼리를 조회하면 되겠지만, 쿼리가 100줄이상에 parameter가 10개 넘어가면 일일이 찾아 바꿔 조회하는 것도 번거롭습니다. 파라미터가 바인딩된 쿼리로 pretty 하게 출력되도록 설정해보겠습니다. 1. build.gradle에 log4jdbc dependency추가. /** for MyBatis Log Beautifier. using log4jdbc */ implementation('org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16') 2. main/resources/ 하위에 log4jdb..
https://www.jooq.org/doc/3.2/manual/sql-building/queryparts/pretty-printing/ Pretty printing SQL As mentioned in the previous chapter about SQL rendering, there are some elements in the org.jooq.RenderContext that are used for formatting / pretty-printing rendered SQL. In order to obtain pretty-printed SQL, just use the following custom settings: www.jooq.org Spring의 webConfig 클래스에 아래와 같이 Bean을 ..
아래 조인 조건을 보자. AS-WAS : 조인조건에서 ACCOUNT 테이블 조인 조건에서 OR을 사용하여 실행계획 cost가 매우 높게 나옴. AS-IS : select로 각각 분리하여 조인으로 변경. account 테이블 6000만건 이상 조회시. 5분 소요되는 것을 3초로 단축. index를 스캔하지 않던 조건을 index를 타도록 변경한 사례. 결과적으로 아래와 같은 쿼리로 실행.
테이블을 조회하다보면 한 컬럼에 두개 이상의 조건을 걸어야 할 때가 있습니다. 예를 들면 아래와 같습니다. ex) 구매일이 '2021-04-01' 이전과 이후 데이터를 모두 가지고 있는 회원 데이터를 조회 하려면? SELECT * FROM member_order m1 INNER JOIN member_order m2 ON m1.id = m2.id AND m1.buy_date > '2021-04-01' AND m2.buy_date
- 문제 상황이 발생했다. 어떤 데이터를 조회하는데 일부가 누락되어 조회되는 상황발생. - 어떤 select 쿼리에 아래와 같이 limit 100이 적용 되 있다. pageable이 null 일 경우 조회결과에 limit 100을 건다. limit가 없을 시 해당쿼리의 실행결과가 122건이라고 할 때, limit가 적용되 있으면 몇건을 반환할까? limit 100 이니까 당연히 100건인것 같지만, 현실은 24건을 반환한다. 원인은 result Map 이 적용되 있기 때문. resultMap이란 결과값을 map에다 담아주는 역할을 함. resultMap을 찾아가보자. 해당 resultMap의 안에서 collection 작업을 통해서 grouping 해주기 떄문에 100개의 row가 24개로 결과가 나오게..
java.sql.SQLSyntaxErrorException : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1. 이라는 에러가 났다. 로그를 보면. Mapper에서 실행된 SQL문은 문제가 없어 보인다. 문제가 없어보인다고?... 자세히 봐바... {#id} 가 아니라 #{id} 잖아.... .... 이 문제 때문에 1시간을 소비했다.. 이런저런 설정 변경하고 구글링 하고.. 로그를 천천히 보도록 하자...