[Spring + MyBatis - ๐Ÿ› ๏ธTroubleShooting] Mybatis์˜ ์ƒ์„ฑ์ž ๊ฐ์ฒด ๋งคํ•‘ ๋ฐฉ๋ฒ•

Oguยท2024๋…„ 4์›” 12์ผ
1
post-thumbnail

๐Ÿ› ๏ธ์ƒํ™ฉ

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ๊ฐ์ฒด ๋งคํ•‘์‹œ ์ฃผ์˜ํ•  ์ ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ์ค‘ ์•„์ง ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ ์˜๋ฌธ์ ์ธ

  1. ์™œ ๋‚˜๋Š” Mybatis์—์„œ @Getter ์™€ @Builder ๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ •์ƒ์ ์œผ๋กœ ๊ฐ์ฒด ๋งคํ•‘์ด ๋˜๋Š”๊ฐ€?

์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ด์œ ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด, ๋จผ์ € Mybatis๊ฐ€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ๊ฐ์ฒด ๋งคํ•‘์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์ข…๋ฅ˜ ๋ฐ ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ—‚๏ธ Mybatis์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ๊ฐ์ฒด ๋งคํ•‘

MyBatis๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์กฐํšŒํ•œ ์ฟผ๋ฆฌ๋ฅผ DTO์— ๋งคํ•‘ํ•  ๋•Œ,์–ด๋– ํ•œ ๋งคํ•‘ ๋ฐฉ์‹๋“ค์ด ์กด์žฌํ•˜๊ณ , ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ• ๊นŒ์š”?

์ €๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ๊ฐ€๋…์„ฑ, ์œ ์—ฐ์„ฑ, ๋ถˆ๋ณ€์„ฑ ๋“ฑ์˜ ์ด์œ ๋กœ @Builder ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, @Builder ํŒจํ„ด์„ ํ™œ์šฉํ•œ ๊ฒฐ๊ณผ ๋งคํ•‘์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿงฉ Mybatis์—์„œ @Builder ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฃผ์˜์ 

@Builder๋Š” ๋นŒ๋” ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก private ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ด๋Š” ๋ชจ๋“  ํ•„๋“œ ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

1. ๐Ÿฆ• @Builder + ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgsConstructor)

๊ธฐ๋ณธ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋งคํ•‘ํ•  ๊ฒฝ์šฐ, ๋ณ€์ˆ˜ ๋„ค์ด๋ฐ๊ณผ column ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋งคํ•‘์ด ๋ฉ๋‹ˆ๋‹ค. (์ด๋•Œ ๋Œ€์†Œ๋ฌธ์ž๋Š” ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์ง€๋งŒ, camelCase๋Š” ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.)

์ฆ‰ ๋Œ€์†Œ๋ฌธ์ž ์ƒ๊ด€ ์—†์ด DB์˜ column๋ช…๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.

2. ๐Ÿฆ• @Builder + ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgsConstructor) + ๋ณ„์นญ(Alias)

๋Œ€์†Œ๋ฌธ์ž๋Š” ๋ฌด์‹œํ•˜๊ณ  ๋ณ€์ˆ˜์™€ ์ปฌ๋Ÿผ๋ช…์ด ์ผ์น˜ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋งคํ•‘์ด ๋˜์ง€๋งŒ, ์œ„์˜ ๊ฒฝ์šฐ๋งŒ์œผ๋กœ๋Š” ๋ณดํ†ต ๋งŒ์กฑํ• ๋งŒํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ž๋ฐ” ๋ช…๋ช… ๊ทœ์น™์œผ๋กœ ๋Œ€๊ฒŒ camelCase๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ธฐ๋ณธ์ƒ์„ฑ์ž์˜ ์ž๋™ ๋งคํ•‘์˜ ๊ฒฝ์šฐ camelCase๊นŒ์ง€ ๊ณ ๋ คํ•ด ์ฃผ์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿด ๋•Œ๋Š” ๋ณ„์นญ(Alias)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž + ์ปฌ๋Ÿผ Alias๋ฅผ ์ง€์ •ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ชจ๋“  ํ•„๋“œ ๋ฐ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐฉ๋ฒ• 1๊ณผ 2๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ์—๋Š” ํ•„๋“œ๋ช…์ด ์นด๋ฉœ์ผ€์ด์Šค์ธ ํ•„๋“œ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์ƒ์‚ฐ์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ camelCase๊นŒ์ง€ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณ€์ˆ˜ ๋„ค์ด๋ฐ์— ๋”ฐ๋ผ ์ž๋™ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
MyBatis - ๐Ÿ› ๏ธTroubleShooting

