Skip to content

Commit cf74232

Browse files
authored
Feat: bulk create batch (#73)
1 parent 22283a8 commit cf74232

6 files changed

Lines changed: 38 additions & 5 deletions

File tree

com.bkmarriott.charge/src/main/java/com/bkmarriott/charge/application/outputport/RoomChargeOutputPort.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public interface RoomChargeOutputPort {
1818

1919
void bulkCreate(List<RoomChargeForCreate> roomChargeForCreateList);
2020

21+
void bulkCreateBatch(int batchSize, List<RoomChargeForCreate> roomChargeForCreateList);
22+
2123
RoomCharge updateCharge(RoomCharge roomCharge, Integer charge);
2224

2325
List<DefaultRoomCharge> findAllDefault();

com.bkmarriott.charge/src/main/java/com/bkmarriott/charge/application/service/RoomChargeService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,6 @@ public void createAllNextDefaultCharge() {
7676
.map(hotelType -> RoomChargeForCreate.of(hotelType.getHotelId(), hotelType.getRoomType(), date, roomChargeMap.get(hotelType.getRoomType())))
7777
.toList();
7878

79-
roomChargeOutputPort.bulkCreate(roomChargeForCreateList);
79+
roomChargeOutputPort.bulkCreateBatch(1000, roomChargeForCreateList);
8080
}
8181
}

com.bkmarriott.charge/src/main/java/com/bkmarriott/charge/infrastructure/persistence/adapter/RoomChargeAdapter.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import com.bkmarriott.charge.infrastructure.persistence.repository.DefaultRoomChargeRepository;
1212
import com.bkmarriott.charge.infrastructure.persistence.repository.RoomChargeRepository;
1313
import lombok.RequiredArgsConstructor;
14+
import org.springframework.jdbc.core.JdbcTemplate;
1415
import org.springframework.stereotype.Component;
16+
import org.springframework.transaction.annotation.Transactional;
1517

1618
import java.util.List;
1719
import java.util.Optional;
@@ -22,6 +24,7 @@ public class RoomChargeAdapter implements RoomChargeOutputPort {
2224

2325
private final RoomChargeRepository roomChargeRepository;
2426
private final DefaultRoomChargeRepository defaultRoomChargeRepository;
27+
private final JdbcTemplate jdbcTemplate;
2528

2629
public Optional<RoomCharge> findById(RoomChargeId roomChargeId) {
2730
return roomChargeRepository.findByIdAndIsDeletedFalse(RoomChargeEntityId.fromDomain(roomChargeId))
@@ -47,6 +50,23 @@ public void bulkCreate(List<RoomChargeForCreate> roomChargeForCreateList) {
4750
roomChargeRepository.saveAll(roomChargeEntities);
4851
}
4952

53+
@Transactional
54+
public void bulkCreateBatch(int batchSize, List<RoomChargeForCreate> roomChargeForCreateList) {
55+
batchUpdate(batchSize, roomChargeForCreateList);
56+
}
57+
58+
private void batchUpdate(int batchSize, List<RoomChargeForCreate> roomChargeForCreateList) {
59+
String sql = "INSERT INTO m_room_charge (hotel_id, room_type, date, charge) VALUES (?, ?, ?, ?)";
60+
61+
jdbcTemplate.batchUpdate(sql, roomChargeForCreateList, batchSize, (ps, argument) -> {
62+
RoomChargeEntity entity = RoomChargeEntity.from(argument);
63+
ps.setLong(1, entity.getId().getHotelId());
64+
ps.setString(2, entity.getId().getRoomType().toString());
65+
ps.setString(3, entity.getId().getDate().toString());
66+
ps.setInt(4, entity.getCharge());
67+
});
68+
}
69+
5070
public RoomCharge updateCharge(RoomCharge roomCharge, Integer charge) {
5171
roomCharge.updateCharge(charge);
5272
RoomChargeEntity roomChargeEntity = RoomChargeEntity.fromDomain(roomCharge);

com.bkmarriott.charge/src/test/java/com/bkmarriott/charge/application/service/RoomChargeServiceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ void createAllNextDefaultCharge_successTest() {
227227

228228
// Then
229229
ArgumentCaptor<List<RoomChargeForCreate>> captor = ArgumentCaptor.forClass(List.class);
230-
Mockito.verify(roomChargeOutputPort).bulkCreate(captor.capture());
230+
Mockito.verify(roomChargeOutputPort).bulkCreateBatch(ArgumentMatchers.anyInt(), captor.capture());
231231

232232
List<RoomChargeForCreate> capturedCharges = captor.getValue();
233233
LocalDate expectedDate = LocalDate.now().plusMonths(3);

com.bkmarriott.charge/src/test/java/com/bkmarriott/charge/infrastructure/persistence/adapter/RoomChargeAdapterTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ void bulkCreate_successTest() {
4747
Assertions.assertDoesNotThrow(() -> roomChargeAdapter.bulkCreate(roomChargeForCreateList));
4848
}
4949

50+
@Test
51+
@DisplayName("[객실 요금 batch 벌크 등록 성공 테스트] 객실 요금을 batch 벌크 생성한다.")
52+
void bulkCreateBatch_successTest() {
53+
// Given
54+
List<RoomChargeForCreate> roomChargeForCreateList = genRoomChargeForCreateList();
55+
// When & Then
56+
Assertions.assertDoesNotThrow(() -> roomChargeAdapter.bulkCreateBatch(5, roomChargeForCreateList));
57+
}
58+
5059
@Test
5160
@DisplayName("[객실 요금 조회 성공 테스트] 객실 요금 ID로 객실 요금을 조회한 뒤 Optional 객체에 담아 반환한다.")
5261
void findById_successTest() {
@@ -67,7 +76,7 @@ void findById_successTest() {
6776
void findAll_successTest() {
6877
// Given
6978
List<RoomChargeForCreate> roomChargeForCreateList = genRoomChargeForCreateList();
70-
roomChargeAdapter.bulkCreate(roomChargeForCreateList);
79+
roomChargeAdapter.bulkCreateBatch(5, roomChargeForCreateList);
7180
// When
7281
List<RoomCharge> roomChargeList = roomChargeAdapter.findAll(
7382
roomChargeForCreateList.stream().map(RoomChargeForCreate::id).toList()

com.bkmarriott.charge/src/test/java/com/bkmarriott/charge/infrastructure/persistence/config/PersistenceTestConfig.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@
88
import org.springframework.beans.factory.annotation.Autowired;
99
import org.springframework.context.annotation.Bean;
1010
import org.springframework.context.annotation.Configuration;
11+
import org.springframework.jdbc.core.JdbcTemplate;
1112

1213
@Configuration
1314
public class PersistenceTestConfig {
1415

1516
@Bean
1617
public RoomChargeAdapter roomChargeAdapter(
1718
@Autowired RoomChargeRepository roomChargeRepository,
18-
@Autowired DefaultRoomChargeRepository defaultRoomChargeRepository
19+
@Autowired DefaultRoomChargeRepository defaultRoomChargeRepository,
20+
@Autowired JdbcTemplate jdbcTemplate
1921
) {
20-
return new RoomChargeAdapter(roomChargeRepository, defaultRoomChargeRepository);
22+
return new RoomChargeAdapter(roomChargeRepository, defaultRoomChargeRepository, jdbcTemplate);
2123
}
2224

2325
@Bean

0 commit comments

Comments
 (0)