🖥️ MeetupForm.tsx
const LabeledInput = React.forwardRef<HTMLInputElement, LabeledInputProps>(({ id, name, label, type, placeholder, value, defaultValue, disabled, required, checked, onChange }, ref) => {
return (
<>
<div>
<label htmlFor={id}>{label}</label>
<input
id={id}
name={name}
type={type}
placeholder={placeholder}
disabled={disabled}
value={value}
defaultValue={defaultValue}
required={required}
checked={checked}
onChange={onChange}
ref={ref}
/>
</div>
</>
);
});
...
const MeetupForm = () => {
const router = useRouter();
const queryClient = useQueryClient();
// Ref
const organizerNicknameRef = useRef<HTMLInputElement>(null);
const organizerProfileImageRef = useRef<HTMLInputElement>(null);
const nameRef = useRef<HTMLInputElement>(null);
const startedAtRef = useRef<HTMLInputElement>(null);
const endedAtRef = useRef<HTMLInputElement>(null);
const placeRef = useRef<HTMLSelectElement>(null);
const placeDescriptionRef = useRef<HTMLInputElement>(null);
const adTitleRef = useRef<HTMLInputElement>(null);
const adEndedAtRef = useRef<HTMLInputElement>(null);
const descriptionRef = useRef<HTMLTextAreaElement>(null);
const isPublicRef = useRef<HTMLInputElement>(null); //초기값 왜 null
const categoryRef = useRef<HTMLSelectElement>(null);
const imageRef = useRef<HTMLInputElement>(null);
...
return (
<>
<div>
<form onSubmit={handleMeetupFormSubmit}>
<div>
<LabeledSelect id="category" name="category" label="모임 성격" options={categoryOptions} ref={categoryRef} required />
<LabeledInput id="name" name="name" label="모임 이름(랜덤 생성 버튼 필요)" type="text" ref={nameRef} required />
...

🖥️ JavaScript
// 사용 흐름
// 부모 컴포넌트에서
const nameRef = useRef<HTMLInputElement>(null);
// 자식 컴포넌트 사용
<LabeledInput id="name" label="모임 이름" ref={nameRef} />
// 나중에 값 접근
const name = nameRef.current?.value;
1. DOM 요소 참조 메커니즘
.current 속성에 실제 DOM 요소를 할당한다.2. TypeScript와의 관계
useRef<HTMLInputElement>(null)과 같은 형태로 작성하는 것은, ref가 가리킬 DOM 요소의 타입을 알려주는 것..current가 null이거나 HTMLInputElement 타입의 객체일 수 있음을 의미한다.3. 생성 컴포넌트와 수정 컴포넌트 모두 null인 이유
null로 설정한다.forwardRef를 왜 썼느냐?
그럼 LabeledInput, LabeledSelect는 애초에 왜 만들었느냐?
그럼 useRef의 초기값은 왜 null이냐? 심지어 기존 모임 정보를 가져와 수정하는 코드에서도?

네, 정확합니다! 아주 정확하게 이해하셨습니다. 🥹🥹🥹🥹🥹🥹🥹
클로드랑 나랑 내 머리끄덩이 잡고 나아가는 중

