lifeyun24의 등록된 링크

키자드에 등록된 총 299개의 포스트를 확인하실 수 있습니다.

Naver Blog

[IT 시사] 트위치는 최고 화질을 왜 720p로 낮췄을까?

어느 날 갑자기 예고도 없이 찾아온 트위치 최고 화질 720p. 이게 과연 2022년에 일어날 수 있는 일인가? 무슨 영문인지 알아본다. '트위치(Twitch)'가 22.9.29일 자사 웹사이트를 통해 한국 내 서비스 운영 비용이 지속 증가함에 따라, 오는 30일부터 한국의 시청 화질을 기존 1080p 60 FPS에서 720p로 제한할 것이라 밝혔다. 화질 제한 공지 트위치가 언급한 '서비스 운영 비용'은 최근 몇 해 동안 'SK텔레콤', 'KT', 'LG유플러스' 등 대표 통신 3사를 비롯한 국내 인터넷 서비스 제공사들과 갈등을 빚어온 망 사용료에 따른 부담을 의미하는 것으로 추측된다. 지난 20일 네이버, 카카오 등 국내 기업은 "통신사에 망 이용료를 지불하는데 왜 해외 기업은 예외인가"라는 국내 기업들의 역차별 호소로 관련 법안이 개정되어 비용 부담이 커졌기 때문이다. 망 사용료는 무엇이며 사건의 원인은? 유선 인터넷은 기본적으로 접속료를 지불하면 약정된 대역폭의 회선으로 통신

Naver Blog

[iOS] ipa 배포 방법 4가지 설명 (2탄)

https://blog.naver.com/lifeyun24/222726233932 [Xcode] .ipa 파일 생성 및 설치 한방에 해결 .ipa 파일 확장자를 가진 파일은 iOS 앱 파일입니다. iPhone, iPad 또는 iPod touch 응용 프로그램을 ... blog.naver.com 위 링크는 예전에 필자가 블로그에서 정리한 내용이며 최근에 다시 검토 시 부족한 부분을 발견해 보충하는 목적으로 본 포스트를 작성합니다. 생성 및 설치 방법은 여전히 위 링크를 참고하시면 됩니다. 오늘은 배포 방법 4가지를 심층적으로 알아보겠습니다. iOS 배포 방법 설명 보충 iOS 테스트를 위한 배포 방법에는 4가지 정도의 플랜이 있습니다. (22. 10월 Xcode 기준) 1. 테스트 플라이트 2. 애드 혹 (adhoc) 3. 엔터프라이즈 4. 개발용 테스트 이와 같은 배포 방식을 왜 알아야 하는가? 하는 의문이 들 수 있습니다. 단편적인 예를 들어보겠습니다. 사내에서 개발을 하는데 소스

Naver Blog

[SwiftUI] 왜 $를 붙인 Binding 값을 사용하나요?

// // FrameworkDetailView.swift // AppleFramework-SwiftUI // // Created by tonyyun on 10/27/23. // import SwiftUI struct FrameworkDetailView: View { @StateObject var viewModel: FrameworkDetailViewModel var body: some View { VStack(spacing: 20) { Spacer() Image(viewModel.framework.imageName) .resizable() .frame(width: 80, height: 80) Text(viewModel.framework.name) .font(.system(size: 24, weight: .bold)) Text(viewModel.framework.description) Spacer() Button(action: { viewModel.isSafariPresented =

Naver Blog

[SwiftUI] @ Property Wrappers 정리

@State SwiftUI에서 상태를 처리하는 방법 뷰의 상태를 저장하는 프로퍼티로 상태 관리 주체는 해당 뷰 기본적으로 Private 선언이기에 다른 뷰와 값을 소통하려면 Binding을 이용 값이 변경될 때마다 UI 업데이트 @Binding 뷰와 상태를 바인딩 하는 방법 상위 @State 변수를 전달 받아 하위 뷰에서 캐치해 변화 감지 및 연결 Binding은 다른 뷰가 소유한 속성을 연결하기에 소유권 및 저장 공간이 없음 ObservableObject 클래스 프로토콜로 관찰하는 어떠한 값이 변경되면 변경사항을 알려줌 뷰에서 인스턴스 변화를 감시하기 위해 뷰모델 객체로 생성할 때 사용할 수 있음 @Published ObservableObject를 구현한 클래스 내에서 프로퍼티 선언 시 사용 @Published로 선언된 프로퍼티를 뷰에서 관찰할 수 있음 ObservableObject의 objectWillChange.send() 기능을 @Published 프로퍼티가 변경되면 자동으로

Naver Blog

[SwiftUI] 하위 View 를 선언하는 3가지 방법

