본문 바로가기

mybatis6

mybatis - ResultMap Collection을 통해 데이터 한번에 가져오기 프로젝트를 진행하던 중 member의 정보와 member가 작성한 article의 리스트, member가 속해 있는 group의 리스트를 가져와야 하는 기능을 구현해야 했다. member와 article와 group는 각각 테이블이고 member와 article는 일대다 관계, member와 group는 다대다 관계이며 중간에 member_group이라는 연결 테이블이 존재한다. member 정보 따로, article 리스트 따로, group 리스트 따로 구현하면 3번의 db접근이 일어난다. 그리고 설계를 잘못하면 N+1문제가 발생할 수 있다. 나는 이를 1번의 DB접근으로 표현하고 싶다. JPA에서는 fetch join 혹은 eager 한 방식으로 데이터를 가져오거나 배치사이즈를 조정하여 문제를 해결할.. 2023. 6. 18.
mybatis - insert 후 해당 객체의 바로 PrimaryKey 얻기 mybatis를 진행하면서 객체를 데이터베이스에 저장하는 메서드를 실행 후 데이터베이스 상의 primaryKey가 바로 필요한 경우가 있다. mybatis에서는 insert, delete, update 후 int 값을 리턴하는데 이 값은 얼마나 insert, delete, update 한 지를 알려주는 count 값이다. insert 한 후 id를 얻기 위해서 select 메서드를 실행해야 하는가? 이는 데이터베이스에 한번 접근할 것을 두번이나 접근해야 하므로 좋지 않다. 그렇다면 어떻게 해야하는가? 방법은 xml파일을 활용하는 것이다. 아래의 예시를 보자. INSERT INTO article( content, latitude, longitude, public_map, private_map, title,.. 2023. 4. 16.
springboot with mybatis - foreign key로 연결된 행 삭제 이 글은 JPA로만 프로젝트를 진행하다가 mybatis를 사용할 때 발생하는 문제중 고아객체에 관한 내용을 담고 있다. 저번 프로젝트에서 스프링부트와 JPA로 진행을 하였는데 delete 쿼리를 날릴 때 고려한 것은 고아객체였다. 외래키로 연관관계에 있는 두 엔티티 부모를 삭제하면 부모의 외래키를 가지고 있는 자식은 어떻게 되는가? 에 대한 내용이 고아객체 내용이다. JPA에서는 부모객체가 삭제되어 없는 상황일 때 자식객체를 고아객체로 표현하였고 이를 객체 내의 어노테이션을 달아서 해결했었다. 그렇다면 Mybayis에서 어떻게 해결할까? 처음에는 고아객체가 데이터베이스 전체에서 쓰이는 말인줄 알았지만 알고보니 JPA에서만 사용되는 말이었다. 그렇기에 Mybatis 고아객체라고 검색을 해도 인터넷에는 나오.. 2023. 4. 9.
springboot with mybatis - test 설정(인메모리 db: h2) springboot로 mybatis를 이용하여 실제 데이터를 기반으로test를 진행하고 있었다. 하지만 실제데이터로 진행하면 그때그때마다 상황이 달라지기 때문에 테스트 코드가 무조건 성공할 수는 없다. 그렇기에 테스트가 실행될 동안만 필요한 DB를 구현해야 했다. 바로 인메모리 DB를 말이다. 현 상황은 springboot로 mybatis를 사용중이고 flyway를 통해 DB마이그레이션을 하고 있다. Repository 테스트 코드를 작성하기 위해 인메모리 DB인 h2를 사용하려고 한다. 테스트 코드 내의 resources는 아래와 같다. application.yml의 내용은 아래와 같다. spring: datasource: driverClassName: org.h2.Driver password: pas.. 2023. 4. 5.
sprintboot with mybatis - 캐시 및 readonly 적용 평소에 JPA를 통해서만 프로젝트를 진행하였지만 mybatis도 다루고 싶엇기에 스프링부트와 mybatis를 통한 프로젝트를 진행하였고 repository구간을 작성하던 중에 문득 생각이 들었다. mybatis에서는 쿼리힌트로 readOnly옵션을 적용할 수 있는가? JPA를 사용할 때에는 쿼리힌트로 readOnly옵션을 줘가지고 메모리 성능향상을 이루었다. 이에 대해 궁금한 사항은 아래를 참고하길 바란다. https://khdscor.tistory.com/20 JPA 읽기전용으로 데이터를 조회하여 성능 향상(메모리, 속도) JPA를 사용하면서 영속성 컨텍스트에 엔티티를 넣으면서 1차 캐시 및 쓰기 지연 등 여러 가지 이점을 얻을 수 있었다. 여기서 조회기능만을 사용하는 상황에서는 단순히 읽기 전용 기능.. 2023. 3. 5.
스프링부트 MyBatis를 이용하여 MySQL 연동 및 동적쿼리 개발자들은 데이터 베이스에 데이터를 유지하기 위해 JDBC를 이용하여 데이터베이스에 접근하였다. JDBC의 복잡함을 단순하게 하게 위해 Persistence FrameWork를 사용했는데 ORM 프레임워크와 SQL 매퍼이다. ORM 프레임워크는 SQL 코드를 직접 작성하지 않고 자바에서 객체지향적인 방식으로 데이터를 객체로 다루면 이를 관계형 데이터베이스에서 작업할 때 SQL로 변환하여 연동을 할 수 있도록 하는 것이다. 즉 SQL을 직접 작성할 필요가 없는 것이다. 데이터베이스에 종속성이 약해서 바뀌더라도 바로바로 적용 가능하다. 대표적으로는 Hibernate가 있고 이에 대한 표준 기술 명세가 JPA이다. MyBatis는 ORM 프레임워크라고 말하지는 않고 SQL 매퍼라고 한다. 객체와 관계형 데이터.. 2022. 2. 25.