2022. 3. 11. 23:22ใProgramming Project ์์ ์ค/๋ด์ฉ ์ ๋ฆฌ
๐ง๐ป๐ป Git Hub ์ฃผ์
๐ ๋ชฉ์ฐจ
โ [BackEnd][Maven-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ๋ชฉ๋ก ์กฐํ
โ [BackEnd][Maven-PJ]๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ์์ธ ์กฐํ
โ [BackEnd][Maven-PJ]๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ์ญ์
โ [BackEnd][Maven-PJ] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ : ๋ต๋ณ ๋ฑ๋ก / ์์
โ [BackEnd][Maven-PJ] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ : ๋ต๋ณ ์ญ์
๐จ๐ฉ๐ง๐ฆ ํ์ ๊ด๋ จ
โ [BackEnd][Maven-PJ] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ํ์ ๊ด๋ จ : ํ์ ๊ฐ์
๐๋ถ ๋ก
โ [BackEnd][Maven-PJ]๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : Paging์ฒ๋ฆฌ
๐ค ๋ด๊ฐ ๋ง๋ Exception
โ [Exception ์ ๋ฆฌ] org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
โ [Vue.js][Spring] Post Data ์ ์ก ๊ฐ null๊ฐ ์ ์ก ๋ฌธ์
โ
๐ ๊ฐ๋ฐ ๊ด๋ จ Q&A ๊ฒ์ํ ์๋น์ค - ๋ชฉ๋ก ์กฐํ
๐ฝ DevInquryController.java
์ต์ด ๋ชฉ๋ก ์กฐํ๋ผ๋ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ๋ฅผ ์ํด 169๋ฒ์งธ ์ค์์ Service์ ํด๋น Method๋ฅผ ํธ์ถํ๋ ๊ฒ์ด์์. ๋์ค์ ์์ ๋์ด์ผ ํ ๋ถ๋ถ์ด์ง๋ง, ํ์ฌ๋ ๋งค๊ฐ๋ณ์๋ก VO๋ฅผ ๋ฃ์ด์ฃผ๊ณ ์๋๋ฐ, ์ฐจ ํ ๋ชฉ๋ก ์ฒ๋ฆฌ์ ํ์ํ Paging ๊ด๋ จ ๋งค๊ฐ ๋ณ์๋ง ๋ฃ์ด์ฃผ๋๋ก ๋ฐ๊ฟ ๊ฒ์ด์์.
๊ทธ๋ฐ๋ค 172๋ฒ์งธ ์ค์ ๋ณด๋ฉด ์กฐํ์ Count๋ฅผ ํ๊ธฐ ์ํด Service์ ํด๋น Method๋ฅผ ํธ์ถํ๊ณ ์๋ ๊ฒ์ด์์. ์ด ์ญ์ VO๋ฅผ ๋งค๊ฐ ๋ณ์๋ก ๋ฃ์ด์ฃผ๊ณ ์๋ต๋๋ค.
๊ทธ๋ฐ ๋ค 175๋ฒ์งธ ์ค์์ ์กฐํ๋ ๋ชฉ๋ก Data๋ฅผ HashMap์ ๋ฃ์ ๋ค List๋ก ๊ฐ์ธ ๋ฐ์ ๋ค์ ๋ค์ result๋ผ๋ HashMap์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด์์. 176์ ์กฐํ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ฃ์ด์ค ๋ค ๋ฐํํ๊ณ ์๋๋ฐ, ์กฐํ์๋ ์ ์ Type์ผ๋ก ๋ฐ์ ์ ๋ฌํ๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ ๊ฒฐ๊ณผ๊ฐ์ ๋ชจ๋ HashMap result์ ๋ฃ์ด์ค ๋ค ์๋ต ํด ์ฃผ๋ ๊ฒ์ด์์.
๐ฝ DevInquryService.java
Interface๋ฅผ ๊ตฌํํ Impl์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ ๊ฒ์ด์์. ์ด ๋ถ๋ถ์ ๋ชฉ๋ก ์กฐํ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ถ์ Method์ด๊ณ ,
์ด ์ถ์ Method๋ ์กฐํ์ Count๋ฅผ ์ํ Method์ธ ๊ฒ์ด์์.
๐ฝ DevInquryServiceImpl.java
ํด๋น ๋น์ฆ๋์ค ๋ก์ง์์ ๋ฑํ ํด์ค ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก SQL ์ฒ๋ฆฌ๋ฅผ ํ๋ Mapper์ ํด๋น Method๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๋ก ๋ฐํ ํด ์ฃผ๋ ๊ฒ์ด์์.
๐ฝ DevInquryMapper.java
๊ทธ๋ผ ์ด์ ํด๋น Interface๋ฅผ ๊ตฌํํ Mapper XML์ ๋ง๋๋ฌ ๊ฐ๋ณผ ๊ฒ์ด์์.
<!-- Q&A ๋ชฉ๋ก ์กฐํ -->
<select id="devInquryList" parameterType="com.devcommunity.junyharang.model.vo.support.DevInquryVO" resultType="com.devcommunity.junyharang.model.vo.support.DevInquryVO">
select row_number() over(order by i.INQRY_SN asc) as INQRY_INDEX , i.INQRY_SN, i.INQRY_USER_SN , i.FILE_SN , i.INQRY_CN , i.INQRY_SJ , i.SECRET_AT , i.ANSWER_AT , i.ANSWER_CN , i.ANSWER_USER_SN , i.ANSWER_DT , i.CREAT_DT , i.UPDT_DT , i.UPDUSR_SN, u.USER_ID
from tb_com_inqry i inner join tb_user u
on i.INQRY_USER_SN = u.user_sn
where 1=1
<if test=' srchType neq null and srchType neq "" '>
<choose>
<when test="srchType eq '1'.toString()">
and INQRY_SJ like CONCAT('%', #{srchWord}, '%')
</when>
<when test="srchType eq '2'.toString()">
and INQRY_CN like CONCAT('%', #{srchWord}, '%')
</when>
<when test="srchType eq '3'.toString()">
and u.USER_ID like CONCAT('%', #{srchWord}, '%')
</when>
</choose>
</if>
order by INQRY_SN desc
<if test=' pageStart neq null and perPageNum neq null '>
LIMIT #{pageStart}, #{perPageNum}
</if>
</select>
์์ SQL๋ฌธ ์ค
select row_number() over(order by i.INQRY_SN asc) as INQRY_INDEX
์ด ๋ถ๋ถ์ ๋ฐ๋ก ์กฐํํ ๋ ์์ ๋ฒํธ๋ฅผ ๋งค๊ธฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด์์.
ROW_NUMBER ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ ORDER BY๋ฅผ ํ์๋ก ์ฌ์ฉํด์ผ ํ๋๋ฐ, ๋ฑํ ์ ๋ ฌํ ๊ฒ์ด ์์ผ๋ฉด
select row_number() over(order by (SELECT 1)) as INQRY_INDEX
์ด๋ ๊ฒ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด์์. ํ์ง๋ง, ์ฃผ๋ํ๋์ ํด๋น ๊ฒ์ํ ๊ฒ์๊ธ์ ์ผ๋ จ๋ฒํธ(๊ณ ์ ๋ฒํธ)์ธ ID๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์๋ฒ์ ๋งค๊ธฐ๋๋ฐ, ํด๋น ์ปฌ๋ผ ๋ณ๋ช ์ INQRY_INDEX๋ก ํ์ฌ ์กฐํ ํด ๋ฌ๋ผ๊ณ ์ฒ๋ฆฌ ํ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ๋๊ฐ ์์ฑํ๋์ง, ๋๊ฐ ์์ ํ๋์ง์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ inner join์ผ๋ก ํ์ Table์ Join ์์ผ ์คฌ๊ณ , ํด๋น ๊ฒ์ํ Table์ ํ์ ์ผ๋ จ๋ฒํธ์ ํ์ Table์ ํ์ ์ผ๋ จ๋ฒํธ๋ฅผ On ์กฐ๊ฑด์ผ๋ก Mappingํ์ฌ ์กฐํ ํ๋ ค๊ณ ํ ๊ฒ์ด์์.
40๋ฒ์งธ ์ค์ ๋ณด๋ฉด
<if test=' srchType neq null and srchType neq "" '>
๊ฐ ์๋๋ฐ, ํด๋น ๋ด์ฉ์ ๋ง์ฝ srchType(๊ฒ์ Type)์ด๋ผ๋ ๊ฐ์ด Null์ด ์๋๊ณ , srchType์ด ๋น์ด์์ง ์๋ค๋ฉด? ์ด๋ผ๋ ์กฐ๊ฑด์ ์ ์ค ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , ์ฌ๋ฌ ์กฐ๊ฑด์ ์ ์ฃผ๊ธฐ ์ํด <choose> ์ <when>์ ์ฌ์ฉํ์ฌ์ srchType์ด 1์ด๋ผ๋ฉด and ์กฐ๊ฑด์ผ๋ก INQRY_SJ(๊ฒ์๊ธ ์ ๋ชฉ) ๊ฐ์ด๋ฐ์ srcWord(๊ฒ์๋ช )๊ณผ ๊ฐ์ ๊ฒ์ด ์๋์ง ์ฐพ๋๋ก ํ ๊ฒ์ด์์. ์ฐธ๊ณ ๋ก CONCAT ํจ์๋ ์ฌ๋ฌ ๋ฒ์ ๋๋ ๋ฌธ์์ด Text๋ฅผ ๊ฒฐํฉํ๋ ค๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด์์.
CONCAT ๋ค์ ์๋ฏธ๋ '%'(๋ชจ๋ ๋ฌธ์์ด) ๊ณผ #{srchWord} (๊ฒ์๋ช ) ๊ทธ๋ฆฌ๊ณ , '%'(๋ชจ๋ ๋ฌธ์์ด)์ ํ๋๋ก ํฉ์น ๋ฌธ์์ด์ด INQRY_SJ(๊ฒ์๊ธ ์ ๋ชฉ๊ณผ ๊ฐ์์ง๋ฅผ ๋ฌป๊ณ ์๋ ๊ฒ์ด์์.
์ด Logic์ ๊ฒ์๊ธ ๊ฒ์์ ์ํด์ ๋ง๋ค์ด ์ง ๊ฒ์ด์์.
๋ง์ฐฌ๊ฐ์ง๋ก 45๋ฒ์งธ ์ค์๋ ๊ฒ์ ํ์ ์ด 2๋ผ๋ฉด INQRY_CN ์ฆ, ๋ด์ฉ์ ๊ฒ์๋ช ์ด ์๋์ง๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด๊ณ , ๋ง์ง๋ง ๊ฒ์ ํ์ ์ด 3์ด๋ผ๋ฉด ํ์์ ID๊ฐ์ ๊ฒ์ํ๋ ๊ฒ์ด์์.
์กฐ๊ฑด์ ์ด ๋๋๊ณ ๋๋ฉด ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ์ ํ๊ณ , Paging ์ฒ๋ฆฌ๋ฅผ ์ํ ์กฐ๊ฑด์ ์ด ์์ ๋๋ ๊ฒ์ด์์.
54๋ฒ์งธ ์ค์ ์์ฒญ์ผ๋ก ๋ค์ด์จ VO Member ๋ณ์ ์ค pageStart(ํ์ด์ง ์์๋ฒํธ)๊ฐ Null์ด ์๋๊ณ , perPageNum(Page ๋น ๋ณด์ฌ์ค ๊ฒ์๊ธ ๊ฐ์๋ก ์ค์ )์ด Null์ด ์๋๋ผ๋ฉด? ์กฐ๊ฑด์ ์์ผ๋ก ๋ค์ด๊ฐ์ LIMIT๋ฅผ ํตํด Paging ์ฒ๋ฆฌ๋ฅผ ํ์ฌ pageSta(0๋ถํฐ ์์) ์ ๋ค์ด์จ ์ซ์ ๋ถํฐ perPageNum๊ฐ ๊น์ง Data๋ฅผ ์ถ์ถํ๋๋ก ํ ๊ฒ์ด์์.
์ด ์น๊ตฌ๋ ์กฐํ์๋ฅผ ์นด์ดํธํ๊ธฐ ์ํ SQL ๋ฌธ์ธ ๊ฒ์ด์์. COUNT() ํจ์ ์์ *์ ๋ฃ์ด tb_com_inqry Table์ ๋ชจ๋ ์ปฌ๋ผ๋ค์ ๋ํด ๊ฐ์๋ฅผ ์ธ๊ฒ ๋ค๋ ๊ฒ์ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ COUNT๋ผ๋ ๋ณ๋ช
์ผ๋ก ์ปฌ๋ผ์ ๋ง๋ค์ด ๋ฌ๋ผ๊ณ ํ ๊ฒ์ด์์.
์ฌ์ค ์ด Logic์ Count๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์๋ SQL๋ฌธ์ ํ์๊ฐ ์์ ๊ฒ์ผ๋ก ์๊ฐ๋์ง๋ง, ์ด ๋ถ๋ถ์ ๋์ค์ Refactoring ํ๋๋ก ํ ๊ฒ์ด์์.
๐ฃ ๊ฒฐ๊ณผ
๊ทธ๋ผ ๊ฒ์์ ํ ๊ฑด ์๋๋๊น srch์ ๋ํ ๋ด์ฉ์ ๋์ถฉ ์ ๊ณ , Page ์์์ ๊ณผ ๊ฐ์๋ฅผ ์ ์ด์ ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ชฉ๋ก ์กฐํ๋ฅผ ์ฑ๊ณตํ๋ ๊ฒ์ ๋ณผ ์ ์๋ ๊ฒ์ด์์.