본문 바로가기

전체 글233

GitHub Actions + Docker + AWS EC2로 CI/CD 파이프라인 직접 구축하기 1. 왜 CI/CD를 직접 구성해봤나프로젝트를 진행하면서 매번로컬에서 빌드서버에 접속해 재배포설정 하나만 바뀌어도 다시 반복이 과정이 너무 비효율적이라고 느꼈다.그래서 코드를 push하면 자동으로 빌드되고 서버에 반영되는 환경을 직접 구성해 보기로 했다.이번 목표는 다음과 같다.GitHub에 코드 push자동으로 빌드(Test 포함)AWS EC2에 자동 배포Docker 기반으로 실행 환경 통일2. 전체 CI/CD 구조최종적으로 구성한 흐름은 아래와 같다.[Local] └─ git push[GitHub Actions] └─ Gradle build └─ Docker image build[AWS EC2] └─ SSH 접속 └─ git pull └─ docker run초기 학습 목적이기 때문에ECR,.. 2026. 1. 9.
알고리즘 2주차 LIFO, FIFO 동작 원리 이해후입선출(LIFO : Last In First Out)후입선출은 나중에 넣은 데이터가 먼저 빠져나가는 것을 말하며 스택이 후입선출을 사용하는 대표적인 자료구조이다.선입선출(FIFO : First In First Out)선입선출은 먼저 넣은 데이터가 먼저 빠져나가는 것을 말하며 큐가 선입선출을 사용하는 대표적인 자료구조이다. Stack스택은 후입선출을 사용하는 대표적인 자료구조로 가장 최근에 넣은 데이터가 가장 먼저 제거되는 구조를 말한다.주요 연산Push : 스택의 맨 위에 데이터를 추가한다.Pop : 스택의 맨 위 데이터를 삭제한다.Peek : 스택 맨 위의 데이터를 조회한다.isEmpty : 스택이 비어있는지 확인한다. 비어있으면 true, 안비어있으면 false를 .. 2025. 11. 2.
알고리즘 1주차 배열/문자열의 기본 구조와 인덱스 접근 방식 이해배열의 기본 구조정의배열은 같은 자료형의 데이터 여러 개를 하나의 변수 이름으로 관리할 수 있는 구조이다. 메모리 상에 연속된 공간으로 저장되며, 각 요소는 인덱스(index)로 구분된다.선언과 초기화int[] numbers = new int[5];// 크기가 5인 int 배열int[] scores = {90, 85, 100, 70};// 선언과 동시에 초기화를 하는 배열인덱스 접근배열의 인덱스는 0부터 시작해서 최대 길이 -1 까지 접근이 가능하다. 배열의 최대 길이는 .length로 확인할 수 있다.System.out.println(scores[0]);// 90System.out.println(scores[2]);// 100System.out.print.. 2025. 10. 24.
iOS 코디네이터 패턴 코디네이터 패턴이란코디네이터(Coordinator) 패턴은 iOS 개발에서 앱의 네비게이션 흐름을 효율적으로 관리할 수 있도록 도와주는 디자인 패턴이다. 이 패턴은 뷰 컨트롤러 간의 의존성을 최소화하고, 네비게이션 로직을 각 뷰 컨트롤러에서 분리하여 코드의 유지보수성과 확장성을 높이는 것을 목표로 한다. 코디네이터 패턴의 필요성1. UIViewController의 역할 분리: 일반적으로 iOS 앱에서는 UIViewController가 화면 표시와 네비게이션 제어를 동시에 처리하는 경우가 많다. 이는 코드가 복잡해지고, 네비게이션 로직이 여러 컨트롤러에서 분산되면서 유지보수성이 떨어질 수 있다.2. 코드 중복 감소: 코디네이터 패턴을 사용하면 네비게이션 로직을 하나의 코디네이터 클래스에서 관리할 수 있으므.. 2025. 5. 19.
Swift 에러 처리 에러 처리는 프로그램에서 발생할 수 있는 예외적인 상황을 감지하고 대응하는 중요한 프로세스이다. 에러 표현과 던지기(Peoresenting and Throwing Errors)Swift에서 에러는 Error프로토콜을 준수하는 타입으로 표현된다. 열거형을 사용하면 다양한 에러 상황을 모델링하고 관련 값을 포함할 수 있다.enum VendingMachineError: Error { case invalidSelection case insufficientFunds(coinsNeeded: Int) case outOfStock}에러를 발생시키려면 thorw 키워드를 사용한다.thorw VendingMachineError.insufficientFunds(coinsNeeded: 5) 에러 처리 방법(H.. 2025. 3. 14.
iOS 메모리 분석 및 최적화 Instruments에서 Leaks 및 Allocations 활용Leaks & Allocations 개념Leaks: 실행 중인 앱에서 메모리 누수가 발생하는지 감지한는 도구이다. 메모리 할당 후 객체가 해제되지 않고 남아있을 경우 이를 감지할 수 있다.Allocations: 앱이 실행되면서 메모리가 어떻게 할당되는지 추적하고, 과도한 메모리 사용 여부를 분석하는 도구이다.Instruments 실행 방법Xcode에서 Product 창에 Profile 을 선택한다.그러면 위 사진과 같이 Leaks 가 있는데 그것을 클릭하고 Choose 를 실행하면 실행된다.이후 실행을 하고 시간이 지났을 때 메모리 누수가 나는 곳을 알려준다. 메모리 누수 예제 코드class TestViewController: UIViewC.. 2025. 3. 9.
Swift의 ARC Swift는 메모리 관리를 자동으로 처리하기 위해서 ARC(Automatic Reference Counting)를 사용한다. ARC는 객체가 사용되는 동안 참조 카운트(Reference Counting)를 관리하여, 더 이상 필요하지 않으면 객체를 자동으로 메모리에서 해제한다.하지만 객체 간 강한참조(Strong Reference)를 잘못 사용하면, 순환 참조(Strong Reference Cycle)가 발생하여 메모리에서 해제되지 않는 문제가 발생할 수 있다.ARC(Automatic Reference Counting)의 동작 원리ARC는 객체가 할당되면 참조 카운트를 증가시키고, 더 이상 필요하지 않을 때 참조 카운트가 0이 되면 메모리에서 해제된다.class Person { let name: S.. 2025. 3. 1.
2025.02.24 Today I Learned Swift는 정적 타입 언어로 컴파일 시점에서 변수의 타입이 결정된다. 하지만 상속, 프로토콜 채택, 그리고 Any/AnyObject와 같이 런타임에 실제 타입 정보가 중요한 상황에서는 타입 캐스팅을 사용한다.타입 캐스팅은 두 가지 주요 목적이 존재한다.타입 확인(Type Checking)객체가 특정 타입의 인스턴스 인지 확인한다.타입 변환(Type Conversion)런타임에 객체의 타입을 다른 타입으로 안전하게 변환한다.Swift의 주요 타입 캐스팅 연산자Swift에서는 크게 네 가지 연산자를 통해 타입 캐스팅을 수행한다. 각 연산자의 역할과 사용 예제는 아래와 같다.1. is 연산자목적: 객체가 특정 타입에 속하는지 확인하기 위해서 사용한다.if someObject is SomeClass { .. 2025. 2. 24.
2025.02.14 Today I Learned Swift의 이니셜라이저Swift의 init은 클래스, 구조체, 열거형에서 새로운 인스턴스를 생성하는데 필수적인 요소이다.init 의 역할Swift에서 init은 객체가 생성될 때 호출되는 생성자(initializer) 역할을 한다. 클래스, 구조체, 열거형 모두 init 키워드를 사용할 수 있으며 이를 통해 초기 속성 값을 부여하거나 특정 로직을 실행할 수 있다.struct User { var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age }}let user = User(name: "Park", age: 27)init과 deinitinit.. 2025. 2. 14.