Skip to content

[DEPLOY] : 3.0.3#325

Merged
pinocchio22 merged 73 commits intomainfrom
dev
Apr 22, 2026
Merged

[DEPLOY] : 3.0.3#325
pinocchio22 merged 73 commits intomainfrom
dev

Conversation

@pinocchio22
Copy link
Copy Markdown
Contributor

MLSCore

  • Feature 모듈이 서로 직접 의존하지 않도록 구조 개선
  • Core를 중심으로 의존성 방향을 단방향으로 정리

목적

  • Feature 간 중복 의존성 제거
  • 공통 유틸/기반 기능의 단일화
  • Domain/Feature 간 결합도 감소

구조

  • 공통 Utilities
  • 공통 Extensions
  • Logging 관련 기능
  • 공통 Base 객체
  • 네트워크 및 공용 인프라 레벨 구성 요소

MLSAppFeature

  • UI를 포함하지 않는 비즈니스 로직 중심 모듈
  • App 전역에서 사용하는 공통 UseCase 제공
  • DomainInterface 기반 의존성 유지

목적

  • 여러 Feature에서 공통으로 사용하는 비즈니스 로직 통합
  • 네트워크 / 로컬 데이터 접근 로직 중앙화
  • Feature 모듈 간 중복 로직 제거

구조

  • DataSources (Local / Remote)
  • Repositories
  • UseCases
  • 공통 Domain 모델

MLSAuthFeature

  • 인증 로직 변경 시 영향 범위 최소화

목적

  • 로그인/회원가입 기능 독립화
  • 외부 로그인 의존성 분리
  • 인증 관련 UI/로직 모듈화

구조

  • 로그인 화면
  • 회원가입 흐름
  • 소셜 로그인 연동 (Kakao / Apple)
  • 인증 상태 관리

MLSDesignSystem

  • UI 변경 시 영향 범위 최소화
  • Feature 모듈 간 UI 중복 제거
  • 디자인 일관성 유지

목적

  • UI 컴포넌트 재사용성 확보
  • Feature 간 UI 의존성 제거
  • 디자인 토큰 중앙 관리

구조

  • 공통 UI 컴포넌트
  • Typography
  • Color 시스템
  • Button / Header / Tab UI
  • 공통 Layout 구성

기타 수정사항

  • API 도메인 주소 변경
  • 앱 이름 수정

dongglehada and others added 30 commits March 17, 2026 15:57
MLSCore 모듈 초기구성을 진행합니다.
1. 기존 DesignSystem -> MLSDesignSystem
2. BaseFeature의 SharedView 이전
3. 디자인 컴포넌트 + 공용뷰 + 디자인 팩토리 + Utils
4. 각 Feature에서 UI관련하여 해당 모듈을 의존
5. UIImage 직접접근 코드 수정
6. @mainactor 설정
BaseViewController를 Core 모듈로 옮기고 TabbarController 직접참조를 제거하여  DesignSystem의 의존성을 분리
dongglehada and others added 18 commits April 11, 2026 23:50
…nto fix/#315-Components

# Conflicts:
#	MLS/MLSDesignSystem/Sources/MLSDesignSystem/Components/Tooltip/TooltipView.swift
#	MLS/MLSDesignSystem/Sources/MLSDesignSystem/Layouts/Factory/TooltipFactory.swift
추천 기능 UI에 맞게 컴포넌트들을 수정 / 구현합니다.
set-read 제외한 알람관련 API 도메인 주소를 v1->v2로 수정
페이징 시 기존 데이터에 덮어쓰기가 아닌 추가 되고있던 이슈 해결
+ 진행중 이벤트 클릭 이슈는 현재 확인 불가능
+ 버전 3.0.0 및 앱 이름 변경
알림 관련 API 도메인을 수정 + 버그 픽스
@pinocchio22 pinocchio22 requested a review from dongglehada April 22, 2026 12:15
@pinocchio22 pinocchio22 self-assigned this Apr 22, 2026
@pinocchio22 pinocchio22 added feat 새로운 기능을 추가 fix 버그 수정, 잔잔바리 수정, 병합 시 충돌 해결 refactor 프로덕션 코드 리팩토링, 파일 삭제, 네이밍 수정 및 폴더링 add 파일 추가 test 테스트 코드 추가 chore 빌드 설정, 프로젝트 설정 등 “로직에 영향 없는” 변경 remove 파일 삭제 labels Apr 22, 2026
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request transitions the project to a modular architecture by introducing the MLSCore, MLSDesignSystem, MLSAppFeature, and MLSAuthFeature frameworks. It implements core infrastructure including a centralized logging system, a networking layer with interceptor support, an image loading system with two-level caching, and a comprehensive authentication flow supporting Apple and Kakao. Additionally, alarm-related services were migrated to API version 2, updating pagination cursors from strings to integers. Technical feedback highlights critical concurrency risks in the Apple login provider, potential thread blocking in disk storage cleanup, and the need to optimize layout performance by avoiding redundant constraint creation. Other recommendations include replacing print statements with the new logging system, improving error visibility in the App Store service, and enhancing the image loader to support request cancellation for better resource management.

