pile·
최신
  1. 백엔드·네이버페이네이버페이·

    Composite PK에서 시작된 Spring Boot 4 / Spring Batch 6 업그레이드 기록

    문제Spring Data JDBC 의 Composite ID 적용을 위해 Spring Boot 3.5 → 4.0.1 업그레이드 시 Spring Batch, Kotlin, Jackson 등 전체 스택 메이저 전환 필요.

    접근Spring Boot 4 / Spring Batch 6 / Spring Framework 7 / Kotlin 2.3 / Jackson 3 / Kotest 6 / Gradle 9 / ojdbc11 순차 업그레이드. Composite ID 는 Persistable 인터페이스로 구현, JdbcDefaultBatchConfiguration 상속으로 메타데이터 저장.

    결과기술 부채 해결 + 장기 유지보수성 개선. 운영 DB 접근 정책 충돌을 사전 식별해 안정적 배포 달성.

    #kotlin#spring#spring-boot+3
  2. 백엔드·LINE EngineeringLINE Engineering·

    코드 품질 개선 기법 29편: 고르디우스 변수

    문제로컬·원격 데이터 동기화 클래스에서 ID 집합 비교 결과를 `localEntryIds`, `remoteEntryIds` 변수에 담아 추가·업데이트·삭제 분기를 만들면, 변수 하나로 여러 의미가 묶여 "고르디우스 변수" 가 된다.

    접근의도별로 변수를 잘라낸다. `idsToAdd`, `idsToUpdate`, `idsToDelete` 처럼 결과 집합을 미리 계산한 뒤 각 처리에 그대로 전달한다. 비교식 `id !in localEntryIds && id in remoteEntryIds` 같은 표현을 변수명으로 흡수.

    결과분기 조건이 변수명으로 자기 설명적이 되고, 분기마다 의미가 명확해진다. 코드 리뷰 시 변수 한 개에 여러 책임이 묶인 패턴을 식별하는 안티패턴으로 정착시킨다.

    #code-review#kotlin#refactoring+1
  3. 백엔드·LINE EngineeringLINE Engineering·

    코드 품질 개선 기법 28편: 제약 조건에도 상속세가 발생한다

    문제Kotlin 에서 `IntArray` 의 박싱 회피 이점을 살리려 `List<Int>` 를 구현한 `ImmutableIntList` 같은 래퍼를 만들면, 상위 인터페이스의 기본 메서드가 그대로 따라와 의도치 않은 가변 동작·성능 저하가 발생한다.

    접근"상위 타입을 상속/구현하면 제약과 책임이 함께 따라온다" 는 관점으로 설계를 재검토. 꼭 필요한 일부 메서드만 노출하거나, 인터페이스 구현 대신 별도 타입으로 한다.

    결과박싱 최적화와 불변성을 동시에 얻으려고 인터페이스를 무리하게 구현하는 패턴의 비용을 명시한다. 작은 래퍼 클래스 설계 시 상속의 "상속세" 를 계산하라는 가이드를 제공.

    #code-review#kotlin#performance+1
  4. 백엔드·LINE EngineeringLINE Engineering·

    코드 품질 개선 기법 25편: 요컨대... 무슨 말이죠?

    문제Kotlin data class 의 일부 필드가 자주 변하는 상태라는 이유로 `var` 로 선언되면, 동일 객체를 공유한 여러 곳에서 의도하지 않은 변경이 발생해 버그가 새어 나간다.

    접근모든 필드를 `val` 로 두고 상태 변경 시 `copy()` 로 새 인스턴스를 만들도록 강제. 리뷰 코멘트도 "그래서 결론은 val 로 하라" 는 한 문장으로 핵심을 먼저 전달한다.

    결과불변 데이터 모델이 동시성·디버깅 측면의 안전성을 높인다. 리뷰 코멘트 작성 시 결론을 첫 문장에 두는 스타일 가이드도 함께 정착.

    #code-review#kotlin#immutability+1
  5. 백엔드·LINE EngineeringLINE Engineering·

    코드 품질 개선 기법 23편: 반환의 끝이 에지 케이스의 끝

    문제조기 반환(early return)을 남용해 빈 리스트, 1개 원소 같은 에지 케이스마다 별도 분기를 만들면, 주 로직과 동일한 일을 두 번 작성하게 돼 중복·버그가 늘어난다.

    접근에지 케이스를 배제하는 분기 대신 포함해서 처리한다. `userIds.isEmpty()` 나 `size == 1` 같은 케이스도 일반 시퀀스 변환 코드 안에서 자연스럽게 처리되도록 작성한다.

    결과함수 본체가 단일 경로로 단순해진다. 조기 반환은 진짜 에러 케이스에 한정하고 평범한 데이터 변형은 일반 로직으로 흡수.

    #code-review#kotlin#refactoring+1
  6. 백엔드·LINE EngineeringLINE Engineering·

    코드 품질 개선 기법 22편: To equal, or not to equal

    문제`UserProfileViewData` 같은 UI 데이터 모델이 자체 `equals` / `hashCode` 를 직접 오버라이딩하면, 비교 키 선택·해시 계산이 실수로 한쪽만 바뀌어 컬렉션·캐시 동작이 깨진다.

    접근구조적 등가성이 정말 필요한지 먼저 점검한다. 필요하면 data class 가 자동 생성하는 `equals` / `hashCode` 를 활용하고, 직접 작성할 경우 두 메서드의 일관성을 코드 리뷰 체크리스트에 포함한다.

    결과사용자 자체 정의 등가성을 도입할 때 빠지기 쉬운 함정을 명시. UI 데이터 모델에서 가능하면 표준 data class 의 자동 구현을 우선한다.

    #code-review#kotlin#data-class+1
  7. 백엔드·카카오페이카카오페이·

    함수형 프로그래밍과 Effect System을 이용한 의도가 명확한 코드 작성하기

    문제`client.sendEvent()` 같은 호출이 메서드 시그니처만으로는 사이드 이펙트의 종류와 실패 양식을 드러내지 않는다. 사이드 이펙트가 코드 곳곳에 숨으면 예측성과 유지보수성이 떨어진다.

    접근Effect System 을 활용해 사이드 이펙트를 타입으로 명시. Scala 의 Cats Effect / ZIO, Kotlin 의 suspend, Algebraic Effects 의 Kyo · CanThrow 등을 비교하며 효과 추적·조합·테스트 가능성을 정리한다.

    결과함수의 의도와 실패 가능성을 컴파일러가 강제하도록 만든다. 사이드 이펙트가 명시적이 되어 안정성·테스트성·리팩터링 안전성이 모두 올라간다.

    #effect-system#functional-programming#scala+1
  8. 백엔드·카카오페이카카오페이·

    Ktor로 팀 환경에 맞는 API 서버 구현하기

    문제Ktor 를 카카오페이의 개발 환경과 팀 컨벤션에 맞게 도입할 수 있는지 검증 필요.

    접근ContentNegotiation, CallLogging, StatusPages, MicrometerMetrics 등 Ktor 플러그인 + 코루틴 기반 비동기 처리로 팀 스펙 충족.

    결과로깅, 메트릭, 예외 처리 포함한 프로덕션 레벨 API 서버 구현 가능 확인. 팀 내 신규 모듈부터 도입 결정.

    #kotlin#ktor#api-server+2
  9. 백엔드·카카오페이카카오페이·

    Spring Cloud Stream 도입하기

    문제카카오페이 데이터 플랫폼이 여러 admin API 와 소스의 데이터를 결합하면서 코드 품질과 확장성 유지 필요.

    접근Spring Cloud Stream + Kotlin. Function 기반 패턴 + 멀티 모듈 아키텍처로 표준화된 loose-coupling 데이터 파이프라인 구성.

    결과유연한 데이터 오케스트레이션, 코드 유지보수성 향상, 수평 확장 용이. 기존 spring-kafka 대비 결합도 감소.

    #kotlin#kafka#multi-module+2
  10. 백엔드·카카오페이카카오페이·

    Kotlin 환경에서 로그를 기록할 때 불필요한 문자열 연산을 방지하는 방법

    문제Kotlin 에서 SLF4J + String Template 조합이 로그 레벨이 비활성화돼 있어도 불필요한 String 연산을 수행해 성능 저하.

    접근Parameterized Logging({} placeholder) 사용 또는 kotlin-logging 라이브러리의 람다 표현식으로 조건부 evaluation.

    결과비활성 시 Parameterized 2.5ms vs String Template 96.5ms (38 배 차이). kotlin-logging 은 15.5ms 로 가독성 유지.

    #kotlin#performance#logging+2