๊ด€๋ฆฌ ๋ฉ”๋‰ด

C-log

[FE]jsonํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๊ฐ ๋ฌธ์ œ ์ด๋ฏธ์ง€ ๋„์šฐ๊ธฐ(1) ๋ณธ๋ฌธ

๐Ÿ’ป๊ฐœ๋ฐœ ๋…ธํŠธ/๋‚˜๋งŒ์˜ ์‹œํ—˜์ง€

[FE]jsonํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๊ฐ ๋ฌธ์ œ ์ด๋ฏธ์ง€ ๋„์šฐ๊ธฐ(1)

4:Bee 2024. 2. 29. 12:34
728x90

ํ˜„์žฌ ๋ฐฑ์—”๋“œ๋กœ ๋ถ€ํ„ฐ ์•„์ง ์™„๋ฒฝํ•œ api๋ฅผ ์ „๋‹ฌ ๋ฐ›์ง€ ์•Š์•˜๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ ์•„์ง ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒƒ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋‹ค. ๋ฟ๋งŒ์•„๋‹ˆ๋ผ css๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ์ด๋ฏธ์ง€๋“ค์˜ className๋„ api๋กœ ์ œ์ž‘ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง์ ‘ ์ƒ˜ํ”Œ๋กœ ์ œ์ž‘๋œ jsonํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ • ํ•ด๋ณด๋ คํ•œ๋‹ค. ๋” ๋‚˜์•„๊ฐ€์„œ ๊ธ€์ž ์‚ฌ์ด์— ์ด๋ฏธ์ง€๊ฐ€ ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„๋“ค์„ ์ƒ˜ํ”Œ๋กœ ์ž‘์—…ํ•ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์šฐ์„  ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•œ jsonํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 
{
    "sample": [
        {
            "id": "1",
            "question": "๋‹ค์Œ ์ค‘ ์ด์ค‘๋Ÿ‰ <img src=1/> 1.5ํ†ค ํ”ผ๊ฒฌ์ธ ์Šน์šฉ์ž๋™์ฐจ๋ฅผ 4.5ํ†ค ํ™”๋ฌผ์ž๋™์ฐจ๋กœ ๊ฒฌ์ธํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•œ ์šด์ „๋ฉดํ—ˆ์— ํ•ด๋‹นํ•˜์ง€ ์•Š์€ \n๊ฒƒ์€?",
            "options": [
                "โ‘  ์ œ1์ข… ๋Œ€ํ˜•๋ฉดํ—ˆ ๋ฐ ์†Œํ˜•๊ฒฌ์ธ์ฐจ๋ฉดํ—ˆ",
                "โ‘ก ์ œ1์ข… ๋ณดํ†ต๋ฉดํ—ˆ ๋ฐ ๋Œ€ํ˜•๊ฒฌ์ธ์ฐจ๋ฉดํ—ˆ",
                "โ‘ข ์ œ1์ข… ๋ณดํ†ต๋ฉดํ—ˆ ๋ฐ ์†Œํ˜•๊ฒฌ์ธ์ฐจ๋ฉดํ—ˆ",
                "โ‘ฃ ์ œ2์ข… ๋ณดํ†ต๋ฉดํ—ˆ ๋ฐ ๋Œ€ํ˜•๊ฒฌ์ธ์ฐจ๋ฉดํ—ˆ"
            ],
            "questionImageUrls": [],
            "questionImageDescriptions": [
                ""
            ],
            "answers": [
                "4"
            ],
            ...
}
 

์šฐ์„  ๊ธ€์ž ์‚ฌ์ด์— ์‚ฝ์ž…๋˜์–ด ์žˆ๋Š” ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋Š” ์–ด๋””์— ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”์ง€ ํ‘œ๊ธฐํ•˜๊ธฐ ์œ„ํ•œ '์ด๋ฏธ์ง€ ๋งˆํ‚น'์ด๋‹ค. ์ด๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ jsonํŒŒ์ผ์„ ๋ฆฌ์•กํŠธ๋กœ ๋ Œ๋”๋ง ํ•ด์„œ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ์ง์ ‘ ํŒŒ์‹ฑํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” img ํƒœ๊ทธ๋กœ ์ „ํ™˜ํ•˜๋ ค ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค๊ฒŒ ๋œ ํ•จ์ˆ˜๋Š” ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.

 
//HTML ๋ฌธ์ž์—ด์— ํฌํ•จ๋œ <img> ํƒœ๊ทธ๋ฅผ ์‹ค์ œ ์ด๋ฏธ์ง€๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
  const parseImageTag = (question_img) => {
    // ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ <img src=1> ๋ฌธ์ž์—ด์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
    const imgRegex = /<img\s+src=1\s*\/?>/g;
    // ๋Œ€์ฒดํ•  ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
    return question_img .replace(imgRegex, '<img src= "
https://png.pngtree.com/thumb_back/fh260/background/20230609/pngtree-three-puppies-with-their-mouths-open-are-posing-for-a-photo-image_2902292.jpg"   
/>'
);
};
 

imgRegex๋ณ€์ˆ˜์—๋Š” jsonํŒŒ์ผ์— <img src = 1/>ํƒœ๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ •๊ทœ ํ‘œํ˜„์‹ '/<img\s+src=1\s*\/?>/g'์ธ ๋ฌธ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ๊ธฐ์ž… ํ•ด์ฃผ๊ณ  ๋ณ€ํ™˜์ด ์ด๋ฃจ์–ด์งˆ json์˜ question๋ฌธ์ž์—ด์„ ํŒŒ๋ผ๋งคํ„ฐ๋กœ ๊ฐ€์ง€๊ณ  ์™€ replace๋ฅผ ํ†ตํ•ด์„œ imRegex์™€ ๋‚ด๊ฐ€ ์œˆํ•˜๋Š” img ํƒœ๊ทธ๋กœ ์ „ํ™˜์„ ํ•ด์ค€๋‹ค. ์ดํ›„ ํ•ด๋‹น ํ•จ์ˆ˜ ํŒŒ๋ผ๋งคํ„ฐ์— ๊ฐ ํ•„์š”ํ•œ ์ •๋ณด ๋“ค์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ด๋‹ค. ์•ž์œผ๋กœ className์ด๋‚˜ image_url๋“ค์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 
//HTML ๋ฌธ์ž์—ด์— ํฌํ•จ๋œ <img> ํƒœ๊ทธ๋ฅผ ์‹ค์ œ ์ด๋ฏธ์ง€๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
  const parseImageTag = (question_img) => {
    // ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ <img src=1> ๋ฌธ์ž์—ด์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
    const imgRegex = /<img\s+src=1\s*\/?>/g;
    const tagReplace = '<img src="https://png.pngtree.com/thumb_back/fh260/background/20230609/pngtree-three-puppies-with-their-mouths-open-are-posing-for-a-photo-image_2902292.jpg" />'
'
    // ๋Œ€์ฒดํ•  ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
    return question_img.replace(imgRegex, tagReplace);
  };
 

์ด๋Ÿฐ ์‹์œผ๋กœ ์ „ํ™˜์ด ๋  ๊ฒƒ์ด๋‹ค. ์œ„์˜ ์˜ˆ์‹œ๋กœ ์ „ํ™˜์ด ๋  ๋•Œ ๋‹ค์‹œ ํฌ์ŠคํŒ…์„ ํ•ด๋ณด๊ฒ ๋‹ค.

์ด์ œ parseImageTag๋ฅผ jsx์— ์ ์šฉํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    <ol>
        {data.map((item) => (
          <li key={item.id}>
            <h1>test</h1>
            <p dangerouslySetInnerHTML={{ __html: parseImageTag(item.question) }} />
            {item.options.map((option, index) => (
              <div key={index}>{option}</div>
            ))}
          </li>
        ))}
     </ol>

์—ฌ๊ธฐ์„œ ๊ต‰์žฅํžˆ ๋‚ฏ์„  ๋ฌธ๋ฒ•๋“ค์ด ๋‚˜์˜ค๋Š”๋ฐ 'dangerouslySetInnerHTML'์™€ ' __html:'์ด๋‹ค. ์•„๋งˆ๋„ ํ•ด๋‹น ๋ฌธ๋ฒ•์€ parseImageTage์— ์žˆ๋Š” ํƒœ๊ทธ๊ฐ€ ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด ์ ธ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ•์ œ๋กœ ๋ฌธ์ž์—ด์„ html๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ๋‹ค. dangerouslySetInnerHTML์„ ์ฐพ์•„๋ณด๋‹ˆ React ๋ฌธ๋ฒ•์ด๋ฉฐ, HTML์„ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ƒํ™ฉ์€ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜จ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ์— HTML ํƒœ๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๋ ‡๋‹ค. ์ด ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ๋ฌธ์ œ์‚ฌํ•ญ์„ ์•ผ๊ธฐ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ React์—์„œ๋Š” HTML ํƒœ๊ทธ๋ฅผ ์ง์ ‘ ๋ Œ๋”๋งํ•  ๊ฒฝ์šฐ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ dangerouslySetInnerHTML ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด React๊ฐ€ HTML์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ Œ๋”๋งํ•˜๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๊ฒƒ์€ dangerouslySetInnerHTML์„ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์ „์— ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์Šค์—์„œ ๋ฐ›์€ HTML ์ฝ”๋“œ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด๋‚˜ ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฅผ ํ†ตํ•ด ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์ƒ์˜ ์œ„ํ—˜์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ ์‹œ์—๋Š” ๊ผญ ์ทจ์•ฝ์ ์— ๋Œ€ํ•œ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง‘๊ณ  ๋„˜์–ด๊ฐ€์•ผํ•˜๋Š” ๊ฒƒ์€ '์ด๋ฏธ์ง€ ๋งˆํ‚น'์„ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ Œ๋”๋งํ•  HTML์€ imRegex๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, '์ด๋ฏธ์ง€ ๋งˆํ‚น'์ด HTML๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋˜ ๋งˆํฌ๋‹ค์šด์ด๋˜ ์•„๋ฌด๋Ÿฐ ์ƒ๊ด€์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

728x90
Comments