๐Ÿ“Œ MyBatis Mapper ์™„์ „ ์ •๋ณต โ‘ฅ - ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ• & ์‹คํ–‰ ๊ฒฐ๊ณผ ์ •๋ฆฌ

My Pale Blue Dotยท2025๋…„ 4์›” 25์ผ
0

SPRING

๋ชฉ๋ก ๋ณด๊ธฐ
19/36
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025-04-25


๐Ÿ“ 1๏ธโƒฃ ์™œ Mapper ํ…Œ์ŠคํŠธ๊ฐ€ ์ค‘์š”ํ• ๊นŒ?

MyBatis Mapper๋Š” DB์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—,

SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ํŒŒ๋ผ๋ฏธํ„ฐ ๋งคํ•‘ ์˜ค๋ฅ˜, ๊ฒฐ๊ณผ ๋งคํ•‘ ์˜ค๋ฅ˜๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•จ์œผ๋กœ์จ

๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๊ณ ,

์•ˆ์ •์ ์ธ DB ์—ฐ๋™์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!


๐Ÿ“ 2๏ธโƒฃ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ •

MyBatis Mapper ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์Šคํ”„๋ง ํ™˜๊ฒฝ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

@SpringBootTest
public class MemoMapperTest {

    @Autowired
    private MemoMapper memoMapper;

    // ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์ž‘์„ฑ
}
  • @SpringBootTest : ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹คํ–‰
  • @Autowired : Mapper ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์ž…

โšก Tip:

ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋Š” ๋ณดํ†ต ~Test ๋˜๋Š” ~Tests๋กœ ๋„ค์ด๋ฐํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ 3๏ธโƒฃ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ค€๋น„

  • ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „, DB์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์ „์— ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@BeforeEach
void setUp() {
    // ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ ์„ธํŒ… (ํ•„์š” ์‹œ)
}

๐Ÿ’ก ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ์ „๋žต์„ ์„ธ์šฐ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!


๐Ÿ“ 4๏ธโƒฃ ์‹ค์Šต ์˜ˆ์ œ โ‘  - <if> ๋™์  SQL ํ…Œ์ŠคํŠธ

@Test
void testSelectIfXml() {
    Map<String,Object> param = createSearchParam("text", "a");

    List<Map<String,Object>> response = memoMapper.Select_if_xml(param);

    // โœ… ๊ฒฐ๊ณผ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€ ๊ฒ€์ฆ
    Assertions.assertFalse(response.isEmpty(), "์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");

    response.forEach(System.out::println);
}

private Map<String, Object> createSearchParam(String type, String keyword) {
    Map<String, Object> param = new HashMap<>();
    param.put("type", type);
    param.put("keyword", keyword);
    return param;
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ ํ•ด์„

{id=3002, text=aaaaa, writer=example@example.com, createAt=2025-04-25T15:38}

โžก๏ธ type="text" ์กฐ๊ฑด์œผ๋กœ, text ์ปฌ๋Ÿผ์— "a"๊ฐ€ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ ์กฐํšŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ 5๏ธโƒฃ ์‹ค์Šต ์˜ˆ์ œ โ‘ก - <choose> ์กฐ๊ฑด ๋ถ„๊ธฐ ํ…Œ์ŠคํŠธ

@Test
void testSelectWhenXml_WithWriter() {
    Map<String,Object> param = createSearchParam("writer", "example");

    List<Map<String,Object>> response = memoMapper.Select_when_xml(param);

    Assertions.assertTrue(response.size() >= 3, "์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ์ ์Šต๋‹ˆ๋‹ค.");

    response.forEach(System.out::println);
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ ํ•ด์„

{id=3001, text=asd, writer=example@example.com, createAt=2025-04-25T15:38}
{id=3002, text=aaaaa, writer=example@example.com, createAt=2025-04-25T15:38}
{id=3003, text=bbbb, writer=example@example.com, createAt=2025-04-25T15:38}

โžก๏ธ writer ์ปฌ๋Ÿผ์— "example"์ด ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์กฐํšŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


โš ๏ธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€

    โžก๏ธ ํ…Œ์ŠคํŠธ ์ „/ํ›„ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ๊ณ ๋ ค

  2. ๊ฒ€์ฆ ๋กœ์ง ํ•„์ˆ˜

    โžก๏ธ ๋‹จ์ˆœ ์ถœ๋ ฅ โŒ โ†’ assert ํ™œ์šฉ โœ…

  3. ๋ช…ํ™•ํ•œ ๋ฉ”์„œ๋“œ๋ช…

    โžก๏ธ ํ…Œ์ŠคํŠธ ๋ชฉ์ ์„ ๋“œ๋Ÿฌ๋‚ด๊ธฐ

  4. ๋ฐ˜๋ณต ์ฝ”๋“œ ์ตœ์†Œํ™”

    โžก๏ธ Helper ๋ฉ”์„œ๋“œ ํ™œ์šฉ


๐Ÿ“ Best Practice

  • Helper ๋ฉ”์„œ๋“œ ํ™œ์šฉ ์˜ˆ์‹œ
private Map<String, Object> createSearchParam(String type, String keyword) {
    Map<String, Object> param = new HashMap<>();
    param.put("type", type);
    param.put("keyword", keyword);
    return param;
}
  • ์ข‹์€ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ช…
void testSelectWhenXml_WithValidWriterKeyword() { ... }

๐Ÿ’ก Tip:

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

"์–ด๋–ค ์ƒํ™ฉ์—์„œ ๋ฌด์—‡์„ ๊ฒ€์ฆํ•˜๋Š”์ง€" ๋ช…ํ™•ํžˆ ์ž‘์„ฑํ•˜์„ธ์š”!


๐Ÿ”ฅ ์š”์•ฝ

  • Mapper ํ…Œ์ŠคํŠธ๋Š” SQL ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•!
  • ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์™€ ๊ฒ€์ฆ ๋กœ์ง ์ž‘์„ฑ ์Šต๊ด€ํ™”
  • ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์€ ํšจ์œจ์ ์œผ๋กœ ๋ถ„๋ฆฌ
  • ์‹ค๋ฌด์—์„œ๋Š” CI์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ถŒ์žฅ

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


๐Ÿ’ญ ๋А๋‚€ ์ 

์ด๋ฒˆ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ,

๋™์  SQL ํ…Œ์ŠคํŠธ์˜ ์ค‘์š”์„ฑ๊ณผ ํ•จ๊ป˜

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ค€๋น„, ๊ฒ€์ฆ ๋กœ์ง์˜ ํ•„์š”์„ฑ์„ ์ œ๋Œ€๋กœ ์ฒด๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๋™์  SQL ํŠน์„ฑ์ƒ,

์—ฌ๋Ÿฌ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ค€๋น„ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ๋” ๊ฒฌ๊ณ ํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ๋ฌธํ™”๋ฅผ ์Šต๊ด€ํ™”ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜„


profile
Here, My Pale Blue.๐ŸŒ

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