안녕하세요. 오늘은 MyBatis에서 여러건의 Record를 삽입하기 위해서 쓸 수 있는 태그에 대해 공유하고자 합니다. 우선 insert 쿼리문을 보면 INSERT INTO ROOM(type, deal_type, status) VALUES ('원룸', '월세', '광고중'); 이런 형태로 native 쿼리를 작성해야 할텐데요. JPA 처럼 saveAll() 기능을 제공하게 된다면 매우 편하게 삽입작업을 할 수 있겠지만 MyBatis는 쿼리문을 직접 작성하기 때문에 List의 갯수만큼 insert mapper를 호출하거나 해야했을 것입니다.(이렇게 썻다면 정말 안타까운 상황이네요ㅠㅠ) 예컨데 v1 public class Service { public void addRoom(String type, Stri..
native 쿼리를 직접 작성하는 JDBCTemplate이나 MyBatis 같은 기술은 항상 쿼리문을 직접 관리해야한다는 안좋은 단점이 있다. 물론 특정 DBMS에 맞는 native Query를 직접 작성하는 이점으로 각 쿼리마다 최적화할 수 있다는 장점이 있지만 한두개정도이지 임계점이 넘어가게되면 부담이 될 수밖에 없다. 그 중에서 중복으로 사용되는 조건이나 복잡한 다이나믹 쿼리 조건이 여러 쿼리에서 동시에 사용해야될 경우 xml 쿼리 파일의 용량은 그 배수만큼 커질 것이다. (예를 들어, 페이징의 경우 where절 로직은 메인 Select 문과 count 문의 조건이 limit offset을 제외하고 동일해야한다.) 뭐 예를 들면, 아래와 같다. 다방에서 매물 목록을 조회하는 페이징 API를 호출한다..
지난 포스팅 : https://sas-study.tistory.com/415 지난번 포스팅에 이어서 AttributeConverter를 좀더 응용해서 개발하는 방법을 공유하고자 합니다. 우선 지난번 포스팅에서는 Entity 클래스에 선언된 Enum 타입의 갯수마다 AttributeConverter를 구현하여 각각 XXConverter 클래스를 생성하고 관리해주어야하는 단점이 존재했습니다. 우선 그 점에 있어서는 Entity 클래스의 멤버로 활용중인 Enum 타입을 하나로 묶을 상위 인터페이스가 필요하다고 생각했습니다. 코드로 보여드리자면 public interface EntityEnumerable { String getType(); String getName(); } public enum StudyTyp..
예전에 프로젝트를 했을 때, JPA에 String 클래스 타입으로 enum의 값을 넣었던것 같다. 코드로 예를 들면, // JPA Entity 클래스 ... @Entity public class Study { ... @Column(name = "study_type") private String studyType; } // StudyType Enum public enum StudyType { ONLINE("ONLINE", "온라인"), OFFLINE("OFFLINE", "오프라인"); private String type; private String name; // + type getter // + name getter } // Entity를 영속화하는 서비스 로직 public class StudyServi..
안녕하세요. 오늘은 BooleanExpression을 통해서 QueryDSL Repository의 표현을 좀더 직관적으로 볼 수 있도록 리팩토링하는 과정을 소개해보고자 합니다. 사실 이부분에 대해서는 그동안 BooleanBuilder라는 객체를 활용해서 where 절에 들어올 쿼리문을 생성했는데요. 여러 if절에 의해 다음과 같이 쿼리의 형태를 전혀 예상할 수 없을 정도로 바뀌었습니다. BooleanBuilder를 활용한 repository 메소드public List findLiveStudyBySearch(String title, Integer bigCity, Integer smallCity) { BooleanBuilder builder = new BooleanBuilder(); if (StringUti..
안녕하세요. 오늘은 Spring Data JPA를 활용할때 기본 Insert로 사용하는 save 기능과 saveAll 기능에 대한 성능 실험을 해보려고 합니다. Spring Data JPA의 경우 Bulk Insert의 경우 많은 성능 이슈를 발생시켜서 JPA로 bulk Insert를 하는 것을 권장하지는 않은 것으로 알려져 있는 것으로 알고 있습니다. 하지만 어느정도 로직이 있다면 이를 해소해볼 수 있을까? 하는 생각에 재미삼아 해보았으니 결과만 즐겨보시기 바랍니다. 어플리케이션과 서버의 스펙에 따라 차이가 발생할 수 있으니 제 스펙을 적어보겠습니다. 실험 스펙- LG 그램 17 2019년형- intel cpu i7 8세대- Ram 16GB- Spring Boot 2.3 버전, Maven- Starte..
안녕하세요. 오늘은 MyBatis에서 choose 절을 활용한 동적쿼리를 만드는 방법들에 대해서 소개해보려고 합니다. 보통 특정 조건에 따라 쿼리의 형태가 다이나믹해지도록 구성하기 위한 방법으로 많이 사용되는 절입니다. 사용되는 xml 태그는 ,, 세가지 종류입니다. 하나씩 살펴보겠습니다. 구조 및 사용법select * from tableA where deleted = false and a = 1 and a = 2 and a is not null 전체 choose 조건문의 범위를 결정하는 태그를 시작으로 의 test 속성을 통해 조건을 건다.a 라는 변수는 자바 Interface Mapper에서 넘어온 파라미터를 그대로 사용할 수 있다. 태그는 "그 외에는" 이라는 느낌인데, 때로는 default의 의미..
안녕하세요. 오늘은 마이바티스를 활용하여 간단한 단일 조건문을 구성하는 방법을 소개하겠습니다. 이전에 포스팅했던 choose, when, otherwise를 구성하여 복합적으로 작용하는 dynamic sql을 구현하는 방법을 작성했었는데요.sas-study.tistory.com/383 절은 상당히 간단하면서도 절과 거의 똑!같!이! 사용된다고 보시면 됩니다. 일단 보시죠! 구조 및 사용법select * from tableA where deleted = false and a = #{a} and b = #{b} 일단 가장 일반적으로 활용하는 경우는 select 문의 where 절의 조건으로 넘어온 파라미터의 not null 여부에 따라서 조회 조건에 추가할 지 말지를 결정하는 경우가 있다. 예컨데 리스트 검..