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

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

์ฃผ๋‹ˆ์“ฐ๐Ÿง‘‍๐Ÿ’ป 2022. 3. 12. 01:11
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

 

199 ~ 213๋ฒˆ์งธ ์ค„๊นŒ์ง€์˜ ๋‚ด์šฉ์€ '๊ธ€ ๋“ฑ๋ก' ๋‚ด์šฉ์— ์ค€๋น„ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค!

HashMap result๋ฅผ ์ค€๋น„ํ•ด์„œ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด์ค„ Data๋“ค์„ ๋‹ด์•„ ์ค„ ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ ๋’ค 218๋ฒˆ์งธ ์ค„์—์„œ Service์— ํ•ด๋‹น Method๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๊ฒฐ๊ณผ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋ฉด ํ•ด๋‹น ๊ฐ’์„ DevInqryVO ๊ฐ์ฒด ์ž๋ฃŒํ˜• Type์œผ๋กœ ๋ฐ›์•„์„œ result์— ๋‹ด์•„์ฃผ๋Š” ๊ฒƒ์ด์—์š”.
๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น result๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜ ํ•ด ์ค๋‹ˆ๋‹ค.

 

 

 

    ๐Ÿ”ฝ  DevInquryService.java

 

 

 

 

    ๐Ÿ”ฝ  DevInquryServiceImpl.java

 

์—ฌ๊ธฐ์„œ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ด๋–ค Logic์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , Mapper์— ํ•ด๋‹น Class๋ฅผ ํ˜ธ์ถœ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ  DevInquryMapper.java

 

 

 

 

    ๐Ÿ”ฝ  DevInquryMapper.xml

    <!-- Q&A ์ƒ์„ธ ์กฐํšŒ -->
    <select id="devInquryDetail" parameterType="com.devcommunity.junyharang.model.vo.support.DevInquryVO" resultType="com.devcommunity.junyharang.model.vo.support.DevInquryVO">
        select X.* from (select 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 , u1.USER_ID as ANSWER_USER_ID , DATE_FORMAT(i.ANSWER_DT, '%Y-%m-%d') AS ANSWER_DT , DATE_FORMAT(i.CREAT_DT, '%Y-%m-%d') AS CREAT_DT , i.UPDT_DT , i.UPDUSR_SN, u.USER_ID
        , COALESCE(LAG(i.INQRY_SN) OVER(ORDER BY i.INQRY_SN), -1) AS BEFORE_INQRY_SN
        , LAG(i.INQRY_SJ) OVER(ORDER BY i.INQRY_SN) AS BEFORE_INQRY_SJ
        , COALESCE(LEAD(i.INQRY_SN) OVER(ORDER BY i.INQRY_SN), -1) AS NEXT_INQRY_SN
        , LEAD(i.INQRY_SJ) OVER(ORDER BY i.INQRY_SN) AS NEXT_INQRY_SJ
        from tb_com_inqry i
        inner join tb_user u
        on i.INQRY_USER_SN = u.user_sn
        left outer join tb_user u1
        on u1.USER_SN = i.ANSWER_USER_SN) X
        where 1=1
        <if test="inqrySn neq null and inqrySn neq ''">
            and INQRY_SN like #{inqrySn}
        </if>
    </select>
๋ฐ˜์‘ํ˜•

 

์—ฌ๊ธฐ์„œ๋Š” from์ ˆ์— Sub Query๋ฅผ ์‚ฌ์šฉํ•ด ์ค€ ๊ฒƒ์ด์—์š”.
Sub Query์— ๋Œ€ํ•ด์„œ๋Š” '์ด ๊ณณ'์— ์ •๋ฆฌํ•ด์„œ ์ค€๋น„ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค!

 

