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

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

์ฃผ๋‹ˆ์“ฐ๐Ÿง‘‍๐Ÿ’ป 2022. 3. 9. 16:08
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 ๊ฒŒ์‹œํŒ ์„œ๋น„์Šค

 

 

 

    ๐Ÿ”ฝ  ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ๊ฐ€?

 

    ๐Ÿ”ฝ  VO ๊ตฌ์„ฑ

 

ํ•ด๋‹น VO๊ฐ€ extendsํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ '์ด ๊ณณ'์— ์ •๋ฆฌ ํ•ด ๋‘์—ˆ์–ด์š”!

 

 

์œ„์˜ VO๋Š” ์œ„์™€ ๊ฐ™์ด Table Column๊ณผ Mapping ๋œ ๊ฐ์ฒด์ธ ๊ฒƒ์ด์—์š”.
๊ทธ๋Ÿฐ๋ฐ, VO์— ๋ณด๋ฉด srchWord์™€ srchType์ด ์žˆ๋Š”๋ฐ, ์ด ๋‘ Member ๋ณ€์ˆ˜ ๋‚ด์šฉ์€ Column์— ์—†๋Š” ๊ฒƒ์ด์—์š”.

์ด ๋ณ€์ˆ˜๋“ค์€ Client์—์„œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํ†ตํ•œ ์š”์ฒญ์„ ํ•  ๋•Œ ๊ฒ€์ƒ‰ ์ข…๋ฅ˜ (srchType)๊ณผ ๊ฒ€์ƒ‰๋ช…(srchWord)๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค!

 

๐Ÿš€ ๊ฐœ๋ฐœ ๊ด€๋ จ Q&A ๊ฒŒ์‹œํŒ ์„œ๋น„์Šค - ๋“ฑ๋ก

 

 

 

    ๐Ÿ”ฝ  DevInquryController.java

devInquryRegist(@RequestBody DevInquryVO devInquryVO)

 

61๋ฒˆ์งธ ์ค„์— `@ResponseBody`์— ๋Œ€ํ•œ ์ •๋ฆฌ ๋‚ด์šฉ์€ '์ด ๊ณณ'์— ์ค€๋น„ ํ•ด ๋‘˜๊ฒŒ์š”!

 

devInquryRegist(@RequestBody DevInquryVO devInquryVO)

devInquryRegist(@RequestBody DevInquryVO devInquryVO)

 

 

์ด์ œ ์œ„์˜ Controller Code๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถ„์„ ํ•ด ๋ณด๋ฉด์„œ ๋ณต์Šต์„ ํ•ด ๋ณผ ๊ฒƒ์ด์—์š”.

 

        Field[] fields = devInquryVO.getClass().getDeclaredFields();

VO์— ์ž„์˜์˜ ๊ฐ’์„ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•ด์•ผ ๋  ๋•Œ getDeclaredFields ์ด ์นœ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด ๋‚ด์šฉ์€ ์‚ฌ์‹ค ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์ฃผ๋‹ˆํ•˜๋ž‘๋„ ์ฒ˜์Œ ์จ ๋ณธ ๊ฒƒ์ด๋ผ ์ข€ ๋” ์ž์„ธํžˆ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด '์ด ๊ณณ'์— ์ •๋ฆฌํ•œ ๋‚ด์šฉ์„ ์ค€๋น„ ํ•ด ๋‘˜๊ฒŒ์š”!

 

Map<String, Object> result = new HashMap<>();

 

๊ทธ๋Ÿฐ ๋’ค ์‘๋‹ต(Response) ์‹œ์— ์ „๋‹ฌํ•  ๋‚ด์šฉ๋“ค์„ ๋‹ด์„ ๊ทธ๋ฆ‡์ธ result๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ๊ฒƒ์ด์—์š”.

 

