๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ReactNative

[ReactNative] JSX๋ž€? HTML vs ReactNative ํƒœ๊ทธ ์ด์ •๋ฆฌ!

by IworldT 2021. 8. 19.
๋ฐ˜์‘ํ˜•

๋ฆฌ์•กํŠธ๋Š” JSX ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ, ์ฆ‰ ํƒœ๊ทธ๋“ค์„ ๊ตฌ์„ฑํ•˜๋ฉฐ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ HTML๊ณผ React, React Native ๊ฐ„ ์œ ์‚ฌํ•œ ํƒœ๊ทธ๋“ค์ด ์ข…์ข… ๋ณด์ด๋Š”๋ฐ, ์˜ค๋Š˜์€ ๊ทธ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋Š” ํฌ์ŠคํŒ…์„ ํ•˜๊ฒ ๋‹ค!

 

๋ฆฌ์•กํŠธ์™€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฃผ๋ ฅ์€ ๋ฐ”๋กœ JSX๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋„ JSX์˜ ์‚ฌ์šฉ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ถŒํ•˜๊ณ  ์žˆ๋‹ค.

React๋Š” JSX ์‚ฌ์šฉ์ด ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ์€ JavaScript ์ฝ”๋“œ ์•ˆ์—์„œ UI ๊ด€๋ จ ์ž‘์—…์„ ํ•  ๋•Œ ์‹œ๊ฐ์ ์œผ๋กœ ๋” ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ React๊ฐ€ ๋”์šฑ ๋„์›€์ด ๋˜๋Š” ์—๋Ÿฌ ๋ฐ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ์„  JSX์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž!

 JSX = JavaScript + XML 

 

JSX๋ž€?

JSX๋Š” JavaScript์˜ ํ™•์žฅ ๋ฒ„์ „์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. XML(eXtensible Markup Language)๋Š” ํƒœ๊ทธ(tag, <>)์˜ ์ด๋ฆ„์„ ์ž์œ ๋กญ๊ฒŒ ์ง“๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. ์ด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” JS์— ์ ์šฉ ์‹œํ‚จ ๊ฒƒ์ด ๋ฐ”๋กœ JSX์ด๋‹ค. ์ด์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

const element = <h1>Hello, world!</h1>;

element๋ผ๋Š” ๋ณ€์ˆ˜ ์•ˆ์— <h1>ํƒœ๊ทธ์™€ ๊ทธ์˜ ์ž์‹ ์š”์†Œ๋ฅผ ๋‹ด์•„๋‘๋Š” ์ด ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋กœ JSX์ธ ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ์จ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํƒœ๊ทธ ์•ˆ์— ์‰ฝ๊ฒŒ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

const msg = "Hello World!";
<Text>{msg}</Text>

๋ฌธ์ž์—ด์ด ๋‹ด๊ธด msg ๋ณ€์ˆ˜๋ฅผ ํƒœ๊ทธ ๋‚ด์— ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋ฌธ๋ฒ•์€ ํƒœ๊ทธ์˜ ์ž์‹ ์š”์†Œ๋กœ ์ค‘๊ด„ํ˜ธ{ }๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ณ€์ˆ˜์— ํƒœ๊ทธ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์œ„์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๋ณต์žกํ•œ ํƒœ๊ทธ ์š”์†Œ๋“ค๋„ ํ•˜๋‚˜์˜ ์ž์‹ ์š”์†Œ๋กœ ์‰ฝ๊ฒŒ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

JSX๋Š” ํ•œ ํŒŒ์ผ์— CSS, HTML, JavaScript๊ฐ€ ํ˜ผ์šฉ๋˜์–ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๊ทธ๋™์•ˆ ์ด ์„ธ ์–ธ์–ด๋ฅผ ํŒŒ์ผ๋ณ„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋”ฐ๋กœ ์ž‘์—…ํ•œ ๊ฒƒ์€ ๋ฌด์ฒ™ ๋‹น์—ฐํ•œ ์ผ์ด์—ˆ๊ธฐ์— JSX์˜ ๋“ฑ์žฅ์€ ํฐ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์™”๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋งŒํผ ์˜๊ฒฌ์ด ๊ฐˆ๋ฆฌ๋Š” ์–ธ์–ด์ด๊ธฐ๋„ ํ–ˆ๋‹ค.

