25-03-18
๐ Daily Reportโ
๐ ํ๋ก์ ํธ ์ํฉโ
์ปคํผ๊ฐ ์ ์๋ฐ๋๋ค. ์ท์ถ๊ฐ ๊ฐ์ง๊ณ ๋ ์๋๊ณ ์ฝ๋๋ธ๋ฃจ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๊น๊ณ ๊ฐ์ผ ๋๋๋ฐ
๋ฐ๋ํ๋ ์๋ ์ฝ๋๋ธ๋ฃจ๊ฐ ์ข ์ฐํจ... ๋ฌผํ๊ฑฐ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ๋ฉํ ๋ง ๋ฐ์์ ๋ WBS๋๋ก๋ง ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค๊ณ ๋ง์ํ์ ์ ์ ๋ง๋ฌด๋ฆฌ๋ง ํ๋ฉด ๋๊ฒ ๋ค ์ถ์๋ฐ
๊ทธ ๋ง๋ฌด๋ฆฌ๋ผ๋๊ฒ ์ฐธ... ์ฌ๊ธฐ์ ๋ค ์ธ ์ ์์ง๋ง, ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค.
๋ํ NELO๋ผ๋ ๋ค์ด๋ฒ ๋ด๋ถ ๋ก๊น ์์คํ ์ ๋ํด ์๊ฒ ๋์๋ค. ๋ฉํ ๋๊ป์ ๋ก๊ทธ๋ฅผ ์ฌ๊ธฐ๋ก ๋ค ๋ณด๋ด์ ๊ด๋ฆฌํ๋ค๊ณ ํ์ จ๋ค.
์์คํ ์ด ๋๋ฌด ๋ง์๊ฒ ์๊ฒผ๋๋ผ. ๋ค์ด๋ฒ์ ๊ทธ๋ฐ ์์ฒด ๋ฐฑ์คํผ์ค๋ค์ด ๊ฝค ์์๋ค.
๋ญ๊ฐ, ๋ด๊ฐ ํด๋ผ์ฐ๋์ ๊ด์ฌ ๊ฐ์ง๊ฒ๋ ๊ฐ์ํ ๊ธฐ์ ์์ฒด๊ฐ ์๋๋ผ ๊ทธ๊ฑธ ์ด์ฉํ ์ ํธ์ฑ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด๋ฏ์ด, ๋ฐฑ์คํผ์ค๋ ๋๋ ์ ๋ง๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค๊ธฐ๋ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์ํ์ ๋ํด์๋ ์ค๋ชฐํก ํ๋๋ฐ, ๋ด๊ฐ ๋ฌธ์ํ ๋๋ฌด ๊ท์ฐฎ๋ค, ์ด๊ฑธ ์๋ํํ๋ฉด ์ข์ง ์์๊น์? ์ด์ ์ฐ๋ฉด ๋ฑ ์์ ์ ๋ฐ์๋๊ณ ๊ทธ๋ฐ๊ฑฐ.. ํ๋๊น ๋ฉํ ๋์ด ๋ง ์์ผ์ จ๋ค.
์์ด๋์ด๊ฐ ์ฌ๋ฐ์ด์ ์์ผ์ ๊ฑด๊ฐ 'ใ '? ๊ทธ๋๋ ์์ผ์ จ์ผ๋๊น ๋คํ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๋ฉํ ๋์ด ๋ ๋ถ์ด์ จ๋๋ฐ ์๋ก ๋น์ทํ๋ฉด์๋ ๋ค๋ฅธ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง๊ณ ๊ณ์ ๊ฒ์ด ๋๊ปด์ก๋ค. ์์์ ๋น์ทํ๊ณ ์ปค๋ฆฌ์ดํจ์ค๋ ๋ค๋ฅด๋ฌ๊น...
ํ ๋ถ์ ํ์ค์ ์ผ๋ก ๋ง์ํด์ฃผ์๋ ๋ถ์ด์๋๋ฐ ์๋ฒ์ง๋ ๋๊ฐ์ด ๋ง์ํ์ ์ ์ ๊ธฐํ๋ค. ๋ถ์ ์ ์ผ๋ก ๋ง์ํ์์ง๋ง ๊ธฐ๋ถ์ด ํ๋๋ ์๋์๊ณ ๋์ ๋ฃ๋ ๋๋? ๋ฌด์จ ๋งฅ๋ฝ์ผ๋ก ๊ทธ๋ ๊ฒ ๋ง์ํ์๋์ง ๋๋ฌด ์ดํด๊ฐ ์ ๋๋๋ผ.
๋ค๋ฅธ ํ ๋ถ์ ํ์ค์ ์ธ ์๊ธฐ๋ณด๋ค๋ ๊ธฐ์ ์ ๋น์์ฑ์ด๋ ์๊ธฐ ์ฃผ๊ด ๋๋ ทํ ์กฐ์ธ์ ํด์ฃผ์๋ ๋ถ์ด์๋ค. ๋ ์นด๋กญ๊ฒ ๋๊ปด์ง ์๋ ์์ง๋ง ๋๋ ๊ฐ๋ฐ์ ์์ด ๊ทธ๋ฐ ์์ธ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋จ์ ์ ์๋๋ผ๊ณ ์๊ฐํ๋ค. ๋ค์ ๋งํ๋ฉด, ์ฑํฅ์ด ๋ง๋๋ค.
๊ทธ๋ฐ ํฅ๋ฏธ๋ก์ด ๋ ๋ถ์ ๋ชจ์ต์, ๋ด ๋ฏธ๋์ ๋ฐฉํฅ์ฑ์ ์๊ฐํด๋ณด๋ ๊ณ๊ธฐ๊ฐ ๋์๋ค. ๋น์ฅ 1๋ ํ๋ถํฐ 10๋ ํ๊น์ง.
๐ @Mock
vs @Autowired
โ
Service๋ฅผ ์ ์ธํ ๋ ์ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์๋๋ฐ, ๊ฐ๊ฐ ๋์๋ฐฉ์์ด ๋ค๋ฅธ ๊ฒ ๊ฐ๋ค.
๋๋ ์์ผ๋ก @Mock
์ ๊ทธ๋ฅ ๊ฐ์ง ๊ป๋ฐ๊ธฐ๊ณ ์ง์ง ์๋๋๋ ค๋ฉด @Autowired
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ ๊ฐ๋ค.
ES ์ธ๋ฑ์ฑ๋ mock์ด ๊ฐ๋ฅํ๊ฐ? ์ฐพ์๋ณด๋ ์ด ๊ฒฝ์ฐ์ ES ์๋ฒ๋ฅผ ๊ฐ์์ผ๋ก ์ ์ธํด์ ์์ฑํ๋ ๊ฒ ๊ฐ๋ค๋ง... ์ง๊ธ ์ํฉ์์ ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ๋ ํฐ ๊ฒ ๊ฐ์๋ฐ์ ใ
์ผ๋จ์ ์คํ๋ง ์คํ์ mock data์ ๋ง์ถ์ด ES ์ธ๋ฑ์ฑ๋ ์ด๊ธฐํ๋๋๋ก ํด๋์๊ธฐ ๋๋ฌธ์, ํ
์คํธ์์ ์ค์ ๋ก์ง์ด ๊ตด๋ฌ๊ฐ๋ ์๊ด์ด ์์ด์ @Autowired
๋ฅผ ์ฑํํ๋ค.
@SpringBootTest
@AutoConfigureMockMvc
public class ReserveRestControllerV1Test {
/*
V1 ์์ฝ ๋์์ฑ ํ
์คํธ
*/
@Autowired
private ReservationEntryRepository reRepo;
@Autowired
private TestReserveService testReserveService; // ์ค์ service์ mock ๊ฐ์ฒด ์ฃผ์
private int RESERVATION_TRIAL;
private Long TARGET_ENTRY_ID;
@BeforeEach
void setUp() {
// Given: ๊ณตํต ํ
์คํธ ๋ฐ์ดํฐ
// ๊ณต๊ฒฉํ ์ํธ๋ฆฌ๋ data.sql ์ฐธ๊ณ
RESERVATION_TRIAL = 100000;
TARGET_ENTRY_ID = 3L;
}
// 1. ๋จ์ @Transactional๋ง ์ค์ ํ ์์ฝ ๋์ ํ
์คํธ
@DisplayName("@Transactional ์์ฝ ํ
์คํธ")
@Test
//@Sql("/data.sql") // resources/data.sql ์คํ ํ์
public void testWithSimpleTransaction() throws InterruptedException {
// ๋์์ฑ ํ
์คํธ: 2๊ฐ์ ์ค๋ ๋์์ ์์ฝ ์๋
Runnable reservationTask1 = () -> {
for (int i = 0; i < RESERVATION_TRIAL/2; ++i) {
ReserveRequestDto reserveRequestDto = ReserveRequestDto.builder()
.storeId(1L)
.entryId(TARGET_ENTRY_ID)
.memberCode((long)(100000 + i)) // ๊ฐ์ memberCode ์ค์ : 100000 ~ 149999
.reservedDateTime(LocalDateTime.parse("2025-02-25 14:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))
.headcount(1)
.build();
testReserveService.testWithSimpleTransaction(reserveRequestDto);
}
};
Runnable reservationTask2 = () -> {
for (int i = RESERVATION_TRIAL/2; i < RESERVATION_TRIAL; ++i) {
ReserveRequestDto reserveRequestDto = ReserveRequestDto.builder()
.storeId(1L)
.entryId(TARGET_ENTRY_ID)
.memberCode((long)(100000 + i)) // ๊ฐ์ memberCode ์ค์ : 150000 ~ 199999
.reservedDateTime(LocalDateTime.parse("2025-02-25 14:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))
.headcount(1)
.build();
testReserveService.testWithSimpleTransaction(reserveRequestDto);
}
};
// ์ฌ๋ฌ ์ค๋ ๋์์ ์์ฝ ์๋
Thread thread1 = new Thread(reservationTask1);
Thread thread2 = new Thread(reservationTask2);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
// ์์ฝ ์ ์ ์ด๊ณผ ์ฌ๋ถ ๊ฒ์ฆ
ReservationEntry entry = reRepo.findById(TARGET_ENTRY_ID).get();
assertSame(entry.getReservedCount(), entry.getCapacity()); // ์ต๋ ์ ์ ์ด๊ณผ ์ฌ๋ถ ํ์ธ
assertEquals("CLOSED", entry.getEntryStatus().toString()); // ์ํธ๋ฆฌ๊ฐ ๋ซํ๋์ง ํ์ธ
}
}
์ด ํ
์คํธ ์ฝ๋๋, @Autowired
๋ง๊ณ @Mock
์ผ๋ก ๋ฌ๋ฉด data.sql๋ก DB์ INSERT๊ฐ ๋์๋ ๋ง๋ ์ํธ๋ฆฌ ID 3๋ฒ์ด ์๋ค๋๊ฑธ ์ธ์์ ๋ชปํ๋ค. ์์ ๋ถ๋ฆฌ๊ฐ ๋์ด์๋๋ฏ.
@Autowired
๋ ๋ชปํด์ฃผ๋ ๊ฒโ
๊ทธ๋ฌํ๋ค. ์ด์ฉ์ ๊ณ์ ๋ 10๋ง๊ฐ ๋ง๋ค์ด ๋ฃ์ผ๋ ด ^^