๐Ÿ–ผ๏ธ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๊ฐ„์†Œํ™” โ€“ ์—…๋กœ๋“œ์—์„œ ์„œ๋ฒ„ ์ œ๊ณต์œผ๋กœ

์กฐ์ค€ํ˜•ยท2025๋…„ 4์›” 9์ผ
0

CHOP!

๋ชฉ๋ก ๋ณด๊ธฐ
16/20
post-thumbnail

๊ธฐ์กด์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด์„œ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋กœ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์ง€๋งŒ, ์ด์ œ๋Š” ์„œ๋ฒ„์—์„œ ๋ฉ”์ธ ์บ๋ฆญํ„ฐ ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž๋™์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ–ˆ๋‹ค. ์ด ์ „ํ™˜์€ ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์ด ์•„๋‹ˆ๋ผ, UX์™€ ์œ ์ง€๋ณด์ˆ˜ ๊ด€์ ์—์„œ๋„ ํฐ ์ด์ ์„ ๊ฐ€์ ธ์™”๋‹ค.

๐Ÿ”„ ๊ธฐ์กด ๋ฐฉ์‹: ์‚ฌ์šฉ์ž ์—…๋กœ๋“œ ๊ธฐ๋ฐ˜

์ดˆ๊ธฐ์—๋Š” ์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ด๋ฏธ์ง€ ๋“ฑ๋ก์„ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค:

 <input type="file">๋กœ ํŒŒ์ผ ์„ ํƒ
  • FormData๋กœ ๋ฌถ์–ด์„œ PostResourceWing์œผ๋กœ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

  • ์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€ ID๋ฅผ PatchProfileWing์— logo_id๋กœ ์„ค์ •ํ•˜์—ฌ ํ”„๋กœํ•„์— ๋“ฑ๋ก

const wing = PostResourceWing(formData);
const response = await shootingStar.launch<{ id: string }>(wing);
const uploadedImageId = response.data.id;

const profileUpdateBody: ProfileUpdateBody = {
  foreign_ids: {
    logo_id: uploadedImageId,
  },
};

ํ•˜์ง€๋งŒ ์ด ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค:

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋ฒˆ ์ด๋ฏธ์ง€๋ฅผ ๊ณจ๋ผ์•ผ ํ•จ (๊ท€์ฐฎ์Œ)

  • ์—…๋กœ๋“œ ๊ณผ์ • ์ค‘ ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

  • ์„œ๋ฒ„ ๋ณด์•ˆ ์ด์Šˆ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ

  • ์บ๋ฆญํ„ฐ์™€ ๊ด€๋ จ ์—†๋Š” ์ด๋ฏธ์ง€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ

โœ… ๊ฐœ์„  ๋ฐฉ์‹: ๋ฉ”์ธ ์บ๋ฆญํ„ฐ ์ •๋ณด ๊ธฐ๋ฐ˜ ์ž๋™ ์ด๋ฏธ์ง€

์ด์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„๋กœ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜์ง€ ์•Š์•„๋„, ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์ดํ”Œ ๋ฉ”์ธ ์บ๋ฆญํ„ฐ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋ฅผ ์„ธํŒ…ํ•œ๋‹ค.

๐Ÿ“ฆ ํ•ต์‹ฌ ํ๋ฆ„

  1. ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ „์ฒด๋ฅผ ๋ฐ›์•„์˜ด (GetMyUserWing)

  2. characters ๋ฐฐ์—ด ์ค‘ is_main === true์ธ ์บ๋ฆญํ„ฐ๋ฅผ ์ฐพ์Œ

  3. ํ•ด๋‹น ์บ๋ฆญํ„ฐ์˜ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ์œ ํ‹ธ ํ•จ์ˆ˜ getImagePathFromProfile()๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ

const mainChar = myProfileResponse.data.characters.find(char => char.is_main);
setMainCharacter(mainChar || null);
setMyProfileImage(getImagePathFromProfile(myProfileResponse.data));

๐Ÿงฉ ์œ ํ‹ธ ํ•จ์ˆ˜: getImagePathFromProfile

function getImagePathFromProfile(profile: ProfileData) {
  if (profile === undefined) {
    return ANONYMOUS_LOGO_ID;
  }
  if (profile.foreign_ids.logo_id) {
    return getImagePath(profile.foreign_ids.logo_id);
  } else if (profile.characters.length > 0) {
    for (const character of profile.characters) {
      if (character.is_main) {
        return getImagePath(character.logo_id);
      }
    }
  }
  return ANONYMOUS_LOGO_ID;
}`;
}

๋กœ์ง์ด ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์— ๋ถ„๋ฆฌ๋˜์–ด ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ํ™•๋ณด

์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋˜๋ฏ€๋กœ img src={...}๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โœจ ํšŒ๊ณ 

โ€œ์œ ์ €๊ฐ€ ์‚ฌ์ง„์„ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ž์œ ๋ณด๋‹ค, ์ž๋™ ์ œ๊ณต๋˜๋Š” ์ผ๊ด€์„ฑ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.โ€

์ฒ˜์Œ์—๋Š” ์œ ์ €๊ฐ€ ์ง์ ‘ ์‚ฌ์ง„์„ ๊ณ ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒŒ ๋‹น์—ฐํžˆ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ์„ฑ ํ…Œ์ŠคํŠธ์™€ ํ”ผ๋“œ๋ฐฑ์—์„œ๋Š”

  1. ๋ฉ”์ธ ์บ๋ฆญํ„ฐ ์‚ฌ์ง„์ด ๊ฐ€์žฅ โ€˜๊ทธ ์‚ฌ๋žŒโ€™์„ ์ž˜ ๋‚˜ํƒ€๋ƒ„

  2. ์„œ๋ฒ„ ์ผ๊ด€์„ฑ ์œ ์ง€๊ฐ€ ์‰ฌ์›€

๊ฒฐ๊ตญ ์ž๋™ํ™”๋œ ๋ฐฉ์‹์ด ๋” ์ง๊ด€์ ์ด๊ณ , ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ + UX ๊ฐ„๊ฒฐ์„ฑ ์ธก๋ฉด์—์„œ๋„ ๋” ๋‚ซ๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค.

์•ž์œผ๋กœ๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๊ตฌ์กฐ๋ณด๋‹ค ์„œ๋ฒ„๊ฐ€ ์•Œ์•„์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ์ตœ๋Œ€ํ•œ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ์„ ํ•  ๊ณ„ํš์ด๋‹ค.

profile
์ฝ”๋ฆฐ์ด

0๊ฐœ์˜ ๋Œ“๊ธ€