primitive 에도 onClick 은 사용할 수 있습니다. 현재 코드에는 이미 onClick 이 연결되어 있기 때문에, 우선 handleClick 안의 console.log('click') 자체가 찍히는지 확인해보세요. 만약 이것도 찍히지 않는다면 수동 raycaster.intersectObjects() 문제가 아니라 R3F 이벤트가 해당 모델에 전달되지 않는 상태입니다.
안녕하세요! 연습 목적으로 다양한 문법을 사용해 보는 것은 좋은 방법이라고 생각합니다. 다만 삼항 연산자는 보통 조건에 따라 값을 선택하거나 대입할 때 사용하는 경우가 많습니다. scanf_s() 처럼 입력을 받거나 부수 효과가 있는 함수를 실행하는 용도로 자주 사용하지는 않습니다. 따라서 문법을 익히기 위한 연습은 괜찮지만, 실제 코드에서는 가독성을 위해 if 문을 사용하는 경우가 더 많습니다. 삼항 연산자는 값을 선택하는 상황에서 사용하는 습관을 들이면 이후에도 도움이 될 것입니다.
좋은 질문입니다! 많은 분들이 처음 배우면 헷갈리는 부분인데, 핵심은 작용과 반작용은 같은 물체에 작용하는 힘이 아니라 서로 다른 물체에 작용하는 힘 이라는 점입니다. 공을 차는 상황을 예로 들어볼게요. 내가 공을 앞으로 찹니다. (발 → 공) 동시에 공도 내 발을 같은 크기의 힘으로 밀어냅니다. (공 → 발) 여기서 중요한 것은, 공은 내가 민 힘을 받아 앞으로 움직이고, 발은 공이 민 힘을 받는 것 입니다. 즉, 두 힘이 서로 다른 물체에 작용하기 때문에 서로 상쇄되지 않습니다. 쉽게 말하면 친구와 마주 보고 서서 서로 밀어보는 것과 같습니다. 내가 친구를 밀면 친구도 나를 똑같이 밉니다. 그런데 친구가 받는 힘과 내가 받는 힘은 서로 다른 사람에게 작용하기 때문에 없어지는 것이 아닙니다. 둘 다 뒤로 밀릴 수도 있죠. 그렇다면 공을 찼을 때 왜 발은 거의 안 움직일까요? 그 이유는 발과 몸이 공보다 훨씬 무겁기 때문 입니다. 같은 힘을 받아도 가벼운 공은 훨씬 많이 움직이고, 무거운 사람은 거의 움직이지 않습니다. 자동차와 자전거를 같은 힘으로 밀었을 때 자전거가 더 쉽게 움직이는 것과 같은 원리입니다. 즉, 작용 반작용은 아주 작은 힘부터 아주 큰 힘까지 항상 성립합니다. 힘이 일정 크기 이상이어야만 적용되는 법칙은 아닙니다. 한 줄로 기억하면 됩니다. 작용과 반작용은 항상 크기는 같고 방향은 반대이지만, 서로 다른 물체에 작용하기 때문에 서로 없어지지 않습니다. 이 한 문장만 이해하면 작용·반작용은 거의 다 이해한 것입니다.
아래 AI 답변처럼 index: true / unique: true 옵션과 schema.index() 를 같이 쓰면 중복 인덱스가 생겨서 저 경고가 뜨는 거예요. 실제로는 서비스 동작에는 큰 문제 없지만, 불필요한 인덱스가 중복으로 잡히니까 코드 관리 차원에서 한 쪽만 쓰시는 게 깔끔합니다. 특히 이메일 같은 경우는 보통 unique: true 만 두고, index: true 나 schema.index() 는 잘 사용하지 않습니다. (물론 다른 필드에 검색 속도 최적화용으로는 쓸 수 있습니다)