λ°˜μ‘ν˜•

Programming 70

[Html] select element μ—μ„œ dropdown icon λ°”κΎΈλŠ” 방법

Intro μ•ˆλ…•ν•˜μ„Έμš”. select element μ—μ„œ dropdown icon λ°”κΎΈλŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€ :) How to solve problem Option 1 Option 2 Option 3 /* Hide the default dropdown arrow */ .custom-select { appearance: none; /* For Firefox */ -webkit-appearance: none; /* For Chrome, Safari, Opera */ -moz-appearance: none; /* For Firefox */ background-image: url('custom-dropdown-icon.png'); /* Custom arrow icon */ background-pos..

Programming/Html 2024.04.23

[TypeScript] μ œλ„€λ¦­ μ»΄ν¬λ„ŒνŠΈ (generic component) μ •μ˜ 및 μ‚¬μš©λ°©λ²•

이 글은 원글을 μ°Έκ³ ν•˜μ—¬ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. Definition TypeScript GenericsλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ κ΅¬μ„±μš”μ†Œλ₯Ό μƒμ„±ν•˜λŠ” 방법을 μ œκ³΅ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€. genericsλŠ” ν”„λ‘œκ·Έλž¨μ΄ μž₯기적으둜 ν™•μž₯κ°€λŠ₯ν•  뿐만 μ•„λ‹ˆλΌ μœ μ—°ν•  수 μžˆλ„λ‘ 보μž₯ν•΄μ€λ‹ˆλ‹€. Example # Props interface Props { renderItem: (item: T) => React.ReactNode; keyExtractor: (item: T) => string; data: T[]; } data: μ œλ„€λ¦­ νƒ€μž… Tλ₯Ό 받을 λ°°μ—΄ μš”μ†Œ renderItem: νƒ€μž… T의 react μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ keyExtractor: ν‚€λ₯Ό μΆ”μΆœν•˜λŠ” ν•¨μˆ˜ # Component μ •μ˜ const GenericList = ({ data,..

νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € Yarn Berry λž€? (+ pnp system)

Intro μ•ˆλ…•ν•˜μ„Έμš”. 이번 μƒˆλ‘œ ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•˜λ©΄μ„œ yarn μ—μ„œ yarn berryλ₯Ό λ„μž…ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ‹œκ°„μ—λŠ” Yarn Berry에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. What is yarn berry? Yarn BerryλŠ” JS νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €μΈ Yarn의 λ‹€μŒ λ²„μ „μž…λ‹ˆλ‹€. yarn version 2λΆ€ν„° yarn berry라고 λΆ€λ¦…λ‹ˆλ‹€. What is the difference between yarn and yarn berry? κ°€μž₯ 달라진 점은 Plug'n'Play (PnP) μ‹œμŠ€ν…œμ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. PnP μ‹œμŠ€ν…œμ€ node_modules 폴더λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , νŒ¨ν‚€μ§€μ˜ 쒅속성을 ν”„λ‘œμ νŠΈμ˜ 단일 디렉토리 νŠΈλ¦¬μ— 직접 μ„€μΉ˜ν•©λ‹ˆλ‹€. 일반적으둜 npm μ΄λ‚˜ yarn version 1을 μ‚¬μš©ν• ..

[Understanding TypeScript] Section 1. μ‹œμž‘ν•˜κΈ°

이 글은 udemy의 Typescript :κΈ°μ΄ˆλΆ€ν„° μ‹€μ „ν˜• ν”„λ‘œμ νŠΈκΉŒμ§€ with React + NodeJS κ°•μ’Œλ₯Ό λ°”νƒ•μœΌλ‘œ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€ 1. ν™˜μ˜ pass 2. TypeScriptλž€ 무엇이며 μ™œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€? νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ superset μž…λ‹ˆλ‹€. μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ μ–Έμ–΄κ°€ μ•„λ‹Œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•΄ μƒˆλ‘œμš΄ κΈ°λŠ₯κ³Ό μž₯점을 μΆ”κ°€ν•˜λŠ” μ–Έμ–΄μž…λ‹ˆλ‹€. μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό JS둜 μ»΄νŒŒμΌν•˜λŠ” κ°•λ ₯ν•œ μ»΄νŒŒμΌλŸ¬μž…λ‹ˆλ‹€. νƒ€μž…μ„ μΆ”κ°€ν•˜μ—¬ λΈŒλΌμš°μ € λŸ°νƒ€μž„μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜κΈ° 전에 μ½”λ“œμ˜ μ—λŸ¬λ₯Ό 미리 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 개발 쀑 λŸ°νƒ€μž„ μ—λŸ¬λ‘œ λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό μ΄ˆκΈ°μ— μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 단점) λΈŒλΌμš°μ €μ™€ 같은 μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€. node.js도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 3..

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 16μž₯ ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈ(property attribute)λž€?

16.1 λ‚΄λΆ€ 슬둯과 λ‚΄λΆ€ λ©”μ„œλ“œ λ‚΄λΆ€ 슬둯 (internal slot)κ³Ό λ‚΄λΆ€ λ©”μ„œλ“œ (internal method)λŠ” JS μ—”μ§„μ˜ κ΅¬ν˜„ μ•Œκ³ λ¦¬μ¦˜μ„ μ„€λͺ…ν•˜κΈ° μœ„ν•΄ ECMAScript μ‚¬μ–‘μ—μ„œ μ‚¬μš©ν•˜λŠ” μ˜μ‚¬ ν”„λ‘œνΌν‹° pseudo property와 μ˜μ‚¬ λ©”μ„œλ“œ pseudo method μž…λ‹ˆλ‹€. λͺ¨λ“  κ°μ²΄λŠ” [[Prototype]] μ΄λΌλŠ” λ‚΄λΆ€ μŠ¬λ‘―μ„ κ°–μŠ΅λ‹ˆλ‹€. λ‚΄λΆ€ μŠ¬λ‘―μ€ JS μ—”μ§„μ˜ λ‚΄λΆ€ λ‘œμ§μ΄λ―€λ‘œ μ›μΉ™μ μœΌλ‘œ 직접 μ ‘κ·Όν•  수 μ—†μ§€λ§Œ __proto__λ₯Ό 톡해 κ°„μ ‘ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 16.2 ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈμ™€ ν”„λ‘œνΌν‹° λ””μŠ€ν¬λ¦½ν„° 객체 Js 엔진은 ν”„λ‘œνΌν‹°λ₯Ό 생성할 λ•Œ ν”„λ‘œνΌν‹°μ˜ μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό κΈ°λ³Έκ°’μœΌλ‘œ μžλ™ μ •μ˜ν•©λ‹ˆλ‹€. ν”„λ‘œνΌν‹°μ˜ μƒνƒœλž€ κ°’ (value), κ°’μ˜ κ°±μ‹  κ°€λŠ₯ μ—¬λΆ€ (writable), μ—΄κ±°..

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 15μž₯ let, const ν‚€μ›Œλ“œμ™€ 블둝 레벨 μŠ€μ½”ν”„λž€?

15.1 var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ˜ 문제점 15.1.1 λ³€μˆ˜ 쀑볡 μ„ μ–Έ ν—ˆμš© var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” 쀑볡 선언이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 15.1.2 ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•©λ‹ˆλ‹€. ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λŠ” μ „μ—­ λ³€μˆ˜λ₯Ό λ‚¨λ°œν•  κ°€λŠ₯성을 높이고 μ „μ—­ λ³€μˆ˜κ°€ 쀑볡 μ„ μ–Έλ˜λŠ” κ²½μš°κ°€ λ°œμƒν•©λ‹ˆλ‹€. 15.1.3 λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ… var ν‚€μ›Œλ“œ λ³€μˆ˜ μ„ μ–Έ μ‹œ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ λ³€μˆ˜ 선언문이 μŠ€μ½”ν”„μ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€. // 이 μ‹œμ μ—λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ 이미 foo λ³€μˆ˜κ°€ 선언됨 (1.μ„ μ–Έ 단계) // λ³€μˆ˜ fooλŠ” undefined둜 μ²˜κΈ°ν™” 됨 (2. μ΄ˆκΈ°ν™” 단계) console.log(foo); // undefined // λ³€..

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 14μž₯ μ „μ—­ λ³€μˆ˜μ˜ 문제점

