logo
logo
백엔드
MyBatis
마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
StackOverflow 질문 수: 3447
Github Stars : ★ 20018
사용 기업
여행
푸드테크
이커머스
기타
인공지능
부동산/인테리어
헬스케어
종합
금융/보험
모빌리티
직장
소셜/컨텐츠
techstack-logo
마이리얼트립
techstack-logo
야놀자
techstack-logo
우아한형제들
techstack-logo
11번가
techstack-logo
엠큐닉
techstack-logo
모노리스
techstack-logo
샤플
techstack-logo
중고나라
techstack-logo
모토브
techstack-logo
직방
techstack-logo
마이지놈박스
techstack-logo
SK플래닛
techstack-logo
티웨이브
techstack-logo
하나투어
techstack-logo
진모빌리티
techstack-logo
사람인에이치알
techstack-logo
에임메드
techstack-logo
SK텔레콤
더 보기
기술 블로그 글
SK텔레콤
[SpringBatch 연재 07] MyBatisPagingItemReader로 DB내용을 읽고, MyBatisItemWriter로 DB에 쓰기
여전히 Spring Java 기반의 프로젝트에서 많이 사용하고 있는 ORM(?) 툴중의 하나는 MyBatis이다.직관적인 사용법과, 쿼리를 mapper 파일에 직접 기술하고, 이를 DB Tool을 통해 수행할 수 있는 장점이 있는 도구라서 여전히 인기가 있는것 같다.MyBatis를 Spring Batch에서 사용하는 방법을 알아보자.MyBatisPagingItemReader Spring Mybatis에서 제공하는 ItemReader 인터페이스를 구현하는 클래스이다.MyBatis의 Object Relation Mapper를 이용하며 다음과 같은 특징을 가지고 있다.• None 간편한 설정: MyBatis 쿼리 매퍼를 직접 활용하여 데이터를 읽을 수 있어 설정이 간편하다.• None 쿼리 최적화: MyBatis의 다양한 기능을 활용하여 최적화된 쿼리를 작성할 수 있다.• None 동적 쿼리 지원: 런타임 시 조건에 따라 동적으로 쿼리를 생성할 수 있다.• None MyBatis 의존성: MyBatis 라이브러리에 의존해야 한다.• None 커스터마이징 복잡: Chunk-oriented Processing 방식과 비교했을 때 커스터마이징이 더 복잡할 수 있다.• None SqlSessionFactory: MyBatis 설정 정보 및 SQL 쿼리 매퍼 정보를 담고 있는 객체이다.• None QueryId: 데이터를 읽을 MyBatis 쿼리 ID이다.• None PageSize: 페이징 쿼리를 위한 페이지 크기를 지정한다.• None MyBatisPagingItemReader SqlSessionFactory 객체를 통해 MyBatis와 연동된다.• None SqlSessionFactory는 다음과 같은 방법으로 설정할 수 있다.• None @Bean 어노테이션을 사용하여 직접 생성• None MyBatisPagingItemReader setQueryId() 메소드를 통해 데이터를 읽을 MyBatis 쿼리 ID를 설정한다.• None 쿼리 ID는 com.example.mapper.CustomerMapper.selectCustomers 와 같은 형식으로 지정된다.• None MyBatisItemReader는 pageSize를 이용하여 offset, limit 을 이용하는 기준을 설정할 수 있다.• None SkippableItemReader: 오류 발생 시 해당 Item을 건너뛸 수 있도록 한다.• None ReadListener: 읽기 시작, 종료, 오류 발생 등의 이벤트를 처리할 수 있도록 한다.• None SaveStateCallback: 잡의 중단 시 현재 상태를 저장하여 재시작 시 이어서 처리할 수 있도록 한다.• None MyBatisPagingItemReader 를 이용하여 DB 쿼리 결과를 읽을 수 있도록 ItemReader를 반환한다.• None pageSize: 페이징 단위를 지정한다.• None parameterValues: 파라미터를 전달할 수 있다.• None customer.xml 파일을 지정하고 다음과 같이 쿼리를 작성한다
java
mybatis
spring
SK텔레콤
[SpringBatch 연재 03] SpringBatch ChunkModel과 TaskletModel
이번에는 Spring Batch의 Chunk Model과 Tasklet Model에 대해서 알아볼 것입니다.• None Chunk Model은 처리할 데이터를 일정단위(청크) 로 처리하는 방식이다.• None ChunkOrientedTasklet 은 청크 처리를 지원하는 Tasklet의 구체적인 클래스 역할을 수행한다.• None 청크에 포함될 데이터의 최대 레코드 수(청크 Size), 는 본 클래스의 commit-interval이라는 설정값을 이용하여 조정이 가능하다.• None ItemReader, ItemProcessor, ItemWriter 는 청크 단위를 처리하기 위한 인터페이스이다.• None 위 시퀀스 다이어그램과 같이 ChunkOrientedTasklet 은 ItemReader, ItemProcessor, ItemWriter 구현체를 각각 호출한다.• None 이때 ChunkOrientedTasklet 은 청크 단위에 따라 ItemReader, ItemProcessor, ItemWriter 를 반복실행한다.• None 청크 크기만큼 ItemReader가 데이터를 읽어 들인다.• None 청크 단위를 ItemProcessor로 전달하고, 데이터를 처리한다.• None ItemProcessor를 처리하고난 청크 단위가 ItemWriter로 전달되어 데이터를 저장하거나, 파일처리를 수행한다.• None ItemProcessor은 구체적인 구현체를 구현하여 스프링배치에 전달한다.• None ItemProcessor은 Reader로 읽어들인 청크 데이터들을 처리한다. 처리라고 하면, 데이터를 변환하거나, 데이터에 변경 혹은 외부 인터페이스 호출등을 수행하는 역할을 한다.• None ItemProcessor은 chunk model에서 없어도 되는 옵션이다.• None (1): ItemProcessor 인터페이스를 구현하게 된다. 이때 입력, 출력 데이터 타입을 제네릭 타입으로 받는다.• None (2): process메소드 구현체를 구현하며, 입력 아규먼트로 받아 들인다.• None (3): ItemProcessor 처리 결과로 반환할 출력 객체를 생성한다. 즉, 변환된 데이터 등이 올 수 있다.• None ItemReader는 직접 커스텀 구현을 할 수 있지만 스프링배치에서는 이미 구현된 다양한 ItemReader구현체를 제공한다.• None• None 플랫파일 (즉 구조화 되지 않은파일을 플랫파일이라고한다.)을 읽어 들인다.• None 대표적인 것이 CSV파일 등이 있다.• None 읽어들인 데이터를 객체로 매핑하기 위해서 delimeter를 기준으로 매핑 룰을 이용하여 객체로 매핑한다.• None 혹은 입력에 대해서 Resource object를 이용하여 커스텀하게 매핑할 수도 있다.• None• None 이름이 함축하듯이 XML파일을 StAX기반으로 읽어 들인다.• None• None JDBC를 사용하여 SQL을 실행하고 데이터베이스의 레코드를 읽는다.• None 데이터베이스에서 많은 양의 데이터를 처리해야 하는 경우에는 메모
java
mybatis
spring
CJ올리브네트웍스
[신입사원 OJT] JDBC, MyBatis부터 JPA까지
​안녕하세요. Devops팀 twoAnother입니다.   저는 입사 후에 OJT 과제로 "System View를 통한 대시보드"를 개발했는데요. Java와 Spring Boot를 기술 스택으로 가져갔습니다. 그리고 데이터베이스와 연동하기 위해 저는 JPA + QueryDsl을 이용했습니다.  OJT를 진행하기 전에는 JPA 이론에 대해 공부하기로 마음만 여러번 다짐했었는데요. JPA는 자바 개발자에게는 꼭 끝내야하는 숙제라고 생각합니다. 개발을 하는데 있어서 비즈니스 로직을 처리하기 위해서는 Data를 꼭 사용해야하기 때문이죠!  이번 기회에 구성원 분들에게 제가 개발을 하며 공부했던 내용을 공유해보려고 합니다. 부족하지만 구성원 모두의 학습에 꼭 도움이 됐으면 좋겠습니다.# Layered Architecture(N-tier) ## 4-tier Architecture계층화된 아키텍처에는 표준이 존재합니다.   • Presentation Layer    ◦ 표현 계층(UI)• Business Layer    ◦ Domain 계층    ◦ 비즈니스 로직을 수행하는 Layer• Persistence Layer    ◦ 데이터베이스에 접근하는 계층    ◦ API를 통해 Database Layer와 통신하고 SQL Query 문으로 데이터를 가져오고 데이터를 처리하는 계층    ◦ Business 요청에서 수행하는 작업을 통하여 Database에 저장하거나 갱신 삭제를 하는 계층• Database Layer   보통은 단순하다면 3계층으로 나누게 되지만, 아래 구조와 같이 때에 따라 더 복잡하게 나누는 예도 있습니다.  위 구조는 Service와 Domain 계층을 별개로 분리하는 경우입니다. 여기서 우리가 집중해야 하는 부분은 Persistence 부분이 되겠습니다. 그 이유는 예를 들어 민수가 프로그램을 실행하고 열심히 작업한 뒤에 프로그램을 종료했습니다. 다음날 민수는 이어서 작업을 하려고 다시 프로그램을 실행시켰는데, 어제 작업을 했던 모든 내용이 날아간 것입니다. 이 경우가 바로 영속성을 보장하지 못한 경우입니다.   프로그램이 종료되더라도 데이터의 영속을 보장하는 것이 바로 Persistence(영속성)입니다.   Java Application에서는 JDBC, SQL Mapper, ORM을 통해 영속성을 보장할 수 있는데요. 그러면 이러한 방법들을 간략하게 살펴볼까요?  ※참고그리고 여기서 설명하는 Layered Architecture는 어떻게 infrastructure가 동작하는지에 관한 내용입니다.즉 네트워크 OSI 7계층으로 분리해 놓은 것과 같은 개념이라고 이해하면 됩니다. 반면에 MVC패턴, MVVM 패턴과 같이 어떻게 코드가 디자인(앱을 어떤 식으로 분리하여 역할을 수행할지 + 각 객체가 상호작용하는 구조(선형적인 구조x)) 되는지와 별개의 문제이기 때문에 헷갈리시면 안 됩니다.  # JDBCJDBC(Java Database Connectivity)는 Java API로 데이터베이스의 연결과 쿼리 실행을 해줍니다. JDB
hibernate
java
mybatis
네이버
분산 데이터베이스 환경에서 RoutingDataSource 사용 시 JTA를 이용한 트랜잭션 처리
트랜잭션은 모든 작업이 성공한 경우에만 작업이 커밋되어 데이터베이스에 반영되고, 하나의 작업이라도 도중에 실패하면 모든 작업을 롤백하는 'all or nothing'의 조건을 만족해야 합니다. 데이터베이스가 N대의 샤드로 구성된 웹 서비스 환경에서 스프링 프레임워크의 AbstractRoutingDataSource를 이용하여 데이터소스를 구성하고 트랜잭션을 처리하는 과정에서 발생한 이슈와 해결 경험을 공유합니다. 이 글은 데이터소스 라우팅보다는 분산 데이터베이스 환경에서의 트랜잭션 처리 방법에 대한 내용을 중점적으로 다루므로 스프링 프레임워크의 AbstractRoutingDataSource 적용에 대한 사전 지식은 다음 문서를 참고해 주시기 바랍니다. * Spring + MyBatis 에서 여러 개의 DataSource Routing 하는 방법 * SpringFramework AbstractRoutingDataSource 개발 환경 JAVA 애플리케이션 개발 환경 * Java 1.8 * Apache Maven 3.5.4 MAVEN 의존성 * spring-boot-starter: 2.0.4.RELEASE * spring-boot-starter-aop: 2.0.4.RELEASE * spring-boot-starter-jta-atomikos: 2.0.4.RELEASE * mybatis-spring-boot-starter: 1.3.2 데이터베이스 구성(MYSQL: 5.6.17) * 4대의 userDB * 1대의 commonDB 그림 1 애플리케이션의 데이터베이스 구성 코드 구성 RoutingDataSource와 AOP 설정에 대한 Java Config 구성 예는 JTA sample에서 확인할 수 있다. 비즈니스 로직 요구 사항 * FooService.class에는 bar(String userId) 메서드가 있다. * bar(String userId)에서는 userMapper.insert(String userId), commonMapper.insert(String userId)를 순차적으로 호출한다. * userMapper.insert(String userId)는 userId에 따라서 라우팅되어 선택된 데이터베이스(4대의 userDB 중 1대)의 user_test 테이블에 데이터를 저장한다. * commonMapper.insert(String userId)는 commonDB의 common_test 테이블에 데이터를 저장한다. * 트랜잭션을 활성화한 구성(@EnableTransactionManagement)에서 userMapper.insert(String userId), commonMapper.insert(String userId) 작업 중 어느 하나라도 실패하는 경우 모두 롤백되어야 한다. FOOSERVICE.CLASS 기본 설정 기본 설정은 트랜잭션 경계 설정이 없는 상태이다. @Service public class FooService { @Autowired private UserMapper userMapper; @Autowired private
java
mybatis
spring
연관 기술 스택
techstack-logo
Hibernate
Copyright © 2025. Codenary All Rights Reserved.