문제 상황 현재가 정보에서 불러온 Entity를(TickerAPI) Cell에서 사용 가능하게 변경해줘야 해요. 문제는 Cell에서 한글 이름을 보여줘야 하는데, 서버 어디에서도 한글 이름을 전해주지 않았어요. 이 문제를 해결하기 위해서는 결국 코인 타입별로 직접 한글 이름을 입력해주어야 하는데 186개에 달하는 코인 이름을 매번 검색해서 넣는 것은 시간이 오래 걸리는 하드 코딩이었어요. 그래서 업무를 줄이기 위해, 업비트의 API에서 호출한 정보를 가지고 겹치는 코인의 경우 이름을 할당해주는 작업을 진행했어요. 문제 해결하기 업비트의 API에서 제공하는 코인과 빗썸에서 제공하는 코인의 종류는 달라요. 그래서 목표는 빗썸에서 제공하는 코인의 종류 중 업비트에서 동시에 제공하는 코인이 있다면 업비트에서 내..
문제 상황 인식하기 API에서 암호화폐 코인 별 정보를 받아오려고 해요. 빗썸의 open API에서 Ticker 정보를 받아오는데 그 정보는 아래와 같이 들어와요. // URL: https://api.bithumb.com/public/ticker/{order_currency}_{payment_currency} { "status" : "0000", "data" : { "opening_price" : "504000", "closing_price" : "505000", "min_price" : "504000", "max_price" : "516000", "units_traded" : "14.71960286", "acc_trade_value" : "16878100", "prev_closing_price" : "..
학습했던 MVVM과 RxSwift를 활용해서 프로젝트를 진행하기로 했어요! 여기에 소켓 통신을 사용해보기 위해 암호화폐 거래소 앱을 주제로 선정했어요. 기본적으로는 클론 코딩의 형식을 갖고, 필요에 따라 조금씩 변화를 주며 구현할 계획이에요. 프로젝트 GitHub Repository 3인으로 팀을 구성해서 프로젝트를 진행했어요 :) 목표는 우선 메인화면과 실시간 호가 화면 등 총 3개의 화면으로 잡았는데 이번 글에서는 메인 화면 설계에 대한 글을 작성하려고 해요. 저는 앱을 설계하기 위해 아래와 같이 메인 화면을 분석했어요. 1. SearchBar SearchBar는 NavigationBar에 넣는 방식으로 구현하는 것이 좋을 것 같다고 생각했어요. 서치바 버튼 버튼 버튼 위와 같이 4개의 요소를 sta..
RxTest 활용하기 이번 글에서는 RxSwift로 구현된 기능을 테스트해보기 위해 RxTest를 사용해보려고 해요! RxSwift는 비동기로 동작하기 때문에 단순히 코드를 작업하면 원하지 않는 결과물이 나올 수 있어요. 테스트 시 비동기 상황을 만드는 방법은 여러 가지가 있겠지만, 이번에는 RxTest를 익혀보기로 했어요 :] (거기에 더해 Nimble / RxNimble을 추가로 사용했어요!) 상황 이해하기 우선 테스트하려는 객체를 정의해볼게요. 저는 SearchBar에 글자를 입력하고 검색 버튼을 눌렀을 경우 그 글자가 정상적으로 잘 전달되는지 테스트하려고 해요. 그 코드는 아래와 같아요. import RxCocoa import RxSwift struct SearchBarViewModel { let..
init() vs viewDidLoad() in UIViewController 왜 갑자기 이런 의문이 들었을까? UI 라이브러리인 Texture를 학습하며 init과 didLoad에 차이점을 학습한 경험이 있어요. UIKit에서 UIViewController를 구성할 경우 init은 Main 스레드에서 동작하지만, Texture에서는 init과 didLoad의 차이가 있었어요. 어떤 코드의 경우 init에서 초기화를 하는지, didLoad에서 초기화를 하는지에 따라 큰 차이를 낼 수 있었어요. 예를 들면, UI 같은 경우 갱신을 Main 스레드에서 진행하기 때문에 굳이 init에서 선언하기보다 didLoad에서 선언하는 것이 좋았죠. 그래서 작업할 때 초기화 위치에 대한 고민을 많이 했던 것 같아요. 그..
개요 현업에서 굉장히 좋았다고 느꼈던 기능이 있어 이번 팀 프로젝트를 진행하며 적용시켜보고 싶었어요. 그래서 그 내용을 공유하려고 해요 :) 규모가 큰 프로젝트일수록 브랜치 전략이 필요하고, 브랜치가 세분화됨에 따라 Pull / Request의 중요성은 더 커져요. 특히 혼자만의 판단으로 Merge할 경우 나중에 큰 문제가 생길 수 있어요. 객관적인 판단을 위해 팀원들의 리뷰와 승인이 있을 때에만 Merge를 진행할 수 있는 제약 조건이 있다면 조금 더 신뢰성 있게 프로젝트가 관리될 수 있을 거예요. 그래서 이 글에서는 GitHub에서 팀원들의 승인이 N개 이상일 때에만 Merge 가능하게 제약을 거는 방법에 대해 이야기 해볼게요. 제약 설정하기 방법은 매우 간단해요. 우선 제약을 생성하기 원하는 Git..
문제 풀이 과정의 고민 시뮬레이션으로 문자열을 직접 탐색하는 것도 방법일 수 있다고 생각했어요. DFS처럼 탐색하지만 탐색 조건을 변경하면서요. 하지만 그런 방식은 상황이 너무 복잡해지고 작은 디테일에서 오류가 쉽게 발생할 수 있다고 생각해서 노드를 직접 만드는 것으로 생각했어요. 이 글에서 전위, 중위, 후위 순회에 대한 설명을 하진 않을 계획이에요. 다만, 각 탐색 메서드에서 명백하게 출력의 우선순위를 보여주는 것이 중요하다고 생각해요. 전위는 말 그대로 부모 노드의 데이터를 먼저 보여주는 것, 중위는 왼쪽 노드부터 탐색한 후 부모 노드의 값을 출력해주고 오른쪽 노드를 탐색하는 것처럼이요. 언어를 조금 고민했어요. 파이썬 풀이도 추가로 올릴 예정이지만, 아무래도 Node 클래스를 이용해 풀이하는 데에..
문제 상황 파악하기 UI를 구현할 때 가장 힘든 것 중 하나가 매번 빌드하면서 결과물을 확인하는 것이죠. 물론, Figma 등으로 UI 스펙이 확정된 경우 UI를 그리기 상대적으로 편하지만 그래도 여전히 UI 확인을 실시간으로 할 수 없다는 건 불편한 것 같아요. 특히 현업에서 빌드를 한 번 돌리는데 너무 많은 시간이 소요되었기 때문에 더 힘들었어요(단순 빌드가 20분 넘게 걸린 적도..). 그래서 이번에는 Preview를 통해 화면을 미리 볼 수 있는 기능을 구현해볼게요. Preview 구현하기 우선 도구는 SwiftUI에요. "내 프로젝트는 UIKit인데?" 하는 분이 있을 수도 있지만 프로젝트의 UI와 아무 상관이 없어요. 저 역시 프로젝트는 UIKit와 Snapkit으로 구현하고, SwiftUI는..
- Total
- Today
- Yesterday
- PassingCars#Codility#Python
- 나무자르기#BOJ#이분탐색#Python
- 리모컨#완전탐색#BOJ#Python
- 토마토#백준알고리즘#Python
- API#lazy#
- 섬의개수#백준알고리즘#Python
- 파이썬알고리즘인터뷰#4장
- django
- 텀 프로젝트#백준알고리즘#Python
- Swift#Tuples#Range
- 병든 나이트#BOJ#탐욕법#Python
- NumberofDiscIntersections#Codility#Sort#Python
- 랜선자르기#이분탐색#BOJ#Python
- django#slicing
- 공유기 설치#BOJ#이분탐색#Python
- 반복수열#백준알고리즘#Python
- 종이자르기#분할정복#BOJ#Python
- Triangle#Sorting#Codility#Python
- 배열합치기#분할정복#BOJ#Python
- 순열사이클#BOJ#Python
- Distinct#Codility#Python
- 날짜 계산#BOJ#완전탐색#Python
- filter#isalnum#lower
- 터틀비치#리콘#xbox#controller
- N으로 표현#DP#Programmers#Python
- 쿼드트리#BOJ#분할정복#Python
- 백준 알고리즘#BackTracking
- 미로 탐색#백준알고리즘#Python
- 암호코드#dp#BOJ#Python
- Brackets#Stacks and Queues#Codility#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |