dev-blackcat의 등록된 링크

 dev-blackcat로 등록된 티스토리 포스트 수는 27건입니다.

[Javascript] 자바스크립트 `console`를 활용한 더 나은 디버깅 하기(`console.log`만 사용하지 말자) [내부링크]

자바스크립트에서 디버그를 한다고 하면, 대부분은 `console.log`를 많이 생각할 것입니다. 하지만, `console.log`만 로그를 호출하고 보여줄 수 있는 것이 아니기 때문에, 아래와 같이 다른 디버깅 형태로도 호출하여 활용하면 좋을 것 같습니다. console.table 표 형식의 데이터를 읽기 쉽고 한눈에 파악하기 좋습니다. const users = [ { id: 1, name: 'John Doe' }, { id: 2, name: 'Jane Doe' } ]; console.table(users); console.group `console.group`, `console.groupEnd` 방법을 사용하면 중첩된 축소 가능한 그룹을 만들 수 있습니다. console.group('User Deta..

[NextJS] Isotope-layout `window is not define` 오류 해결하기 [내부링크]

`NextJS`에서 `isotope-layout`를 사용하려고 하면, `SSR` 환경에서는 `window is not define` 오류가 발생할 수 있습니다. 그래서 `Isotope`를 사용하는 곳을 `SSR을 풀어주고 다이나믹 링크를 통하여 해결`해볼 수 있습니다. 예제 `Home.tsx` const DynamicPortfolio = dynamic( () => import('src/components/Portfolio/portfolio'), { ssr: false, }, ) export default function Home() { return ( {/* */} {/* ... 등등 */} ) } `Portfolio.tsx` declare module Portfolio { interface Data {..

[Flutter] 플러터 GetX에서 Hero 위젯 사용하기 [내부링크]

플러터에서 GetX에서 Hero를 사용하려면, 제대로 작동이 안 되는 것을 볼 수 있습니다. 해당 이미지가 Init 시점보다 먼저와 야하기 때문인데요. GetX 패턴을 사용하다 보면 사실상 사용하기가 까다롭다고 볼 수 있습니다. 그래서 GetX에서 사용할 수 있는 방법을 소개합니다. 예시 class ListWidget extends GetView { const ListWidget({super.key}); @override Widget build(BuildContext context) { return Column( children: List.generate( controller.data.length, (index) { return CardWidget(index: index); }, ), ); } } cla..

[Android] 에뮬레이터(Emulator) AVD 램 사이즈 조정 [내부링크]

메모리가 크게 필요한 혹은 리소스가 많이 들어가는 개발이 필요한 경우 에뮬레이터에서도 램과 같은 성능에 직결되는 옵션들의 풀을 늘려주거나 설정해줘야 할 때가 있습니다. 안드로이드 스튜디오에서 설정 가능합니다. 안드로이드 스튜디오에서 `Device Manager`로 들어가서 각 에뮬레이터에 팬 아이콘 모양에 수정으로 들어갑니다. 왼쪽 하단에 `Show Advanced Settings`를 누르면 메모리 및 스토리지 관련 옵션이 나오는데 보통은 여기서 설정해주면 됩니다. 만약, 여기서 설정한게 적용이 안된다면 `config.ini` 파일을 직접 수정하는 방법이 있습니다. 위에서 오른쪽 점 3개 아이콘을 누른 후 `Show on Disk`를 눌러 `config.ini` 파일을 열어줍니다. 하단에 `hw.ramS..

[Flutter] 플러터 개발속도 향상을 위한 VSCODE 가이드 라인 설정하기 [내부링크]

플러터로 개발하다 보면, 선언형 때문에 코드 위치 및 구조를 파악하기 어려울 때가 있습니다. 물론, 코드량이 많아지기 전에 별도로 클래스로 나눠주면 문제가 없겠지만, 명시적으로 도트라인이 보이면 더 좋을 것입니다. 설정방법 우선, `VSCODE 설정`으로 들어갑니다. `Preview Flutter Ui Guides` 항목을 활성화시켜주세요. 그리고, 오른쪽 상단에 아이콘 클릭하여 `OpenSetting JSON` 형태로 열어주세요. 위에 2가지 항목을 추가해 주시고, `VSCODE를 완전히 종료`했다가 다시 열어주세요. 저 같은 경우 재부팅하고 바로 적용이 안되고 조금 있다가 적용이 되더라고요.

[Flutter] 플러터 앱 버전 체크(App Version Check) 만들어 사용하기 [내부링크]

앱의 버전을 체크하여, 업데이트 모달 및 팝업을 띄우는 형태 거나 별도로 체크용으로 필요한 경우 아래에 예제와 같이 만들어 사용하시면 됩니다. 예제 `lib\app\utils\app_version_check.dart` import 'dart:convert'; import 'dart:io'; import 'dart:math' as math; import 'package:http/http.dart' as http; import 'package:package_info_plus/package_info_plus.dart'; /// 마켓 스토어 타입 enum StoreMarket { GooglePlayStore, ApkPure } /// 앱 버전 체크 /// /// [currentVersion] : 현재 앱 버전 ..

[Flutter] 플러터 `RegExp 정규표현식(정규식)` 전체 모음 [내부링크]

개발을 하다 보면, 항상 정규표현식(RegExp) 형태를 사용하게 되는데 매번 검색하는 것도 귀찮기도 하고 정규식하고 친해지지도 않는 것 같아서 최대한 사용할만한 정규표현식 전체를 모음으로 배포합니다. 중간에 틀리거나, 추가할 사항은 알려주시면 주기적으로 업데이트 하겠습니다. 예제 lib/app/utils/regular_expression.dart /// 정규표현식 class RegularExpression { /// 한글만 형식 검사 /// /// [value] String : 한글 static bool isKorean(String value) { RegExp regExp = RegExp( r'^[가-힣]+$', caseSensitive: true, multiLine: false, ); return r..

[Flutter] 플러터 파이어베이스(Firebase)를 통한 애플(Apple) 소셜 로그인 설정하기 [내부링크]

파이어베이스(Firebase)를 활용하면, 구글 로그인을 포함한 애플 로그인도 소셜 로그인을 구현할 수 있습니다. `Authentication`에서 `Sign-in-method 탭`으로 이동하여 하단 애플을 선택하고 사용설정을 진행해 줍니다. 하단에 콜백 URL은 별도로 복사하거나 메모해주시면 됩니다. 파이어베이스에서 앱 추가에서 IOS 추가하기 `앱 번들 ID`, `App Store ID`, `팀 ID` 추가 [Apple] 애플 로그인 설정하기 (Sign In with Apple) 애플 로그인 설정하기 (Sign In with Apple) 앱 및 웹에서 애플 계정으로 로그인 할 수 있는 기능인 "Sign In with Apple"을 설정해보자. 내 iOS 앱에 애플 로그인 기능을 넣어야 하는 이유 애플..

[Flutter] 플러터 성능향상을 위한 `flutter_flags` 명령줄 도구 추가하기 [내부링크]

Flutter 앱의 성능을 개선하려면 `flutter_flags` 명령줄 도구를 사용하여 다양한 성능 관련 플래그를 활성화할 수 있습니다. 이러한 플래그를 사용하면 특정 앱의 요구 사항에 더 잘 맞도록 Flutter 프레임워크 및 Dart 가상 머신의 동작을 미세 조정할 수 있습니다. 명령줄 설명 --dart-define=flutter.inspector.debugDescription=false 앱을 빌드하고 렌더링할 때 성능을 향상시킬 수 있는 위젯에 대한 디버그 설명 생성을 비활성화합니다. --enable-software-rendering=false 하드웨어 가속 렌더링을 비활성화하고 대신 소프트웨어 렌더링을 사용하려면 --enable-software-rendering=false 플래그를 사용할 수 있..

[Flutter] 플러터 성능향상을 위한 `GPU enableSoftwareRendering` 가속하기 [내부링크]

플러터에서 하드웨어 가속을 활성화하려면 `WidgetsFlutterBinding` 객체의 `enableSoftwareRendering` 속성을 false로 설정해야 합니다. 이렇게 하면 Flutter가 `CPU 대신 GPU를 렌더링에 사용`하도록 지시할 것입니다. 아래 예제에서는 `RendererBinding` 개체의 `addPostFrameCallback` 메서드를 사용하여 첫 번째 프레임이 렌더링 된 후 하드웨어 가속을 활성화합니다. 이렇게 하면 하드웨어 가속이 활성화되기 전에 앱이 완전히 초기화됩니다. 하드웨어 가속이 활성화되면 Flutter는 렌더링에 `CPU 대신 GPU를 사용하여 앱의 성능을 향상`할 수 있습니다. 예제 import 'package:flutter/widgets.dart'; vo..

[Flutter] 플러터 성능향상을 위한 지연로딩 하기 [내부링크]

아래에 예제에서는 `MyLazyLoadedWidget`은 필요할 때까지 `MyHeavyWidget`의 로딩을 지연하는 위젯입니다. 앱이 시작되면 `MyLazyLoadedWidget`은 `MyHeavyWidget`이 `비동기식으로 로드되는 동안 로딩 표시기를 표시`합니다. 무거운 위젯이 로드되면 화면에 표시됩니다. 이렇게 하면 무거운 위젯이 필요할 때까지 로드를 지연시켜 앱의 초기 시작 시간을 개선하고 메모리 사용량을 줄이는 데 도움이 될 수 있습니다. 예제 import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildC..

[Flutter] 플러터 성능향상을 위한 `AutomaticKeepAliveClientMixin` 위젯 캐싱하기 [내부링크]

복잡한 레이아웃과 그래픽이 많이 포함되어 빌드 비용이 많이 드는 위젯의 경우 `AutomaticKeepAliveClientMixin`를 사용하여 `wantKeepAlive` 속성을 `true`로 설정하면 이 위젯의 상태를 캐시하고 화면에 표시되지 않을 때 다시 빌드되는 것을 방지할 수 있습니다. 추가로 탭바에서 탭을 할 때마다 재렌더링 되는 것을 볼 수 있는데, 스크롤 위치를 기억한 화면을 표시하기 위해서 사용할 수도 있습니다. 이렇게 하면 위젯을 다시 빌드해야 하는 횟수를 줄여 앱의 성능을 개선하는 데 도움이 될 수 있습니다. 예제 import 'package:flutter/material.dart'; class MyExpensiveToBuildWidget extends StatefulWidget ..

[Flutter] 플러터 성능향상을 위한 `RepaintBoundary` 위젯 사용하기 [내부링크]

플러터에서 작동할 때에 다른 변경되지 않은 위젯까지 재렌더링을 하는 경우가 생길 수 있습니다. 예로 들면, 여러 위젯 안에 하나의 위젯에 데이터만 변경(렌더링)되기만 하면 되는데 그 위젯을 변경하기 위해 관련된 부모, 친구 위젯까지 모두 재렌더링이 발생할 수 있는 것이죠. 플러터로 개발을 하다 보면, const를 붙이게 되면 암묵적으로 렌더링에서 다시 그리지 않습니다. 비슷한 유형이라고 보시면 될것 같습니다. 언제 사용해야할까? 해당 위젯이 복잡한 레이아웃과 그래픽(애니메이션)등이 포함되어 있어 렌더링 비용이 많이 들것이라고 예상이 된다면, `RepaintBoundary`를 사용하여 렌더링 성능을 최적화할 수 있습니다. `RepaintBoundary`를 사용하게 되면, 수치는 낮지만 일부분의 CPU와 메..

[Flutter] 플러터 파이어베이스(Firebase)를 통한 구글(Google) 소셜 로그인 설정하기 [내부링크]

플러터로 소셜 로그인을 하게 되면서, 파이어베이스(Firebase)를 통한 구글, 애플 소셜 로그인을 구현할 수 있습니다. 구글(Google) 소셜 로그인 Firebase 생성 및 설정 먼저, 파이어베이스를 생성 및 설정으로 들어가서 `Authentication`을 설정해줘야 합니다. `Authentication`에서 하위 탭 `Sign-in-method` 클릭하여 `Google 선택` 만약, Google을 인증 제공업체로 사용하려면 하단 외부 프로젝트의 클라이언트 ID 허용 목록에 추가 부분에 구글 클라우드에서 아래 이미지와 같이 사용자 인증 정보 정보를 넣어주면 됩니다. (선택사항) OAuth2.0 클라이언트 ID에서 계정을 클릭하면 클라이언트 ID와 클라이언트 보안 비밀 키를 확인 할 수 있습니다...

[Flutter] 플러터 `Rive` 적용하기 [내부링크]

`Rive`를 활용하여 배경이 움직이고 블러 처리하여 뉴모피즘 느낌을 줄 수 있습니다. rive 사이트에서 예제를 받을 수 있습니다. Rive - The new standard for interactive graphics Use our familiar design and animation tools with our ground-breaking State Machine to create interactive motion graphics for your products, apps, sites, and games. rive.app 아래의 패키지를 설치하여 사용합니다. rive | Flutter Package Rive 2 Flutter Runtime. This package provides runtime fun..

[Flutter] `TextField`, `TextFormField` 특정 포커스(Focus) 위치하기 [내부링크]

플러터에서 `TextField`, `TextFormField`에서 맨 앞 혹은 맨뒤, 입력 텍스트에 특정 위치로 포커스가 커서가 이동 되어야 한다면, 아래에 예제와 같이 텍스트필드에 컨트롤러를 지정하고 `selection`으로 `TextSelection 옵션`을 주면 됩니다. 예제 /// Controller Rx textEditingController = TextEditingController().obs; /// View class MyApp extends GetView { @override Widget build(BuildContext context) { return MaterialApp( home: TextField( controller: controller.textEditingController.v..

[NextJS] Swiper `swiper.params.navigation undefined` 해결하기 [내부링크]

스와이퍼(Swiper)를 쓰다 보면, Init 과정에서 문제가 생기는 경우 간혹 발생이 됩니다. 인입되는 시점을 변경해준다면, swiper를 쓰는데 크게 문제는 발생되지 않을 겁니다. 아래의 예제를 통해서 확인하여 수정하면 정상적으로 작동될 겁니다. 원래는 타입스크립트(Typescript)로 사용하지만, 예제는 자바스크립트(Javascript)이니 타입만 추가로 넣어주시면 될 것 같습니다. 변경 전 현재 스와이퍼(Swiper) 기준으로 최신 버전이 8.4.5입니다. 참고하여 수정하시면 될 것 같습니다. import { Swiper, SwiperSlide } from "swiper/react"; import SwiperCore, { Autoplay, Pagination, Navigation } from "..

[Flutter] 탭바(Tabbar) 스크롤 위치 기억하기 `Render Visible` [내부링크]

플러터에서 탭바를 이용하다 보면, 다른 탭에 갔다가 오게 되면 스크롤 위치가 초기화되는 현상이 있습니다. 스크롤을 유지하기 위해서는 별도의 옵션을 주고 처리해야 합니다. 다만, 각 탭 이동시 렌더링은 이후 계속 유지하고 있습니다. `StatefulWidget`에서 오버라이드(override)를 활용하여 `wantKeepAlive` 옵션을 `true` 값을 주면 됩니다. 예제 /// 탭바 위젯 class TabbarWidget extends GetView { const TabbarWidget({super.key}); @override Widget build(BuildContext context) { return Obx( () => TabBar( controller: controller.tabControll..

[Flutter] Location `Attempt to invoke interface method 'void'` 오류 해결하기 [내부링크]

`Attempt to invoke interface method 'void'` 오류의 경우에는 실제로 `Location`을 가져오는 과정에서 윈도 PC 등 특정 권한 문제로 가져오지 못하는 문제가 있습니다. 따라서, 실제 디바이스에서 릴리즈 모드로 진행하게 되면 오류가 해결될 가능성이 높습니다.

[Flutter] `Location` 위치 정보 가져오기 [내부링크]

Flutter용 플러그인은 Android 및 iOS에서 위치 가져오기를 처리합니다. 또한 위치가 변경될 때 콜백을 제공합니다. pub.dev location | Flutter Package A Flutter plugin to easily handle realtime location in iOS and Android. Provides settings for optimizing performance or battery. pub.dev device_info_plus | Flutter Package Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app i..

[Flutter] 플러터 `notification.metrics.axis == widget.axis: is not true` 해결하기 [내부링크]

스크롤 형태의 위젯에서 너비 값이 지정되지 않은 스크롤 뷰는 `notification.metrics.axis == widget.axis: is not true` 오류가 발생할 수 있습니다. 따라서, 스크롤 형태의 위젯에서 너비를 알 수 있도록 `physics`를 `BouncingScrollPhysics()` 옵션으로 변경하여 너비를 알 수 있도록 해야 합니다. 예제 import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold..

[FastAPI] 스웨거(Swagger) `OAuth2 인증 Authorize 적용`하기 [내부링크]

스웨거에서 `OAuth2` 방식으로 인증 방식을 사용할 수 있습니다. `OAuth2` 인증을 달게 되면, 스웨거에서 `Authorize`라는 버튼이 생기게 되며, 해당 버튼을 통해서 `OAuth2 인증`을 할 수 있습니다. 인증이 필요한 API가 있기 때문에, 작업을 미리 해두면 편합니다. Oauth2 적용하기 `home.py` 아래와 같이 `APIRouter`에서 `dependencies`를 추가해주고, `tokenUrl`을 넣어주면 된다. 참고로 `tokenUrl`은 `root_path`가 먹히지 않기 때문에 앞에 들어가는 경로를 모두 넣어주어야 한다. router = APIRouter( prefix="/home", tags=["home"], dependencies=[ Depends( OAuth2Pa..

[FastAPI] 스웨거(Swagger) HTTP 기본 인증 `Authorize` 적용하기 [내부링크]

Swagger(스웨거)에서 API 호출 시 아이디와 비밀번호를 입력하여 기본 HTTP 인증을 적용할 수 있습니다. 스웨거 문서를 보면 각 API 호출 부분 오른쪽에 자물쇠 아이콘이 생기며, `Execute` 클릭시에 계정 인증을 요구합니다. Simple HTTP 인증 적용하기 해당 API 호출하는 곳에 `Dpends`으로 아래 코드를 넣어주면 됩니다. security = HTTPBasic() credentials: HTTPBasicCredentials = Depends(security) 예제 security = HTTPBasic() router = APIRouter( prefix="/token", tags=["token"], responses={404: {"description": "Not found"}..

[Remix] 리엑트 리믹스 프레임워크 알아보기 [내부링크]

리엑트(React) 리믹스(Remix)는 리엑트 라우터(React-Router)를 만든 개발자가 만들었습니다. Remix는 원래 라이선스 비용을 지불하는 유료 프레임워크였는데, 최근에 무료로 변경되었습니다. Remix 프레임워크 특징 Remix는 프로젝트를 시작할 때 어떤 종류의 서버에서 배포할 건지 선택하게 됩니다. 그 이유는 서버 측에서 렌더링(HTML) 하여 페이지를 보여주기 때문입니다. 즉, 프론트 서버에서 "JS" 코드를 읽고 "HTML"으로 렌더링 해서 보여줍니다. 이 결과로 유저는 하얀 화면(인터넷 속도가 느린 경우 포함), 로딩 중 화면을 볼일이 없습니다. (서버사이드 렌더링) 다만, 데이터를 불러오고 보여주는 과정이 조금 다릅니다. "loader"라는 함수를 통하여 "API"를..

[Gatsby] 리엑트 개츠비 프레임워크 알아보기 [내부링크]

리엑트(React) 개츠비(Gatsby)는 정적 웹 페이지를 만들기 적합한 CMS입니다. Gatsby는 빌드 시 "HTML" 확장자를 가진 파일로 별도의 "JS"를 불러오는 렌더링이 아닌 빌드 할 때에 모두 작성됩니다. 따라서, "정적 웹 페이지"를 만들기에 적합합니다. 여러 강력한 플러그인을 별도로 제공하고 있으며, Gatsby 공식 홈페이지에서 "클라우드 서비스"를 제공합니다. 또한, GraphQL을 이용하여 JS 객체로 저장하고 데이터를 가져올 때에 사용되는데 특정 JSON 파일을 읽어 데이터 풀에 저장한 후 사용된다. 개인적인 의견 레거시 방법(HTML5, CSS3, JS)으로 정적 사이트를 충분히 만들 수 있지만 요즘은 프론트 기술들이 너무 좋기 때문에 여러 가지를 감안하면 레거시 방법을 절대 ..

[Python] Ubuntu 18.04 파이썬 3.10 버전 설치 및 기본 설정하기 [내부링크]

기본적으로 대부분 사용자들은 "3.6.9" 버전 혹은 비슷한 버전을 사용합니다. 버전이 업데이트되면서 문법적으로 변경, 추가, 개선된 부분도 있지만 "DataBase"쪽도 그러하듯 성능적인 부분에서 향상이 있기 때문에 "Alpha", "Beta"를 제외한 공식 최신 버전을 사용하는 게 좋습니다. Python3.10 설치 아래 버전(python3.9 등)으로 설치해줘도 됩니다. sudo apt install software-properties-common -y sudo add-apt-repository ppa:deadsnakes/ppa Python3.10에 지원하는 "dev", "venv" 패키지만 설치 sudo apt install python3.10 python3.10-dev python3.10-ven..

[VSCODE] 비주얼스튜디오코드(Visual Studio Code) SFTP 연동하기 [내부링크]

먼저, 확장 탭을 클릭 후 "SFTP" 검색한 후 아래의 이미지의 확장을 설치해주세요. 새로운 폴더 혹은 기존 프로젝트 폴더를 열어주신 후 "F1"을 눌러 "sftp" 검색 후 "sftp:config"을 선택해주세요. 아래와 같이 ".vscode" 폴더가 생성되며 "sftp.json" 파일이 생성됩니다. 초기 생성 시 없는 속성이 있습니다. 아래와 비교하여 추가해주세요. 옵션 설명 uploadOnSave 저장시에 자동으로 업로드 (true/false) igonre 업/다운로드를 제외할 파일 및 폴더 보안상 ".vscode" 폴더 안의 파일 내용에는 서버 계정의 비밀번호까지 있기 때문에 대부분 설정합니다. { "name": "프로젝트 이름", "host": "서버 IP 주소", "protocol": "sf..