try {

    log.info("๋“ฑ๋กํ•  ๊ธ€์ด ๋น„๋ฐ€๊ธ€์ธ์ง€ ํ™•์ธ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!");
    if (devInquryVO.getSecretAt().equals("false")) {

        log.info("๋“ฑ๋กํ•  ๊ธ€์ด ๋น„๋ฐ€๊ธ€์ด ์•„๋‹™๋‹ˆ๋‹ค! ๊ณต๊ฐœ๊ธ€๋กœ ๋“ฑ๋ก ํ•ฉ๋‹ˆ๋‹ค!");
        devInquryVO.setSecretAt("N");

    } else {

        log.info("๋“ฑ๋กํ•  ๊ธ€์ด ๋น„๋ฐ€๊ธ€ ์ž…๋‹ˆ๋‹ค! ๋น„๋ฐ€๊ธ€๋กœ ๋“ฑ๋ก ํ•ฉ๋‹ˆ๋‹ค!");
        devInquryVO.setSecretAt("Y");

    } // if (devInquryVO.getSecretAt().equals("false")) - else ๋

 

์ฃผ๋‹ˆํ•˜๋ž‘์ด ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ๊ฒŒ์‹œํŒ์—๋Š” ๋น„๋ฐ€๊ธ€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ์š”์ฒญ ์ด์šฉ์ž๊ฐ€ ๋น„๋ฐ€๊ธ€์„ ์ฒดํฌ ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•ด๋‹น VO์— setter๋ฅผ ์ด์šฉํ•˜์—ฌ ๋น„๋ฐ€๊ธ€ ์—ฌ๋ถ€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด๋ฌธ์œผ๋กœ ํ™•์ธ์„ ํ•˜๊ณ , ์ ์ ˆํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

if (CustomStringUtil.getString(devInquryVO.getInqrySn()) == "" || devInquryVO.getInqrySn() == 0) {

    log.info("๋“ฑ๋ก ์š”์ฒญ ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค! ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค!");
    // TODO - ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ๋กœ์ง ๊ตฌํ˜„ ๋’ค ์•„๋ž˜ ํ•˜๋“œ์ฝ”๋”ฉ ์ˆ˜์ • ํ•„์š”

    log.info("devInquryService.devInquryInsertUpdate(devInquryVO)์„ ํ˜ธ์ถœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!");
    devInquryService.devInquryInsert(devInquryVO);

    log.info("Map result์— ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค!");
    result.put("resultSn", devInquryVO.getInqrySn());

 

๋‚˜์ค‘์— ์ฃผ๋‹ˆํ•˜๋ž‘์€ ํ•ด๋‹น Logic์—์„œ ๋“ฑ๋ก / ์ˆ˜์ • Logic์„ ๋ถ„๋ฆฌํ•  ์˜ˆ์ •์ด์ง€๋งŒ, ์ผ๋‹จ์€ ๋น ๋ฅด๊ฒŒ ์™„์„ฑ์„ ์œ„ํ•ด ๋‹ฌ๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์–ด์ฐจํ”ผ ๋ฆฌํŽ™ํ„ฐ๋ง์€ ๊ณ„์† ๋˜์–ด์•ผ ํ•˜๋‹Œ๊นŒ! ํ•˜๋‚˜ํ•˜๋‚˜ ์ฒœ์ฒœํžˆ ๊ฐ€ ๋ณผ ๊ฒƒ์ด์—์š”.

์œ„์˜ Logic์€ VO์•ˆ์— ๋“ค์–ด ์žˆ๋Š” getInqrySn (๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ)๊ฐ€ ๋“ค์–ด ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” Logic์ธ ๊ฒƒ์ด์—์š”. ๋งŒ์•ฝ ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ์—†๋‹ค๋ฉด ์ด ๊ธ€์€ ์‹ ๊ทœ ๋“ฑ๋ก์ด ๋  ๊ฒƒ์ด๊ณ , ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ˆ˜์ •Logic์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋  ๊ฒƒ์ด์—์š”.

์œ„์˜ if๋ฌธ์€ ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ๋น„์–ด์žˆ๋ƒ๊ณ  ๋ฌผ์–ด๋ณด๊ณ  ์žˆ์œผ๋‹ˆ ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด์—์š”.๊ทธ๋Ÿฐ ๋’ค ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๋ฅผ ์‘๋‹ต์œผ๋กœ ์ „๋‹ฌ ํ•ด ์ฃผ๊ธฐ ์œ„ํ•ด result Map์— ๋‹ด์•„ ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

 

} else {

    log.info("๋“ฑ๋ก ์š”์ฒญ ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ์กด์žฌ ํ•ฉ๋‹ˆ๋‹ค! ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค!");
    log.info("devInquryService.devInquryInsertUpdate(devInquryVO)์„ ํ˜ธ์ถœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!");
    devInquryService.devInquryUpdate(devInquryVO);

    log.info("Map result์— ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค!");
    result.put("resultSn", devInquryVO.getInqrySn());

} // if (CustomStringUtil.getString(devInquryVO.getInqrySn() == "" || devInquryVO.getInqrySn() == 0)) - else ๋

 

๋‹ค์Œ์€ else๋ฌธ์ด๋‹ˆ ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋“ค์–ด์˜ค๋Š” ๋กœ์ง์ด๊ณ , ๊ทธ๋ ‡๋‹ค๋ฉด ์ˆ˜์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ด์—์š”.

์—ญ์‹œ ๋งˆ์ง€๋ง‰์— ์ฒ˜๋ฆฌ๋œ ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๋ฅผ result Map์— ๋‹ด์•„ ์ค€ ๊ฒƒ์ด์—์š”.

 

log.info("Logic์ด ์™„๋ฃŒ ๋˜์—ˆ์œผ๋ฏ€๋กœ, 200 Code๋ฅผ Map result์— ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค!");
result.put("code", 200);

๊ทธ๋Ÿฐ ๋’ค HTTP Status Code๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด result Code์— ํ•ด๋‹น Code๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

} catch (Exception e) {

    log.info("๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก / ์ˆ˜์ •์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ(๊ถŒํ•œ ๋ฌธ์ œ)ํ•˜์—ฌ catch๋ฌธ์ด ์‹คํ–‰ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");

    e.printStackTrace();

    log.warn(e.getMessage());

    log.info("Logic์ด Error๋กœ 401 Code๋ฅผ Map result์— ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค!");
    result.put("code", 401);

    return result;

} // try - catch ๋