select 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 , u1.USER_ID as ANSWER_USER_ID , DATE_FORMAT(i.ANSWER_DT, '%Y-%m-%d') AS ANSWER_DT , DATE_FORMAT(i.CREAT_DT, '%Y-%m-%d') AS CREAT_DT , i.UPDT_DT , i.UPDUSR_SN, u.USER_ID
, COALESCE(LAG(i.INQRY_SN) OVER(ORDER BY i.INQRY_SN), -1) AS BEFORE_INQRY_SN
, LAG(i.INQRY_SJ) OVER(ORDER BY i.INQRY_SN) AS BEFORE_INQRY_SJ
, COALESCE(LEAD(i.INQRY_SN) OVER(ORDER BY i.INQRY_SN), -1) AS NEXT_INQRY_SN
, LEAD(i.INQRY_SJ) OVER(ORDER BY i.INQRY_SN) AS NEXT_INQRY_SJ
from tb_com_inqry i
inner join tb_user u
on i.INQRY_USER_SN = u.user_sn
left outer join tb_user u1
on u1.USER_SN = i.ANSWER_USER_SN

 

 

๋จผ์ € ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์•Œ๊ณ ์žํ•˜๋Š” ๊ฒƒ์€ ํšŒ์› ํ…Œ์ด๋ธ”๊ณผ Inner join์„ ํ•˜๊ณ , left outer join์œผ๋กœ ๋‹ค์‹œ ํšŒ์›๊ณผ ์กฐ์ธ์„ ํ•œ tb_com_inqry Table์—์„œ ๊ฐ ์ปฌ๋Ÿผ์„ ์กฐํšŒ ํ•˜๋Š”๋ฐ, COALESCE ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณด์ด๋Š” ๊ฒƒ์ด์—์š”. ์ด๊ฒƒ์€ A Table์— phone์ด๋ผ๋Š” ์ปฌ๋Ÿผ๊ณผ B Table์— tel์ด๋ผ๋Š” ์ปฌ๋Ÿผ์ด ์žˆ๋Š”๋ฐ, ์‚ฌ์‹ค ์ปฌ๋Ÿผ๋ช…์€ ๋‹ค๋ฅด์ง€๋งŒ, ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ™์€ ์ „ํ™”๋ฒˆํ˜ธ ์ธ ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ๋ฐ, ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” Phone์ด๋ผ๋Š” ์ปฌ๋Ÿผ์— ์ „ํ™”๋ฒˆํ˜ธ Data๊ฐ€ ์‚ฝ์ž…์™ธ๊ณ , ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—” tel์— ์‚ฝ์ž…์ด ๋œ๋‹ค๊ณ  ํ•  ๋•Œ, phone์„ ํ™•์ธ ํ–ˆ๋‹ค๊ฐ€ ์—†์œผ๋ฉด tel์„ ํ™•์ธํ•˜๊ณ  ํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ํ•œ๋ฒˆ์— ํ™•์ธํ•˜๋ ค๊ณ  ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ ์ธ์ž๋ถ€ํ„ฐ ์ •ํ™•ํžˆ ์ฐจ๋ก€๋กœ ํ™•์ธ ํ•ด์„œ ์ฒ˜์Œ์œผ๋กœ Null์ด ์•„๋‹Œ ๊ฐ’์„ ๋งŒ๋‚˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์ธ ๊ฒƒ์ด์—์š”. ์ฆ‰, ์ฃผ์–ด์ง„ ์ธ์ˆ˜์—์„œ ์ฒซ ๋ฒˆ์งธ๊ฐ€ NULL ์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋ž๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ , Lag ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ํ–‰์„ ๋˜๋Œ์•„๋ณด๊ณ , ํ˜„์žฌ ํ–‰์—์„œ ํ•ด๋‹น ํ–‰์˜ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์œˆ๋„์šฐ ํ•จ์ˆ˜์ธ ๊ฒƒ์ด์—์š”.
์ด ์นœ๊ตฌ๋Š” ํŒŒํ‹ฐ์…˜ ๋˜๋Š” ๊ฒฐ๊ณผ ์ง‘ํ•ฉ ๋‚ด์˜ ํ–‰ ์ˆ˜ ๋งŒํผ ํ˜„์žฌ ํ–‰ ์•ž์— ์žˆ๋Š” expressionํ–‰์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”.
์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ธฐ์ค€ ์ด ์ „์— ๊ฐ’์— ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์—ฌ๊ธฐ์„œ ์œˆ๋„์šฐ ํ•จ์ˆ˜๋ž€ group by์™€ ๋น„์Šทํ•˜๋‚˜, ์ง‘๊ณ„๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ๋ณด๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”. ํ–‰๊ณผ ํ–‰๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ธ ๊ฒƒ์ด์—์š”. 