3. ๐Ÿฆ• @Builder = ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž (@AllArgsConstructor)

ํ•˜์ง€๋งŒ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž๋กœ๋งŒ ๋งคํ•‘ํ•œ๋‹ค๋ฉด, ์ž๋ฐ” ๋ฌธ๋ฒ•์ธ ์ „์ฒด์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ํŒŒํƒ€๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜, ํƒ€์ž…๊ณผ ๋ณ€์ˆ˜ ์ˆœ์„œ๋ฅผ ๋งž์ถฐ ์ƒ์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š” ์ ๊ณผ ๊ฐ™์ด ์ฃผ์˜๋ฅผ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž๋กœ ๋งคํ•‘ํ•˜๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ์— ์กฐํšŒ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ด๊ฐ’ ์ˆœ์„œ๋Œ€๋กœ ๋งคํ•‘์ด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ @AllArgsConstructor ๋งŒ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ์„ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1. ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜ ์ˆœ์„œ๋ฅผ ํ…Œ์ด๋ธ”์˜ column ์ˆœ์„œ์™€ ๋˜‘๊ฐ™์ด ๋งž์ถฐ์•ผ ํ•œ๋‹ค.
2. ๊ทธ ์ˆœ์„œ๋Œ€๋กœ ๋งคํ•‘๋˜๋ฏ€๋กœ CamelCase๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ •์ƒ์ ์œผ๋กœ ๋งคํ•‘๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋งŽ์€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ์ƒ์„ฑ์ž๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ, arg ์—˜๋ฆฌ๋จผํŠธ์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
Mybatis 3.4.3v ์ดํ›„๋ถ€ํ„ฐ๋Š” ๊ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์—ฌ ์ž„์˜์˜ ์ˆœ์„œ๋กœ arg ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mybatis ๊ณต์‹ ๋ฌธ์„œ
https://mybatis.org/mybatis-3/ko/sqlmap-xml.html

4. ๐Ÿฆ• @Builder + ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgs) + ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž(@AllArgs)

๐Ÿ—‚๏ธ 2. @Getter ์™€ @Builder ๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ •์ƒ์ ์œผ๋กœ ๋งคํ•‘๋๋˜ ์ด์œ 

๋”ฐ๋ผ์„œ ๋งŽ์€ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ์—์„œ Mybatis๋Š” ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์–ด์•ผ ์ •์ƒ์ ์œผ๋กœ ๋งคํ•‘์ด ๋œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ด๋Š” ์ž˜๋ชป๋œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ @Getter์™€ @Builder ๋งŒ ๋ถ™์–ด์žˆ๋Š” ํด๋ž˜์Šค์—๋Š” ๋ชจ๋“  ํ•„๋“œ๊ฐ’์„ ํฌํ•จํ•œ ์ƒ์„ฑ์ž๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ์—, ์ž๋ฐ” ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ „์ฒด์ƒ์„ฑ์ž๋งŒ์œผ๋กœ๋„ ๊ฐ์ฒด ๋งคํ•‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ „์ฒด์ƒ์„ฑ์ž๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋ช‡๊ฐ€์ง€ ์ฃผ์˜์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—‚๏ธ ์ฐธ๊ณ 

profile
็งใฏใ‚ฒใƒผใƒ ใจๆ—ฅๆœฌใŒๅฅฝใใชBackend Developerๅฟ—ๆœ›็”ŸใฎOguใงใ™๐Ÿค๐Ÿค

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