๐ฝ Oracle CHAR ํ์ ๊ณต๋ฐฑ ํจ๋ฉ โ ํธ๋ฌ๋ธ์ํ & ์ฌ๋ฐ ๋ฐฉ์ง ๊ฐ์ด๋
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฐ์ ๊ธฐ๋ฅ | ๊ธฐ์ค์ ๋ณด > ์ฝ๋๊ด๋ฆฌ โ ์ฝ๋ ๊ทธ๋ฃน ๋จ๊ฑด ์กฐํ (selectGroupOne) |
| ์ฆ์ | ์ ์ฒด ๋ชฉ๋ก ์กฐํ(selectGroupList)๋ ์ ์, ๋จ๊ฑด ์กฐํ๋ ํญ์ ๋ฐ์ดํฐ ์์(0๊ฑด) |
| P6SPY ๋ก๊ทธ | SQLยทํ๋ผ๋ฏธํฐ ๋ชจ๋ ์ ์์ผ๋ก ์ถ๋ ฅ๋จ |
| MyBatis ๋งคํ | ๊ฒฐ๊ณผ ๊ฐ์ฒด null ๋ฐํ (๋งคํ ์คํจ๊ฐ ์๋ 0๊ฑด ๋ฐํ) |
Oracle์ CHAR(n) ์ปฌ๋ผ์ ์
๋ ฅ๊ฐ์ด ์ ์ธ ๊ธธ์ด๋ณด๋ค ์งง์ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์ ๊ณต๋ฐฑ์ ํจ๋ฉํ์ฌ ์ ์ฅํ๋ค.
-- GROUP_CD ์ปฌ๋ผ์ด CHAR(5)๋ก ์ ์ธ๋ ๊ฒฝ์ฐ
INSERT INTO T_CODEGROUP VALUES ('KOR', '002', '๊ฑฐ๋๊ตฌ๋ถ');
-- โ DB์๋ GROUP_CD = '002 ' (๋ค์ ๊ณต๋ฐฑ 2์๋ฆฌ ํจ๋ฉ๋์ด ์ ์ฅ)
๋๋ฒ๊ทธ ๋ก๊ทธ๋ก ํ์ธํ ์ค์ ์ ์ฅ๊ฐ:
[DEBUG] DB ์ค์ ๊ฐ langCd='KOR' groupCd='002 ' groupName='๊ฑฐ๋๊ตฌ๋ถ'
โโ ๊ณต๋ฐฑ 2์๋ฆฌ ํจ๋ฉ
Oracle์ ๋น๊ต ๋์์ ๋ฐ์ดํฐ ํ์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋น๊ต ๊ท์น์ ์ ์ฉํ๋ค.
| ๋น๊ต ์กฐํฉ | ์ ์ฉ ๊ท์น | ๊ฒฐ๊ณผ ์์ |
|---|---|---|
CHAR = CHAR |
๊ณต๋ฐฑ ํจ๋ฉ ๋น๊ต (blank-padded) | '002' = '002 ' โ TRUE |
CHAR = VARCHAR2 |
๋นํจ๋ฉ ๋น๊ต (non-padded) | '002' = '002 ' โ FALSE |
MyBatis/JDBC๋ Java String ํ์
ํ๋ผ๋ฏธํฐ๋ฅผ Oracle์ VARCHAR2๋ก ๋ฐ์ธ๋ฉํ๋ค.
์ ํ๋ฆฌ์ผ์ด์
: groupCd = "002" โ JDBC PreparedStatement โ Oracle VARCHAR2('002')
DB ์ ์ฅ๊ฐ: GROUP_CD = '002 ' โ CHAR(5)
๋น๊ต ์กฐํฉ์ด CHAR = VARCHAR2๊ฐ ๋๋ฏ๋ก ๋นํจ๋ฉ ๋น๊ต ๊ท์น์ด ์ ์ฉ๋์ด:
-- ์ค์ ๋ก Oracle์ด ์ํํ๋ ๋น๊ต
WHERE GROUP_CD = '002'
-- '002 ' (CHAR) = '002' (VARCHAR2) โ FALSE โ 0๊ฑด ๋ฐํ
selectGroupList๋ WHERE ์ ์ด ์๋ ์ ์ฒด ์กฐํ์ด๋ฏ๋ก ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ด ๋ฐ์ํ์ง ์๋๋ค. CHAR ํจ๋ฉ ๊ฐ ๊ทธ๋๋ก ๋ฐํ๋ ๋ฟ, ๋น๊ต ์ฐ์ฐ์ด ์์ด ๋ฌธ์ ๊ฐ ๋๋ฌ๋์ง ์์๋ค.
-- ๋ชฉ๋ก ์กฐํ: WHERE ์์ โ ๋น๊ต ์์ โ ํจ๋ฉ๊ฐ ๊ทธ๋๋ก ๋ฐํ
SELECT LANG_CD, GROUP_CD, GROUP_NAME FROM T_CODEGROUP ORDER BY LANG_CD, GROUP_CD
-- โ ์ ์ ๋์
-- ๋จ๊ฑด ์กฐํ: CHAR ์ปฌ๋ผ์ VARCHAR2 ํ๋ผ๋ฏธํฐ์ ๋น๊ต โ 0๊ฑด
SELECT ... FROM T_CODEGROUP WHERE GROUP_CD = '002'
-- โ 0๊ฑด ๋ฐํ (DB์๋ '002 '๋ก ์ ์ฅ๋์ด ์์)
P6SPY๋ PreparedStatement์ setString() ํธ์ถ ์์ โ ์ฆ Oracle ์๋ฒ์ ๊ฐ์ด ์ ๋ฌ๋๊ธฐ ์ด์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ๋ก์ฑ ๋ก๊น
ํ๋ค.
[P6SPY ๋ก๊ทธ]
select LANG_CD, GROUP_CD, GROUP_NAME from T_CODEGROUP
where LANG_CD = 'KOR' and GROUP_CD = '002'
๋ก๊ทธ ์์ผ๋ก๋ '002'๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ธ๋ฉ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, Oracle ๋ด๋ถ์์๋ ์ด ๊ฐ์ VARCHAR2 ํ์
์ผ๋ก ์ฒ๋ฆฌํ์ฌ '002 '(CHAR)์ ๋น๊ตํ๋ฏ๋ก 0๊ฑด์ด ๋ฐํ๋๋ค.
P6SPY ๋ก๊ทธ: GROUP_CD = '002' โ ๋์๋ ์ ์
Oracle ๋ด๋ถ: '002' (VARCHAR2) โ '002 ' (CHAR) โ ์ค์ ๋ก๋ ๋ถ์ผ์น
SQL Developer์์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์คํํ ๋๋ ๋ฆฌํฐ๋ด ๋ฌธ์์ด '002'๊ฐ Oracle ๋ด๋ถ์์ CHAR ํ์
์ผ๋ก ์ฒ๋ฆฌ๋์ด ๊ณต๋ฐฑ ํจ๋ฉ ๋น๊ต ๊ท์น์ด ์ ์ฉ๋๋ฏ๋ก ์ ์ ์กฐํ๋๋ค.
| ์คํ ํ๊ฒฝ | ํ๋ผ๋ฏธํฐ ํ์ | ๋น๊ต ๊ท์น | ๊ฒฐ๊ณผ | |
|---|---|---|---|---|
| SQL Developer (๋ฆฌํฐ๋ด) | CHAR | ๊ณต๋ฐฑ ํจ๋ฉ ๋น๊ต | ์ ์ ์กฐํ | |
| JDBC PreparedStatement | VARCHAR2 | ๋นํจ๋ฉ ๋น๊ต | 0๊ฑด ๋ฐํ |
์ด ์ฐจ์ด๊ฐ "์ฟผ๋ฆฌ๋ ์ ์์ธ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ง ์ ๋๋ค"๋ ํผ๋์ ์ ๋ฐํ๋ค.
<select id="selectGroupOne" resultMap="groupRm">
SELECT LANG_CD, GROUP_CD, GROUP_NAME
FROM T_CODEGROUP
WHERE LANG_CD = #{langCd} AND GROUP_CD = #{groupCd}
</select>
CHAR ์ปฌ๋ผ์ RTRIM์ ์ ์ฉํ์ฌ ๊ณต๋ฐฑ ํจ๋ฉ์ ์ ๊ฑฐํ ํ ๋น๊ตํ๊ณ , SELECT ์์๋ ์ ๊ทํ๋ ๊ฐ์ ๋ฐํํ๋ค.
<select id="selectGroupOne" resultType="kr.co.nh.atms.web.code.entity.CodeGroup">
SELECT RTRIM(LANG_CD) AS langCd,
RTRIM(GROUP_CD) AS groupCd,
GROUP_NAME AS groupName
FROM T_CODEGROUP
WHERE RTRIM(LANG_CD) = #{langCd} AND RTRIM(GROUP_CD) = #{groupCd}
</select>
T_CODEGROUP๊ณผ T_CODE์ CHAR ์ปฌ๋ผ(LANG_CD, GROUP_CD, CODE)์ ์ฌ์ฉํ๋ ๋ชจ๋ WHERE ์ ๊ณผ SELECT ์ ์ผ๊ด ์ ์ฉํ์๋ค.
| ์ฟผ๋ฆฌ ID | ์ ์ฉ ๋ด์ฉ |
|---|---|
codeCols (๊ณตํต ์ปฌ๋ผ) |
RTRIM + AS ๋ณ์นญ ์ถ๊ฐ |
codeWhere (๊ณตํต ์กฐ๊ฑด) |
RTRIM(์ปฌ๋ผ) = #{ํ๋ผ๋ฏธํฐ} |
selectCodeOne |
WHERE ์ RTRIM ์ ์ฉ |
selectCodeByGroup |
WHERE ์ RTRIM ์ ์ฉ |
updateCode |
WHERE ์ RTRIM ์ ์ฉ |
deleteCode |
WHERE ์ RTRIM ์ ์ฉ |
selectGroupList |
SELECT RTRIM ์ ์ฉ (๋ฐํ๊ฐ ์ ๊ทํ) |
selectGroupOne |
SELECT + WHERE ๋ชจ๋ RTRIM ์ ์ฉ |
updateGroup |
WHERE ์ RTRIM ์ ์ฉ |
deleteGroup |
WHERE ์ RTRIM ์ ์ฉ |
countCodesByGroup |
WHERE ์ RTRIM ์ ์ฉ |
INSERT๋ ์์ ๋ถํ์: INSERT ์ Oracle์ด ์๋์ผ๋ก CHAR ๊ธธ์ด์ ๋ง๊ฒ ํจ๋ฉํ๋ฏ๋ก ์ ์ ๋์ํ๋ค.
CHAR ํ์
์ ์ฌ์ฉํ์ง ์๋๋ค. ๊ณ ์ ๊ธธ์ด ์ฝ๋์ฑ ์ปฌ๋ผ๋ VARCHAR2๋ก ์ ์ธํ๋ค.
-- โ ๊ธ์ง
GROUP_CD CHAR(5)
-- โ
๊ถ์ฅ
GROUP_CD VARCHAR2(5) NOT NULL
CHAR๋ ๋น๊ต ์ ํ์
์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋ ์จ๊ฒจ์ง ์ํ์ด ์๋ค. Oracle์์ VARCHAR2๋ ์
๋ ฅ ๊ธธ์ด ๊ทธ๋๋ก ์ ์ฅํ๋ฉฐ JDBC์ ์์ ํ ํธํ๋๋ค.
๋ ๊ฑฐ์ DB์ CHAR ์ปฌ๋ผ์ ํผํ ์ ์๋ ๊ฒฝ์ฐ, ์๋ ๊ท์น์ ๋ฐ๋์ ๋ฐ๋ฅธ๋ค.
<!-- โ ๊ธ์ง: CHAR ์ปฌ๋ผ์ ํ๋ผ๋ฏธํฐ์ ์ง์ ๋น๊ต -->
WHERE GROUP_CD = #{groupCd}
<!-- โ
ํ์: RTRIM์ผ๋ก ๊ณต๋ฐฑ ์ ๊ฑฐ ํ ๋น๊ต -->
WHERE RTRIM(GROUP_CD) = #{groupCd}
<!-- โ ๊ธ์ง: CHAR ์ปฌ๋ผ์ ๊ทธ๋๋ก SELECT -->
SELECT GROUP_CD FROM T_CODEGROUP
<!-- โ
๊ถ์ฅ: RTRIM์ผ๋ก ์ ๊ทํํ์ฌ SELECT -->
SELECT RTRIM(GROUP_CD) AS GROUP_CD FROM T_CODEGROUP
PR ๋ฆฌ๋ทฐ ์ ์๋ ํญ๋ชฉ์ ์ ๊ฒํ๋ค.
[ ] Oracle CHAR ํ์
์ปฌ๋ผ๊ณผ์ WHERE ๋น๊ต์ RTRIM์ด ์ ์ฉ๋์ด ์๋๊ฐ?
[ ] CHAR ํ์
์ปฌ๋ผ์ด SELECT์ ํฌํจ๋ ๊ฒฝ์ฐ RTRIM ์ ๊ทํ๊ฐ ๋์ด ์๋๊ฐ?
[ ] ์ ๊ท ํ
์ด๋ธ DDL์ CHAR ํ์
์ด ์ฌ์ฉ๋์ง ์์๋๊ฐ?
ํ ์คํธ ์ ๋ค์ ์ฌํญ์ ๋ฐ๋์ ํ์ธํ๋ค.
| ์ ๊ฒ ํญ๋ชฉ | ๋ฐฉ๋ฒ |
|---|---|
| P6SPY ๋ก๊ทธ๋ง์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ๋จํ์ง ์๋๋ค | P6SPY๋ ๋ฐ์ธ๋ฉ ๊ฐ์ ๋ณด์ฌ์ฃผ์ง๋ง, ํ์ ์ ๋ณด๋ ํ์ํ์ง ์๋๋ค |
| SQL Developer ์ง์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋งน์ ํ์ง ์๋๋ค | ๋ฆฌํฐ๋ด ๋ฌธ์์ด์ CHAR ๋น๊ต, JDBC๋ VARCHAR2 ๋น๊ต๋ก ๋์์ด ๋ค๋ฅด๋ค |
| ๋จ๊ฑด ์กฐํ๋ ๋ชฉ๋ก ์กฐํ์ ๋ณ๋๋ก ๋ฐ๋์ ํ ์คํธํ๋ค | WHERE ์ ์ด ์๋ ๋ชฉ๋ก๊ณผ ๋ฌ๋ฆฌ, ๋จ๊ฑด์ CHAR ๋น๊ต ๋ฌธ์ ๊ฐ ๋ ธ์ถ๋๋ค |
CHAR ํ์ ๋ฌธ์ ๋ ๊ฐ์ด ๊ฐ์ ๋ณด์ฌ๋ ๊ธธ์ด๊ฐ ๋ค๋ฅด๋ฉด ๋ฐ์ํ๋ค. ์์ฌ ์ ๊ธธ์ด๋ฅผ ํจ๊ป ๋ก๊น ํ๋ค.
log.debug("groupCd='{}' len={}", groupCd, groupCd == null ? -1 : groupCd.length());
DB ์ค์ ๊ฐ๊ณผ ์์ ํ๋ผ๋ฏธํฐ์ len์ด ๋ค๋ฅด๋ฉด CHAR ํจ๋ฉ ๋ฌธ์ ๋ฅผ ์์ฌํ๋ค.
| ํญ๋ชฉ | CHAR(n) |
VARCHAR2(n) |
|---|---|---|
| ์ ์ฅ ๋ฐฉ์ | ๊ณ ์ ๊ธธ์ด (๊ณต๋ฐฑ ํจ๋ฉ) | ๊ฐ๋ณ ๊ธธ์ด (์ ๋ ฅ๊ฐ ๊ทธ๋๋ก) |
= CHAR ๋น๊ต |
๊ณต๋ฐฑ ํจ๋ฉ ๋น๊ต (blank-padded) | โ |
= VARCHAR2 ๋น๊ต |
๋นํจ๋ฉ ๋น๊ต (non-padded) | ๋นํจ๋ฉ ๋น๊ต |
| JDBC String ๋น๊ต | ๋นํจ๋ฉ โ '002' โ '002 ' |
๋นํจ๋ฉ โ '002' = '002' |
| SQL Developer ๋ฆฌํฐ๋ด ๋น๊ต | ๊ณต๋ฐฑ ํจ๋ฉ โ '002' = '002 ' |
โ |
| ํด๊ฒฐ ๋ฐฉ๋ฒ | RTRIM(์ปฌ๋ผ) = #{param} |
๋ณ๋ ์ฒ๋ฆฌ ๋ถํ์ |
ํต์ฌ: SQL Developer์์๋ ๋๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ ๋๋ค๋ฉด CHAR vs VARCHAR2 ๋น๊ต ๊ท์น ์ฐจ์ด๋ฅผ ๊ฐ์ฅ ๋จผ์ ์์ฌํ๋ผ.