# TestCode์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ ์—ฐ๋™
Study Repository

TestCode์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ ์—ฐ๋™

by rlaehddnd0422

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์™€ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•˜๋ฉด ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ๋“ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์— Item ํ…Œ์ด๋ธ”์— ๋ช‡ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•  ๋•Œ, 

ํ…Œ์ŠคํŠธ์—์„œ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฒ€์ƒ‰ ๋ฉ”์†Œ๋“œ findItems()๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋“ค๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

@Test
void findItems() {
    //given
    Item item1 = new Item("itemA-1", 10000, 10);
    Item item2 = new Item("itemA-2", 20000, 20);
    Item item3 = new Item("itemB-1", 30000, 30);

    log.info("repository={}", itemRepository.getClass());
    itemRepository.save(item1);
    itemRepository.save(item2);
    itemRepository.save(item3);

    //๋‘˜ ๋‹ค ์—†์Œ ๊ฒ€์ฆ
    test(null, null, item1, item2, item3);
    test("", null, item1, item2, item3);

    //itemName ๊ฒ€์ฆ
    test("itemA", null, item1, item2);
    test("temA", null, item1, item2);
    test("itemB", null, item3);

    //maxPrice ๊ฒ€์ฆ
    test(null, 10000, item1);

    //๋‘˜ ๋‹ค ์žˆ์Œ ๊ฒ€์ฆ
    test("itemA", 10000, item1);
}

void test(String itemName, Integer maxPrice, Item... items) {
    List<Item> result = itemRepository.findAll(new ItemSearchCond(itemName, maxPrice));
    assertThat(result).containsExactly(items);
}

 ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค๋ฅธ ํ™˜๊ฒฝ๊ณผ ์ฒ ์ €ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ํ…Œ์ŠคํŠธ ์ „์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ„๋„๋กœ ์šด์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • jdbc:h2:tcp://localhost/~/test : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ (local)
  • jdbc:h2:tcp://localhost/~/testcase : ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ (test)

src/main/resources/application.properties 

spring.profiles.active=local
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa

src/test/resources/application.properties

spring.profiles.active=test
  spring.datasource.url=jdbc:h2:tcp://localhost/~/testcase
  spring.datasource.username=sa

 

ํ…Œ์ŠคํŠธ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅด ๋ถ„๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ํ…Œ์ŠคํŠธ์—์„œ ์ƒ์„ฑํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์‚ญ์ œ ํ•ด์ฃผ์–ด์•ผ ๋‹ค์Œ ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?


Solution1. ํŠธ๋žœ์žญ์…˜๊ณผ ๋กค๋ฐฑ ์ „๋žต 

์ด ๋•Œ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํŠธ๋žœ์žญ์…˜์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๊ณ  ๋‚œ ํ›„ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ•์ œ๋กœ ๋กค๋ฐฑํ•ด๋ฒ„๋ฆฌ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํ…Œ์ŠคํŠธ ์‹คํ–‰๋„์ค‘ ์ค‘๊ฐ„์— ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ด์„œ ๋กค๋ฐฑ์„ ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•ด๋„ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰ํ•˜๊ธฐ ์ „ ์ด๋ ‡๊ฒŒ @BeforeEach๋กœ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•ด์ฃผ๊ณ ,

@Slf4j
@SpringBootTest
class ItemRepositoryTest {
    @Autowired
    ItemRepository itemRepository;

    @Autowired
    PlatformTransactionManager transactionManager;

    TransactionStatus status;

    @BeforeEach
    void init()
    {
        status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    }

ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ์ด๋ ‡๊ฒŒ @AfterEach๋กœ ๋กค๋ฐฑํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@AfterEach
void afterEach() {
    //MemoryItemRepository ์˜ ๊ฒฝ์šฐ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉ
    if (itemRepository instanceof MemoryItemRepository) {
        ((MemoryItemRepository) itemRepository).clearStore();
    }

    transactionManager.rollback(status);
}
์ฐธ๊ณ ๋กœ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ application.properties์— ๋“ฑ๋ก๋œ ์ •๋ณด๋ฅผ ํ†ตํ•ด DataSource์™€ ๋”๋ถˆ์–ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ๋“ฑ๋กํ•˜์ง€ ์•Š์•„๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Solution2. @Transactional

 ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ, ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ AOP @Transactional ๋ฐฉ์‹์ด์ฃ .

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ @Transactional์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

@Transactional
@Slf4j
@SpringBootTest
class ItemRepositoryTest {
    @Autowired
    ItemRepository itemRepository;

//    @Autowired
//    PlatformTransactionManager transactionManager;
//
//    TransactionStatus status;
//
//    @BeforeEach
//    void init()
//    {
//        status = transactionManager.getTransaction(new DefaultTransactionDefinition());
//    }

    @AfterEach
    void afterEach() {
        //MemoryItemRepository ์˜ ๊ฒฝ์šฐ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉ
        if (itemRepository instanceof MemoryItemRepository) {
            ((MemoryItemRepository) itemRepository).clearStore();
        }

//        transactionManager.rollback(status);
    }

