전체 글 158

[iOS] Xcode Cloud를 활용하여 iOS CI/CD 환경 구축하기 (feat. 슬랙 웹훅으로 빌드 결과 알림받기)

1. iOS CI/CD 툴 선택 기준1) Github와 연동되는가2) Slack을 통해 팀에게 알릴 수 있는 Webhook 기능을 제공하는가3) Test를 진행할 수 있는 환경인가4) 소요되는 비용 2. iOS CI/CD Tools 특징보통 Xcode cloud, Github Actions, Fastlane, Bitrise를 사용하는 것으로 보인다.여기서 어떤 툴을 사용해야할지 선택해야하니 .. 다른 분들의 적용기들을 참고해서 대략적인 특징을 정리해보았다. 1) Github Actions현재 회사 개발팀에서 활용하고 있는 배포 자동화 툴이다. 장점- Github 자동화툴인만큼, Github와 호환성이 좋으며 내부에서 심플하게 자동화 workflow 구축 가능하다는 점이 장점- Github에서 다양한 Te..

[Python] 프로그래머스 - 방문 길이 (Lv. 2)

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/49994 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 틀린 풀이 def solution(dirs): answer = set() # 처음 걸어본 길 --> 중복 제거하기 위해 자료형은 set를 활용 dirs = list(dirs) x, y = 0, 0 for dir in dirs: cur_x, cur_y = x, y if dir == "U": y += 1 elif dir == "L": x -= 1 elif dir == "R": x += ..

[클린코드] - 변수, 함수

