Programming Project ์ž‘์—…์‹ค/๋‚ด์šฉ ์ •๋ฆฌ

[BackEnd][Maven-PJ] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ : ๋ชฉ๋ก ์กฐํšŒ

์ฃผ๋‹ˆ์“ฐ๐Ÿง‘‍๐Ÿ’ป 2022. 3. 11. 23:22
728x90
๋ฐ˜์‘ํ˜•

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ป Git Hub ์ฃผ์†Œ

 

 

๐Ÿ—‚ ๋ชฉ์ฐจ

โ— [BackEnd][Maven-PJ] ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ : ๊ธ€ ๋“ฑ๋ก(์ž‘์„ฑ) / ์ˆ˜์ •

โ— [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 ์‹œ์ž‘์ ๊ณผ ๊ฐœ์ˆ˜๋ฅผ ์ ์–ด์„œ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชฉ๋ก ์กฐํšŒ๋ฅผ ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•