return result;

 

ํ•ด๋‹น try - catch๋ฌธ์€ ๊ถŒํ•œ์ด ์žˆ๋ƒ ์—†๋ƒ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ด์—์š”. ํ•ด๋‹น Logic์— ๊ถŒํ•œ์ด ์—†๋Š” ์ด์šฉ์ž๊ฐ€ ์ ‘๊ทผ์„ ํ•˜์—ฌ Logic์„ ์š”์ฒญํ•˜๋ฉด catch๋ฌธ์— ๋น ์ ธ์„œ 401 Http State Code๋ฅผ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด result Map์— ํ•ด๋‹น Code๋ฅผ ์ง‘์–ด ๋„ฃ์–ด์คฌ๊ณ , ๋ฐ˜ํ™˜์„ ํ•˜์—ฌ ์‘๋‹ต ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด๊ณ ,

catch๋ฌธ์— ๋น ์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด try๋ฌธ์—์„œ ์ฒ˜๋ฆฌ๋œ ์‘๋‹ต๊ฐ’๋“ค์„ ๋ชจ์€ result Map์„ ๋ฐ˜ํ™˜ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

    ๐Ÿ”ฝ  DevInquryService.java

 

 

์œ„์˜ Service๋Š” interface๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ๊ฒŒ์‹œํŒ ๋“ฑ๋ก Method๋ฅผ ์ถ”์ƒ Method๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด์—์š”. 

 

 

    ๐Ÿ”ฝ  DevInquryServiceImpl.java

 

 

๊ทธ๋ฆฌ๊ณ , Interface๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ Method๋ฅผ ์žฌ์ •์˜(Override)๋ฅผ ํ†ตํ•ด Service Logic์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด์—์š”.
์ด๋ ‡๊ฒŒ ํ•œ ์ด์œ ๋Š” ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… DI(Dependency Injection)๋ฅผ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ํ•œ ๊ฒƒ์ด์—์š”. ์ด ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ๋Š” '์ด ๊ณณ'์— ์ž์„ธํžˆ ์ค€๋น„ ํ•ด ๋‘˜๊ฒŒ์š”!

 

