맥에는 VS Code, Atom 기타 훌륭한 에디터가 있지만 가끔 리눅스에서 처럼 vim을 사용할 순간이 있습니다. 하지만 처음 리눅스나 맥에 vim을 설치하면 탭이 스페이스 공백으로 설정되어 있지 않고 그냥 탭으로 동작하는 경우가 있습니다. 이때 vimrc 파일을 수정해서 파일을 수정해줍니다. 보통 개인 PC 일 경우에는 복잡한 vimrc 설정을 할 수 있겠지만 단순하게 꼭 필요한 설정만 해보겠습니다. ▼ 이렇게 설정하면 탭으로 인한 스트레스가 없습니다. smartindent : 들여쓰기 설정 tabstop : 탭 4칸 설정 expandtab : 탭 대신 스페이스로 설정 shiftwidth : 자동 들여쓰기를 4칸으로 설정 ▼ 다음은 좀 더 자세한 vimrc 옵션들입니다. . vimrc는 숨김 파일이며..
테이블 뷰에서 아이템을 추가하고 삭제 이동하는 기능은 많이 사용되는 기능입니다. 스위프트 UI에서는 List를 사용해서 보다 간단하게 이 기능을 구현할 수 있습니다. 이를 위해서는 NavigationView를 사용해야 하며 onMove, onDelete 함수를 사용합니다. 또한 토글 성격의 EditButton은 toolbar에 포함되며 macOS는 사용할 수 없고 iOS 전용입니다. ▼ 우선 해당 리스트에 사용될 데이터를 정의합니다. 총 5개의 데이터를 배열로 생성했습니다. ▼ 이제 NavigationView를 생성하고 그 안에 List를 추가합니다. ForEach 구문을 이용해서 배열에 있는 Text를 추가합니다. ▼ 리스트가 추가되었다면 이제 navigationTitle을 추가해주고 toorbar에 ..
IntelliJ는 다른 IDE에 비해서 Github를 연동하기 편리합니다. 만약 iOS 개발을 한다고 하면 Xcode에서 인텔리제이처럼 Github 연동이 별로 좋지 않아 소스트리나 기타 Git 관리 프로그램 또는 터미널에서 직접 Git 명령어를 사용하게 됩니다. 물론 최근에는 많이 좋아져서 그냥 Xcode로도 충분히 해결할 수 있을 것 같긴 합니다. 아무튼 Github에 쉽게 프로젝트를 remote로 설정하고 commit 하는 방법을 알아보겠습니다. ▼ 우선 인텔리제이로 새로운 프로젝트를 하나 만들어줍니다. 기존에 사용하던 프로젝트가 있다면 그 프로젝트에서 진행해도 됩니다. ▼ CMD+SHIFT+A 단축키를 누르면 다음 같이 Actions 검색창이 활성화 됩니다. ▼ 이제 검색창에 git이라고 검색하면..
시뮬레이터 다크모드 아이폰 개발을 하다보면 시뮬레이터를 자주 사용합니다. 최근 iOS 13 이후부터는 다크 모드를 지원하게 되는데요. 개발 초기에는 앱 개발 시 다크 모드를 포함하지 않는 경향이 있었지만 최근에는 다크모드를 지원하는 앱이 많아졌습니다. 일일이 시뮬레이터에 연결해서 다크모드를 테스트하는 것보다는 시뮬레이터에서 테스트하는 편이 훨씬 빠릅니다. 아이폰에서는 제어센터에서 손쉽게 변경할 수 있는데요. 시뮬레이터는 조금 귀찮긴 합니다. 그림 지금부터 시뮬레이터에서 다크 모드로 변경하는 법을 알아보겠습니다. ▼ 다음과 같이 앱 홈화면에 설정 메뉴를 선택합니다. ▼ 설정화면에서 아래쪽으로 스크롤해줍니다. ▼ 시스템 설정 마지막 부분에 개발자 메뉴를 선택합니다. ▼ Developer (개발자) 메뉴에서 ..
H2 데이터베이스 H2 데이터베이스는 관계형 데이터베이스 관리 시스템(DBMS)으로 자바로 작성되었습니다. 임베드 모드로 동작하거나 다른 웹 서버 데이터베이스 관리시스템과 비슷한 구성을 할 수 있도록 클라인트 서버 모드로 구동이 가능합니다. 대부분의 SQL 표준 구문을 지원하며 용량이 매우 적은 저용량 데이터베이스입니다. 스프링 부트환경에서 자주 사용되는 H2 Database를 설치해보고 간단히 데이터를 추가 삭제해보겠습니다. H2 데이터베이스는 별도의 프로그램 없이 웹 브라우저 콘솔을 이용할 수 있어서 편리합니다. https://h2database.com/html/download.html Downloads Downloads Version 2.1.214 (2022-06-13) Windows Install..
DataGrip 데이터 덤프 ▼ 데이터 그립을 이용해서 데이터 dump를 해보겠습니다. 우선 데이터를 복사할 스키마를 선택하고 오른쪽 버튼을 눌러서 메뉴를 불러옵니다. 그리고 Export Data to File 이라는 메뉴를 선택합니다. ▼ Extrator 항목에서 SQL Inserts 를 선택합니다. 이밖에도 CSV 나 JSON 같은 다양한 옵션을 선택할 수 있습니다. 만약 RDBM 데이터를 NOSQL 쪽으로 옮길때 JSON을 사용하면 유용할 것 같습니다. 엑셀을 사용할 때는 CSV를 사용하기 좋겠네요. 그밖에 Add table definition을 선택하면 DDL 구문이 만들어지는 것을 볼 수 있습니다. 오른쪽에 프리뷰는 실제 데이터가 아니라 이렇게 구성된다는 것을 보여주는 예시입니다.
Localizable.string 스위프트UI에서 다국어 처리를 해보도록 하겠습니다. 기존 오브젝티브 C나 Swift에서 하던 방식보다 훨씬 간단하게 처리할 수 있는 장점이 있습니다. 다음과 같이 .enviroment 옵션을 줘서 강제로 locale을 한국(ko)로 지정할 수도 있습니다. 기존 스토리 보드 개발 방식에 비해서 테스트 할 때 굉장히 유리합니다. 기존에는 자간이나 텍스트 사이즈를 및 개행을 확인해보기 위해서 일일히 실행해봐야 했는데 정말 획기적입니다. 다국어 처리하기 ▼ 우선 문자열 파일을 만들기 위해서 새로 파일을 하나 만듭니다. 프로젝트 파일을 오른쪽 버튼을 눌러서 New File... 버튼을 누릅니다. ▼ 아래쪽으로 조금 스크롤 하다보면 String File 을 확인할 수 있습니다. 선..
SwiftGen 이란? 스위프트를 사용해서 앱을 만들다 보면 리소스 관리가 안드로이드에 비해서 훨씬 복잡하고 어렵다는 것을 알 수 있습니다. 어렵다기보다는 관리가 제대로 이루어지지 않아서 실수를 하는 경우도 많고 워낙 IDE 가 훌륭해서(?) 까다로운 경우가 많죠. 하지만 이러한 모든 문제를 알고 만들어진 오픈소스가 있습니다. SwiftGen이라는 오픈소스인데요. 글 쓰는 현재 8천 명이 넘게 즐겨찾기로 추가해놓았습니다. 다음의 항목들을 관리할 수 있게 해 줍니다. Assets Catalogs Colors Core Data Files Fonts Interface Builder files JSON and YAML files Plists Localizable strings https://github.com/..
▼ 전체코드 ▼ LINE 6 : 그냥 텍스트를 노출합니다. ▼ LINE 9~10 : 텍스트의 사이즈를 변경합니다. ▼ LINE 13~14 : 텍스트의 사이즈와 스타일(.bold)을 변경합니다. ▼ LINE 27~28 : 텍스트의 사이즈와 스타일(.thin)을 변경합니다. .bold .semibold .heavy .light .regular .thin .ultraLight .black ▼ LINE 37~38 : 텍스트의 사이즈와 스타일 그리고 디자인을 변경합니다. .default .monospaced .reounded .sefif ▼ LINE 54~55 : 커스텀 텍스트 스타일을 변경합니다. .largeTitle .title .title2 .title3 .headline .subheadline .body ..
▼ 스위프트 UI를 사용할 때 이미지를 가져와 사이즈를 화면에 맞게 조절하고 원 모양의 이미지를 만드는 방법을 알아보겠습니다. 이미지를 사용하는 방법은 아주 간단한데 사용하는 패턴은 여러가지가 될 수 있으니 알아두는게 좋습니다. 우선 예제를 실행하기 전에 Assets 폴더에 img 라고 아무 이미지나 하나 넣어줍니다. ▼ 다음과 같이 VStack을 하나 만들고 그 안에 Image를 하나 새로 만들어줍니다. 보는 것과 같이 이미지가 화면이 꽉찬 것을 볼 수 있습니다. 기본으로 이미지를 추가하게 되면 높이를 기준으로 좌우가 넓게 표현됩니다. ▼ 이번에는 .resizable() 을 추가해서 화면을 폭에 맞추어보겠습니다. 화면이 아래위로 꽉차서 비율이 깨지는 것을 볼 수 있습니다. ▼ 이제 .aspectRati..
아이폰 앱을 만들면 무한 스크롤을 구현해야 하는 경우가 있습니다. 주로 서버에서 보내온 데이터가 페이징 처리가 되있는 경우에 무한 스크롤을 구현합니다. 더보기 버튼을 만들어서 구현할 수 도 있지만 더 보기 버튼 보다는 무한 스크롤로 테이블 뷰를 구현하는 것이 더 자연스럽습니다. 지금 부터 무한 스크롤을 위해서 필요한 것들과 방법에 대해서 알아보겠습니다. ViewModel 코드 (데이터 정의) ▼ 우선 통신하는 부분을 보겠습니다. 코드가 길어서 복잡해보이겠지만 단순합니다. totalPage, currentPage, isLoading 변수를 선언해줍니다. 데이터 통신이 끝나면 테이블 뷰 데이터에 기존 데이터를 포함해서 appendData를 해줍니다. 또한 통신이 시작하기 전에 isLoading 값을 true..
스위프트의 동적 멀티플라이어 오토레이아웃을 사용하다보면 동적으로 멀티플라이어 값을 동적으로 바꿔야 할 경우가 있습니다. 특히나 iPad iPhone을 동시에 개발 할 때 필요합니다. 해당 비율을 동적으로 주기 위해서는 NSLayoutConstraint에 multiplier를 적용해주면 되지만 몇 가지 생각해야 하는 것이 있습니다. 다음과 같이 Constraint를 removeConstraint로 삭제한 뒤에 다시 addConstraint를 이용해 추가해줘야 합니다. 또한 새로 화면을 업데이트 하기 위해서 layoutIfNeeded 함수를 호출해줘야 합니다. ▼ 우선 다음과 같이 extension을 사용해 constraintWithMultiplier라는 함수를 만들어줍니다. 내부적으로 하는 일은 그냥 새로..
JPA를 사용하면서 JQPL 로 쿼리를 작성했는데 다음과 같은 에러 문제를 겪었습니다. GROUP BY 명령을 실행할 때 MySQL 5.7 이상 버전 부터는 sql_mode 옵션을 변경해줘야 합니다. GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 오래된 데이터베이스에서는 문제없이 동작하는 코드 였는데 새로운 MySQL 을 도커로 설치하고 실행하니 문제가 되어서 찾아보았습니다. only_full_group_by 옵션을 비활성화 하는 방법은 다음과 같습니다. 관리자 권한으로 로그인 한뒤에 mysql 에서 다음과 같이 입력해서 only_full_group_by 옵션을 꺼주면 됩니다. 참고로 MySQL 뿐만아니라 MariaDB에서도..
Oh-my-zsh 설치하기 https://ohmyz.sh/ Oh My Zsh - a delightful & open source framework for Zsh Oh My Zsh is a delightful, open source, community-driven framework for managing your Zsh configuration. It comes bundled with several helpful functions, helpers, plugins, themes, and a few things that make you shout... OH MY ZSH! ohmyz.sh 다음 스크립트를 복사해서 터미널에 붙여넣기 합니다. ▼ 다음과 같은 화면이 보인다면 설치가 완료되었다는 뜻 입니다. ▼ 다음..
Homebrew Homebrew는 macOS 에서 지원하지 않는 프로그램들을 설치할 수 있는 패키지 관리자 중에 하나입니다. 리눅스에서 apt 나 yum 같은 역할을 합니다. 하지만 맥은 대부분의 필수 유틸리티는 기본적으로 설치되어 있거나 Appstore에서 다운로드하기 때문에 개발자와 같은 특수한 경우를 제외하고는 잘 설치하지 않습니다. 기존 인텔 CPU 맥에서는 아무런 문제가 없었지만 M1 맥 출시 이후에 homebrew를 설치하다 보면 문제가 생깁니다. brew 명령어가 실행되지 않는 문제가 있는데 homebrew를 설치하고 나서 나오는 메시지를 참고해서 수정 가능합니다. https://brew.sh/index_ko Homebrew The Missing Package Manager for macOS..
▼ 우선 도커 명령어를 사용해서 다음과 같이 NginX 이미지를 다운로드 합니다. ▼ 이미지를 다운로드 받았다면 다음과 같이 새로운 컨테이너를 생성합니다. --name : 실행할 컨테이너의 이름을 입력합니다. -d : 백그라운드로 실행합니다. -p : 포트를 설정합니다. (내부는 80으로 지정하고 외부는 8080으로 지정합니다.) ▼ 컨테이너 상태를 확인하기 위해서 컨테이너 내부로 들어갑니다. ▼ nginx -v 명령을 통해서 버전을 확입합니다. ▼ ps 명령을 사용해서 nginx의 상태를 확인해야 하지만 해당 명령이 없을 경우 apt-get 명령을 통해서 procps 를 설치합니다. ▼ procps 가 설치되었다면 다음과 같이 ps 명령을 이용해서 nginx의 상태를 확인합니다. grep 명령으로 프로..
스프링 부트 도커 파일 설정 ▼ 최상위 경로에 다음과 같이 docker 파일을 만들어줍니다. EXPOSE에 원하는 포트를 입력합니다. FROM - JDK를 설정합니다. ENV - 환경변수 설정를 설정합니다. WORKDIR - 환경변수를 경로로 지정합니다. COPY - 빌드된 jar 파일을 application.jar의 파일명으로 복사합니다. EXPOSE - 실행될 포트를 설정합니다. CMD - 명령어 옵션을 입력합니다. 빌드 및 컨테이너 실행 ▼ 프로젝트를 빌드하기 전에 gradlew 파일을 실행 가능하도록 권한을 변경합니다. ▼ gradlew를 이용해서 프로젝트를 빌드합니다. -x 옵션으로 test 프로젝트는 빌드하지 않습니다. ▼ 도커 이미지 생성을 위해서 빌드를 합니다. 임의로 my라는 이름을 주었..
평소에 소스 머지를 위해서 소스트리나 깃허브의 Github Desktop으로 작업을 합니다. Git에 특화되어 있고 인텔리제이에 비해서 다양한 언어로 된 IDE를 독립적으로 관리할 수 있기 때문이죠. 하지만 최근에 인텔리제이로 작업을 많이 하게 되면서 그런 툴들을 쓰는 것도 귀찮고 해서 직접 인텔리제이에서 머지(merge) 작업을 하는 방법을 알아보았습니다. 매우 간단하고 편리합니다. 인텔리제이 Merge Branch ▼ 메뉴바에서 Git 메뉴를 선택하고 하위 메뉴중에 Merge...를 선택합니다. ▼ 머지할 대상 브랜치를 선택합니다. (현재 브랜치는 master) ▼ 다양한 옵션을 선택할 수 있습니다. --no-ff : fast-foward 관계라 하더라도 강제로 merge commit을 생성하고 병합..
포스트맨을 사용하다보면 다음과 같은 에러가 뜰 수 있습니다. "Could not send request" CORS Error: The request has been blocked because of the CORS policy 이때 옆에 보면 Use Postman's Desktop Agent 라는 버튼을 볼 수 있는데요. 이 버튼을 눌르면 Desktop Agent 를 사용해서 CORS 문제를 해결할 수 있습니다. 단 Desktop Agent 를 설치해야 하는데요. 설치 방법은 간단합니다. 포스트맨 CORS 에러 한 가지 주의하실 점은 포스트맵 데스크탑용 프로그램이 아닌 에이전트라는 점 입니다. 포스트맨은 데스크탑용 어플리케이션을 사용하거나 웹 브라우저를 통해서 사용할 수 있는데요. 웹 브라이저에서 사용중..
코드 스니핏(Code Snippet) Snippet은 작은 조각이란 뜻으로 보통 프로그래밍 개발 시 미리 작성해 놓은 다양한 단축 구문을 모아놓은 템플릿이라고 할 수 있습니다. 이미 맥에도 유료나 무료의 다양한 Code Snippet 툴들이 존재합니다. 하지만 오늘 알아볼 Xcode의 Snippet은 기본 제공되며 체계적으로 코드를 저장한다면 강력한 개발 도구가 될 수 있을 것 같습니다. ▼ 단축키는 Command + Shift + L 입니다. 보통 스토리보드나 XIB에서 해당 단축키를 누르면 이미지 라이브러리가 노출됩니다. 일반 코드를 보고 있다가 단축키를 누르면 Snippet 라이브러리가 노출됩니다. ▼ 만약 다음과 같이 av라고 검색하면 API 버전을 체크하는 구문을 검색할 수 있습니다. 오른쪽 하..