๋ฆฌ์•กํŠธ๊ฐ€ JSX๋ฅผ ํ‘œ์ค€ JavaScript ์–ธ์–ด์ฒ˜๋Ÿผ ์ด์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ JS ์ปดํŒŒ์ผ๋Ÿฌ์ธ ๋ฐ”๋ฒจ(Babel)์ด ํฐ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Ÿฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์— ๋” ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ๊ฐ„๊ฒฐํ•œ JSX ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•จ์œผ๋กœ์จ createElement๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , ์›น ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋ฐ”์ผ ์•ฑ ๊นŒ์ง€ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์–ธ์ œ๋“  ํƒœ๊ทธ์˜ ์ด๋ฆ„์„ ์ƒˆ๋กœ ์ง€์–ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ ์š”์†Œ๋“ค์„ ์ž˜ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ฒ ๋‹ค. HTML, React ์›น, React Native์˜ ๊ธฐ๋ณธ ๋‚ด์žฅ ํƒœ๊ทธ๊ฐ€ ๋™์ผํ•˜์ง€๋Š” ์•Š๋‹ค. ๊ธฐ๋Šฅ์ด ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์ง์— ๋”ฐ๋ผ ํƒœ๊ทธ์˜ ์ด๋ฆ„๋„ ๋‹ฌ๋ผ์กŒ์œผ๋‹ˆ, ๊ทธ๊ฒƒ์„ ๋น„๊ตํ•˜์—ฌ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

 

React Native Component

์šฐ์„  React Native ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ฐœ์ทŒํ•œ ์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž.

๋‹ค์–‘ํ•œ <View> ํƒœ๊ทธ์™€ <Text> ํƒœ๊ทธ, <Image> ํƒœ๊ทธ๊ฐ€ ๊ธฐ๋ณธ ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋กœ ์ œ๊ณต๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์ด ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ์กด์— ์•Œ๊ณ  ์žˆ๋˜ HTML, React์˜ ๊ทธ๊ฒƒ๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์กŒ๋Š”์ง€, ๋ฌด์—‡๊ณผ ๋น„์Šทํ•œ์ง€ ๋น„๊ตํ•˜์—ฌ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. 

 

์ผ๋ฐ˜์ ์ธ HTML, ์›น ์š”์†Œ

<div>, <p>, <span>, <a>, <li>, <ul>, <ol>, <img> ๋“ฑ

 

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ

<View>, <Image>, <Text>, <FlatList> ๋“ฑ

 

HTML์˜ ์š”์†Œ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋งคํ•‘๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œ๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

HTML React Native
div <View>
img <Image>
span, p <Text>
ul/ol, li <FlatList>

 

<View>

๋ชจ๋ฐ”์ผ ์•ฑ UI์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ ๋‹จ์œ„๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์•„๊นŒ ์œ„์˜ ์‚ฌ์ง„์—์„œ ๋ณด์•˜๋“ฏ, ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ ์•„๋ž˜์—๋Š” View๊ฐ€ ๊น”๋ ค์žˆ๋‹ค.

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” View๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

 View is a container that supports layout with flexboxstylesome touch handling, and accessibility controls.
View๋Š” flexbox, style, ํ„ฐ์น˜ ๋‹ค๋ฃจ๊ธฐ์™€ ์ ‘๊ทผ์„ฑ ์ œ์–ด์™€ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ์„ ์ง€์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ž…๋‹ˆ๋‹ค.

ํ•œ๋งˆ๋””๋กœ ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐ ์š”์†Œ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋‹จ์œ„๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

