Develop28 [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. [KMP] Kotest로 테스트 코드 멀티플랫폼에 적용하기 Kotest멀티플랫폼인 KMP에서 테스트코드를 작성하기 위해서는 Kotlin에서 제공하는 테스트 프레임워크인 Kotest를 사용해야 한다. Kotest에는 종류가 여러 가지가 있는데 나는 BehaviorSpec을 선택했다.그 이유는 BehaviorSpec은 아래처럼 given - when - then 형식으로 표현이 가능하여 더 체계적으로 작성할 수 있겠다고 생각했기 때문이다.class UiStateTest : BehaviorSpec({ given("테스트 조건 환경이 주어졌을 때") { ... `when`("테스트 대상 행위가 발생하면") { ... then("의도한 결과가 검증될 것이다.") { ... .. 2025. 3. 9. [Android] Baseline Profile로 성능 개선하기 앱 성능을 개선해보고 싶다는 생각이 들어 찾아보던 도중 Baseline Profile이 있어 이를 적용해보고자 했다.Baseline Profile의 의미와 적용 과정에서의 트러블 슈팅을 담았다. Baseline ProfileBaseline Profile을 사용하면 포함된 코드 경로의 해석과 JIT(Just In Time) 컴파일 단계를 피하여 최초 실행 후 코드 실행 속도가 약 30% 향상된다.사용자가 느끼는 이점으로는 앱 시작 시간 최적화, 상호작용으로 인한 버벅거림 줄임, 전반적인 런타임 시간 개선 등이 있다. Baseline Profile을 적용하지 않더라도 플레이스토어에서 Cloud Profile을 사용하기는 한다.다만, Cloud Profile은 업데이트 후 배포되기까지 수 시간에서 수일이 걸리.. 2025. 2. 18. [Android] ProcessPhoenix 오픈소스 뜯어보기 안드로이드에서 앱을 재시작 해야 할 때 ProcessPhoenix를 사용하면 간편하게 프로세스를 종료하고 다시 앱을 실행할 수 있다.나는 이러한 사실만 알고 있었고, 아래처럼 코드를 작성했을 때 문제가 없어 보였다.Handler(Looper.getMainLooper()).post { Toast.makeText(context, TOKEN_EXPIRED_ERROR, Toast.LENGTH_LONG).show() // 토큰 만료 토스트 메세지 ProcessPhoenix.triggerRebirth(context) // 앱 재실행 코드} 위 코드는 토큰 만료 시 사용한 코드인데 정작 토큰이 만료됐을 때 토스트 메세지만 뜨고 IllegalStateException이 발생하며 앱이 비정상 종료가 되어버린 것이.. 2025. 2. 2. [Android] SnackBar 디자인시스템 구현기 (Material 뜯어보기) 지난 포스팅에 있었던 BottomSheet에 이어, SnackBar도 디자인시스템을 구현하면서 공부했던 것을 기록하고자 한다.스낵바도 바텀시트와 동일하게 컴포즈로 작성이 되어 있으며 Material3 라이브러리를 사용하지 않는다. 사실 스낵바 관련 포스팅은 여러 번 올렸었다.📍스와이프 이벤트 처리: https://comyou.tistory.com/130📍LineBreak 속성: https://comyou.tistory.com/131📍단어 단위 개행: https://comyou.tistory.com/136 그래서 이번 글에서는 Material 속성에 기반한 구현방식에 집중해서 작성할 것이다. SnackBarHostStateSnackBarHostState는 스낵바의 상태를 관리하는 클래스이다.Mate.. 2025. 1. 30. [Android] BottomSheet 디자인시스템 구현기 (Material 뜯어보기) BottomSheet를 디자인시스템으로 구현하면서 Material의 동작 방식을 공부했던 것에 대해 기록하고자 한다.해당 디자인시스템은 컴포즈로 작성이 되어 있으며 Material3 라이브러리를 사용하지 않는다. BottomSheetType우선, Maeterial과는 상관 없는 바텀시트의 디자인이다. 내가 만드려는 디자인시스템의 바텀시트 타입은 두 가지였다. 버튼이 한 개 있는 OneButton 타입버튼이 두 개 있는 TwoButton 타입 각 타입에 대한 각 버튼의 텍스트를 무조건 작성해 줘야 되기 때문에 Sealed Class로 묶어 작성했다.sealed class BottomSheetType { data class OneButton( val buttonText: String .. 2025. 1. 29. 이전 1 2 3 다음