28๋ฒˆ์งธ ์ค„ @Transactinal์— ๋Œ€ํ•œ ์ •๋ฆฌ ์ž๋ฃŒ๋Š” '์ด ๊ณณ'์— ์ •์„ฑ์Šค๋Ÿฝ๊ฒŒ ์ค€๋น„ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค!

 

@Slf4j๋Š” ์ฝ˜์†”์— Log๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ Annotaion์ธ ๊ฒƒ์ด์—์š”. ์ฃผ๋‹ˆํ•˜๋ž‘์€ ์–ด๋””์„œ ๋ถ€ํ„ฐ ์–ด๋””๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฐœ๋ฐœ๋‹จ๊ณ„์—์„œ๋Š” ์•Œ๊ณ  ์‹ถ์–ด์„œ ๋˜๋„๋ก ๊ตฌํ˜„๋œ ๋‚ด์šฉ์— ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์ถœ๋ ฅ ๋˜๋„๋ก ํ•˜๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค.

 

์ž! ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ DB Handling์„ ์œ„ํ•ด Mapper Class์— Method๋ฅผ ํ˜ธ์ถœ ํ•ด์„œ ๋ถˆ๋Ÿฌ ๋ณด๋„๋ก ํ• ๊ป˜์š”!

 

 

    ๐Ÿ”ฝ  DevInquryMapper.java

 

 

์—ญ์‹œ Mapper Class๋ฅผ Interface๋กœ ๋งŒ๋“ค์—ˆ๊ณ , ํ•„์š”ํ•œ Method๋Š” ์ถ”์ƒ Method๋กœ ๋งŒ๋“ค์–ด ์ค€ ๊ฒƒ์ด์—์š”.
๊ทธ๋ฆฌ๊ณ , @Mapper๋ฅผ ํ†ตํ•ด์„œ ์ด Class๊ณผ ์—ฐ๊ฒฐ๋  ๊ตฌํ˜„ xml File๊ณผ ์—ฐ๊ฒฐ์„ ํ•ด ์ค„ ๊ฒƒ์ด์—์š”.

 

@Mapper.class

๋ฐ˜์‘ํ˜•

 

Mapper ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ฝ”๋“œ๋Š” ๋‹จ์ˆœํžˆ meta annotation์ด ๋ถ™์–ด ์žˆ๊ณ , ์•ˆ์— ํŠน๋ณ„ํ•œ ๋‚ด์šฉ์€ ์—†์–ด ๋ณด์ด๋Š” ๊ฒƒ์ด์—์š”. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ MyBatis์˜ mappers๋ฅผ ์œ„ํ•œ marker interface๋กœ ์ด์šฉ๋˜๊ณ , SQL์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ธ ๊ฒƒ์ด์—์š”. ์ด ์นœ๊ตฌ๋Š” Mybatis3.0 ๋ถ€ํ„ฐ ์ƒ๊ฒผ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋ฐ‘์— Mapper.xml์— Name Space์— ํŒจํ‚ค์ง€๋ช…์„ ํฌํ•จํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์„ ์ ์–ด์ฃผ๋ฉด ์—ฐ๊ฒฐ์ด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

    ๐Ÿ”ฝ  DevInquryMapper.xml

 

 

์ด ์นœ๊ตฌ๊ฐ€ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก์‹œ์— SQL ๋ฌธ์„ DB์— ๋˜์ ธ์ค„ Mapper ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด์ธ ๊ฒƒ์ด์—์š”.

<mapper namespace> ์ด ๊ณณ์— ์œ„์— ์ด์•ผ๊ธฐ ํ–ˆ๋˜ Mapper ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ๋ฉด ํ•ด๋‹น Mapper ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ์ด ๋˜๊ณ ,
<insert> id ์†์„ฑ์— Mapper ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ถ”์ƒ Method๋ช…์„ ์จ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ฆฌ๊ณ , parameterType ์†์„ฑ์€ ์ด xml์— ์–ด๋–ค ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด ์ค„ ๊ฒƒ์ด๋ƒ๊ณ  ์ดํ•ด ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์ฃผ๋‹ˆํ•˜๋ž‘์€ VO ์ž์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ต๋‹ˆ๋‹ค!

๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก์ด๊ธฐ ๋•Œ๋ฌธ์— INSERT ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๊ณ , tb_com_inqry ๋ผ๋Š” Table์— 9 ~ 18 Line Column์— Matching๋  ๊ฐ’๋“ค์„ #{๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฐ์ฒด์˜ Member ๋ณ€์ˆ˜๋ช…}์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ•œ๊ฒŒ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. 7๋ฒˆ์งธ ์ค„์— `<![CDATA[...]]>` ์ด ์นœ๊ตฌ๋Š” ๋Œ€์ฒด ๋ฌด์—‡์ผ๊นŒ์š”?

์ผ๋‹จ, ์ด ์นœ๊ตฌ๋ฅผ ํ’€์–ด ์“ฐ๋ฉด `Character Data` ์ฆ‰, '๋ฌธ์ž ๋ฐ์ดํ„ฐ'๋ผ๋Š” ๋œป์ธ ๊ฒƒ์ž‰์—์š”.
์ด ์šฉ์–ด๋ฅผ ์ข€ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์ด์•ผ๊ธฐ ํ•˜์ž๋ฉด '(Unparsed) Character Data' ์ฆ‰, Parsingํ•˜์ง€ ์•Š์€ ๋ฌธ์ž ๋ฐ์ดํ„ฐ๋ผ๋Š” ์˜๋ฏธ์ธ ๊ฒƒ์ด์—์š”. ์ด์— ๋ฐ˜๋Œ€๋˜๋Š” ์นœ๊ตฌ๋Š” 'PCDATA'๋ผ๊ณ  ๋ถ€๋ฅธ ๋‹ต๋‹ˆ๋‹ค!

 

์˜ˆ์‹œ๋ฅผ ํ•œ๋ฒˆ ๋“ค์–ด ๋ณผ๊ฒŒ์š”. ์œ„์— ๋‚ด์šฉ์— Text๋ฅผ ์ถœ๋ ฅ ํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

์ด๊ฒƒ์€ ![CDATA[]] ๋ฅผ ์“ฐ์ง€ ์•Š์•˜์„ ๋•Œ ๋ชจ์Šต์ด๊ณ , ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ์ด์—์š”.

 

 

 

์ฐจ์ด๊ฐ€ ๋Š๊ปด์ง€์‹œ๋‚˜์š”? ์ด๋ ‡๋“ฏ <![CDATA[...]]๋Š” ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” Text๊ฐ€ Parsing ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์œ„์— mapper.xml์—์„œ๋Š” ๋ฐ”๋กœ SQL๋ฌธ์ด Parsing ๋˜์–ด ๊ธฐ๋Šฅ์„ ์žƒ์–ด๋ฒ„๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด ๋ž๋‹ˆ๋‹ค!

 

 

๐Ÿ“ฃ ๊ฒฐ๊ณผ

 

Postman์„ ํ†ตํ•ด ๋“ฑ๋ก์„ ํ•ด ๋ณด์•˜๋Š”๋ฐ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—์š”. ํ•ด๋‹น ๋‚ด์šฉ์€ '์ด ๊ณณ'์— ์ •๋ฆฌ ํ•ด์„œ ์ค€๋น„ ํ•ด ๋‘˜๊ฒŒ์š”!

 

 

Request Body์— ๋“ค์–ด๊ฐˆ ๋ถ€๋ถ„์— ๊ผญ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š” ๋‚ด์šฉ์„ ์ œ์™ธํ•˜๊ณ , ์œ„์— Exception์„ ์ฒ˜๋ฆฌํ•œ ๋’ค Request๋ฅผ ๋ณด๋‚ด๋‹ˆ ์ •์ƒ ์ฒ˜๋ฆฌ ๋œ ๊ฒƒ์ด์—์š”.

 

 

DB์—๋„ ์ •์ƒ์ ์œผ๋กœ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

๐Ÿš€ ๊ฐœ๋ฐœ ๊ด€๋ จ Q&A ๊ฒŒ์‹œํŒ ์„œ๋น„์Šค - ์ˆ˜์ •

    ๐Ÿ”ฝ  DevInquryService.java