<Text>

ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. HTML์—์„œ๋Š” <div>์ด๋“  <p>์ด๋“  ์–ด๋””์—๋‚˜ ํ”Œ๋ ˆ์ธ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์—์„œ๋Š” ์›น๊ณผ ํ…์ŠคํŠธ ๋ Œ๋”๋ง ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ๋Š” ์ž์‹์š”์†Œ๋กœ ํ”Œ๋ ˆ์ธ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ <Text>๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

<Text> Right </Text>

<View> Wrong </View>

์œ„์™€ ๊ฐ™์ด Text ๋‚ด์—๋Š” ์ผ๋ฐ˜ ํ”Œ๋ ˆ์ธ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฅผ ์ œ์™ธํ•œ View์™€ ๊ฐ™์€ ํƒœ๊ทธ ๋‚ด์— ํ”Œ๋ ˆ์ธ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค๊ฐ€๋Š” ์˜ค๋ฅ˜๋ฅผ ๋งž์ดํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ <View> ๋‚ด์— ํ”Œ๋ ˆ์ธ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด <View>์˜ ์ž์‹์š”์†Œ๋กœ <Text>๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ทธ ์•ˆ์— ํ”Œ๋ ˆ์ธ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค.

 

<Image>

Image๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ ์žˆ๋˜ HTML์˜ <img> ํƒœ๊ทธ์™€ ๋น„์Šทํ•˜๋‹ค. source ์†์„ฑ์„ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ž…๋ ฅํ•˜์—ฌ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ํ•œ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ ์€, HTML์—์„œ๋Š” css ์†์„ฑ์œผ๋กœ background-image ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜์˜ ์š”์†Œ๊ฐ€ ์•„๋‹Œ ์š”์†Œ์˜ ์Šคํƒ€์ผ ์†์„ฑ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ์€ ๋ชจ๋“  ๊ฒƒ์˜ ์ปดํฌ๋„ŒํŠธํ™”์ด๋ฏ€๋กœ, ์š”์†Œ์˜ ์†์„ฑ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋งŒ์•ฝ ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐฐ๊ฒฝ ์†์„ฑ์œผ๋กœ์จ ์ด๋ฏธ์ง€๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

<Image style={{height:'100%',width:'100%',resizeMode:'cover'}}
	source={require("์ด๋ฏธ์ง€๊ฒฝ๋กœ")}>

style ์†์„ฑ์˜ resizeMode๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€์˜ ๋น„์œจ์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

O'REILLY์˜ React Native ์ฑ…์—์„œ ๋ฐœ์ทŒ

์œ„์˜ ์ด๋ฏธ์ง€๋กœ resizeMode์˜ ๊ฐ ์˜ต์…˜์— ๋Œ€ํ•ด ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

Contain ์€ ์„ธ๋กœ๋‚˜ ๊ฐ€๋กœ ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ 100%์ผ ๋•Œ ๊นŒ์ง€๋งŒ ์ž์‹ ์˜ ๋น„์œจ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Cover ๋Š” ๊ฐ€๋กœ์™€ ์„ธ๋กœ๊ฐ€ ๋‘˜ ๋‹ค 100% ์ด์ƒ์ด ๋  ๋•Œ ๊นŒ์ง€ ์ž์‹ ์˜ ๋น„์œจ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Stretch ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋น„์œจ์— ๋งž์ถฐ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ค๋Š˜์€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๊ฐœ๋ฐœ ๊ณต๋ถ€ 2์ผ์ฐจ๋กœ ์œ„์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ์— ์ฐฉ์ˆ˜ ํ•˜๊ธฐ ์ „ ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ๋“ค๋ถ€ํ„ฐ ์•Œ์•„๋ณด์•˜๋‹ค.

ํŒŒ์ดํŒ…!

 

์ฐธ๊ณ ํ•œ ์„œ์ ์€ https://iworldt.tistory.com/27 ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€