import SwiftUI struct TodoListView: View { @EnvironmentObject private var pathModel: PathModel @EnvironmentObject private var todoListViewModel : TodoListViewModel var body: some View { ZStack { VStack { if !todoListViewModel.todos.isEmpty { CustomNavigationBar( isDisplayLeftBtn: false, rightBtnAction: { todoListViewModel.navigationRightBtnTapped() }, rightBtnType: todoListViewModel.navigationBarRightBtnMode) } else { Spacer() .frame(height: 30) } titleView // 여기에 넣기 위한 방법 } } } // 방법 1 var titl

Naver Blog

[UIKit] Collection View 스크롤 방향 바꾸기, page control 연결하기

기본적으로는 vertical 방향으로 스크롤이 진행된다. Horizontal로 변경. Page Control이랑 연동하기 Paging Enabled 체크, (스르륵 넘어가던 화면이 촥촥 타이밍에 맞게 끊기면서 멈춘다.) 움직일 때 표시되는 선(indicator)을 끄는 것은 선택 사항. 다만 page control이 있기에 indicator은 필요없을 것이다. page control 연결 코드 설정 @IBOutlet weak var pageControl: UIPageControl! // page control의 점을 총 몇개 보여줄 것인지 override func viewDidLoad(){ pageControl.numberOfPages = messages.count // page control의 어떤 점이 밝게 빛날지 0,1,2... 아래에서 사용. // pageControl.currentPage } ... extension OnboardingViewController: UIScro

Naver Blog

[iOS] Compositional Layout 알아보기

기존의 single layout은 복잡한 layout을 구현하기에 힘들다. 따라서, UICollectionViewDataSource --> UICollectionViewDiffableDataSource UICollectionViewFlowLayout --> UICollectionViewCompositionalLayout 로 변경 사용해야 하며, // Data, Presentation, Layout 새로운 방법 사용 wwdc // snapshot: data // diffable datasource: presentation // compositional layout: layout 이렇게 한다고 볼 수 있다.

Naver Blog

[UIKit] error: Failed to instantiate the default view controller for UIMainStoryboardFile'Main'

에러 본문: Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set? 확인 해야할 부분은 두가지다. 1. storyboard에 view controller제대로 연결했는지 확인하기 2. Is initial view controller 체크 entry point is not set? 라고 여쭤보는 것이기에 이 부분을 체크하면 해결 가능하다. 다 했으면 clean build folder한 번 하고 돌리는 것도 추천.

Naver Blog

[Mac] 기본 터미널의 호스트 네임 변경하기

맥북 기본 터미널을 열면 시스템에서 디폴트 값으로 이름@이름-기기이름 이런 형식으로 만들어놨다. 한국어로 설정했을 경우 영문 이름이 틀릴 수도 있기에 수정이 필요하다. scutil --set HostName [원하는HostName] 실행 후 터미널을 재시동하면 적용이 된다.

Naver Blog

[iOS] Cocoapods 설치 및 외부 라이브러리 사용하기

CocoaPods은 Objective-C 또는 Swift에서 라이브러리를 사용할 수 있게 도와주는 모듈이다. sudo gem install cocoapods m1/m2 설치 후에 버전 관련 에러가 날 수도 있는데, 경험상 기본적으로 맥에 설치되어 있는 ruby 버전은 쉽게 업데이트하지 않는 것이 좋다. 따라서 에러 메시지에 나오는 내용대로 수정하면 된다. 어렵지 않다. 터미널 창을 열어, 생성한 프로젝트 폴더로 이동한다. pod init 그러면 "Podfile"이 생성된다. # <- 주석 처리되어 있는 부분인 platform은 자신의 프로젝트 최저 버전으로 설정하고 주석을 지운다. 그리고 라이브러리에 명시되어 있는 내용에 따라 해당 위치에 추가할 내용을 추가한다. Podfile에도 문법이 존재하기에 정확안 위치에 커맨드를 넣어야 한다. pod install 로 라이브러리 설치. 라이브러리 설치 이후에는 프로젝트 폴더의 .xcodeproj 파일이 아닌, .xcworkspace 파일을

Naver Blog

[iOS] 오픈소스 라이브러리 PR 승인 (instructions)

남는 시간을 활용하여 storyboard로 필자만의 iOS 앱을 개발 중이었다. 사용자가 앱 진입 시 UI 사용 안내를 받게 하기 위하여 cocoapods에서 instructions라는 라이브러리를 찾았다. 규모도 꽤 크고 사용자도 많아 한 번 필자의 앱에 적용하여 시도해 보기로 했다. 사용법에 따라 적절한 부분에 코드를 집어넣으면서 사용하였는데 라이브러리의 오리지널 파일에서 warning이 발생하였다. Swift도 다른 언어와 별반 차이 없이 Apple에서 계속 업데이트하기에 iOS의 버전이 업데이트됨에 따라 사용하지 못하는 문법이 발생할 수 있다. 해당 warning은 Apple이 iOS15.0 이상부터 사용하지 말라고 권고하는 문법이다. 그냥 필자의 local 파일에서 수정하고 잊어버릴 수도 있었지만, 개발자로서의 이타심이 이 부분을 못 지나치게 하였다. 필자는 iOS15.0 이전과 이후 두 파트로 나눠서 코드를 수정하여 pull request 요청을 보냈다. 주말이 지나서 라

Naver Blog

[SwiftUI] List(list, id: \.self)에서 &quot;id:&quot;를 생략하고 싶을 때

// 기존 형태 List(list, id: \.self) { item in StockRankRow(stock: item) .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) .listRowSeparator(.hidden) .frame(height: 80) } .listStyle(.plain) .background(.black) // 가져오는 데이터 struct StockModel: Hashable { let rank: Int let imageName: String let name: String let price: Int let diff: Double } 대충 이런 형식이다. List(list, id: \.self) 에서 id:는 구분자를 설정하기 위해서인데 그것을 데이터 쪽에서 설정할 수 있다. struct StockModel: Hashable, Identifiable { var id: UUID = UUID(

Naver Blog

[SwiftUI] @StateObject, @ObservedObject 이해하기

`@StateObject`와 `@ObservedObject`는 SwiftUI에서 사용되는 두 가지 프로퍼티 래퍼입니다. 둘 다 ObservableObject 프로토콜을 준수하는 객체의 변화를 감지하여 뷰를 업데이트하는 데 사용되지만, 주요한 사용 케이스와 라이프 사이클 관리 측면에서 차이가 있습니다. 1. **@StateObject**: - `@StateObject`는 **소유자**입니다. 즉, SwiftUI가 이 객체의 라이프 사이클을 관리하게 됩니다. - `@StateObject`는 주로 뷰 내에서 처음 생성되는 객체에 사용됩니다. - 뷰가 다시 생성되어도, `@StateObject`로 마킹된 객체는 파괴되지 않고 존속합니다. - 이러한 특징 덕분에 뷰의 라이프 사이클 동안 한 번만 초기화하고 유지하려는 객체 (예: 뷰 모델)에 적합합니다. 2. **@ObservedObject**: - `@ObservedObject`는 **참조**입니다. 객체의 라이프 사이클은 SwiftUI가

Naver Blog

[개발 지식] &quot;Single Source of Truth&quot; (SSoT)는 무엇인가?

"Single Source of Truth" (SSoT)는 데이터 설계와 아키텍처에서 중요한 원칙 중 하나로, 어떤 특정 데이터나 정보에 대해 그 데이터의 정확하고 신뢰할 수 있는 하나의 출처나 저장 위치가 있어야 한다는 의미입니다. 이 원칙은 중복, 모순 및 데이터 불일치 문제를 방지하는 데 도움을 줍니다. SSoT의 핵심 아이디어는 다음과 같습니다: 1. **데이터 중복 최소화**: 데이터가 여러 위치에 중복 저장되지 않도록 합니다. 중복 저장은 데이터 불일치의 위험을 높이므로, 가능한 한 중복을 피하려고 노력합니다. 2. **데이터 무결성 유지**: 데이터가 변경될 때, 해당 변경이 SSoT에서만 수행되어야 합니다. 그 결과, 다른 시스템이나 구성 요소에서는 이 SSoT를 참조하여 항상 최신의 정보를 얻을 수 있습니다. 3. **일관성**: SSoT는 데이터의 일관성을 보장합니다. 모든 시스템이 동일한 데이터 소스를 참조하므로 데이터의 일관성이 유지됩니다. 실제 애플리케이션 개

Naver Blog

[SwiftUI] error: EnvironmentObject 응용 프로그램이 예기치 않게 종료되었습니다.

@EnvironmentObject 를 사용하면 preview가 crash 난다. struct ContentView_Previews: PreviewProvider { static var previews: some View { FirstView().environmentObject(UserProfileSettings()) } } PreviewProvider에 .environmentObject(.environmentObject로 설정한 class) 추가로 해결

Naver Blog

[SwiftUI] error: Cannot convert value of type '.Type' to expected argument type 'Binding&lt;&gt;'

@Binding var framework: AppleFramework ... #Preview { FrameworkDetailView(framework: AppleFramework) } --> #Preview { FrameworkDetailView(framework: .constant(AppleFramework.list[0])) } .constant 에 .list[0] 추가하면 된다.

Naver Blog

[SwiftUI] Button의 Tappable 영역 정하기

https://alejandromp.com/blog/playing-with-swiftui-buttons/ Playing with SwiftUI Buttons | Alexito's World The abstractions on SwiftUI are so composable that customising the UI it's basically an intrinsic property of the framework. Let's take a quick look at some things you can do... alejandromp.com 자세한 내용은 위 사이트를 참고하면 좋다. 필자는 유용한 내용만 추출해서 정리해보겠습니다. Button(action: { // presentationMode.wrappedValue.dismiss() // 창닫기 }, label: { Text("Learn More") .font(.system(size: 20, weight: .bold)) .foreground

Naver Blog

[UIKit] UISearchController 만들어 보기

class SearchViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self if let flowlayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout{ flowlayout.estimatedItemSize = .zero } // 여기 self.navigationItem.title = "Search" let searchController = UISearchController(searchResultsController: nil) searchController.hidesNavigationBarDuringPre

Naver Blog

[Xcode] 개발 중 사용하는 유용한 단축키 모음

(CMD) + c(Click) : 정의로 이동 / fold로 현재 커서가 위치한 블록 접기/펼치기 기능 (Option) +c(Click) : Declaration을 보여줌 (CMD) + (SHIFT) + F : 전체 파일 스트링 검색 (CTRL) + i : 코드 정렬 (CMD) + [ 또는 ] : 코드 들여 쓰기 (Option) + (CMD) + [ : 해당 줄의 코드를 위로 올림 (Option) + (CMD) + ] : 해당 줄의 코드를 위로 내림 (SHIFT) + (CTRL) + c(Click) : 여러 줄을 클릭해 한번에 수정/추가 가능 Command + Control + e : 같은 단어 한번에 선택 (CMD) + D : 선택한 줄 아래로 복사 + + ← : 코드 블록 접고 열기

Naver Blog

[Xcode] Github에 Xcode 프로젝트 올리기 (push 하기)

Xcode -> Settings -> Accounts +로 Github 계정 추가. Token 생성은 하단의 Create a Token on Github로 진행하면 된다. 계정 추가 완료 후 Integrate -> New Git Repository... 만약에 프로젝트 처음 생성 시 git repository도 같이 생성으로 진행했으면 아래와 같이 이미 source control이 됐다고 뜬다. 좌측 Source Control Navigator 클릭 Repositories -> 앱 이름 우클릭 -> Remote 항상 깃허브에서 설정하던 대로 진행해 준다. 여기까지 진행하면 깃허브에서 repository 생성이 완료됐을 것이다. 하지만 위 사진과 같이 init 당시의 repo만 올라갔지 그동안 변경했던 부분은 아직 push를 해줘야 한다. commit & push 작업 진행. Integrate에 필요한 명령들이 다 있으니 이대로 진행하면 된다. repo에도 commit & push 된

Naver Blog

[UIKit] Autolayout 이해하기 (in storyboard)

기존 프레임 기반 레이아웃의 문제가 있다. 아이폰 8~15까지 다 스크린 사이즈 및 해상도가 조금씩 다르며 동적으로 뷰를 위치 시킬 수 없고, 또 스크린별로 일일이 계산해 주는 것은 방대한 작업량을 요구한다. 따라서 autolayout = 자동으로 의도를 정해주면 알아서 위치하게 해준다. 제약사항(Constraint)를 통해서 autolayout을 적용 적용 시, 뷰는 위치를 알 수 있어야 하고 크기를 알 수 있어야 한다. 아이폰의 좌상점이 (0,0)이다. x, y 축 존재. 버튼이 수직 기준으로 이 전체 뷰에서 중앙에 위치하고 싶다. 그러면 버튼에서 ctrl+클릭으로 끌어서 원하는 뷰로 끌어온다. 그러면 위와 같이 메뉴가 나온다. size inspector에서 확인 가능. 이렇듯이 설정 중에 빨간색이 나타난 이유는 사이즈라든지, 수평 수직 위치 등 아직 정하기 않은 부분이 있다~라는 것을 알려줍니다. 여기서는 수직 위치를 안 정해서 그렇다, 설정을 완료하면 빨간 테두리도 사라지며

Naver Blog

[iOS] 앱 lifecycle 생명주기 간단 정리

import UIKit class SymbolRollerViewController: UIViewController { let symbols: [String] = ["sun.min","moon","cloud","wind","snowflake"] @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var label: UILabel! @IBOutlet weak var button: UIButton! // 메모리 올라가고, 화면 준비하고. override func viewDidLoad() { super.viewDidLoad() reload() } // 화면이 곧 보여진다. override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } // 화면이 보여진 이후. override func viewDidAppear(_ animated: Bool) { super.

Naver Blog

[UIKit] 주황색 표시인 constraints 업데이트가 안될 때

사진과 같이 버튼을 view 중앙에 위치 시키고 싶은데 바로바로 업데이트가 안될 때가 있다. option+command+플러스키 constraints가 업데이트된다.

Naver Blog

[UIKit] 실행되고 있는 앱의 hierarchy(계층) 보는 법

먼저 앱을 실행하고 있는 상태에서 그럼 이렇게 UIcollectionView에서 셀 크기 및 각종 레이아웃 정보를 볼 수 있다.

Naver Blog

[UIKit] 자동완성, 셀 사이즈, 내용 압축 저항 우선순위 변경법

자동 완성 목록 보여주기 ESC, Tab ESC를 누르면 나오며 여기서 Tab으로 한 단어씩 완성해 나가거나 원하는 것을 선택 후 Enter을 눌러 선택. collectionViewCell 사이즈 Estimate Size 코드에서 셀 사이즈를 safe area width 사이즈로 한정해 줬음에도 불구하고 화면 밖으로 나갈 때가 있다. 그럴 때는 Estimate(추정) Size: None으로 설정하면 코드대로 작동한다. 내용 압축 저항 우선순위 Content Compression Resistance Priority 대화 내용 이랑 날짜는 같은 horizontal 선상에 위치하며 서로가 서로를 밀고 있는 상황이다. 여기서 긴 대화 내용 때문에 기기에서 날짜가 보이지 않는 현상이 발생하는데, 힘의 균형 싸움에서 대화 내용이 지고 날짜가 이겨서 날짜가 보였으면 한다. 따라서 대화 내용 label의 size inspector에 들어가, 이 Content Compression Resistanc

Naver Blog

[UIKit] label lines 변경, UIImageView round corner radius 설정하기 in storyboard

label 라인 변경 여기서 lines에 따라 변경이 된다. label 양이 lines보다 많으면 많이 나온 부분은 자동으로 ...으로 변경된다. UIImageView round corner User Defined Runtime Attributes 변경. layer.masksToBounds layer.cornerRadius 현재 사용하는 이미지가 80 X 80로 설정했기에, 이미지를 동그랗게 하려면 40으로 하면 된다. ** 코드로 변경하는법 import UIKit class ChatListCollectionViewCell: UICollectionViewCell { @IBOutlet weak var thumbnail: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var chatLabel: UILabel! @IBOutlet weak var dateLabel: UILabel! // imageView corner

Naver Blog

[Swift] 날짜 타입 &quot;yyyy-MM-dd&quot;에서 &quot;M/d&quot;으로 변경하는 법

func formattedDateString(dateString: String) -> String { // String -> Date -> String // 2022-04-01 -> 1/4 let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" if let date = formatter.date(from: dateString){ formatter.dateFormat = "M/d" return formatter.string(from: date) } else { return "" } } 넘어오는 데이터에서 날짜(dateString)는 "yyyy-MM-dd" 형식의 string이다. let formatter = DateFormatter()를 사용하여, string -> date-> date format -> string으로 변환하여 return 시킨다.

Naver Blog

[Swift] 가격을 천 단위로 콤마 들어가게 변경하기

func convertToCurrencyFormat(price:Int)->String{ let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.maximumFractionDigits = 0 return numberFormatter.string(from: NSNumber(value: price)) ?? "" } [코드] 이렇게 return 시키면 된다. 5123450원 -> 5,123,450원

Naver Blog

[UIKit] collectionViewCell 여백 설정, Navigation controller 추가, Superview 설정하기

collectionViewCell 여백 설정 class FrameworkListViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! let list:[AppleFramework] = AppleFramework.list // data, presentation, layout override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self // 컨텐츠 상하좌우 여백주기 collectionView.contentInset = UIEdgeInsets(top: 20, left: 16, bottom: 0, right: 16) } } Navigation controller 추가 storyboard를 선택한 상태에서 Editor-> Embed in-> Navig

Naver Blog

[UIKit] CollectionViewCell 의도한 대로 셀 사이즈가 안 나올 때

extension FrameworkListViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let interItemSpacing: CGFloat = 10 let paddingSpacing: CGFloat = 16 let width = (collectionView.bounds.width - interItemSpacing * 2 - paddingSpacing * 2) / 3 let height = width * 1.5 return CGSize(width: width, height: height) } 이렇 듯이 셀 사이즈를 코드로 정해놨는데 의도대로 작동이 안 될 때가

Naver Blog

[Swift] 함수의 정의 및 필요성

함수의 필요성 및 기본 형태 // 함수 기본 형태 func hello(name:String) -> String { return "Hello " + name } print(hello(name:"Tony")) 함수의 다양한 형태 // 파라미터 기본값 설정 func addTwoNumbers(num1:Int, num2:Int = 100)->Int{ let sum = num1 + num2 return sum } addTwoNumbers(num1: 5) //num2 생략 // 파라미터 많이 받기 func addNumbers(numbers:Int...)->Int { var sum = 0 for num in numbers{ sum += num } return sum } addNumbers(numbers: 1,2,3,4,5)

Naver Blog

[Swift] class 개념, 상속, subclass, override 등

class 개념 let circle = Circle() 이 부분이 핵심인데, 이 클래스의 instance를 만든다고 한다. 따라서 circle는 여기서 instance 하고 불린다.(또한 객체 object, 하지만 애플은 instance라고 명명하는 듯.) 또한 클래스 이름은 대문자이며, 변수 상수 함수는 소문자 이름이다. 변수, 상수가 클래스의 안에 있으면, 클래스의 속성 property라고 하며, 클래스 안에 있는 함수는 클래스의 메소드method라고 한다. 클래스 안의 속성은 초깃값이 없으면 에러가 난다. class 생성자 또한 생성자 지정 init() 도 가능하다. self는 속성과 구분하기 위해. class 변수, 상수 만드는법 65, "Hello" 등 값을 리터럴이라고 한다. 컴퓨터 과학 분야에서 리터럴 이란 소스 코드의 고정된 값을 나타내는 표기법이다. 거의 모든 프로그래밍 언어는 정수, 부동소수점 숫자, 문자열, 불린 자료형과 같은 기본적인 값에 대한 표기법이 있다.

Naver Blog

[Swift] 열거형(Enumeration)

.iOS는 AppleOS.iOS를 생략한 것으로 보는 바와 같이 생략할 수 있다. 위에서부터 아래로 0,1,2,3 부여된다. rawValue를 사용해서 출력하면 0이 출력된다. (.iOS이기 때문.) 문자열 타입도 가능한데, 이 경우는 iPad가 출력된다.

Naver Blog

[Swift] open, public, internal 등 접근제어(access control)

모듈은 하나의 코드 배포 단위. framework과 같이 import 키워드를 써서, 또 다른 모듈에서 로드할 수 있는 코드 단위를 모듈이라고 함. 최종 합본

Naver Blog

[iOS] 앱 기획 시 iOS 최저 버전을 정하는 기준

https://developer.apple.com/support/app-store/ App Store - Support - Apple Developer About the App Store Find out how the App Store empowers you to distribute apps in the thriving app economy and successfully run and grow a global business. Get an overview of the extensive app management tools and marketing resources you can access, and the capabilities you can integrate into your a... developer.apple.com 애플이 주기적으로 발표하는 기기 종류 별 OS 점유율을 보면 된다. 아이폰의 경우 최대한 많은 사용자를 얻기 위해서 iOS15를 최저로 잡고 개발할 수도 있지만 개

Naver Blog

[Git/Github] (오픈소스 기여 과정) 원격 저장소 fork 및 PR(pull request)까지

먼저 원하는 원격 저장소를 fork 한다. * 필요시 Copy the main branch only 체크 해제. 2. repository 클론 하기 https 주소를 클론 원하는 경로에 git clone https://github.com/username/projectName cd projectName 3. 브랜치 추적하기 clone 해온 폴더로 이동하여 원격 저장소에 이미 만들어진 자신의 브랜치에서 작업합니다. 하지만 원격 저장소에서 clone 해온 직후 branch를 검색해 보면 main 밖에 보이질 않습니다. git clone을 해줄 경우 main 브랜치만 로컬로 가져오는 것이기 때문에 원격 저장소의 다른 브랜치를 가져오는 별도의 작업을 해주어야 합니다. 아래 사진에서는 안 보이지만 자신의 이름과 일치하는 branch를 가져오면 됩니다. * 이 작업을 하려면 1번에서의 체크를 해제해야 함. 1. 어떤 branch가 존재하는지 확인합니다. (clone해온 직후에는 main 브랜치만

Naver Blog

[UIKit] 앱 개발 중 메모(사이징, 앱 아이콘, 코드 정렬 등)

모든 기종에 사진이 잘리지 않게 autoresizing size inspector -> autoresizing에서 모든 방향 활성화 그래도 어떤 기종에서는 사진이 찌뿌둥돼서 나온다. 그러면 attributes inspector -> view/Content Mode -> Aspect Fill 2. autoresizing보다는 autolayout을 사용 원하는 버튼이 중앙 정렬 필요시, 버튼 선택 및 이 두 항목을 추가 후, add constraints 하면 중앙 정렬 가능하다. // 만약 중앙에서 아래로 50만큼 내려간 것으로 바꾸고 싶다, 그러면 size inspector -> constraints -> 3. app icon generator 이제 더 이상 예전처럼 귀찮게 다른 사이트가서 생성하여 xcode로 옮길 필요가 없다. 1024 1024 single icon 하나면 xcode가 알아서 generate 해준다. -- WWDC 2022 업데이트 내용 4. UI와 연동된 코드 보

Naver Blog

[UIKit] error: this class is not key value coding-compliant for the key.

에러는 appdelegate.swift에서 발생하지만 여기 코드는 건든 적이 없다. 그러면 ViewController.swift에서 영향을 준 건데 다른 곳(RN 등)과 달리 여기는 항상 스토리보드를 확인해 줘야 한다. UIButton으로 IBOutlet을 연동했고 buttonTest라는 함수를 만들었다. 그리고 어떤 이유든지 이 코드를 지웠다. 직후 위 에러가 발생한다. Referencing Outlets에 'buttonTest'가 남아있으므로 지워줘야 한다. 문제 해결. 에러 위치 찾기 본인이 어떤 작업을 한 직후 에러가 발생했는지 명확하면 문제가 해결되지만, 그렇지 않으면 에러 발생한 위치를 찾아야 한다. Main.storyboard 우클릭 -> Open As -> Source Code xml 파일이 열린다. 단어 찾기로 에러를 일으킨 단어를 찾으면 위치가 나온다. 해당 부분을 찾아가서 스토리보드를 지운다.

Naver Blog

[Dart] 함수 functions 관련 basic 내용 정리

함수 정의 Dart는 진정한 객체 지향 언어이므로 함수도 객체이며 타입이 Function입니다. 이는 함수를 변수에 할당하거나 다른 함수에 인수로 전달할 수 있음을 의미합니다. void 는 아무것도 return 하지 않습니다. 따라서 리턴 값이 있으면 void를 string,num등 특정타입으로 명시해줘야 합니다. String sayHello(String name) { return "Hello ${name} nice to meet you."}; // 하나의 표현식만 포함하는 함수의 경우 아래와 같이 단축 구문을 사용할 수 있습니다. String sayHello(String name) => "Hello ${name} nice to meet you."; num plus(num a, num b) => a + b; void main() { print(sayHello("sugar")); } 2. Named parameters Named parameters는 명시적으로 required로 표시되

Naver Blog

[React] styled-components의 props전달법 및 extending

styled-components를 굳이 사용해야 한다면 지켜야 할 룰에 대해서 정리해본다. props 전달 방법 const Box = styled.div` background-color: ${props=>props.bgColor}; `; function App(){ return( <Box bgColor='red'/> <Box bgColor='yellow'/> ) }; 2. 확장 방법 const Box = styled.div` background-color: ${props=>props.bgColor}; `; const Circle = styled(Box)` ...(추가 css) `; function App(){ return( <Box bgColor='red'/> <Circle bgColor='yellow'/> ) };

Naver Blog

[UIKit] storyboard로 앱 개발 프로젝트 생성 및 Xcode 구성

Xcode의 iOS 앱 개발로 진행. product name: 앱 설치 시 나타날 이름 organization identifier: 팀의 도메인을 거꾸로 해서 쓴다. 예) 원래 tonyyun.com -> com.tonyyun 소속되어 있는 팀(조직) 이 없으면 임의로 작성해도 상관없다. bundle identifier: organization identifier+product name 고유여야함, 즉 앱스토어에 같은 번들 아이디가 있으면 그 앱은 앱스토어에 올릴 수가 없음. 일단 인터페이스는 Storyboard로 진행. (SwiftUI / Storyboard 두 가지) 애플에서는 SwiftUI를 권장하지만 기존 오래된 앱들이 storyboard로 작성되었기에 유지 보수를 위해서라도 알아둬야 한다고 생각합니다. Storyboard vs SwiftUI ?? https://gobans.tistory.com/15 iOS - SwiftUI와 Storyboard 애플에서 주관하는 Apple D

Naver Blog

[Swift] 앱 개발을 위한 Swift 기본 문법

https://developer.apple.com/swift/ Swift - Apple Developer Swift is a powerful and intuitive programming language for iOS, iPadOS, macOS, tvOS, and watchOS. Writing Swift code is interactive and fun, the syntax is concise yet expressive, and Swift includes modern features developers love. developer.apple.com 연산자 // 산술 연산자 var weight = 65 weight += 10 weight -= 10 weight *= 10 weight /= 10 weight %= 10 // 비교 연산자 // < , > , == , != // 논리 연산자 // && : 조건이 둘 다 true 시 true // || : 둘 중 하나 이상 true 시 tru

Naver Blog

[Dart] Dart 언어의 data types

1. 기본 데이터 타입 아래 타입을 포함한 거의 대부분의 타입들이 객체로 이루어져 있다. (함수도 객체) 이것이 Dart가 진정한 객체 지향 언어로 불리는 이유이다. void main() { String name = "tom"; bool isPlay = true; int age = 10; double money = 52.55; num x = 12; num y = 1.2; } 2. dart에서 lists를 선언하는 것은 두 가지 방법이 있다. void main(){ int case1 = [1,2,3,4,5]; List case2 = [1,2,3,4,5]; } 만약 vscode나 dartPad를 사용한다면 맨 끝을 쉼표로 마무리하면 유용하다. void main(){ int case1 = [ 1, 2, 3, 4, 5, ]; } dart의 유용한 점은 `collection if`와 `collection for`을 지원하는 것이다. collection if를 사용하면 `존재할 수도 안 할 수

Naver Blog

[Dart] Error: Could not find a Dart SDK.에러 해결

VSCode 에서 .dart 파일에서 코드 작성 시, 필요로 인하여 확장에서 dart관련 확장을 설치했다. 다만 위와 같은 에러가 뜨면서 진행이 되지 않고 있다. Download SDK로 들어가서 무슨 문제인지 들여다 보자. https://dart.dev/get-dart Get the Dart SDK Get the libraries and command-line tools that you need to develop Dart web, command-line, and server apps. dart.dev 홈페이지에 이렇게 macOS 대응 터미널 명령어를 제시해 줬다. 이대로 진행해보자. #mac homebrew 설치 관련 오류는 여기에: https://blog.naver.com/lifeyun24/223138284136 [Mac] Mac 에 homebrew 설치하기 및 warning: /opt/homebrew/bin is not in your path. 에러 해결 homebrew 관련

Naver Blog

[Dart] Dart 입문 및 변수(Variables) 선언

Dart를 배우기 앞서 dart의 class에 관하여 많은 내용을 다룰 예정이다. 왜냐면 Dart는 진정한 객체지향 언어이고 flutter도 객체지향 프레임워크이기 때문이다. 항상 class를 사용한다. 이제 시작. 1. 'main' funtion main 함수는 모든 dart 프로그램의 entry point이기 때문에 중요하다. 반드시 main 함수를 작성해야 한다. void main() { print('hello world'); } 2. 변수 선언 방법 1.var void main() { var name = 'tony'; name = 'yun'; print(name); //yun } js와 마찬가지로 var로 선언한 변수는 그 값을 변경할 수 있다. 다만, 같은 타입이어야 한다. dart는 변수의 타입을 자동으로 인식한다. (본 예제는 string이다) 2. 명시적으로 변수의 타입을 지정 이런 경우도 위와 똑같이 변수 업데이트 가능하다. 관습적으로 함수나 메서드 내부에 지역 변수

Naver Blog

[Git] Git branch 생성, 조회, 삭제 및 에러 해결

오늘은 현업에서 필자가 branch 관련하여 얻은 지식 중 중요한 내용들을 적어보겠습니다. 우선 cli로 중요한 커맨드 먼저 적어본 다음, 특정 상황에서의 문제 발생 원인 및 대처법을 적어보겠습니다. command 조회 git branch (로컬 브랜치 목록 조회) git branch -r (원격 브랜치 목록 조회) git branch -a (모든 브랜치 목록 조회) (master)$ git branch (로컬) * master newbranch newbranch2 (master)$ git branch -r (원격) origin/master origin/newbranch (master)$ git branch -a (모든) * master newbranch newbranch2 origin/master origin/newbranch 2. 로컬 branch 생성 및 변경 방법1 (master)$ git branch newbranch //생성 (master)$ git chechout new

Naver Blog

[Mac] 자동 brew update 방지하는 법

homebrew는 모든 brew install 전에 자동으로 brew update를 실행하기 시작했다. 즉, 패키지를 설치할 때마다 네트워크 속도에 따라 10-20초를 기다려야 합니다. 이것은 전혀 불필요한 과정이다. (혹은 회사에서 각자 컴퓨터의 환경을 맞춰놨는데, 혼자 업데이트하면 불상사가 생길 수도 있다.) 어떻게 하면 이런 행동에서 벗어날 수 있을까, 이에 대한 해답을 가져와본다. 다음과 같이 설치 명령 앞에 HOMEBREW_NO_AUTO_UPDATE=1을 붙이기만 하면 됩니다: HOMEBREW_NO_AUTO_UPDATE=1 brew install somepackage

Naver Blog

[TypeScript] 리터럴 타입, 유니언 타입, 교차 타입 설명

TypeScript는 프로그래밍 언어, 작성한 코드가 자바스크립트로 변환 개발자가 실수하지 않도록 보호. 어떻게? 타입스크립트 작성 → 통과 → 컴파일 → 자바스크립트 (즉, 타입스크립트에서 에러가 있으면 JS로 컴파일이 안됨.) 리터럴 타입(Literal Type): 정확한 타입 - TypeScript의 리터럴 타입은 string, number 두 가지가 있으며, 문자열이나 숫자에 정확한 값을 지정할 수 있습니다. https://www.typescriptlang.org/play?#code/Q 문자열 리터럴 타입 (String Literal Types) 아래 코드에서 Food 에서 허용한 3개의 문자열 외에 다른 문자열을 사용하게 되면 에러가 발생한다. type Food = "rice" // 리터럴 타입 type Food = "rice" | "noodle" | "meat"; //유니언 타입 const myFood1: Food = "rice"; const myFood2: Food =

Naver Blog

[Mac] Mac 에 homebrew 설치하기 및 warning: /opt/homebrew/bin is not in your path. 에러 해결

homebrew 관련 내용은 이미 예전 같은 카테고리의 포스터에서 다룬 적이 있기 때문에 여기서는 생략하겠습니다. 간단하게 말하면 Ruby와 Git 으로 개발된 MacOS 용 패키지 매니저입니다. https://brew.sh/index_ko Homebrew The Missing Package Manager for macOS (or Linux). brew.sh 홈페이지의 명령어를 터미널에 복붙해도 zsh: command not found: brew 가 나오며, 설치 시 떴던 경고 메시지 Warning: /opt/homebrew/bin is not in your PATH에 나와 있듯이, 아직 PATH 에 등록이 되지 않아서 그렇습니다. 해결: /Users/username 경로 아래에 vi ~/.zshrc 로 에디터 진입 export PATH="/opt/homebrew/bin:$PATH" 를 작성해주고, ESC와 :wq를 누르고 엔터를 치면된다. # :wq는 저장 및 나오기 2. 그래도

Naver Blog

[iOS] AppStore 심사 통과를 위한 스크린샷 조정 사이트

먼저 우리가 앱 스토어에 앱을 검색하면 앱 아이콘 하단에 개발자가 캡처 해놓은 앱 내부의 사진들이 보입니다.(혹은 동영상). screenshot 이것 screenshot까지 철저히 자기 입맛대로 통제하고 맘에 안 들면 리젝 시켜버리니... 하긴 그동안 앱 스토어의 앱들이 한결같이 깔끔해 보이고 좋아 보이던 게 다 이유가 있었습니다. 개발자 or 디자이너 분들 다 수고 많습니다.. ㅠ screenshot은 아래 사이트를 추천합니다. https://previewed.app/app-store-screenshot-generator/ App Store Screenshot Generator | Panoramic Mockup Sets Create eye-catching mockups for your app, in 3D. previewed.app 스크린샷을 아이폰 틀 모양에 넣어서 보이게 할 수도 있습니다. 고품질 사진은 비용을 지불해야 하지만 일반 사진으로도 문제없이 진행 가능합니다. (이왕이면

Naver Blog

[iOS] iOS 앱스토어 심사를 드디어 통과하면서... (회고록)

드디어 필자의 회사 프로젝트 React Native 앱이 iOS 스토어까지 심사를 통과했습니다. 얼마나 감격스러웠는지... 안드로이드는 일주일 전에 출시를 마쳤으며, iOS는 10회에 가까운 reject 덕에 일주일 정도 출시가 늦어졌습니다. 덕분에 앱이 좀 더 앱 다워졌달까. 오히려 코칭을 해주는 느낌이어서 좋았습니다. 앱을 만들면서 회사에서는 "~이런 기능의 앱을 만들어라" 밖에 없었기 때문에 처음에는 꽤 막막했습니다. 왜냐하면 앱 디자인부터 시작해서 앱 구조, 로직, 심지어 백엔드(Nodejs)에서 api 만들기까지 혼자 진행해야 했기 때문입니다. 그래도 앱 개발을 좋아하는지라 밤낮없이 생각하고 구상하며, 심지어 주말에도 악상이 떠올라 회사에 나가서 진도를 나아갔습니다. 기본적인 회원가입, 로그인, 회원 탈퇴, 콘텐츠 보여주기 등 기능은 갖춰서 구글 심사는 문제없이 통과됐었습니다. iOS 리젝을 당하면서 앱스토어 심사원이 꽤나 세세하게 검토와 지적을 해준 덕분에 많은 깨달음을

Naver Blog

[RN] 앱 출시 후 유지 보수 회고록(iOS, Android)

React Native의 장점은 명확합니다. iOS 및 Android 환경에서 동시 개발을 진행할 수 있으며, 또한 CodePush를 통한 배포가 유용하기 때문입니다. 이에 따른 디버깅과 오류는 훨씬 많겠지만, 개발자로서 감수해야 하는 부분입니다. 필자의 회사 프로젝트 앱이 iOS, Google 두 마켓에 출시한지 어느덧 2주라는 시간이 흘렀습니다. 그동안 어떤 일이 있었고, 어떻게 해결했는지 끄적여 보겠습니다. iOS (Apple) -확실히 심사 시간이 오래 걸립니다. 앱 제출의 기본 흐름은: 심사 대기 중-> 심사 중-> 심사 결과. 이렇게 크게 3단계입니다. 심사 대기 중-> 심사 중 이 구간의 대기 시간이 엄청 깁니다. 짧게는 하루, 길게는 미국 쪽 블랙프라이데이 등 연휴가 걸치면 이틀 정도 걸렸습니다. 심사에 들어가면 (심사 중-> 심사 결과) 결과 나오기까지 30분~1시간 정도 걸립니다. 보통 심사는 한국 시간 기준 새벽에 진행했었습니다. -구글보다 심사를 모든 방면에서

Naver Blog

[iOS] UI 디자인 기본 원칙

오늘은 필자가 1년 동안 4개의 앱을 개발해오면서 그동안 보고 깨달았던 프론트엔드 개발자의 기본 소양 중 하나인 "UI" 디자인에 대하여 정리해 보겠습니다. 서론에 앞서 "UI"와 "UX"는 차이점이 존재합니다. (UX가 전체 경험을 구성하는 것이라면 UI는 사용자가 상호 작용할 시각적이면서 유형적 요소를 만들어 나가는 데 중점을 둡니다, 이는 나중에 따로 정리를 하겠습니다.) 우선 개발자의 입장에서는 해당 레이아웃이 현재 "기술적으로 가능"한지에 대해서 본인이 스스로 잘 알아야 합니다. 더 나아가 앱의 레이아웃 구성 시 디자이너와의 적절한 소통을 통해 타협점을 만들고 해결 방안을 찾아갈 수 있습니다. 그와 동시에 (병렬적) 고려해야 할 것은 유저에게 보이는 화면입니다. 매력적인 사용자 경험은 견고한 인터페이스 디자인을 기반으로 합니다. 코딩을 시작하기 전 다음과 같은 기본 디자인 개념을 고려하여 다양한 사용자를 위한 깔끔하고 효율적인 인터페이스를 디자인하십시오. -Apple UI

Naver Blog

[Android][Error] ReactNative Release Build 시 http 통신이 안되는 문제 해결

오늘 앱의 디버깅을 끝내고 드디어 출시 전 마지막 Release Build로 테스트를 잠깐 진행했었습니다. 근데 이게 웬일, 로그인 및 회원가입 등 http 통신을 요청할 시 앱이 죽어버렸습니다ㅠ Build 때도 문제없었고, Release 때 어떻게 이런 일이 발생하는지... 심지어 iOS release build는 문제없었습니다. 참고로 react native init 0.69 이상입니다. AndroidManifest.xml 해당 원인으로 찾아보니 Android 쪽은 코드 한 줄을 추가해 주어야 했습니다. 경로는 /android/app/src/main/AndroidManifest.xml <application>태그 안에 android:usesCleartextTraffic="true" 추가해 주고 다시 release build 하니 잘 작동했습니다!

Naver Blog

[Android] ReactNative 서명된 aab 파일 생성 법(+구글 플레이 스토어 출시를 위한)

오늘 필자가 회사에서 만든 앱이 드디어 구글 플레이 스토어에 등록이 되었습니다! 필자도 한두 번쯤은 reject 당하겠지...라는 각오가 있었는데 이렇게 한 번에 되어버리니 처음에는 어안이 벙벙했습니다, 원래 이렇게 되는 건지 아니면 운이 좋았던 건지... 그래도 출시를 위해 많은 정보를 찾아보고 헤맸던 보람이 있었던 것 같습니다. 그럼 출시에 성공했던 경험을 토대로, ReactNative에서 진행했던 aab 파일 생성 법을 정리해 보겠습니다. 요즘 구글은 apk보다는 aab 파일 형식을 권장하고 있습니다. 순조롭게 출시하려면 시대의 흐름을 따라야겠죠? https://developer.android.com/guide/app-bundle Android App Bundle 정보 | Android 개발자 | Android Developers Android 개발자 문서 가이드 Android App Bundle 정보 이 페이지의 내용 압축 다운로드 크기 제한 기타 고려사항 추가 리소스 블로그

Naver Blog

[Android] 구글 플레이 스토어 앱 출시 회고록(+출시 과정)

오늘은 필자가 회사 프로젝트인 React Native로 앱을 개발하고, 마지막 Google Play Store까지 심사 통과됐던 회고록을 끄적여보겠습니다. 내부 테스트 먼저 본인 혹은 회사의 구글 계정이 개발자 계정에 가입되어 있어야 합니다. (비용 지불 필요) 우선 완성한 앱을 구글 스토어의 내부 테스트에 올려 테스터들에게 배포를 했습니다. 왜냐하면 React Native 특성상 ios, android 양쪽 모두 대응을 하기 때문에, 어떤 디바이스에서 레이아웃이 잘릴지, 혹은 문제가 생길지... 이 모든 문제를 출시 후에 겪으면 안 되니 내부 테스트는 필수라고 생각합니다. 내부 테스트는 별도의 앱 심사가 필요하지 않았으며(서명은 필요), 올린 aab 파일을 테스터들의 이메일로 발송하면, 테스터들이 해당 링크로 앱을 다운로드할 수 있었습니다. 충분한 테스트를 거친 후 이제 출시해도 괜찮다는 결정이 내려졌습니다. 구글 플레이 스토어 출시 대시보드 우선 google play consol

Naver Blog

[iOS] AppStore 앱 심사 reject 회고록

오늘은 이번 주 iOS 앱 출시를 준비하면서 겪었던 과정을 끄적여보겠습니다. 결론부터 말하면 AppStore 심사는 Google Play Store보다 훨씬 까다로웠습니다. 앞서 TestFlight 등 진행 과정은 필자의 아래 링크를 보면 됩니다. https://blog.naver.com/lifeyun24/222922524686 [iOS] 앱 출시 전 TestFlight에 배포하기 React Native로 개발을 진행했어도 iOS는 특별한 조치 없이 Xcode에서 진행하면 됩니다. TestFlight... blog.naver.com 1회 reject 로그인 기능이 있는 앱이면 로그인 정보를 제공해야 한다.(구글 플레이 스토어도 마찬가지) Sign-in required box를 체크하고 미리 가입해둔 id, 비번 정보를 제공해 주면 됩니다. 앱 기본 정보 작성은 각 앱마다 상황이 다르니 각자 알맞게 진행하면 되겠습니다. +핸드폰 번호 이슈(ios, android는 모두 앱 '수출'에

Naver Blog

[RN] component의 StyleSheet까지 props 전달하는 방법

예를 들어 여러 화면에서 같은 component를 많이 재사용하고 있다고 가정한다. 그러면 어떤 화면에서는 boolean 값을 넘겨주는 것으로 component의 스타일을 각자 다르게 보이고 하고 싶다. 어떻게 해야 할까. //MainScreen.js ... <Copyright text="이용약관, 개인정보 수집 및 이용 동의(필수)" isUnderLine={true} /> ... //Copyright.js 라는 component import React from 'react'; import {StyleSheet, Text} from 'react-native'; import PropTypes from 'prop-types'; import {COPYRIGHT} from 'assets/color/Palette'; const Copyright = ({text, isUnderLine}) => { return <Text style={styles(isUnderLine).text}>{text}</

Naver Blog

[RN] text 내부에서 함수 혹은 줄바꿈 사용법

함수 사용 text={`이용약관, 개인정보 수집${checkboxState} 및 \n이용 동의(필수)`} backtick을 사용하고 ${ } 안에 함수명을 넣으면 된다. 줄바꿈만 사용 text={'이용약관, 개인정보 수집 및 \n이용 동의(필수)'} ={""}형태면 된다. \n은 줄 바꿈이다.

Naver Blog

[iOS] 앱 출시 전 TestFlight에 배포하기

React Native로 개발을 진행했어도 iOS는 특별한 조치 없이 Xcode에서 진행하면 됩니다. TestFlight란? TestFlight는 현재 Apple Inc가 소유하고 있으며 iOS 개발자 프로그램 내에서 개발자에게만 제공되는 모바일 애플리케이션의 무선 설치 및 테스트를 위한 온라인 서비스입니다. Xcode에서는 Version, Build를 정해주고, Xcode 창 상단 Build:Any iOS Device, 그 후 메뉴바에서 Product/ Archive를 누르면 아카이브가 진행됩니다. 완료 후 대부분 선택 사항을 default로 진행하고 Testflight/Appstore 항목에서 올리면 됩니다. https://appstoreconnect.apple.com/ App Store Connect appstoreconnect.apple.com 그다음 위 사이트인 app store connect로 이동합니다. 앱 -> 본인이 방금 올린 앱 -> TestFlight에서 내부 테

Naver Blog

[RN] React Query에 대한 이해

import React, { useState } from "react"; import { FlatList, StatusBar, StyleSheet, Text, TouchableOpacity, } from "react-native"; const DATA = [ { id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba", title: "First Item", }, { id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63", title: "Second Item", }, { id: "58694a0f-3da1-471f-bd96-145571e29d72", title: "Third Item", }, ]; const Item = ({ item, onPress, backgroundColor, textColor }) => ( <TouchableOpacity onPress={onPress} style={[styles.item, backgroundColor]}>

Naver Blog

[React] Props를 활용해 버튼 재사용, function 사용 및 types 지정하기

같은 버튼을 사용 시, 스타일은 같고 버튼 텍스트만 다르게 하고 싶으면 이때 props의 개념을 사용하면 된다. Boolean 형식도 넘겨진다. function Btn({ text, big }) { /*원래 props에서 하나의 인자만 받는다. Btn(props) 이렇게. 다만 Object형식으로 받기에 {text}형식으로 꺼내준다. 그러면 {text, big} 등 여러 인자를 받을 수 있다. */ return ( <button style={{ backgroundColor: "tomato", color: "white", padding: "10px 20px", //style안에서 다중값을 사용하려면 이렇게 border: 0, borderRadius: 10, fontSize: big ? 20 : 16, }} > {text} </button> ); } function App() { return ( <div> <Btn text="Save Changes" big={true} /> <Btn t

Naver Blog

[React] React.Memo를 사용해서 어플 최적화하는 방법

import React from "react"; function Btn({ text, IfYouPressBtn }) { return ( <button style={{ backgroundColor: "tomato", color: "white", padding: "10px 20px", border: 0, borderRadius: 10, }} onClick={IfYouPressBtn} > {text} </button> ); } const MemorizedBtn = React.memo(Btn); //여기 function App() { const [value, setValue] = React.useState("Save Changes"); const changeValue = () => setValue("Revert Changes"); return ( <div> <MemorizedBtn text={value} IfYouPressBtn={changeValue} /> {/* usestate에서 st

Naver Blog

[RN] react-native-vector-icons 세팅하기

https://github.com/oblador/react-native-vector-icons#iconbutton-component GitHub - oblador/react-native-vector-icons: Customizable Icons for React Native with support for image source and full styling. Customizable Icons for React Native with support for image source and full styling. - GitHub - oblador/react-native-vector-icons: Customizable Icons for React Native with support for image source a... github.com icon을 사용하기 위해서 이 라이브러리를 사용한다. yarn add react-native-vector-icons @types/react-native-v

Naver Blog

[RN][Warning] RCTBridge required dispatch_sync to load REAModule. This may lead to deadlocks

원래 문제없던 iOS 앱 빌드가 MacOS를 Ventura13.0 업그레이드 -> Xcode 업그레이드 이후 첫 앱 빌드 시 에러가 났다: RCTBridge required dispatch_sync to load REAModule. This may lead to deadlocks. 많은 해결안에서 AppDelegate.m을 수정하라고 하는데... 알다시피 RN 0.69.x 버전 이후로 AppDelegate.m이 아닌 AppDelegate.mm이 생성된다. 따라서 기존 해결안 적용 불가능. 여기서는 4가지 해결 방법이 있다. Simply ignore the warning It only appears in debug mode, so you won't see this in production build of your app Add the following code In index.js of your app: (필자는 이 방법으로 해결.) import { LogBox } from 'reac

Naver Blog

[Xcode][Error] Failed to register bundle identifier 해결

xcode error 이 에러는 react native 프로젝트를 처음 생성하고 xcode로 빌드 할 때 발생한다. 내용은 Failed to register bundle identifier, No profiles for 'org.reactjs.native.example.AppName' were found. 원인은 설정한 이름이 이미 존재해서 에러가 난 것이다. 아래 사진처럼 다른 이름으로 설정하면 된다.

Naver Blog

[Android] Galaxy S10 시리즈 루팅

오늘은 간단하게 폰의 최상위 권한을 얻을 수 있는 -- 루팅을 진행해 보겠다. 메모를 영어로 적어놨기에 그대로 가져온다. 기본 매뉴얼은 아래 영상을 참고하면 잘 진행된다. https://www.youtube.com/watch?v=TSfQmC4OTZo&ab_channel=ExplainingAndroid 1. developer menu->OEM unlocking 2. download mode: (volumn down+bixby) press , and usb connect 3. long press volumn up button, to insert unlock bootloader mode, press volumn to make sure unlock the bootloader(this will delete all personal data from your phone) 3.5 after that I did not touch anything on phone. 4. ‘OEM unlocking’ b

Naver Blog

[RN] debugging tool 소개 (react-native-debugger 소개 업데이트)

오늘은 react-devtools, react-native-debugger 및 react-native-debugger-open까지 다뤄볼 예정이다. react-devtools https://reactnative.dev/docs/debugging#accessing-the-in-app-developer-menu Debugging · React Native Accessing the In-App Developer Menu reactnative.dev yarn global add react-devtools scripts에 추가해 주면 편리하다. 화면 아이폰을 흔들어서 개발자 메뉴 호출 시 연결된다. react-native-debugger (react devtools+console+redux devtools) https://github.com/jhen0409/react-native-debugger#installation GitHub - jhen0409/react-native-debugger:

Naver Blog

[RN] react-native-launch-screen 세팅 (iOS)

스플래시 스크린은 각 마켓마다 정의하는 이름이 다르다: Android: SplashScreen iOS: LaunchScreen 본 과정도 android 편과 마찬가지로 필자가 수많은 착오를 겪은 뒤에 작성한 것이니, 부족한 부분 발견 시 댓글에 남겨주시면 감사하겠습니다. android의 splash screen은 다른 포스트에서 진행을 했으니 여기서는 진행하지 않겠다. 앱은 처음에 안드로이드와 마찬가지로 npx create-react-native-app SplashApp 으로 빌드 했다. (이하 crna 빌드) 라이브러리는 마찬가지로 react-native-splash-screen 으로 했다. https://www.npmjs.com/package/react-native-splash-screen react-native-splash-screen A splash screen for react-native, hide when application loaded ,it works on iOS

Naver Blog

[RN][Error] cli.init is not a function (해결 업데이트)

npx react-native init myApp - -version 0.69.4 진행 시 발생한 문제지만 버전 지정하지 않고 최신으로 진행해도 문제가 발생한다.(최신 0.70.1) 그것은 예전에도 다뤘던 init 시 TypeError: cli.init is not a function 에러. 전에는 0.69 버전이 문제였다고 생각했는데 아니었다. 진심으로 해결하고자 찾다 보니 다른 문제점을 발견했다. 에러 내용 먼저 공식 문서에선 react-native-cli @react-native-community/cli를 전역 설치하는 것을 권장하지 않는다. 공식 문서 내용 필자는 본인이 안 했으리라 생각했지만 초반 RN 배울 때 멋모르고 따라 하다가 -g 옵션으로 설치했을 가능성이 있다고 생각했다. 전역 설치 확인 yarn global list 로 yarn 패키지 매니저로 무엇을 전역적 설치했는지 검색. 하나밖에 없었다. 그럼 초반에는 패키지 매니저를 npm으로 진행했었으니, npm으로 찾기

Naver Blog

[서평] 희망의 끈 -히가시노 게이고

가족의 조건에 꼭 아이가 있어야만 하는 것일까? 새 생명이 찾아온다는 것은 참으로 귀하고 기쁜 일이다. 원하는 이에게, 원하는 때에 찾아온다면 그것만큼 큰 복은 없겠지만 뜻대로 되지 않는 것이 사람 사는 세상이다. 원치 않는 시기에 원치 않는 임신. 피치 못할 사정이 겹쳐서 떠난 아이들과 태어난 아이들의 얄궂은 운명의 톱니바퀴. 본 소설 '희망의 끈'이다. 만날 수는 없다 해도, 자신에게 소중한 사람과 보이지 않는 끈으로 이어져 있다고 생각하면 그것만으로도 충분히 행복하다고 했어. 그리고 그 끈이 아무리 길어도 희망을 품을 수 있으니 죽을 때까지 그 끈을 놓지 않겠다고 하더구나. 진정한 가족의 의미를 다시 한번 돌이켜볼 수 있는 좋은 책이다. 누구에게나 '희망의 끈'은 존재한다. 삶이 원만하게 흘러가지 않는다고 해서 좌절하기 전에 우리는 다시 한번 생각해 볼 필요가 있다. 그저 알지 못하는 곳에서 자신을 지켜보고 기도를 해주는 존재가 있을 수도 있다는 것을. 희망의 끈 저자 히가시노

Naver Blog

[서평] 악의 -히가시노 게이고

이 소설 '악의'는, 노노구치의 수기와 가가 형사의 기록을 번갈아 보여주는 형식으로 전개된다. 작가 히가시노 게이고는 전혀 다른 개성을 가진 두 종류의 글을 만들어낸 셈이다. 글에는 그 글을 쓴 이의 성품이 담기게 된다. 일부러 감추려 해도 우리가 써내는 글에 결국 드러나고 마는 인간적 품성이나 모종의 편견... 글을 쓴다는 것이 새삼 두려워지는 대목이다. 한편으로 우리가 일상적으로 접하는 수많은 글들, 그 속에 담긴 자잘한 오류나 편견이 우리의 의식에 아주 깊숙이 뿌리를 내린다는 것 또한 등이 오싹해지는 깨달음이었다. 글 쓰는 일을 업으로 하는 작가들의 세계에 대한 언급도 흥미 깊은 부분이다. 작가로서 등단하기까지의 어려움, 더 많은 사람들에게 알려지고 싶다는 직업적인 욕구, 어렵게 써낸 소설이 독자에게 외면받고 그대로 묻혀버리는 데 대한 비해도 이 소설 곳곳에서 베어난다. 더구나 노력이 아니라 '운'에 의해 좌지우지되는 것이 아닌가 하는 의심, 성공을 거둔 유명 작가에 대한 질투

Naver Blog

[서평] 스물아홉 생일, 1년 후 죽기로 결심했다. -하야마 아마리

제1회 일본감동대상 대상 수상작, '스물아홉 생일, 1년 후 죽기로 결심했다.'. 정말 오랜만에 좋은 책을 읽은 것 같다. 본 책은 작가의 인생 실화를 바탕으로 작성되었다. 파견사원으로 일하던 아마리는 혼자만의 우울한 스물아홉 생일을 맞는다. 변변한 직장도 없고, 애인에게는 버림받았으며, 못생긴 데다 73킬로그램이 넘는 외톨이... 깜깜한 터널과도 같은 인생에 절망하던 그녀는 자살을 결심하던 순간, 텔레비전 화면에 펼쳐진 '너무도 아름다운 세계'에 전율을 느낀다 -그곳은 라스베이거스. 작가 아마리가 실제로 묵었던 베네시안 호텔 난생처음 '뭔가를 해보고 싶다'라는 간절함과, 가슴 떨리는 설렘을 느낀 그녀는 스스로 1년의 시한부 인생을 선고한다. '스물아홉의 마지막 날, 라스베이거스에서 최고로 멋진 순간을 맛본 뒤에 죽는 거야. 내게 주어진 날들은 앞으로 1년이야.' 그날부터 인생의 카운트다운이 시작된다. 카지노에서 목숨을 건 도박을 해보고 싶었던 그녀는 수중에 큰돈이 필요했다. 당시

Naver Blog

[서평] 인간실격 -다자이 오사무

사람들은 대부분 일상에서 가면 놀이를 하고 있다. 놀이라면 즐거워야 하는데 가면 놀이는 마냥 즐거운 놀이는 아니다. 일상생활을 하다 보면 다양한 사람과 만나고 다양한 상황을 겪게 된다. 그때마다 사람들은 자신이 언제나 오롯이 본모습만을 보인다고 하지만 사실 자신의 다양한 가면의 모습을 보인다. 가면을 쓰는 이유는 보통 사람처럼 보이기 위해서, 좋은 사람인 것처럼 보이고 싶어서 등등 때문이다. 사람들은 본인도 가면 놀이를 하면서 다른 상대의 가면이 조금이라도 벗겨진다면 바로 손가락질을 하며 욕한다. 그래서 대개 사람들은 가면을 들키지 않기 위해 노력하기도 하고 가면의 모습을 자신의 모습이라고 굳게 믿고 착각한다. 인간실격의 요조는 가면 생활을 잘하면서도 부끄러움을 느끼는 인간이다. 잘하면서 부끄러워한다는 것이 참 아이러니하지만 요조는 몇 번이고 가면을 집어던지고 싶어 하지만 던지지 못한다. 요조도 우리와 마찬가지로 사회를 살아가는 구성원이고 가면을 집어던지기에는 사람을 너무 사랑하기

Naver Blog

[서평] 용의자 X의 헌신 -히가시노 게이고

히가시노 게이고라는 작가를 처음 접했을 때는 아마 '나미야 잡화점의 기적'을 읽었을 때였다. 책 내용에 너무 감동받은 나머지 국내에서 상영한 영화도 보러 갔었는데... 세월이 흘러 비록 내용은 잘 기억나지 않지만, 히가시노 작가에 대한 좋은 인상만은 어렴풋이 가지고 있었다. 이 독서평을 적는 시점에선 필자는 이미 히가시노의 소설을 7권 읽었다. 만약 누군가가 '그래서 히가시노 작가의 소설 중에 제일 추천하는 책은?'라고 묻는다면, 한치의 고민도 없이 '용의자 X의 헌신'을 추천할 것이다. 세상에 아름다운 사랑은 있어도 아름다운 살인은 없다. 어떤 이유를 들어도 살인은 정당화 될 수 없다. 세상에 수 많은 범죄가 있고 그 이유는 참으로 다양하지만 특별한 경우를 제외하고 대부분 무언가를 잃지 않기 위해서이다. 물론 100%는 아니다. 그렇지만 대부분 무언가를 얻기 위해서 보단 잃지 않기 위해서 또는 들켜서는 안되기 위해 사람들은 거짓말을 하고 범죄를 저지른다. 이 책을 이해하기 위해서는

Naver Blog

[일본 여행] 구마모토 여행, 구마몬과 함께!

오래간만에 예전 여행을 꺼내어 정리해 보려고 합니다. 목적지는 바로 일본 규슈에 있는 구마모토입니다! 후쿠오카가 인기 여행지인 만큼, '난 일본에서만큼은 한국인 안 보고 싶다!', '일본다운 일본을 느끼고 싶다!' 하시는 분들은 구마모토를 추천드립니다. 후쿠오카에서 신칸센으로 눈 깜짝할 사이면 구마모토에 갈 수 있으며, 'JR 북 규슈 패스'로 알차게 당일치기도 다녀올 수 있습니다. 구마모토역 구마모토역에 도착하자마자 눈앞에 보이는 마스코트 '구마몬'! 여기는 뭐니 뭐니 해도 구마모토 성이 제일 유명하죠. 구마모토 성 바로 앞에 인기 관광지 '조사이엔'이 있습니다. 다양한 먹을거리, 디저트, 공연과 함께 약 1시간 정도 가게와 즐길 거리 등이 준비되어 있습니다. 필자는 오래 머물지 않고 바로 목적지로 출발! 그 이후 도보로 10분이면 성에 도착합니다. 성의 외부 사진. 날씨가 좋기에 기분도 덩달아 좋아집니다. 여기서 일본성에 관한 재밌는 상식을 말하자면, 성 지붕 위나 성 주변에 사

Naver Blog

[일본 여행] 힐링 되는 공간, 교토 아라시야마.

오늘은 교토의 아라시야마라는 명소로 포스팅을 해보겠습니다. 교토의 서북쪽에 위치한 아라시야마 아라시야마(岚山)의 뜻은 폭풍+산이며, 기세 차고 웅장하며 장엄한 산악미를 자랑합니다. 산 좋고 물 맑고 경치가 아름다운, 교토에서 손꼽히는 명승지 중 하나입니다. 옛 교토가 일본의 수도였을 적에 천황이 이곳에 나들이를 종종 왔다고 합니다. 도게츠교 도게츠교(渡月桥). 한밤중 강물에 반사된 달빛이 마치 다리를 건너는 것처럼 아름답다 하며 붙여진 이름입니다. 대나무숲. 샐 수 없이 많은 대나무가 양옆으로 하늘을 찌르듯이 솟아있으며, 바람이 지나갈 때 들리는 샤샤샥하는 소리는 마치 천년 전의 일본으로 돌아간 듯한 느낌이 들게 합니다. 또한 일본 명승지에는 인력거가 빠질 수 없죠. 비용이 좀 비싸긴 하다만 한 번쯤은 옛 일본 귀족 느낌을 내보는 것도 잊지 못할 추억이 될 것입니다. 도게츠교 아래로 흐르는 카츠라강에서 작은 배도 탈 수 있으며, 주위에 기념품샵 및 카페도 많이 있어서 관광으로 최적화

Naver Blog

[일본 여행] 교토 후시미이나리 신사 & 오사카 우메다 공중정원 투어!

후시미이나리 신사는 교토 명소 중 하나로 천 개가 넘는 '토리이' 가 있다고 하여 '천본 토리이'로 유명한 장소입니다. JR 교토역과 가까운 후시미이나리 신사 신사 입구 이른 아침이었는데도 불구하고 신사는 외국인 관광객들로 붐볐습니다. (지하철 내릴 때부터 줄 서서 나갔던 기억이) 신사 안내도 참고로 '후시미'는 교토의 지역 이름이고, '이나리 신사'는 자연과 농업 풍요의 신이 모셔진 곳입니다. 센본(千本)토리이 '토리이'는 한자로 鸟居이며, 새가 앉아서 쉬는 곳이라는 의미입니다. 또한 토리이의 円 모양의 문은 현세와 신의 구역을 나누는 결계라고 옛사람들은 믿었으며, 일본인들은 이 토리이를 통과하기 전에 고개를 숙여 인사하는 것으로 신에 대한 경의를 표합니다. (그렇다고 센본토리이에서 계속 인사하며 나아가지는 않습니다,,) 일본 문화를 사랑하는 많은 서양 여행객들과 동양인들이 여기서 사진을 찍고 있었습니다. 사진기와 얼굴만 준비되어 있으면 인생 샷은 쉽게 건질 수 있겠네요.ㅎㅎ 여기

Naver Blog

[서평] 가면 산장 살인사건 -히가시노 게이고

책을 구매하기 전에 항상 타인의 리뷰는 보는 습관이 있다. 필자보다 먼저 이 작품을 읽은 사람들은 모두 입을 모아 결말이 정말 대단하다고 하여 홀린 듯이 구매했었던 기억이 난다. 그리고 그 기대는 정확하게 맞아떨어졌다. 이 작품은 결말에 '대반전'이 마련되어 있다. 대담한 단발의 트릭이 실로 멋지게 꼴을 갖추고 있다는 의미에서 대중들의 평가 문구에 거짓은 없었다. 그 책을 끝까지 읽기까지 트릭을 간파할 수 없었다. 이 사람인가? 아니 이 사람인가? 마지막에 가서 생각지도 못한 작가의 덫에 걸려들었다는 나 자신을 발견하고 발을 동동 구르며 분해했다. 작 중 등장인물이 꽤 많았다. 따라서 메모를 하기 않고서는 누가 어떤 말을 했는지 정리가 안되기에 종이와 팬을 따로 준비했다. 약혼자의 죽음에 의문점을 발견하고, 별장에서 다 같이 토론하는 도중 들이닥친 두 강도. 모두 인질로 잡힌 와중, 끝내 별장 안에서는 수수께끼의 살인 사건이 발생하는데... 스토리를 과하게 소개하는 것은 추리 소설에

Naver Blog

[서평] 녹나무의 파수꾼 -히가시노 게이고

제목에서도 알 수 있듯이 이 이야기의 주요 소재로 등장하는 것은 '녹나무'다. 교토 대학의 녹나무 녹나무(樟木)는 따뜻하고 습기 많은 토양에서 자라는 상록활엽수로, 일본에서 가장 큰 나무로 알려져 있다. 실제로 가고시마의 가모신사 녹나무는 수령 1천5백 년으로 추정되고 나무 기둥 안에 넓이 약 13제곱미터의 빈 공간이 있다고 한다. 가고시마 가모신사 녹나무 독특한 향의 정유 성분이 있어서 방충제, 심장 약, 향료 등의 원료로 쓰인다. 또한 목질도 치밀해서 목조 불상, 악기, 고급 가구의 재료가 되기도 한다. 인간의 유한한 삶을 훌쩍 뛰어넘는 자연물에는 신이 깃든다고 일본 사람들은 옛날부터 믿어왔다. '녹나무의 파수꾼' 은 수령을 짐작하기 어려운 녹나무를 중심으로 이야기가 펼쳐진다. 인간의 깊은 염원이 그곳에 신을 불러들인 것일까. 한 세대가 그다음 세대에게 간절히 전해주고 싶은 것, 영구히 끊이지 않고 이어가는 것이 발하는 힘이 이야기 전체에 흐르고 있다. 히가시노 작가는 인간의 본

Naver Blog

[독후감] 최소한의 IT 언어

앞으로의 10년은 지난 10년과 다른 지식이 요구될 것이므로 우리는 항상 공부를 해야 합니다. 특히 IT 분야는 새로운 프로그래밍 언어, 프레임워크 혹은 툴 등이 매년 새로운 기술 스택으로 등장하고 있습니다. 오늘은 윌북 출판사로부터 협찬받은 도서 - '최소한의 IT 언어'의 독후감을 작성해 보겠습니다. 2020부터 지금까지 우리는 힘든 시기를 겪었습니다. 많은 회사가 업무 방식을 재택근무로 전환했으며, 학생들은 비대면 수업, 심지어 헬스장, 노래방 등 시설 이용에 많은 제약이 있었습니다. 이때 우리는 IT의 중요성을 다시 한번 깨달았습니다. 이제 IT는 우리가 꼭 누군가를 만나지 않고도 사업을 운영 가능하게 하고, 서로 소통하고, 하루를 계획하고, 인터넷 수업을 듣고, 음식을 주문하고, 결혼식을 준비하고, 세금을 신고하고, 옷을 구입하는 등 삶의 모든 영역에서 혁명적인 변화를 일으키고 있습니다. 이 책은 애플리케이션을 개발하는 방법(코딩)을 알려주는 것이 아닌 애플리케이션의 기본적

Naver Blog

[일본 여행] 간사이 공항부터 교토까지, 그리고 기요미즈데라

드디어 본격적으로 하늘길이 열리면서 들뜬 마음으로 일본으로 출발했습니다. 출발 전 많은 블로그를 보면서 예습을 했지만… 현실과는 다른 부분이 많아서 오늘은 필자가 직접 겪으면서 있었던 해프닝, 아울러 꿀팁까지 정리해 보겠습니다. 간사이 공항 도착 사전에 mySOS 등록은 필수라고 봅니다. 출국 전에 공항에서 확인도 하며, 간사이에 도착해서도 안내하는 직원분이 mysos를 제시하라고 안내합니다. 날씨도 참 좋았고… 오사카 도착할 때 체감 온도는 딱 3주 전의 서울이었습니다. 즉 서울보다는 조금 더워서, 이때는 어쩌면 반팔도 가능하겠다는 생각도 들더라고요. 티켓 예약을 안 했으면 입국하고 2층에 있는 티켓 구매처로 와야 합니다. 교토까지 가려면 하루카 열차 티켓을 사야 합니다. 그리고 간사이에서 사용하는 교통카드인 ICOCA도 같이 사면 좋겠죠. 고민하지 마시고 딱 바로 앞에 보이는 JR Ticket Office에서 세트로 구매하시면 됩니다. 하루카 티켓+ ICOCA 세트로 간편하게 구

Naver Blog

[Node] 서버에서 정규 표현식, 터미널 커맨드 사용하는 법

오늘은 nodejs 서버에서 데이터 처리 시 용이한 정규 표현식, 터미널 커맨드 사용하는 법을 알아보겠다. 정규 표현식 사용 new RegExp( ) const FileList = (props) => { const data = SeeFiles(props?.id)?.data?.seeFiles; console.log("data : ", data); let zipRegex = new RegExp( `${process.env.REACT_APP_SERVER_URL}[a-zA-Z0-9가-힣/\s_()-.]+\.zip`, "g" ); //pdf file detect let pdfRegex = new RegExp( `${process.env.REACT_APP_SERVER_URL}[a-zA-Z0-9가-힣/\s_()-.]+\.pdf`, "g" ); //apk file detect let apkRegex = new RegExp( `${process.env.REACT_APP_SERVER_URL}[a-zA

Naver Blog

[RN] react-native-splash-screen 세팅 (android)

본 포스트는 필자가 직접 시도하고 작성한 내용이니 아직 부족한 점이 있을 수 있다. 향후에 보완점을 발견하면 업데이트하는 방식으로 진행하겠다. https://www.npmjs.com/package/react-native-splash-screen react-native-splash-screen A splash screen for react-native, hide when application loaded ,it works on iOS and Android.. Latest version: 3.3.0, last published: 10 months ago. Start using react-native-splash-screen in your project by running `npm i react-native-splash-screen`. There are 62 other projects in the npm registry us... www.npmjs.com 필자는 프로젝트 빌드를 creat

Naver Blog

[JS] ES6 문법 & 지식 포인트 메모

ES6에서는 대격변이 있었다. 7,8,9는 단순 기능 추가. 1. let, const used "var" before, var (variable) 변하기 쉬운 문제점 var name = 'Tony' name = 'Smith', 앱이 커질 때 변수 재할당을 해서 실수하기가 쉽다. const (constant) 상수, 불변의, 고정의 const person = { name: "Tony" } person.name="Pedro" //const는 이런 경우에만 변경. let 은 var과 비슷. //평소에는 const 사용 권장, let은 variable 값을 overwrite 해야 하는 상황이 일어나면 사용. var은 사용 권장 안 함. 2. arrow functions 기존: function nameOf(arg){ } nameOf: function 이름 arg: argument, 독립 변수, 함수 혹은 메서드를 호출할 때, 전달 혹은 입력되는 실제 값, parameter과 많이 혼용됨. {

Naver Blog

[Android] 안드로이드 기기 deviceUniqueId와 공장초기화의 관계(react-native-device-info)

회사 프로젝트 중 안드로이드 기기 -> 회사 서버로 촬영한 영상 전송을 진행하던 중. 어느 디바이스에서 들어오는지를 확인하기 위해 deviceUniqueId를 따로 추출해서 formData에 넣어서 보내고 있었다. 하지만 deviceUniqueId는 기기마다 고유 불변의 값이라 생각했는데 아니었다. 모두가 간과한 사실이 있었다. 먼저 react-native-device-info 라이브러리를 사용한다. import DeviceInfo from "react-native-device-info"; const deviceUniqueId = DeviceInfo.getUniqueIdSync(); 일단 이렇게 간단하게 가져올 수 있다. 이외에도 react-native-device-info 라이브러리에 대해 추가 설명을 하자면 -getUniqueId(): 기기별로 고유한 ID 값을 리턴한다. (필자가 사용 시에는 getUniqueIdSync( ) ) -getBatteryLevel(): 배터리가 얼마

Naver Blog

[개발 지식] Redux의 필요성은? (상태 관리 도구의 필요성)

redux Redux(리덕스)란 JavaScript(자바스크립트) 상태 관리 라이브러리이다. Redux(리덕스)의 본질은 Node.js 모듈이다. 상태 관리 도구가 왜 필요할까, 상태란? React에서 State는 component 안에서 관리되는 것이다. 자식 컴포넌트들 간의 direct 데이터 전달은 불가능 하다. 자식 컴포넌트들 간의 데이터를 주고 받을 때는 상태를 관리하는 부모 컴포넌트를 통해서 주고 받는다. 그런데 자식이 많아진다면 상태 관리가 매우 복잡해진다. 상태를 관리하는 상위 컴포넌트에서 계속 내려 받아야한다. => Props drilling 이슈 상태 관리 툴은 어떤 문제를 해결해 주나? 1. 전역 상태 저장소 제공 2. Props drilling 이슈 해결 예를 들어, <A>라는 컴포넌트에 상태가 있고, <I>라는 컴포넌트가 해당 상태를 사용한다고 하면, 그 중간에 존재하는 <C>, <G> 등은 굳이 name이라는 상태가 필요하지 않음에도, 컴포넌트에 props를

Naver Blog

[Redux] Redux(리덕스)란? (상태 관리 라이브러리)

Redux의 기본 개념 : 세 가지 원칙 1. Single source of truth 동일한 데이터는 항상 같은 곳에서 가지고 온다. 즉, 스토어라는 하나뿐인 데이터 공간이 있다는 의미이다. 2. State is read-only 리액트에서는 setState 메서드를 활용해야만 상태 변경이 가능하다. 리덕스에서도 액션이라는 객체를 통해서만 상태를 변경할 수 있다. 3. Changes are made with pure functions 변경은 순수함수로만 가능하다. 리듀서와 연관되는 개념이다. Store(스토어) – Action(액션) – Reducer(리듀서) Store, Action, Reducer의 의미와 특징 1. Store (스토어) Store(스토어)는 상태가 관리되는 오직 하나의 공간이다. 컴포넌트와는 별개로 스토어라는 공간이 있어서 그 스토어 안에 앱에서 필요한 상태를 담는다. 컴포넌트에서 상태 정보가 필요할 때 스토어에 접근한다. 2. Action (액션) Actio

Naver Blog

[Redux] Vanilla JavaScript에 Redux 적용하기(store, reducer) #0

npx create-react-app , 먼저 순수 자바스크립트로 숫자 카운터 기능을 구현해 본다. //index.html <!DOCTYPE html> <html lang="en"> <head> ... </head> <body> <button id="add">Add</button> <span>0</span> <button id="minus">Minus</button> </body> </html> //index.js const add = document.getElementById("add"); const minus = document.getElementById("minus"); const number = document.querySelector("span"); let count = 0; number.innerText = count; const updateText = () => { number.innerText = count; }; const handleAdd = () => { coun

Naver Blog

[Redux] Vanilla JavaScript에 Redux 적용하기(action) #1

const reducer = (state = 0, action) => { //state = 0은 default값 console.log(state, action); return state; }; const store = createStore(reducer); action은 reducer의 두번째 인자로 받아지며 state를 modify할 수 있다. action is a way that communicate with reducer. 그럼 어떻게 action을 사용할 수 있나. const reducer = (state = 0, action) => { console.log(state, action); return state; }; const store = createStore(reducer); store.dispatch("HELLO"); //dispatch()를 사용. Actions must be plain objects 라고 한다. const reducer = (state = 0, act

Naver Blog

[Redux] Vanilla JavaScript에 Redux 적용하기(subscribe) #2

import { legacy_createStore as createStore } from "redux"; //state가 없으면 default로 0으로 호출한다. const reducer = (state = 0, action) => { console.log(state, action); if (action.type === "ADD") { return state + 1; } else if (action.type === "MINUS") { return state - 1; } else { return state; } }; const store = createStore(reducer); add.addEventListener("click", () => { store.dispatch({ type: "ADD" }); }); minus.addEventListener("click", () => { store.dispatch({ type: "MINUS" }); }); 여기까지 진도를 나왔었고, 아랫부분

Naver Blog

[Redux] Vanilla JavaScript에 Redux 적용하기 (Recap)#3

앞서 #2에서 작성한 기존 코드를 improve 해보겠다. switch, case, default const reducer = (state = 0, action) => { if (action.type === "ADD") { return state + 1; } else if (action.type === "MINUS") { return state - 1; } else { return state; } }; if, else if, else ====> switch, case, default const reducer = (state = 0, action) => { switch (action.type) { case "ADD": return state + 1; case "MINUS": return state - 1; default: return state; } }; redux 공식 문서에서도 switch, case, default 문법 사용을 권장하고 있다. 두 번째, 기존에서는 dispatc

Naver Blog

[Redux] Vanilla JS Todolist에 Redux 적용하기 #0

//index.html ... <body> <h1>To Dos</h1> <form> <input type="text" placeholder="Write to do" /> <button>Add</button> </form> <ul></ul> </body> //index.js const form = document.querySelector("form"); const input = document.querySelector("input"); const ul = document.querySelector("ul"); const createToDo = (toDo) => { const li = document.createElement("li"); li.innerText = toDo; ul.appendChild(li); }; const onSubmit = (e) => { e.preventDefault(); const toDo = input.value; input.value = ""; createTo

Naver Blog

[RN] React Native 앱 버전 관리하기 (iOS & Android)(업데이트)

우선 앱의 버전은 회사마다 조금씩 다르겠지만 "a.b.c"로 구분한다. a: 큰 버전업 배포 시 (앱의 navigation 구조를 갈아엎는 등) b: 새로운 기능 배포 시 (component 추가 등) c: QA 등 자잘한 테스트 버전 업 배포 시 (하드 코딩 내용 수정 등) 위 기준은 회사마다 차이가 조금씩 존재한다. 처음에는 react-native-version이라는 npm 라이브러리를 사용했는데 잘 적용되지 않았다. 따라서 오늘은 수동으로 버전 수정하는 방법을 정리해 본다. android , ios 따로 진행해야 한다. Android 안드로이드 document에서 찾은 내용입니다. 우선 android/app/build.gradle 파일을 수정해야 합니다. android { defaultConfig { versionCode 2 versionName "1.0.1" } } 위의 코드는 버전을 1.0.1로 올리는 코드입니다. 여기서 주목해야 할 점은 versionCode, versio

Naver Blog

[중국 시사] 사회적 매장된 유명 배우 3인 (EXO-M 멤버 크리스 등)

안녕하세요. 토니입니다. 최근 들어 이슈가 되는 중국인 배우 3인 및 그들의 매장 사유를 알아보도록 하겠습니다. 1. 우이판 ( 吴亦凡 Kris) 중국판 '네이버'인 바이두에선 이름 우측에 "캐나다 국적 연예인, 강간 혐의"라고 박제를 해놓았습니다. 중국 포털사이트 바이두(baidu)에서의 검색 화면 크리스(이하 Kris)는 2012년 2월 16일 그룹 'EXO'로 정식 데뷔하였고, 이후 'EXO-M'의 멤버로서 활동했습니다. 인지도를 쌓은 후 그는 중국 본토에서 활발하게 활동했으며, '실력은 없더라도 재치 있고 멋있는' 아티스트로 많은 중국 청년들에게 호평을 받았는데요, 유행어 'skr, skr'의 탄생 또한 '랩 오브 차이나'에서 의미를 알 수 없는 'skr, skr'를 유행어로 밀면서 수억 명 중국 청년들의 '힙합 리더, 패션 리더'로 자리 잡았고, 실시간 검색어 1위에 몇 번이나 등극했습니다. 사건의 발단 2021년 7월 17~18일, Du Meizhu라는 한 여성이 웨이보(

Naver Blog

[중국 시사] 중국에서 역대급 반전을 이뤄낸 일본 게임

안녕하세요. 토니입니다. 한국인 못지않게 반일 감정이 심한 중국인들은 일본 문화, 특히 일본 게임을 어떻게 받아들이고 있는지 궁금하실 텐데요, 그럼 과거의 중국으로 가보겠습니다. 2000년대 초반, 한국과 비슷한 상황으로 그 당시 청소년들에게 유일한 매체는 'TV'였습니다. 중국 시트콤<Home With Kids>등 작품이 대박 인기를 끌었지만, 반면 애니메이션은 비교적 낮은 퀄리티를 보여줬습니다. <Home With Kids>, 중국식 유머와 출중한 연기력으로 시트콤 장르가 유행을 시작함 중국 애니메이션 <Pleasant Goat and Big Big Wolf>, 스토리는 출중했지만 작중 캐릭터들의 부자연스러운 움직임 등 평가가 아쉬움 이런 와중에 혜성 같은 작품이 홍콩을 통해 중국 대륙으로 유통됩니다. 그것은 바로 <나루토>. <호카게 닌자>라는 번역명으로 중국 시장에 진입 자국 애니메이션 퀄리티에 아쉬워하던 중국인들은 <나루토>를 처음 접하고 충격을 받았으며, 순식간에 대중적인

Naver Blog

[일본 가수] 요네즈 켄시- 세계를 포옹한 자폐증 소년의 이야기

안녕하세요. 토니입니다. 코로나가 심해진 요즘 집에 있는 시간이 길어지니 문득 '자폐'란 단어가 떠오르는데요, 그래서 이번엔 일본 유명 가수- 요네즈 켄시에 대하여 소개해 드리겠습니다. 요네즈 켄시 (米津 玄師/よねづ けんし) '외로움'이라는 단어로 요네즈 켄시의 어린 시절을 요약할 수 있습니다. 1991년 3월 10일 일본 도쿠시마 시의 한 가난한 가정에서 태어난 그는 어릴 적부터 타인과 의사소통하는 데 어려움을 겪었고 종종 학교에서 지적받았습니다. 이름 때문에 놀림을 당했다고도 하네요. 가족과의 관계도 좋지 않았습니다. 아버지와 한 번 소통하는데 약 1시간이 필요했고, 어머니와 여동생과의 사이도 좋지 않았습니다. 켄시는 어렸을 때부터 자신이 보통 사람이 아니라고 생각했습니다. 나이가 들수록 점점 외로워지고, 공부에 흥미도 잃으며, 친구도 없는 그는 학교에 가기 싫다는 생각까지 들게 됩니다. 그는 열두 살 때 '고기능 자폐 장애'를 진단받았습니다. 고기능 자폐 장애 (高機能自閉症,

Naver Blog

[세계 시사] 21세기 마리오네트 WHO

아프리카에서 발견된 코로나19 새 변이 바이러스 '오미크론'이 우려 변이로 분류됐습니다. 오미크론 변이는 지난달 남아프리카 보츠와나에서 처음 발견된 뒤 남아프리카 공화국에서 빠르게 확산됐는데요, 유럽 각국은 발원지로 지목된 남아프리카로 통하는 문을 걸어 잠그고 있습니다. 남아프리카 보츠나와 위치 과학자들은 '오미크론'이 우리가 가장 우려하고 있는 높은 전염성과 백신 면역반응 회피, 이 두 가지를 모두 갖고 있는 것으로 분석했습니다. WHO는 최근 몇 주간 이 변이의 감염자 수가 급격히 늘고 있다며, 오미크론 변이가 재감염의 위험이 크다고 지적했습니다. 자 그럼 도대체 왜 이번 변이 바이러스 이름을 '오미크론'으로 지정했을까요. Ο, ο(그리스어: 오미크론)은 15번째 그리스 문자이다. 그리스 숫자로는 70을 뜻한다. -위키백과 그리스 문자 이번 변이 바이러스는 13번째 바이러스입니다. 즉, 이름이 위 그리스 문자 순서 상 'Nu(뉴)'로 와야 맞는데요, WHO는 '뉴'라는 발음이 '

Naver Blog

[세계 시사] 블랙 프라이데이는 상술이다

블랙 프라이데이(이하 블프)는 11월의 넷째 주 목요일인 추수감사절 다음날로, 미국에서 연중 가장 큰 규모의 쇼핑이 행해지는 날입니다. 올해 블프는 2021년 11월 26일 금요일 (Black Friday, 검은 금요일) 안 좋은 역사가 있을 듯한 어감과는 다르게 'black'이라는 표현은 이날이 연중 처음으로 회계 장부에 흑자(black ink)를 기록하는 날이라는 데에서 유래됐는데요, 소매업체의 경우, 1년 매출의 70%가 이날 이루어진다고 합니다. 넷상에서 유명한 블프 짤 국내 11번가, 지마켓, 옥션 빅 스마일 데이나 일부 대기업 공식 계정이 아니면 이미 가격 다 올려놓고 파는 거라 의미가 없다는 얘기가 있는데요, 쿠폰 적용하면 할인가가 아닌 정가가 나와서 소비자들에 대한 눈속임을 했다는 말이 있습니다. 큰 할인에 훅해서 판단력을 잃지 마시고, 꼭 과거 정가를 확인하고 구매가 필요할 것 같습니다.

Naver Blog

[세계 시사] 알파고의 모국어

'한국인으로 태어나 모국어는 물론, 영어는 필수에 중국어/일본어 등 제2외국어까지 배워야 경쟁력이 갖춰지는 2021년. 거기에 프로그래밍 언어까지 배우라고?' -라고 생각하시면 큰 오산입니다. 오늘은 4차 산업 혁명의 키워드'코딩'에 대해 알아보겠습니다. 사진만 봐도 머리가 아픈 '코딩'. 코딩이란 프로그래밍 코드를 어딘가에 적는 것을 말합니다. 즉, 알고리즘을 특정한 프로그래밍 언어를 이용해 컴퓨터 프로그램으로 구현하는 기술을 말하는데요, 프로그래밍 언어 인기 순서 (2018년 10월 기준 Python 1위, Java 2위, JavaScript 3위) 중 1위인 파이썬을 알아보겠습니다. 파이썬 Python Life is short, You need Python. 문법이 매우 쉬워서 작성하기에 간단하기 때문에 초보자들이 처음 프로그래밍을 배울 때 추천되는 언어입니다. 인스타그램, 유튜브, reddit 등이 파이썬을 주로 쓰고 있다고 알려져 있으며, 외국의 구인 사이트에도 파이썬을 할

1 2 3