์ •๋ฆฌํ•˜์ž๋ฉด

COALESCE(LAG(i.INQRY_SN) OVER(ORDER BY i.INQRY_SN), -1) AS BEFORE_INQRY_SN

์œ„์˜ SQL๋ฌธ์€ ์ด์ „ ๊ธ€์„ ๋ณด๊ธฐ ์œ„ํ•œ SQL๋ฌธ์ธ๋ฐ, ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ ๋ฒˆํ˜ธ๋ฅผ LAG ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ ์ด์ „ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•œ ๋’ค,  OVERํ•จ์ˆ˜๋กœ ์ •๋ ฌ์„ ํ•œ ๋’ค ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ(INQRY_SN)์„ COUNT () ์—†์ด Count ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ๊ฒƒ์ด์—์š”. COALESCE()๋ฅผ ํ†ตํ•ด NULL ๊ฐ’์„ ์ฒดํฌํ•ด์„œ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ NULL์ด๋ฉด '-1'์„ ๋ฐ˜ํ™˜ํ•ด์„œ Exception ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€ ๊ฒƒ์ด์—์š”. 

 

COALESCE(LEAD(i.INQRY_SN) OVER(ORDER BY i.INQRY_SN), -1) AS NEXT_INQRY_SN

๋‹ค์Œ ๋ถ€๋ถ„์€ ๋‹ค์Œ ๊ธ€์„ ๋ณด๊ธฐ ์œ„ํ•œ SQL๋ฌธ์ด์—์š”. ์œ„์—์™€ ๊ฐ™์ง€๋งŒ, LAG ๋Œ€์‹  LEAD๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ์ฒ˜๋ฆฌํ•œ ๊ฒƒ์ด์—์š”.

 

๊ทธ๋ฆฌ๊ณ , inner join์„ ํ†ตํ•ด ํšŒ์› Table๊ณผ join์„ ํ•ด์„œ ์ž‘์„ฑ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•˜๊ณ , ๋‹ต๋ณ€์„ ๋‚จ๊ธด ํšŒ์›์˜ ์ •๋ณด๋Š” Null์ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—(๋‹ต๋ณ€์ด ์—†์„ ๊ฒฝ์šฐ) left outer join์„ ํ†ตํ•ด ๋‹ต๋ณ€ ํšŒ์›์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ join์„ ํ•ด ์ค€ ๊ฒƒ์ด์—์š”.

์ด Sub Query์˜ ๋ณ„๋ช…์„ X๋กœ ์ฃผ๊ณ , Main Query Select ์ ˆ์—์„œ X.*์œผ๋กœ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์กฐํšŒํ•˜๊ฒŒ ํ•œ ๋’ค

where 1=1

์„ ํ†ตํ•ด AND ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์„ ํ•˜๊ณ ,

<if test="inqrySn neq null and inqrySn neq ''">

์„ ํ†ตํ•ด์„œ ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ (inqrySn)์ด null์ธ์ง€ ํ˜น์€ ๋น„์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธ ํ•œ ๋’ค ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด if์ ˆ ์•ˆ์— 

and INQRY_SN like #{inqrySn}

and ์กฐ๊ฑด์ ˆ์„ ํ†ตํ•ด ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ (INQRY_SN) ๊ฐ’์„ ๋ฐ›์•„ ํ•ด๋‹น ๋‚ด์šฉ์„ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

๐Ÿ“ฃ ๊ฒฐ๊ณผ

 

์ด๋ ‡๊ฒŒ Postman์œผ๋กœ Test ์‹œ์— ์ •์ƒ์ ์œผ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•