본 포스팅은 코드리뷰를 진행하며 팀원으로부터 받은 피드백과 클린코드 도서를 종합하여 새롭게 꺠달은 점이나 코드를 고쳐나가는 과정을 기록하는 포스팅입니다. 혹시 틀린 정보가 있다면 댓글로 알려주시면 감사하겠습니다 :) 1. 함수는 작으면 작을수록 좋다. 하나의 블록 안에 코드가 길어지면 길어질수록 이해하기 힘들다. 길어지는 부분을 또 하나의 기능 단위로 나누어 함수화하고, 이를 호출하는 것이 더 명확하게 이해하기 쉬워진다. 2. if - else 블록은 가급적이면 뎁스 1개가 가장 좋다. 블록 안에 if - else 문이 또 들어가게 되면 함수 가독성이 떨어지게 된다. 팀원의 말을 가져오면 차라리 만족하지 않는 조건일 경우에 return 시켜버리는게 더 좋은 방법이라고 한다. (if 블록 뎁스가 2개 이상..

[iOS/Swift] MVVM-C + Clean Architecture 리팩토링

MVVM-C(Coordinator)로 되어있는 프로젝트를 진행하던 중, ViewModel이 API 통신 + 비즈니스 로직 등 모든 로직을 처리하면서 한 클래스가 너무 많은 역할을 가져가고 있다는 생각이 들었고, 이에 따라 유지보수에 많은 시간이 소요된다고 생각했다. --> 객체지향 SOLID의 S(RP, 단일 책임 원칙)에 거리가 멀어 응집도가 낮고 결합도가 높음 --> 유지보수에 많은 시간 소요 + 단위 테스트의 어려움 이미 MVVM-C인 패턴에서 ViewModel의 데이터 로직 - 비즈니스 로직을 분리해줄 아키텍처가 있을까 해서 VIPER나 RIBs 등 여러가지 아키텍처에 대해 조사해본 결과, 현재 아키텍처에서 Clean Architecture의 원리를 도입하는 것이 가장 의도와 적절한 아키텍처라는 ..

[백준/Python] 숨바꼭질 1, 3 정리 (feat. 0-1 BFS, 다익스트라)

1697 - 숨바꼭질 https://www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 틀린 풀이 from collections import deque import sys input = sys.stdin.readline n, k = map(int, input().rstrip().split()) visited = [0] * 100001 def bfs(): global board global visited q = deque([n]) vis..

[Python] 코딩테스트에 필요한 문법 정리

문자열/컬렉션 문자열/배열 (튜플도 문법 거의 똑같음) ✅ 배열 슬라이싱 https://dojang.io/mod/page/view.php?id=2208 - list[시작인덱스:끝인덱스:증가폭] 시작인덱스, 증가 폭 생략 시 디폴트는 0 끝 인덱스 -> 끝인덱스 -1 - 시작 인덱스와 끝 인덱스가 같으면 빈 리스트를 반환함 >>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] >>> a[4:7] # 인덱스 4부터 6까지 요소 3개를 가져옴 [40, 50, 60] >>> a[1:1] # 인덱스 1부터 0까지 잘라서 새 리스트를 만듦 [] >>> a[1:2] # 인덱스 1부터 1까지 잘라서 새 리스트를 만듦 [10] >>> a[4:-1] # 인덱스 4부터 -2까지 요소 5개를 ..

[백준/Swift] 1520 내리막길

문제 https://www.acmicpc.net/problem/1520 1520번: 내리막 길 첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다. www.acmicpc.net 시간초과 코드 import Foundation let input = readLine()!.split(separator:" ").map { Int($0)! } let m = input[0], n = input[1] //m: x / n : y var board:[[Int]] = [] for _ in 0.. DP의 메모이제이션 기법 활용 예를들어 이 경우를 비교해보면 20에서 도착지점까지 가는 ..

[iOS/GCD] 4. async/await (Swift 5.5 ~) (feat. vs Combine, RxSwift)

async/await이 나오게 된 배경 메인 스레드에서 다른 스레드로 작업을 보내고 -> 해당 스레드에서 다른 스레드로 작업을 보내고 .... 이런식으로 이어나가면서 completionHandler를 진행하게 되면, 콜백 지옥에 빠지게된다. func processImageData(completionHandler: (_ result: Image) -> Void) { loadWebResource("a.txt") { dataResource in loadWebresource("b.txt") { dataResource in decodeImage(dataResource, imageResource) { imageTmp ..... async/await를 도입하면? func processImageData() async ..

🍎 iOS/GCD 2023.07.24

[iOS/GCD] 3. GCD의 주의사항

주의해야 하는 사항 1. UI 관련한 작업은 반드시 메인 스레드로 보내줘야한다. (DispatchQueue.main.async) DispatchQueue.global().async { // 네트워크 통신 (데이터 다운로드) DispatchQueue.main.async { // UI와 관련된 작업 } } 2. 비동기 처리를 하는 함수에서는 return 문으로 반환하면 비동기적 실행으로 인해 nil을 return하므로, 탈출 클로저를 사용하여 결과값을 반환해야한다. (Apple에서는 이를 completion Handler라고 명칭함) func getImages(url: String, completionHandler: @escaping (UIImage?) -> Void) { let url = URL(strin..

🍎 iOS/GCD 2023.07.23

[iOS/Swift] URLSession vs Alamofire

iOS 앱을 만들 때 거의 필수적으로 네트워킹을 구현하는 경우가 많다. URLSession, Alamofire 모두 사용해보았을 때 각각 원리가 어떻게 되고, 장단점이 어떻게 되는지 분석하여 현재 프로젝트 리팩토링이나 다음 프로젝트를 진행할 때 기술 선택 시 도움이 되고자 비교해보고자 한다. URLSession vs Alamofire URLSession은 애플 프레임워크에서 제공되는 가장 기본적인 방법이며, Alamofire/Moya는 서드파티 라이브러리이다. Get과 Post 각 메소드에 대해 라이브러리 별 사용을 비교할 것임. (어차피 delete, put, patch는 모두 Post와 같이 body값을 보내주는 형태이기 때문에 생략) 먼저 URLSession, Alamofire를 비교해보자. 1) ..

반응형