본문 바로가기

전체 글121

[DroidKnights] Retrofit -> Ktor 마이그레이션 오늘은 필자의 "첫 컨트리뷰션 도전기"에 대해 적어보고자 한다. 항상 오픈소스에 기여를 하고 싶다는 생각이 있어서 여러 오픈소스의 이슈들을 주의깊게 보고 있었다. 그러다 마침 '국내 최대 규모 안드로이드 컨퍼런스 드로이드나이츠 앱'에서 KMP로 마이그레이션하면서 여러 이슈들이 올라온 것을 보았다. 이미 UI를 다루는 이슈들은 대부분 다른 분들이 하겠다고 하셔서 남아 있는 이슈들 중에 골랐다. Koin으로 마이그레이션 하는 이슈와, Ktor로 마이그레이션 하는 이슈가 중에 고민이 되었다. Koin은 저번에 마이그레이션을 한 경험이 있었기 때문에 이미 알고 있는 이슈보다는 새로운 기술에 도전해보면서 내 스스로도 성장을 하고 싶어 Ktor 마이그레이션 이슈를 고르게 되었다! 💡해당 이슈는 아래에서 확인이 가.. 2025. 5. 28.
[CS] Kotlin과 Java의 동일성, 동등성 이번에는 객체 공부를 할 때 쉽게 헷갈릴 수 있는 동일성과 동등성에 대해 공부해 보았다. 또한 Kotlin과 Java에서는 어떻게 다르게 쓰이는 지도 정리했다.우선, 이름부터 헷갈리기 쉬운 동일성과 동등성의 개념에 대해 알아보자. 동일성Identity, 영어로 하면 이해기 쉽다. 객체의 메모리 내 주소값이 같은지 식별한다.즉, 내용이 같더라도 주소가 다르다면 다른 객체로 판단하는 것이다. 동등성Equality, 논리적으로 같은 지위를 지녔는지 확인하는 것이다.즉, 변수가 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 두 변수는 동등하다고 본다. Java의 동일성, 동등성그럼 Java에서는 동일성과 동등성이 어떻게 판단되는지 알아보자.String str1 = new String("Bona");.. 2025. 5. 21.
[Server] Kotlin SpringBoot 프로젝트에 ktlint 적용하기 이번에 Kotlin으로 Spring Boot를 개발하는 프로젝트에 들어가게 되었다. 이에 Kotlin 관련 코드 컨벤션을 정하면 좋을 것 같다는 이야기가 나왔고 이를 효율적으로 해주는 ktlint 설치를 담당하게 되어 이를 정리해보고자 한다.ktlint ktlint란, Kotlin 코드의 스타일을 자동으로 검사하고 포맷팅해주는 도구이다.이를 통해, 코드를 깔끔하게 유지하고 팀 스타일 가이드를 지킬 수 있다는 장점이 있다. 📍ktlint는 pinterest의 오픈소스를 대부분 사용한다고 한다. GitHub - pinterest/ktlint: An anti-bikeshedding Kotlin linter with built-in formatterAn anti-bikeshedding Kotlin linter.. 2025. 5. 5.
[Server] JPA 개념부터 Spring Data JPA까지 JPA는 스프링부트에서 DB에 접근하는 방법을 알 수 있는 중요한 기술 중 하나이다. 그래서 JPA가 어떤 것인지 기초부터 심화까지 알아보았고 그 내용을 정리하고자 한다. JPAJPA란, Java 객체를 데이터베이스 테이블에 매핑(ORM) 해주는 표준 "인터페이스"이다. 즉, SQL을 직접 쓰지 않아도 DB와 소통할 수 있게 도와주는 도구라고 볼 수 있다.JPA를 구현한 대표적인 오픈소스로는 "Hibernate"가 있다. JPA의 장점은 다음과 같다.JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다. 구현방법구현방법에 대해 알아보기 전, 이해를 위해 전체적인 다이어그.. 2025. 5. 5.
[IT 인프라] Ch4 기본 이론 (큐, 배타적 제어, 상태 저장/비저장) 📚 를 읽고 그 내용을 정리하였습니다 큐'큐(Queue)'는 우리말로 '대기 행렬'이라 표현할 수 있다. 큐(대기 행렬)에서는 줄을 설 때는 가장 마지막에 서고, 처리는 선두부터 순서대로 된다.먼저 들어온 데이터가 먼저 나가는 큐 동작을 FIFO(First In First Out) 방식이라고 한다. 큐는 컴퓨터 세계에서 다양한 곳에 행렬이 만들어진다.CPU 처리를 기다리고 있는 프로세스나 스레드 행렬하드 디스크 등의 저장소 읽기 처리를 기다리고 있는 I/O 요구 행렬네트워크 접속 성립을 기다리고 있는 접속 요구 행렬 이때 CPU를 기다리고 있는 프로세스 행렬을 런큐(Run-Queue)라고 한다.'런큐에 쌓인 프로세스 수를 코어 수로 나누어서 1이라면 문제 없다' 라는 것이 일반적이다. 참고로, C.. 2025. 5. 3.
[Android] FCM 푸시알림 커스텀 구현기 (딥링크 활용) 필자가 속해 있는 프로젝트 에서 FCM 푸시알림 기능을 맡았다. 이에 대해 알아보면서 안드로이드 알림에는 어떤 종류가 있는지, 어떻게 커스텀하면 되는지, 딥링크로 어떻게 화면 이동하는 지 등을 공부했고 이를 기록하고자 한다. FCM 푸시알림그럼 FCM 푸시알림이란?Firebase Cloud Messaging의 약자로, Google 클라우드 메세징 서비스이다. 이를 통해 FCM 토큰으로 사용자를 식별하여 쉽게 푸시알림을 구현할 수 있다. 서버랑 통신할 때는 위와 같은 흐름을 따른다. 정리하면 다음과 같다.1. Firebase에서 토큰을 발급하여 Client에게 보낸다.2. Client는 발급받은 토큰을 Server에게 보낸다.3. Server는 이 토큰을 이용해 Firebase에게 메시지 전송을 요청한다.. 2025. 4. 28.
[AI] Prompt Engineering으로 AI 모델 제어하기 AI가 많은 인기를 끌고 있는 만큼 이를 활용할 수 있는 개발자가 되고 싶어서 AI 스터디에 들어갔다.스터디에서 AI의 Prompt Engineering에 대해 알아보고 이를 통해 AI 모델을 제어하는 과제를 수행하여 그 과정을 기록하고자 한다. Prompt EngineeringPrompt Engineering이란 다양한 애플리케이션과 연구 주제에 언어 모델(LM)을 효율적으로 사용할 수 있도록 프롬프트를 개발하고 최적화하는 분야를 의미한다. 즉, AI 모델을 원하는 형태로 제어하는 것이다. 몇 가지 파라미터의 설정만으로도 AI 모델을 제어할 수 있다.max_tokens: 모델이 생성하는 토큰의 최댓값이다.temperature: 창의성을 제어한다. 낮은 temperature일수록 사실적이고 간결한 응답을.. 2025. 4. 23.
[IT 인프라] Ch3 3계층형 시스템 (웹 데이터, 가상화) 📚 를 읽고 그 내용을 정리하였습니다 3계층형 아키텍처3계층형 아키텍처에 대한 구성요소를 살펴보면 위와 같다.웹 서버, AP 서버, DB 서버로 이루어져 있다.이 세 대의 서버는 스위치를 경유해서 연결돼 있다. 각각의 서버를 확대해서 보면 CPU, 메모리, 디스크, NIC/HBA 같은 하드웨어 부품이 나열돼 있다. 이제부터 OS를 이해하는 데 있어서 필수 개념이라고 할 수 있는 프로세스와 스레드, 커널에 대해 알아보자. 프로세스와 스레드프로세스 및 스레드는 프로그램 실행 파일 자체가 아니라 OS상에서 실행돼서 어느 정도 독립성을 가지고 동작하는 것이다.프로세스와 스레드가 활동하기 위해서는 메모리 공간이 필요하다. 이것은 커널에 의해 메모리상에 확보된다. 프로세스 시작 시에 벌어지는 순서는 다음과 같다.. 2025. 4. 12.
[KMP] Kotest로 알아본 Stub vs Fake (테스트 더블) 📚 책의 가장 마지막 장인 12장에서는 "코루틴 단위 테스트"에 대해 다룬다.이때 테스트 더블에 대해 설명해주면서 그 종류 중 하나인 Stub을 들어주었다. 그러나 책을 읽던 당시의 나는 테스트 코드를 처음 접했기에 Stub을 왜 사용하는지 이해가 되지 않았다. 그러다, KMP 프로젝트에서 kotest를 이용해 테스트 코드를 작성할 기회가 있었는데 기존에 사용한 Mockk 라이브러리는 멀티플랫폼에서 사용이 불가하기에 Stub으로 구현해야만 했었다. 이 과정 덕분에 Stub이 무엇인지 이해가 되었고 그 과정을 설명해보려 한다. 테스트 더블우선 테스트 더블에 대해 먼저 알아보자.테스트 더블이란, 다른 객체와 의존성을 가진 객체를 테스트하기 위해 사용하는 것으로 "객체에 대한 대체물"을 의미한다.위 그림처.. 2025. 3. 22.
[객사오] 코드로 알아보는 객체의 "역할, 책임, 협력" 📚객체지향의 사실과 오해 객체지향 공부를 하기 위해 를 읽기 시작했다.책의 내용을 무작정 정리하기 보다는, 내가 이 책을 읽고 더 공부하고 싶은 부분을 직접 딥다이브 해 볼 생각이다. 이번에 읽은 챕터는 [01. 협력하는 객체들의 공동체]로 객체지향의 본질에 대해 파고든다. 객체지향적으로 잘 짠 코드는 무엇일까?객체는 충분히 '협력적'이어야 한다. 다른 객체의 요청에 충실히 응답하고, 다른 객체에게 적극적으로 도움을 요청할 수 있어야 한다는 것이다. 객체가 충분히 '자율적'이어야 한다. 본인 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로 통제하여 절제하는 것을 의미한다. '객체의 자율성'에 대해 보충 설명을 하자면, 객체의 내부와 외부를 명확하게 구분하는 것이다.객체의 사적인 부분은 객체 스스로 .. 2025. 3. 16.
[백준/1764/Kotlin] 듣보잡 문제문제를 풀 때 시간 복잡도를 생각하고 풀자는 의미에서 이번 포스팅을 하게 되었다. 이 문제는 "듣도 못한 사람"의 리스트와 "보도 못한 사람"의 리스트 중 중복되는 데이터를 사전 순으로 출력하는 문제이다. 트러블 슈팅1) 시간 초과처음에 코드를 작성했을 때 출력은 제대로 되었는데 막상 백준에서 돌려보니 시간 초과 문제가 발생하였다.내가 작성한 코드의 흐름은 아래와 같다.val neverHeard : MutableSet = mutableSetOf()val result : MutableSet = mutableSetOf()repeat(n) { neverHeard.add(bufferedReader.readLine())}repeat(m) { val neverSeen : String = buffere.. 2025. 3. 16.
[KMP] Kotest로 테스트 코드 멀티플랫폼에 적용하기 Kotest멀티플랫폼인 KMP에서 테스트코드를 작성하기 위해서는 Kotlin에서 제공하는 테스트 프레임워크인 Kotest를 사용해야 한다. Kotest에는 종류가 여러 가지가 있는데 나는 BehaviorSpec을 선택했다.그 이유는 BehaviorSpec은 아래처럼 given - when - then 형식으로 표현이 가능하여 더 체계적으로 작성할 수 있겠다고 생각했기 때문이다.class UiStateTest : BehaviorSpec({ given("테스트 조건 환경이 주어졌을 때") { ... `when`("테스트 대상 행위가 발생하면") { ... then("의도한 결과가 검증될 것이다.") { ... .. 2025. 3. 9.