 @Transactional์„ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ๊ธˆ ํŠน๋ณ„ํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

@Transactional์ด ์ ์šฉ๋œ ํ…Œ์ŠคํŠธ ๋™์ž‘ ๋ฐฉ์‹ 

TestCode์— @Transactional์„ ์ ์šฉํ–ˆ์„ ๋•Œ ๋™์ž‘ ๋ฐฉ์‹

@Transactional์ด ํ…Œ์ŠคํŠธ์— ์žˆ์œผ๋ฉด ์Šคํ”„๋ง์€ ํ…Œ์ŠคํŠธ๋ฅผ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ๋กค๋ฐฑ์„ ์‹œ์ผœ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค!

๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ํ›„ ๊ฐœ๋ฐœ์ž๋Š” ๋”ฐ๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

 

Q. ๋งŒ์•ฝ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ ์„œ๋น„์Šค๋‚˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์„œ๋น„์Šค๋‚˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต์— @Transactional์ด ๋ถ™์–ด์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”๊ฐ€? 

A. ์„œ๋น„์Šค๋‚˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต์˜ ํŠธ๋žœ์žญ์…˜๋„ ํ…Œ์ŠคํŠธ์—์„œ ์‹œ์ž‘ํ•œ ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์–ด, ํ…Œ์ŠคํŠธ์˜ ์‹คํ–‰๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋‚ด๋ถ€ ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 
Q. ํ…Œ์ŠคํŠธ๊ฐ€ ์ž˜ ์ž‘๋™ํ–ˆ๋Š”์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ™•์ธํ•˜๊ณ  ์‹ถ์–ด ์ปค๋ฐ‹ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋˜๋Š”๊ฐ€?

A. ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์œ„์— @Commit์ด๋‚˜ , @Rollback(false)๋กœ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™ํ˜€์ฃผ๋ฉด ๋กค๋ฐฑํ•˜์ง€ ์•Š๊ณ  ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋ฉ๋‹ˆ๋‹ค.

Solution3. ์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ DB

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ํ•˜๊ณ , ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋ฒˆ์žกํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

 ๋‹จ์ˆœํžˆ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒ€์ฆํ•  ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•ด๋„ ๋œ๋‹ค. ๋” ๋‚˜์•„๊ฐ€์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ๋Š” ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ , ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋ฅผ JVM ์•ˆ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ H2 DB๋Š” ์ž๋ฐ”๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ๊ณ , JVM ์•ˆ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

DB๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‚ด์žฅํ•ด์„œ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ธฐ

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ฝ”๋“œ์— DataSource๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ชจ๋“œ๋กœ ๋นˆ ๋“ฑ๋ก 

@Bean
@Profile("test")
public DataSource dataSource()
{
   log.info("๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”");
   DriverManagerDataSource dataSource = new DriverManagerDataSource();
   dataSource.setDriverClassName("org.h2.Driver");
   dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
   dataSource.setUsername("sa");
   dataSource.setPassword("");
   return dataSource;
}
  • @Profile("test") : ํ”„๋กœํ•„์ด test์ธ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ. ์ฆ‰ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—๋งŒ ์ ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
  • DataSource ๋“ฑ๋กํ•  ๋•Œ jdbc:h2:mem:db ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ(๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋“œ)๋กœ ๋™์ž‘ํ•˜๋Š” H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • DB_CLOSE_DELAY=-1 : ์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์ด ์—ฐ๊ฒฐ์ด ๋ชจ๋‘ ๋Š์–ด์ง€๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ ์ข…๋ฃŒ๋˜๋Š” ๋ฐ -1๋กœ ์„ค์ •ํ•˜๋ฉด ์ด๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‚ฌ์‹ค ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” ์ž„๋ฒ ๋””๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์„ค์ •๋„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋•๋ถ„์—

//  @Bean
// @Profile("test")
// public DataSource dataSource()
// {
//    log.info("๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”");
//    DriverManagerDataSource dataSource = new DriverManagerDataSource();
//    dataSource.setDriverClassName("org.h2.Driver");
//    dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
//    dataSource.setUsername("sa");
//    dataSource.setPassword("");
//    return dataSource;
// }
spring.profiles.active=test
#spring.datasource.url=jdbc:h2:tcp://localhost/~/testcase
#spring.datasource.username=sa

 ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  ์„ค์ •์ •๋ณด๋ฅผ ์ง€์šฐ๊ฒŒ ๋˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ž๋™์œผ๋กœ ์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


<์ •๋ฆฌ>

์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ์ฝ”๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์— ์ ‘๊ทผํ•  ๋•Œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ ( ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜์–ด ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๋ฌธ์ œ)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์™€ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ„๋ฆฌ.
  • ๋‘ ๋ฒˆ์งธ, ํŠธ๋žœ์žญ์…˜์„ ์ด์šฉํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ํ…Œ์ŠคํŠธ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กค๋ฐฑ
  • ์„ธ ๋ฒˆ์งธ, TestCode์—์„œ ํŠน๋ณ„ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” @Transactional์„ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ ๋กค๋ฐฑ
  • ๋„ค ๋ฒˆ์งธ, ์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ๊ฑฐ.

<์ฐธ๊ณ ์ž๋ฃŒ>

 

์Šคํ”„๋ง DB 2ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ™œ์šฉ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ DB ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธ

www.inflearn.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