
핵심 설정
권장
트래픽 패턴과 DB 자원에 맞춰 수치 튜닝
예시
spring:
datasource:
url: jdbc:mariadb://localhost:3306/app
driver-class-name: org.mariadb.jdbc.Driver
username: app
password: app
hikari:
maximum-pool-size: 10
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
예시
@Configuration
@MapperScan("com.example.project.mapper")
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource ds) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(ds);
org.apache.ibatis.session.Configuration conf =
new org.apache.ibatis.session.Configuration();
conf.setMapUnderscoreToCamelCase(true);
factory.setConfiguration(conf);
return factory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory f) {
return new SqlSessionTemplate(f);
}
}
예시
@Repository
public class UserQuery {
private final SqlSessionTemplate sql;
public UserQuery(SqlSessionTemplate sql) { this.sql = sql; }
public User findById(Long id) {
return sql.selectOne("UserMapper.findById", id);
}
}
mybatis:
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.example.project.domain
@SpringBootApplication
@MapperScan("com.example.project.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
예시
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock private UserMapper userMapper;
@InjectMocks private UserService userService;
@Test
void find_user() {
when(userMapper.findById(1L)).thenReturn(new User(1L, "u"));
User u = userService.find(1L);
assertEquals(1L, u.getId());
}
}
권장 조합
@SpringBootTest, @Transactional, @ActiveProfiles test, H2 인메모리
테스트 설정 예시
# application-test.yml
spring:
datasource:
url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
driver-class-name: org.h2.Driver
username: sa
password:
sql:
init:
mode: always
schema-locations: classpath:db/schema.sql
data-locations: classpath:db/data.sql
mybatis:
mapper-locations: classpath:mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true
통합 테스트 예시
@SpringBootTest
@ActiveProfiles("test")
@Transactional
class UserServiceIT {
@Autowired private UserService userService;
@Test
void create_and_find() {
Long id = userService.create(new UserCreate("name"));
assertNotNull(userService.find(id));
}
}
주요 속성
| 옵션 | 설명 |
|---|---|
| REQUIRED | 있으면 참여, 없으면 생성 |
| REQUIRES_NEW | 항상 새 트랜잭션, 기존은 중단 |
| SUPPORTS | 있으면 참여, 없으면 비트랜잭션 |
| NOT_SUPPORTED | 비트랜잭션으로 실행, 기존은 중단 |
| MANDATORY | 기존 트랜잭션 필수, 없으면 예외 |
| NEVER | 트랜잭션 금지, 있으면 예외 |
| NESTED | 내부 세이브포인트 기반 중첩 처리 |
@Transactional(rollbackFor = { Exception.class })
public void process() { ... }
주의 사항
@Transactional(readOnly = true)
public User find(Long id) { ... }
체크리스트