Comment on lines +11 to +15
private var authServiceResponse = PublishSubject<Credential>()

public func getCredential() -> Observable<Credential> {
let subject = PublishSubject<Credential>()
authServiceResponse = subject
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

authServiceResponse를 클래스 프로퍼티로 관리하면 여러 번의 인증 요청이 동시에 발생할 경우 이전 요청의 Subject가 덮어씌워지는 문제가 발생합니다. 이로 인해 첫 번째 요청의 결과가 두 번째 요청의 구독자에게 전달되거나, 첫 번째 구독자가 응답을 영원히 받지 못하는 버그가 생길 수 있습니다. 요청마다 독립적인 인스턴스를 생성하여 델리게이트를 처리하거나, 요청을 식별할 수 있는 로직을 추가해야 합니다.

Comment on lines +199 to +207
DispatchQueue.global(qos: .background).async { [weak self] in
let timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { _ in
self?.checkCache()
}
// 백그라운드에서 실행되는 타이머를 메인 루프에 추가
RunLoop.current.add(timer, forMode: .common)
// 백그라운드 스레드에서 타이머를 계속 실행하기 위해 RunLoop를 유지
RunLoop.current.run()
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

RunLoop.current.run()은 해당 스레드를 무한히 점유(blocking)하게 됩니다. DispatchQueue.global()에서 실행되더라도 시스템의 스레드 풀 자원을 계속 점유하는 것은 권장되지 않습니다. 주기적인 캐시 정리 작업은 DispatchSourceTimer를 사용하거나, Task 내에서 while !Task.isCancelled 루프와 try await Task.sleep을 사용하는 현대적인 방식으로 교체하는 것이 좋습니다.

Comment on lines +121 to +123
snp.makeConstraints { make in
make.height.equalTo(style.height)
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

configureUI() 함수는 isEnabled 상태가 변경될 때마다 호출됩니다. 이때 snp.makeConstraints를 매번 호출하면 동일한 뷰에 중복된 제약 조건이 계속 쌓이게 되어 메모리 사용량이 늘어나고 레이아웃 성능이 저하됩니다. snp.updateConstraints를 사용하거나, 높이 제약은 초기화 시점에 한 번만 설정하도록 수정이 필요합니다.

            snp.updateConstraints { make in\n                make.height.equalTo(style.height)\n            }

Comment on lines +29 to +31
guard let lookupResponse = try? JSONDecoder().decode(AppStoreLookupResponse.self, from: data) else {
throw AppStoreError.parsingError
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

try?를 사용하여 디코딩을 수행하면 파싱 실패 시 구체적인 에러 원인(필드 누락, 타입 불일치 등)을 파악하기 어렵습니다. do-catch 문을 사용하여 에러를 명시적으로 처리하고 로그를 남기면 유지보수 및 디버깅에 큰 도움이 됩니다.


import RxSwift

public final class NetworkProviderImpl: NetworkProvider {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

프로젝트의 공통 로깅 시스템을 활용하기 위해 Loggable 프로토콜 채택을 권장합니다.

Suggested change
public final class NetworkProviderImpl: NetworkProvider {
public final class NetworkProviderImpl: NetworkProvider, Loggable {


public func requestData<T: Responsable & Requestable>(endPoint: T, interceptor: Interceptor?) -> Observable<T.Response> {
return Observable.create { [weak self] observer in
print("🚀 requestData: 요청 시작 - \(endPoint)")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

print 대신 Loggable에서 제공하는 logDebug를 사용하여 로깅 일관성을 유지해 주세요.

            self?.logDebug(\"🚀 requestData: 요청 시작 - \(endPoint)\")

return
}

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

0.3초의 고정된 지연 시간(Magic Number)을 사용하는 것은 네트워크 상태나 기기 성능에 따라 레이스 컨디션이 발생할 수 있는 취약한 구조입니다. Kakao SDK의 내부 상태가 확정된 후 호출되는 적절한 콜백을 활용하거나, 지연이 반드시 필요하다면 그 이유를 주석으로 명시하고 상수로 관리하는 것이 좋습니다.

/// - Parameters:
/// - url: 요청할 URL 객체
/// - completion: 요청 완료 후 호출되는 클로저
func fetchDataFrom(url: URL, completion: @escaping (Result<Data?, Error>) -> Void) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

fetchDataFrom 메서드가 URLSessionDataTask를 반환하지 않아 요청을 취소할 수 없습니다. 이미지 로딩의 경우 셀 재사용 시 이전 요청을 취소하는 것이 네트워크 자원 절약과 성능 최적화에 필수적입니다. 반환값으로 Cancellable이나 Task를 제공하도록 개선을 권장합니다.

@pinocchio22 pinocchio22 merged commit 86a3917 into main Apr 22, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

add 파일 추가 chore 빌드 설정, 프로젝트 설정 등 “로직에 영향 없는” 변경 feat 새로운 기능을 추가 fix 버그 수정, 잔잔바리 수정, 병합 시 충돌 해결 refactor 프로덕션 코드 리팩토링, 파일 삭제, 네이밍 수정 및 폴더링 remove 파일 삭제 test 테스트 코드 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants