LIKE 연산자 MySQL에서 LIKE 연산자는 패턴 매칭을 수행하는 데 사용됩니다. 이 연산자는 문자열의 일부 또는 전체를 비교하여 특정 패턴을 가진 데이터를 검색하는 데 유용합니다. SELECT * FROM [테이블명] WHERE LIKE [조건] LIKE 연산자 패턴 % : 글자숫자를 정해주지않음(EX 컬럼명 LIKE '홍%') _ : 글자숫자를 정해줌(EX 컬럼명 LIKE '홍_동') LIKE 연산자와 % 기호를 사용하는 경우, 패턴 매칭이 데이터베이스에서 모든 레코드에 대해 수행되어야 하기 때문에 성능에 영향을 미칠 수 있습니다. 일반적으로 다음과 같은 점을 고려할 수 있습니다: 인덱스 활용 여부 %로 시작하는 패턴 매칭은 인덱스를 사용하기 어려울 수 있습니다. 왜냐하면 와일드카드가 문자열의 처..
맥을 사용해서 개발을 하다보면 디폴트 값으로 F1, F2 키가 기능 키로 매핑되어 있는 것을 확인할 수 있습니다. 특히나 크롬을 사용할 때 F12 키를 이용하는 경우가 많습니다. 하지만 그 외에는 F12를 잘 쓰지 않는다면 기본 맥 키보드의 설정이 더 편리할 수 있습니다. 선택적으로 다음 두 가지 방식으로 크롬 인스펙터 개발 화면을 사용할 수 있습니다. 1. 키보드 설정을 변경 ▼ 맥 설정 화면으로 이동해서 키보드 단축키를 선택합니다. ▼ 기능 키 메뉴로 이동해서 F1, F2 등의 키를 표준 기능 키로 사용 스위치를 활성화 해줍니다. 2. 단축키를 활용 맥에서는 다음 키를 사용해서 크롬의 인스펙터를 켤 수 있습니다. ⌘ + ⌥ + i 저는 개인적으로 2번째 방법으로 사용합니다. 기본적으로 지원하는 키이기..
안드로이드에서 리스트 뷰를 생성할 때 Adapter를 통해서 데이터를 바인딩해서 생성하는 방법을 알아보았습니다. 이번에는 간단한 예제를 만들때 어댑터를 만들지 않고 XML을 구성하여 직접 리스트 뷰 entries 속성을 통해 바인딩하는 방법을 알아보도록 하겠습니다. res/values 에 새로운 파일을 추가해서 데이터를 XML로 구성합니다. name을 myarray로 지정합니다. LIST1 LIST2 LIST3 위에서 만든 XML 데이터를 바인딩하기 위해서 리스트 뷰 에 @array/myarray 로 android:entries 에 값을 대입합니다. MainActivity onCreate 함수에 리스트 뷰 이벤트만 추가해줍니다. override fun onCreate(savedInstanceState: ..
예전에는 안드로이드에서 뷰에 대한 참조를 하려면 findViewById를 사용해야 했습니다. 그런데 사용되는 XML의 참조 객체가 많아질 수록 사용하기 불편할 뿐더러 반복되는 코드가 지져분해지기 쉽습니다. Butter knife나 extension을 통해 불편함을 해소하긴 했지만 버전 3.6 이상 부터는 안드로이드 뷰 바인딩을 통해 좀 더 편리하게 뷰에 있는 객체에 참조할 수 있게 되었습니다. findViewById를 사용할 경우 단점 느린 속도 타입 캐스팅에 따른 예외 사용자 실수로 Null 참조 자동 생성되는 파일 만약 뷰 바인딩(View Binding)을 사용하게 된다면 다음과 같이 ViewBinding 을 구현하는 임의의 파일들이 생성됩니다. Activity 클래스와 매핑 되는 클래스로 별도로 작..
뷰 모델 생성 뷰 모델을 생성합니다. 이름은 UsersViewModel 이고 ObservableObject를 상속합니다. 다음 두 개의 속성을 @Publised 래퍼로 가지고 있습니다. users : 통신의 결과 값인 User 객체의 배열 isLoading : 통신 중을 확인하는 Boolean 값 fetchUsers()라는 함수를 만들어서 통신 결과 값 데이터를 반환합니다. final class UsersViewModel: ObservableObject { @Published var users: [User] = [] @Published var isLoading = false func fethUsers() async throws { isLoading = true defer { isLoading = fals..
아이폰과 마찬가지로 모바일 환경에서 가장 많이 사용되는 형태의 UI가 리스트입니다. 안드로이드 리스트 뷰는 안드로이드에서 가장 많이 사용되는 컴포넌트 중에 하나로 다음과 같은 특징을 가지고 있습니다. 레이아웃과 같은 뷰 그룹에 속함 어뎁터(Adapter)를 통해 데이터와 리스트 뷰를 연결 오래전부터 사용 가능 했으며 API Level 1 부터 존재 프래그먼트를 사용할 경우 this 컨텍스트를 사용할 수 없기 때문에 getActivity() 함수를 사용 프래그먼트를 사용할 경우 LayoutInflater를 사용해 뷰를 가져옴 리스트 뷰 생성 아이디가 listview1 인 리스트 뷰를 선언한다. 데이터 정의 다음과 같이 데이터를 정의한다. class MainActivity : AppCompatActivity..
스위프트 Charts 라이브러리 iOS 개발을 하다보면 다음과 같은 차트 라이브러리를 많이 사용하게 됩니다. 차트 라이브러리를 사용하게 되면 그중에 ValueFormatter를 커스텀 해야 할 때가 있습니다. 텍스트의 크기나 라벨의 문구를 반복적으로 수정하는 일이 필요할 때 사용하며 때에 따라 알맞게 사용하면 됩니다. https://github.com/danielgindi/Charts/tree/master GitHub - danielgindi/Charts: Beautiful charts for iOS/tvOS/OSX! The Apple side of the crossplatform MPAndroidChart. Beautiful charts for iOS/tvOS/OSX! The Apple side of ..
어느 프로그래밍 언어든 마찬가지 이겠지만 스위프트를 사용하다보면 아주 다양하게 딕셔너리 값을 사용하게 됩니다. 특히나 통신 파라미터를 만들기 위해서 요청(Request) 값을 만들다보면 자주 사용합니다. 하지만 대부분의 상황에서는 Any에 nil 값을 사용하지 않겠지만 일반적으로 nil 값을 넣으면 값이 추가되지 않는 것을 볼 수 있습니다. ▼ 아래 구문은 에상과 달리 key1의 값이 존재하지 않습니다. nil 포함하게 되면 "key1" 값은 포함되지 않게 됩니다. var myDictionary: [String: Any?] = [:] // nil 값을 포함하는 예시 myDictionary["key1"] = nil myDictionary["key2"] = 42 myDictionary["key3"] = "H..
iOS Background Modes 아이폰 개발을 하다보면 백그라운드 설정이 필요할 때가 있습니다. 저전력 블루투스나 백그라운드 프로세싱등을 하려면 Backgroubnd 모드를 활성화해줘야 하는데 만약 해당 기능을 활성화하고 Plist에 특정 옵션을 추가하지 않으면 iOS 13이상에서 앱 제출시 문제가 될 수 있습니다. 만약 앱스토어에서 문제가 생기면 다음 옵션들을 만들어 수정해줘야 합니다. Missing Info.plist value. The Info.plist key 'BGTaskSchedulerPermittedldentifiers' must contain a list of identifiers used to submit and handle tasks when 'UIBackgroundModes' h..
Flutter 개발 설정 플러터를 설치하면 몇 가지 해줘야 하는 것들이 있습니다. 특히 처음 설치하면 main.dart 파일이 복잡하게 구현되어 있는데 이 부분부터 정리해보겠습니다. ▼ main.dart의 모든 코드를 제거하고 다음과 같이 main() 함수만 남깁니다. 그리고 stless를 추가하고 탭키를 누르면 Flutter Stateless Widget이 만들어지게 됩니다. stless ▼ 그리고 해당 클래스의 이름을 MyApp 으로 변경합니다. 물론 다른 이름으로 변경해도 괜찮습니다. MyApp의 경우 처음 플러터 프로젝트가 생성 될 때의 이름입니다. import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } clas..
카드 형태의 이미지를 만들 때 많이 사용하는 효과를 extension으로 쉽게 구현해 보겠습니다. 위의 이미지에서 보듯이 카드를 이용한 디자인을 할 때 디자이너들이 곡선과 함께 쉐도우를 주는 작업을 많이 합니다. 플랫 한 디자인이 아닌 약간 입체적으로 보이기 위해서 사용하는데 익스텐션을 이용해서 만들어보겠습니다. 다만 특정 UIView를 감싼 컨테이너가 필요하다는 점에 유의해 주세요. ▼ 실습에 앞서서 다음 두개의 라이브러리를 추가해 줍니다. import SnapKit import Then ▼ 그리고 뷰 컨트롤러에 컨테이너와 Box 뷰를 생성하겠습니다. 단순히 Conatiner 뷰를 화면에 붙이고 그 안에 box를 넣은 상태입니다. box의 경우 300의 높이 값을 가지고 상단, 좌우로 100 만큼 떨어..
▼ 우선 데이터를 만들기 위해서 Store 객체를 만듭니다. @Published 선언을 해서 2개의 색상을 만듭니다. updateDisplay 함수는 단순히 색상을 바꾸는 역할을 합니다. 처음 blue, green 색 에서 updateDisplay 함수가 호출되면 red, orange 색으로 바뀝니다. class Store: ObservableObject { @Published var colors: [Color] = [.blue, .green] func updateDisplay() { colors = [.red, .orange] } } ▼ 다음으로 ContentView에 Store() 객체를 생성해서 포함시킵니다. @main struct Test1App: App { @StateObject var stor..
테스트 환경 및 mariadb 버전 10.6.12-MariaDB-0ubuntu0.22.04.1 Failed to Connect to MySQL at \[server ip:3306\] with user ... 데이터베이스에 연결시 문제가 되면 위와 같은 에러를 확인할 수 있습니다. 사용자가 외부에서 접근할 수 있도록 권한을 주었다고 하더라도 mysql이나 mariadb 의 경우 bind-address에 대한 설정을 해주어야 합니다. 다만 대부분의 예제가 mysql 기준으로 되어 있고 mariadb도 이전 버전의 설치 경로로 설명되어 있어 비교적 최신 버전인 10.6.12 버전에서 bind-address 설정하는 방법을 알아보겠습니다. mariadb의 ip 대역을 확인하려면 다음과 같이 netstat 명령을..
Visual Studio Code - Word Wrap VS 코드를 처음 설치하고 텍스트 파일 및 소스파일을 열면 자동 줄 바꿈이 되지 않는 것을 볼 수 있습니다. Visual Studio Code 에서 자동 줄바꿈을 하는 방법은 다음과 같습니다. ▼ 우선 Visual Studio Code를 실행합니다. Code 메뉴를 선택해서 기본 설정 > 설정 메뉴를 열어줍니다. 단축키는 (Command + ,) ▼ 왼쪽 창 탭 메뉴에서 텍스트 편집기(Editor) 메뉴를 선택합니다. 설정 검색에 Word Wrap 으로 검색하거나 직접 스크롤 해서 메뉴를 찾고 기본값 off에서 on으로 변경해줍니다. off (기본값) on wordWrapColumn bounded ▼ 다음과 같은 단축키를 사용하여 자동 줄바꿈 기능을..
버전 표기법 /* 숫자 표기법 (예: 1.0, 2.3.1): 이 방법은 가장 일반적으로 사용되는 표기법입니다. 버전 번호는 일련의 숫자로 표시되며, 점으로 구분된 여러 섹션으로 나눌 수 있습니다. 일반적으로 주요 버전, 부 버전, 패치 레벨 등을 나타내기 위해 사용됩니다. 주요 버전은 대규모 변경 사항이 있을 때 증가하고, 부 버전은 중간 크기의 변경 사항이 있을 때 증가하며, 패치 레벨은 버그 수정과 같은 작은 변경 사항이 있을 때 증가합니다. 알파벳 표기법 (예: 1.0a, 2.3.1b): 이 방법은 주로 개발 초기에 사용되는 표기법입니다. 알파벳은 개발 단계를 나타내며, 주로 'a' (알파), 'b' (베타), 'rc' (릴리즈 후보) 등으로 표시됩니다. 알파 버전은 초기 개발 단계에서 사용되고, ..
CryptoSwift 크립토스위프트는 스위프트로 작성된 오픈 소스 암호화 라이브러리입니다. 이 강력한 라이브러리는 다양한 암호화 알고리즘을 제공하여 데이터 보호를 위한 안전하고 간편한 솔루션을 제공합니다. CryptoSwift은 스위프트 언어의 강력한 기능과 표현력을 활용하여 데이터 암호화, 해시 함수, HMAC, 인증 부호, AES, RSA 등 다양한 암호화 작업을 수행할 수 있습니다. 해당 라이브러리는 대칭 및 비대칭 암호화를 위한 AES, RSA, ChaCha20 등의 암호화 알고리즘을 제공합니다. 간편한 인터페이스를 통해 데이터를 안전하게 암호화하고 복호화할 수 있습니다. 다양한 해시 함수인 MD5, SHA1, SHA256, SHA512 등을 지원하여 데이터의 해시 값을 계산할 수 있습니다. 해시..
Rust 란 Rust는 Mozilla Research에서 개발한 시스템 프로그래밍 언어로, 안전성, 성능, 병행성을 강조합니다. Rust는 메모리 안전성을 보장하면서도 저수준 프로그래밍을 지원하며, 동시성 작업을 위한 기능을 제공합니다. Rust는 넓은 응용 범위를 가지고 있으며, 운영 체제, 임베디드 시스템, 웹 개발 등 다양한 분야에서 사용될 수 있습니다. Cargo 란 Cargo는 Rust의 공식 패키지 관리자이자 빌드 도구입니다. Rust 프로젝트의 종속성 관리, 라이브러리 설치, 빌드, 테스트, 실행 등을 편리하게 처리할 수 있도록 도와줍니다. Cargo는 Rust 커뮤니티에서 널리 사용되며, 프로젝트의 구조화와 의존성 관리를 간편하게 해줍니다. Cargo는 Cargo.toml 파일을 사용하여 ..
UIDocumentPickerViewController ▼ UIDocumentPickerViewController는 파일 선택 기능을 제공하는 뷰 컨트롤러로, 파일 선택 창을 표시하고 사용자가 파일을 선택하면 해당 파일에 대한 처리를 위임합니다. 선택한 파일은 delegate를 통해 알려주며, 이를 활용하여 원하는 작업을 수행할 수 있습니다. 다중 선택을 허용하거나 모달 프레젠테이션 스타일 등을 설정하여 사용자 경험을 조정할 수 있습니다. ▼ 다음 코드는 didPickDocumentsAt에서 선택된 파일의 URL을 가져와 출력합니다. 그런 다음, 선택된 파일이 PDF 파일인지 확인하고, PDF 파일인 경우 파일명을 디코딩합니다. 이후, Data(contentsOf:)를 사용하여 파일 데이터를 가져옵니다...
다국어 앱 스키마 언어 설정 Xcode로 다국어 앱을 제작할 때 여러 언어로 테스트해보기가 쉽지 않은데 Xcode에서 간단한 설정으로 다국어 테스트를 해볼 수 있습니다. 다만 실제 단말에서 테스트하기 위해서는 직접 단말에 시스템 설정에서 Region이나 App Language를 바꿔야 합니다. 하지만 단순히 언어의 Localization을 확인하기 위해서는 시뮬레이터를 여러 개 만들어서 사용해 보기 편리합니다. ▼ 프로젝트 파일을 열고 타겟이 아닌 프로젝트 메뉴에서 해당 프로젝트를 선택하고 하단에 Localizations 영역을 확인합니다. ▼ Xcode 상단바에서 프로젝트 아이콘을 눌러 Edit Scheme 메뉴를 선택합니다. ▼ Run 스키마의 Options 메뉴에서 App Languages를 Eng..
▼ 보통 Rounded Corner를 처리하려면 다음 코드와 같이 레이어에 cornerRadius와 masksToBounds를 주는 것이 일반적입니다. 하지만 이렇게 하면 사각형의 모서리 4방향 모두 Radius 값이 적용됩니다. ▼ 때문에 다음과 같은 익스텐션을 만들어서 활용하는 것이 편리합니다. UIBezierPath로 path를 생성하고 마스킹하는 형태의 방법입니다. 이렇게 하면 UIRectCorner 옵션을 받아서 각 모서리 별로 둥글게 처리할 수 있습니다. ▼ 다음은 .topLeft, .topRight 옵션을 준 모양입니다. 위쪽 왼쪽 오른쪽 모서리만 둥글게 처리된 것을 볼 수 있습니다. ▼ 이번에는 좌측 상단과 우측 하단만 주어서 아이콘 모양의 디자인을 만들수도 있습니다. 이밖에도 다양한 활용..