๐ŸƒTDD ๊ฐœ๋ฐœ - Repository Test 3

dev_itzel_02โœจยท2025๋…„ 2์›” 7์ผ

๐ŸƒJavaSpring

๋ชฉ๋ก ๋ณด๊ธฐ
5/11
post-thumbnail

โ“Situation

// campusId๊ฐ€ 5๋ณด๋‹ค ์ž‘์€ ์บ ํผ์Šค๋“ค ์ฐพ๊ธฐ
    @Query("SELECT c.campusNameKo, c.thumbnailUrl FROM CampusEntity c WHERE c.id < 5")
    List<Object[]> findCampusList();

์œ„์˜ repository ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ์ค‘์ด๋‹ค.

@BeforeEach
    void setUp() {
        campusRepositoryV2.save(new CampusEntity(1, "๊ฐ€์ขŒ", "url1"));
        campusRepositoryV2.save(new CampusEntity(2, "์น ์•”", "url2"));
        campusRepositoryV2.save(new CampusEntity(5, "๋‚ด๋™", "url3")); // id๊ฐ€ 5๋ผ์„œ ํ•„ํ„ฐ๋ง ๋Œ€์ƒ ์•„๋‹˜
    }
    
@Test
    @DisplayName("campusId < 5 ์บ ํผ์Šค ์ฐพ๊ธฐ")
    public void checkCampusList_campusIdLessThan5() {
        // given - ์˜ˆ์ƒ ๋ฐ์ดํ„ฐ
        List<Object[]> campusList = new ArrayList<>();
        campusList.add(new Object[]{"๊ฐ€์ขŒ", "url1"});
        campusList.add(new Object[]{"์น ์•”", "url2"});

        // when
        List<Object[]> result = campusRepositoryV2.findCampusList();

        // then
        assertThat(result).hasSize(2);
        assertThat(result).usingRecursiveComparison().isEqualTo(campusList);
    }

์œ„์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.
campusId ๊ฐ’์ด 5๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋งŒ ์ฐพ์•„์˜ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์—ˆ๋Š”๋ฐ, campusID ๊ฐ€ 5์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๊พธ๋งŒ ํฌํ•จํ•˜์—ฌ ์˜ˆ์ƒ๋ฐ์ดํ„ฐ์™€ ๋‹ฌ๋ผ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜์˜€๋‹ค.

๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‚˜ ๊ณ„์† ์˜ค๋ฅ˜๋ฅผ ์ฐพ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ,
์•„๋ฌด๋ž˜๋„ id < 5 ๋ผ๋Š” ์กฐ๊ฑด์„ ์ž˜ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.


โœ”๏ธReason

์˜ค๋ฅ˜์˜ ์›์ธ์€ ๋ฐ”๋กœ Entity ํด๋ž˜์Šค์— ์žˆ์—ˆ๋‹ค.

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

id ํ•„๋“œ๊ฐ’์— GeneratedValue ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•œ ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค.

CampusEntity ํด๋ž˜์Šค์—์„œ @GeneratedValue๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋‹ค๋ฉด, save(new CampusEntity(1L, ...))๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ID๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


โœ”๏ธSolution

ID ์ž๋™ ์ฆ๊ฐ€๋ฅผ ํ”ผํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ธฐ

๐Ÿ‘‰๐Ÿผ ์ง์ ‘ ID๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์œ ์ง€ํ•˜๋ ค๋ฉด GenerationType.IDENTITY๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.
์ œ๊ฑฐํ•˜๋‹ˆ ํ…Œ์ŠคํŠธ๋Š” ์„ฑ๊ณตํ•˜์˜€๋‹คโ—


๐Ÿ”น@GeneratedValue๋ž€?

@GeneratedValue ๋Š” JPA์—์„œ ๊ธฐ๋ณธ ํ‚ค(@Id) ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.
์ฆ‰, ์ƒˆ๋กœ์šด ์—”ํ„ฐํ‹ฐ๊ฐ€ ์ €์žฅ๋  ๋•Œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ID๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๊ณ ์œ ํ•œ ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค.

์ „๋žต์„ค๋ช…
IDENTITY๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ID ์‚ฌ์šฉ (ex: AUTO_INCREMENT in MySQL)
SEQUENCE๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Sequence ๊ฐ์ฒด ์‚ฌ์šฉ (ex: @SequenceGenerator ํ•„์š”)
TABLE๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์—ฌ ID ๊ด€๋ฆฌ
AUTO (๊ธฐ๋ณธ๊ฐ’)DB์— ๋งž๊ฒŒ ์ž๋™ ์„ ํƒ (MySQL์ด๋ฉด IDENTITY, Oracle์ด๋ฉด SEQUENCE ๋“ฑ)
profile
๐Ÿœ๐Ÿ‘ฃsteadiness๐Ÿœ๐Ÿ‘ฃ

0๊ฐœ์˜ ๋Œ“๊ธ€