Controller๋Š” ๋“ฑ๋ก๊ณผ ์ˆ˜์ •์ด ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ฆฌ๊ณ , ์š”์ฒญ Body์— ๊ฒŒ์‹œ๊ธ€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜์—ฌ ์—†์œผ๋ฉด ๊ธ€ ๋“ฑ๋ก์œผ๋กœ ํŒ๋‹จํ•˜๊ณ , ์žˆ์œผ๋ฉด ์ˆ˜์ •์œผ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

    ๐Ÿ”ฝ  DevInquryServiceImpl.java

 

๋ญ”๊ฐ€ ๋ฐ”๋€ ๊ฒƒ์€ Controller์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ฒ˜๋ฆฌ๋˜๊ณ , Service ๋‹จ์—์„œ๋Š” ๋‹จ์ง€ DB์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Method๋งŒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ฐจ ํ›„ ์ด ๋ถ€๋ถ„์€ ๋ณ€๊ฒฝํ•  ์˜ˆ์ • ์ž…๋‹ˆ๋‹ค.

 

 

    ๐Ÿ”ฝ  DevInquryMapper.java

 

 

 

 

    ๐Ÿ”ฝ  DevInquryMapper.xml

 

update Query๋ฅผ ์จ์„œ VO์— ๋“ค์–ด์˜จ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ(inqrySj), ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ(InqryCn), ํŒŒ์ผ ๊ด€๋ จ ์ผ๋ จ๋ฒˆํ˜ธ(fileSn), ์ˆ˜์ •์ผ, ์ˆ˜์ •์ž(upduserSn)์ผ๋ จ ๋ฒˆํ˜ธ, ๋น„๋ฐ€๊ธ€ ์—ฌ๋ถ€(secretAt)์— ๋Œ€ํ•ด ์ˆ˜์ •์„ ํ•˜๊ณ , ์ˆ˜์ •์€ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ์— ๋งž๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๋‚˜์ค‘์— ์ฃผ๋‹ˆํ•˜๋ž‘์€ and ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์„œ ํšŒ์› ์ผ๋ จ๋ฒˆํ˜ธ๋„ ํ™•์ธ์„ ํ•˜๋„๋ก ํ•ด์„œ ์ž๊ธฐ ์ž์‹ ์˜ ๊ฒŒ์‹œ๊ธ€๋งŒ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ Refactoring์„ ์ง„ํ–‰ํ•ด๋ณด๋ ค ํ•ด์š”.

 

 

 

์œ„์— ๊ธ€ ๋“ฑ๋ก ๋‹จ๊ณ„์—์„œ ๋“ฑ๋กํ•œ ๊ธ€์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜์ •์ด ๋˜๋‚˜ ํ™•์ธ ํ•ด ๋ณผ๊ฒƒ์ด์—์š”.

 

 

 

 

๐Ÿ“ฃ ๊ฒฐ๊ณผ

 

์‚ฌ์‹ค ๋ˆˆ์น˜ ์ฑ„์…จ๊ฒ ์ง€๋งŒ, ์ด Logic์€ RestFulํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด์—์š”.
๋ฐ”๋กœ ์ˆ˜์ •์€ Patch๋‚˜, Put Method๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋“ฑ๋ก๊ณผ ํ•จ๊ป˜ Post๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์—์š”.
์ด ๋ถ€๋ถ„๋„ ์ฐจ ํ›„ ๋ชจ๋“  ์„œ๋น„์Šค ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜๋ฉด ์ ์ฐจ Refactoring์„ ์ง„ํ–‰ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

์•ž์œผ๋กœ ํ•ด๋‹น Project์—์„œ ๋‹ค๋ฅธ ๊ฒŒ์‹œํŒ์— ๋“ฑ๋ก ๋ถ€๋ถ„์— ๋Œ€ํ•ด ํŠน๋ณ„ํ•œ ๋‚ด์šฉ์ด ์žˆ์ง€ ์•Š๋Š” ํ•œ ์ถ”๊ฐ€ ํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๊ณ , ์ฃผ๋‹ˆํ•˜๋ž‘์˜ Project๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์•„๋ž˜ Git Hub์—์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„๊ฒŒ์š”! 

 

 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•