분류 전체보기 30

[iOS] RxSwift + Swift Testing

✅ 왜 RxBlocking이 필요할까? RxSwift는 비동기 스트림을 다루는 라이브러리입니다. 하지만 테스트는 동기적으로 결과를 확인해야 합니다// ❌ 이렇게 하면 안 됨 - 비동기라서 테스트가 끝나기 전에 완료됨func test_잘못된_방법() { let result = userRepository.getUser(id: 1) // Single // result는 아직 실행되지 않은 스트림일 뿐! #expect(result == expectedUser) // 컴파일 에러!}// ✅ RxBlocking으로 동기화func test_올바른_방법() throws { let result = try userRepository.getUser(id: 1) .toBlocking() ..

iOS 2025.07.31

[iOS] Factory Pattern

Factory Pattern이 필요한 이유만약 처음에 단순하게 버튼을 이렇게 만들었다// 처음엔 이렇게 만들었지...let button = UIButton()button.setTitle("확인", for: .normal)button.backgroundColor = .blue 그런데 기획자가 와서 말합니다: "아, 이제 라이트 모드랑 다크 모드 두 가지로 만들어주세요!" // 이제 이런 코드가 앱 곳곳에...if isDarkMode { let button = UIButton() button.setTitle("확인", for: .normal) button.backgroundColor = .black button.setTitleColor(.white, for: .normal)} else ..

iOS 2025.07.24

[iOS] Coordinator 패턴 적용기

📚 Coordinator 패턴이란?네비게이션 로직을 View Controller에서 분리하여 별도의 객체가 담당하도록 하는 아키텍처 패턴기존 방식의 문제점View Controller가 다른 View Controller를 직접 생성하고 present/push네비게이션 로직이 여러 곳에 분산되어 관리가 어려움View Controller 간의 강한 결합 Coordinator 패턴의 개념들1. childCoordinators 배열의 역할var childCoordinators = [Coordinator]() // 메모리 관리를 위한 배열메모리 관리를 위한 것배열에 추가 = 메모리에서 해제되지 않게 유지배열에서 제거 = 메모리에서 해제2. coordinator = self를 하는 이유let homeVC = Hom..

iOS 2025.07.22

[트러블슈팅] UICollectionViewCell 그림자가 초기 렌더링 시 안 보이는 문제

