728x90 React/React 실습10 [React] 이벤트 기반 아키텍처 vs HTTP 서비스 아키텍처 이벤트 기반 아키텍처 vs HTTP 서비스 아키텍처1. 정의이벤트 기반(Event‑driven) 아키텍처시스템에서 발생한 ‘사건(이벤트)’을 메시지로 발행(publish)하고, 구독(subscribe)한 컴포넌트가 비동기로 처리예시: 주문 생성 → 재고 서비스가 “재고 감소” 이벤트 처리HTTP 서비스(요청/응답) 아키텍처클라이언트가 HTTP 요청을 보내면 서버가 즉시 응답하는 동기 방식예시: GET /orders/123 요청 → 주문 정보 반환2. 주요 차이점구분이벤트 기반HTTP 서비스통신 방식비동기 (Asynchronous)동기 (Synchronous)결합도느슨 결합 (loose coupling)상대적으로 강한 결합응답 보장발행만 보장, 처리 성공 불투명요청‑응답으로 성공/실패 명확확장성수평 확장 .. 2025. 4. 18. System.Text.Json을 활용한 네이버 로그인 응답 처리 개선 네이버 사용자 정보 응답 처리 개선 - JsonDocument → JsonSerializer기존에는 네이버 사용자 정보를 처리할 때, 아래처럼 JsonDocument와 GetProperty()를 활용하는 방식이 일반적이었습니다:var userInfoJson = JsonDocument.Parse(json).RootElement;var response = userInfoJson.GetProperty("response");var naverId = response.GetProperty("id").GetString();var email = response.TryGetProperty("email", out var emailProp) ? emailProp.GetString() : null;하지만 이 방식은 유지보수성.. 2025. 4. 10. [SSO] 네이버 소셜 로그인 연동 및 보안 고려사항, (팝업 기반 소셜 로그인 처리 방식) 1. 네이버 소셜 로그인 연동 개요웹 애플리케이션에서 네이버 소셜 로그인을 연동하는 과정은 다음과 같습니다:사용자가 네이버 로그인 버튼을 클릭하면, 팝업 창을 통해 네이버 로그인 페이지로 리다이렉트됩니다.사용자가 네이버에서 인증을 완료하면, 팝업 창은 액세스 토큰을 포함한 정보를 부모 창(메인 애플리케이션)으로 전달합니다.부모 창은 전달받은 액세스 토큰을 사용하여 네이버 API로부터 사용자 정보를 가져옵니다.2. 팝업 창에서 부모 창으로 데이터 전달팝업 창에서 부모 창으로 데이터를 전달하기 위해 window.opener.postMessage 메서드를 사용합니다. 예를 들어, 백엔드에서 다음과 같은 HTML을 반환하여 팝업 창에서 부모 창으로 데이터를 전달할 수 있습니다: var html = $@" .. 2025. 4. 10. [OAuth2] 기존 시스템에 네이버 소셜 로그인 기능 연동하기 (JWT + 팝업 방식) ✅ 프로젝트 목표기존 이메일/비밀번호 로그인 시스템이 있는 웹 애플리케이션에 네이버 소셜 로그인(OAuth2) 기능을 추가합니다. 로그인 후 네이버 계정을 통해 별도 회원으로 가입되며, JWT 방식으로 인증 처리됩니다.✅ 전체 동작 시나리오사용자가 "네이버 로그인" 버튼 클릭팝업 창으로 네이버 로그인 화면으로 이동로그인 성공 후, 등록된 redirect_uri로 code 와 state 전달백엔드에서 access_token 요청 → 사용자 정보 요청네이버 UID로 사용자 조회 → 없으면 자동 회원가입JWT 발급 → 팝업창에서 부모창으로 전달부모창은 토큰 저장 후 로그인 상태 처리✅ 핵심 처리 방식naverId: 네이버에서 제공하는 비식별 UID로, 계정 식별자로 사용됨이메일: 사용자 정보 중 하나지만, 로.. 2025. 4. 2. [React] Material-UI Popover 위치 보정과 애니메이션 적용 시행착오 기록 이번 글에서는 Material-UI의 Popover 컴포넌트 사용 중 겪었던 시행착오와, 위치 보정 및 자연스러운 애니메이션을 적용하기까지의 해결 과정을 기록합니다.1. 문제 상황처음에는 Material-UI의 Popover를 사용하여 특정 버튼을 클릭하면 팝업이 열리도록 구현하였습니다. 하지만 팝업 내부의 내용이 확장될 때 다음과 같은 문제가 발생했습니다.내용이 확장되면 Popover가 화면 밖으로 벗어나는 현상Popover 위치가 자동으로 보정되지 않아 부자연스러운 UI위치 보정이 되어도 움직임이 너무 딱딱해서 UX가 나쁨2. 처음 시도한 방법 (실패)처음에는 Popover를 Popper로 변경하여 popperRef를 사용해 위치를 직접 업데이트하려고 했습니다. {/* 내용 */} 문제점:기존.. 2025. 3. 14. [React] Material-UI Popover에서 Popper로 전환한 시행착오 1. 배경 및 요구사항프로젝트에서는 Popover를 사용하여 특정 UI를 구현하고자 하였다. 그러나 팝오버가 열려 있는 동안에도 배경 요소와 상호작용할 수 있도록 하려는 요구사항이 존재하였다.2. 초기 시도: Popover의 ModalProps 활용Material-UI Popover는 내부적으로 Modal을 사용하여 포커스를 팝오버 내부로 강제하는 특성을 지니고 있다. 이에 ModalProps를 이용하여 백드롭 숨김, 스크롤 잠금 해제, 포커스 강제 해제를 시도하였다. 아래 코드는 그 예이다. {/* Popover 내용 */}그러나 이 방법을 사용하면 TypeScript 에러가 발생하였다.오류 메시지는 다음과 같다.Property 'ModalProps' does not exist on type 'Int.. 2025. 3. 14. [React] Drawer와 Tab, Accordian - Console 콘솔에러 제거하기 [React] https://hhahee.tistory.com/174 Drawer와 Tab, Accordian으로 FAQ 구현하기2025년 02월 03일Mui의 Accordion 컴포넌트 사용Help Container에서 해당하는 버튼을 선택하면 Drawer가 나오도록 설정Drawer안에는 Tabs를 4가지로 구성각 Tab안에는 Questions의 리스트가 나오도록 하였음questionhhahee.tistory.com위 포스팅에서 초래된 콘솔 에러 해결해보기 모두 정상동작하지만 콘솔의 에러 (경고) 코드를 제거하고 싶었다. 1. FaqsTabs.tsx:84 Warning: Each child in a list should have a unique "key" prop.위의 에러에 나온 84번째 줄은 컴포.. 2025. 2. 4. [React] Drawer와 Tab, Accordian으로 FAQ 구현하기 2025년 02월 03일Mui의 Accordion 컴포넌트 사용Help Container에서 해당하는 버튼을 선택하면 Drawer가 나오도록 설정Drawer안에는 Tabs를 4가지로 구성각 Tab안에는 Questions의 리스트가 나오도록 하였음question은 길이와 expand시 bold체에 따라 한줄~두줄로 설정될 수 있음 → useEffect를 사용하여 expand되는 question 혹은 tab이 바뀔때마다 question의 wrapper라고 할 수 있는 AccordionSummary 컴포넌트의 height을 조정함호버 시, 글자색과 AccordionSummary 배경색상을 변경하여 가시적으로 표현함Question은 선택 시 Accordian 형태로 answer가 dropdown되도록 설정하였음.. 2025. 2. 3. [React] KeyDown, KeyUp 한국어 2번? onKeyUp, onKeyDown 한글 입력 시 두번 실행되는 오류특정 환경에서 한글 입력 시 composing 단계를 거치는데 이게 완료되지 않아 keyCode나 which 값이 229가 나오는 에러가 발생한다고 한다.이 229 에러가 발생해 그 연장선으로 key event가 제대로 작동하지 않아 결국 함수가 두 번씩 실행된 것 같은데, 두 번 실행에 대한 정확한 사유는 적혀있지 않았다.onKeyDown을 사용하고, composing 단계랑 keyCode === 229 일 때 return 하는 방법으로 걸러주어 밑의 작성된 코드를 정상적인 동작을 하게끔 만들어 주는 것으로 파악된다.function keyEnterHandler(e) { if (e.isComposing || e.keyCode === 22.. 2025. 2. 3. 이전 1 2 다음 728x90