14.1 λ³€μˆ˜μ˜ 생λͺ…μ£ΌκΈ° 14.1.1 지역 λ³€μˆ˜μ˜ 생λͺ…μ£ΌκΈ° 지역 λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°λŠ” ν•¨μˆ˜μ˜ 생λͺ… 주기와 μΌμΉ˜ν•©λ‹ˆλ‹€. function foo() { var x = 'local' // λ³€μˆ˜ x 생성, λ³€μˆ˜ x에 κ°’ ν• λ‹Ή console.loog(x) return x // λ³€μˆ˜ μ†Œλ©Έ } foo(); console.log(x); // x is not defined ν˜Έμ΄μŠ€νŒ…μ€ μŠ€μ½”ν”„λ₯Ό λ‹¨μœ„λ‘œ λ™μž‘ν•©λ‹ˆλ‹€. ν˜Έμ΄μŠ€νŒ…μ€ λ³€μˆ˜ 선언이 μŠ€μ½”ν”„μ΄ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” JS 고유의 νŠΉμ§•μ„ λ§ν•©λ‹ˆλ‹€. 14.1.2 μ „μ—­ λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ° ν•¨μˆ˜μ™€ 달리 μ „μ—­ μ½”λ“œλŠ” λͺ…μ‹œμ μΈ 호좜 없이 μ‹€ν–‰λ©λ‹ˆλ‹€. var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λ©λ‹ˆλ‹€. μ΄λŠ” μ „μ—­ λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°κ°€ μ „μ—­ 객체의 생λͺ… 주기와 ..

[JavaScript] νŠΉμ • μš”μ†Œ element μœ„μΉ˜λ‘œ 슀크둀 μ΄λ™ν•˜λŠ” 방법 scrollIntoView

Intro μ•ˆλ…•ν•˜μ„Έμš”. λͺ¨λ°”일 λ„€λΉ„κ²Œμ΄μ…˜ λ©”λ‰΄μ—μ„œ 슀크둀 이동을 ν‘œν˜„ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ 방법이 μžˆκ² μ§€λ§Œ μ €λŠ” νŠΉμ • μš”μ†Œ μœ„μΉ˜λ‘œ 슀크둀 이동할 수 μžˆλŠ” scrollIntoView ν•¨μˆ˜λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. Syntax scrollIntoView() scrollIntoView(alignToTop) scrollIntoView(scrollIntoViewOptions) alignToTop - true : aligned to the top 상단 κΈ°μ€€ 슀크둀 이동 | scrollIntoViewOptions: {block: "start", inline: "nearest"} - false : aligned to the bottom ν•˜λ‹¨ κΈ°μ€€ 슀크둀 이동 | scrollIntoViewOptions: {block: "end",..

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 13μž₯ μŠ€μ½”ν”„

13.1 μŠ€μ½”ν”„λž€?λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜ 이름, ν•¨μˆ˜ 이름, 클래슀 이름 λ“±)λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유 λ²”μœ„κ°€ κ²°μ •λ˜λΉ„λ‹€. 이λ₯Ό μŠ€μ½”ν”„λΌκ³  ν•©λ‹ˆλ‹€. 즉 μŠ€μ½”ν”„λŠ” μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λ§ν•©λ‹ˆλ‹€. var x = 'global' function foo() { var x = 'local' console.log(x) //local } foo() console.log(x) //global 13.2 μŠ€μ½”ν”„μ˜ μ’…λ₯˜μ½”λ“œλŠ” μ „μ—­κ³Ό μ§€μ—­μœΌλ‘œ ꡬ뢄할 수 μžˆμŠ΅λ‹ˆλ‹€ 13.2.1 μ „μ—­κ³Ό 지역 μŠ€μ½”ν”„μ „μ—­μ΄λž€ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­μ„ λ§ν•©λ‹ˆλ‹€. 전역은 μ „μ—­ μŠ€μ½”ν”„λ₯Ό λ§Œλ“­λ‹ˆλ‹€. μ „μ—­ λ³€μˆ˜λŠ” μ–΄λ””μ„œλ“  μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 13.2.2 지역과 지역 μŠ€μ½”ν”„μ§€μ—­μ΄λž€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό λ§ν•©λ‹ˆλ‹€. 지..

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 12μž₯ ν•¨μˆ˜

12.1 ν•¨μˆ˜λž€? ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ ν•¨μˆ˜λŠ” 일련의 과정을 λ¬Έ(statement)으둜 κ΅¬ν˜„ν•˜κ³  μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ κ²ƒμž…λ‹ˆλ‹€. ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μž…λ ₯을 μ „λ‹¬λ°›λŠ” λ³€μˆ˜λ₯Ό (parameter), μž…λ ₯을 (argument), 좜λ ₯을 λ°˜ν™˜κ°’return value)라고 ν•©λ‹ˆλ‹€. 12.2 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 이유 μ½”λ“œμ˜ μž¬μ‚¬μš© μΈ‘λ©΄, μœ μ§€λ³΄μˆ˜μ™€ νŽΈμ˜μ„±μ„ 높이고 μ½”λ“œμ˜ 신뒰성을 λ†’μ΄λŠ” νš¨κ³Όκ°€ μžˆμŠ΅λ‹ˆλ‹€. 12.3 ν•¨μˆ˜ λ¦¬ν„°λŸ΄ λ¦¬ν„°λŸ΄μ€ μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” 문자 λ˜λŠ” μ•½μ†λœ 기호둜 μ‚¬μš©ν•΄ 값을 μƒμ„±ν•˜λŠ” ν‘œκΈ° 방식을 λ§ν•©λ‹ˆλ‹€. 즉 λ¦¬ν„°λŸ΄μ€ 값을 μƒμ„±ν•˜κΈ° μœ„ν•œ ν‘œκΈ°λ²•μž…λ‹ˆλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ„ ν‰κ°€λ˜μ–΄ 값을 μƒμ„±ν•˜λ©°, 이 값은 κ°μ²΄μž…λ‹ˆλ‹€. 즉 ν•¨μˆ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. 12.4 ν•¨μˆ˜ μ •μ˜ 1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ fu..

λ°˜μ‘ν˜•