🚨문제상황셀 내부이미지에 shadow를 적용했지만 최초 실행 시 보이지 않음스크롤 후 다시 돌아오면 그림자가 정상적으로 보임아래 사진 순서 대로 1,2번은 안보이고 스크롤 하면 3번부터 보임, 다시 돌아오면 2,1 순으로 그림자가 생김 🔎 문제 원인AutoLayout이 완전히 적용되기 전에 shadowPath 설정containerView.bounds가 아직 계산되지 않은 상태여서 (0,0,0,0)이 찍힘override func layoutSubviews() { super.layoutSubviews() containerView.layer.shadowPath = UIBezierPath( roundedRect: containerView.bounds, // ❌ 초기에 bounds가..

iOS 2025.07.18

[AI와 함께하는 네트워크 공부] 3. HTTP란?

HTTP (HyperText Transfer Protocol)웹에서 클라이언트와 서버가 데이터를 주고받기 위한 통신 규약 🌐 HTTP의 특징1. 무상태성 (Stateless)서버는 클라이언트의 이전 요청을 기억하지 않습니다.요청 1: "로그인 해주세요" → 서버: "로그인 성공"요청 2: "내 정보 보여주세요" → 서버: "누구세요? 다시 로그인하세요" 서버 부담 감소: 각 요청마다 상태를 저장할 필요가 없어서 메모리 절약확장성: 여러 서버에 요청을 분산시키기 쉬움단순성: 각 요청이 독립적이라서 이해하기 쉬움문제점과 해결책:문제: 로그인 상태를 유지하려면?해결: 쿠키(Cookie), 세션(Session), 토큰(Token) 사용 2. 비연결성 (Connectionless)요청과 응답이 끝나면 연결을 끊..

TIL 2025.07.14

[iOS] Coordinator 패턴으로 화면 전환 로직 분리하기

기존의 ViewController에서 직접 화면 전환을 처리하는 방식이 마음에 들지 않아 Coordinator 패턴을 적용해보았다. ✅ Coordinator 패턴화면 전환(네비게이션) 로직을 별도의 객체로 분리하는 디자인 패턴 기존 문제점// ViewController가 다른 ViewController를 직접 알고 있어야 함class ExchangeRateViewController: UIViewController { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let calculatorVC = CalculatorViewController(exchangeRate: rate) na..

iOS 2025.07.10

[iOS] 클로저에서 async/await로 리팩토링하기

기존에 배웠던 클로저 기반 네트워킹에서 async/await 방식으로 리팩토링 아닌 리팩토링을 해보았다 ✅ 기존 방식 (클로저 기반)private func fetchData() { session.dataTask(with: request) { (data, response, error) in guard let data, error == nil else { return } if let response = response as? HTTPURLResponse { if (200.. ✅ async/awaitfunc fetchData(url: URL) async -> Result { do { let (data, response) = tr..

iOS 2025.07.08

[AI와 함께하는 네트워크 공부] 2. TCP vs UDP

🚚 TCP (Transmission Control Protocol)장점단점1. 신뢰성 보장패킷 분실 시 자동 재전송중복 패킷 제거순서 보장2. 흐름 제어받는 쪽 속도에 맞춰 전송버퍼 오버플로우 방지3. 혼잡 제어네트워크 상황에 맞춰 전송 속도 조절1. 속도 느림연결 설정 시간 필요확인 과정으로 인한 지연2. 오버헤드헤더 크기 큼 (20바이트)제어 정보 많음3. 실시간 통신에 부적합재전송으로 인한 지연순서 보장 때문에 블로킹🤝 TCP 3-Way Handshake (연결 설정)📱 클라이언트 → 🖥️ 서버: "연결하고 싶어요!" (SYN)🖥️ 서버 → 📱 클라이언트: "좋아요! 연결해요!" (SYN-ACK) 📱 클라이언트 → 🖥️ 서버: "확인했어요!" (ACK) ex.// URLSession..

TIL 2025.07.07

비트 연산자

기본 비트 연산자OR 연산 (|)// 둘 중 하나라도 1이면 19 | 20// 01001 (9)// 10100 (20)// ----- OR// 11101 (29)AND 연산 (&)// 둘 다 1이어야 19 & 20// 01001 (9)// 10100 (20)// ----- AND// 00000 (0)XOR 연산 (^)// 서로 다르면 1, 같으면 010 | 12// 1010 (10)// 1100 (12)// ---- XOR// 0110 (6)NOT 연산 (~)// 0은 1로, 1은 0으로~1010 = 0101시프트 연산 (>)1 > 2 # 8을 오른쪽으로 2칸 이동# 1000 → 0010 (2가 됨) 비트 조작 기본 패턴특정 비트 설정 (Set)// n번째 비트를 1로 설정number |= (1 특정..

알고리즘 2025.07.04

[AI와 함께하는 네트워크 공부] 1. OSI 7계층 모델

나는 왜 네트워크 수업을 듣지 않았을까......후회할 시간이 없다!네트워크 관련 면접 질문들을 중심으로 빠르게 훑어보려고 한다0, 1레벨에 있는 질문들에 답하기 위해 필요한 개념들을 ai와 함께 묻고 답하며 정리한다 🎯 7계층으로 분리 이유복잡한 네트워크 문제를 해결하기 위해 복잡성 관리: 네트워크 통신이라는 복잡한 과정을 여러 단계로 나누어서 각각을 단순하게 만듭니다. 문제 해결의 효율성: 네트워크에 문제가 생겼을 때, 어느 계층에서 문제가 발생했는지 쉽게 찾을 수 있습니다. 각 계층은 독립적으로 동작하므로 문제가 생긴 부분만 고치면 됩니다.표준화: 각 계층마다 전 세계가 공통으로 사용하는 규칙(프로토콜)을 정합니다. 이렇게 하면 애플, 삼성, 구글 등 다른 회사의 기기들이 서로 통신할 수 있..

TIL 2025.07.03