ワンクリックで
kotlin-clean-architecture
Kotlin/Android 클린 아키텍처 패턴 안내. feature-first 3계층(data/domain/presentation) 구조, Repository·UseCase·ViewModel 적용 시 사용.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Kotlin/Android 클린 아키텍처 패턴 안내. feature-first 3계층(data/domain/presentation) 구조, Repository·UseCase·ViewModel 적용 시 사용.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
NAVER API HUB 검색 스킬. 네이버 클라우드 NAVER API HUB로 블로그·뉴스·지역·웹·이미지 등 검색 및 검색어 트렌드 조회. "네이버 API HUB", "네이버 검색 API", "블로그 검색", "검색어 트렌드" 요청에 활성화.
Git Flow 브랜치·커밋 규칙(변경 요약은 한국어 필수). 커밋, 브랜치 생성, Git Flow, 커밋 메시지 작성 요청 시 사용.
UIKit MVVM에서 Combine 바인딩, @Published, PassthroughSubject, ObservableObject 역할, sink/cancellables 패턴. UI 상태는 @Published, 화면 이동/토스트/Alert 같은 일회성 이벤트는 PassthroughSubject. SwiftUI vs UIKit ObservableObject 차이, Combine 바인딩 설계 시 사용.
Swift Concurrency 경계 설정, @MainActor, Task 배치, UIKit MVVM async API 설계. ViewModel, @MainActor, Task, async await, Combine 바인딩, isLoading 처리 시 사용.
Swift/iOS MVVM 패턴 안내. Model·View·ViewModel 구조, 바인딩(Combine/@Published), 서비스/저장소 연동 시 사용.
SwiftUI MVVM에서 @Observable/ObservableObject 선택, @StateObject/@ObservedObject/@EnvironmentObject 사용 기준, .task/.refreshable와 취소 처리, @MainActor 상태 갱신 규칙 설계 시 사용.
| name | kotlin-clean-architecture |
| description | Kotlin/Android 클린 아키텍처 패턴 안내. feature-first 3계층(data/domain/presentation) 구조, Repository·UseCase·ViewModel 적용 시 사용. |
feature_name/
├── data/ # DataSource, DTO, Repository 구현
├── domain/ # Entity, UseCase, Repository 인터페이스
└── presentation/ # ViewModel, UI (Compose/View)
순수 Kotlin data class. Android/외부 라이브러리 의존 없음.
data class User(
val id: String,
val name: String
)
Data 계층이 구현.
interface UserRepository {
suspend fun getUser(id: String): Result<User>
}
단일 비즈니스 흐름. suspend 함수.
class GetUserUseCase(
private val repository: UserRepository
) {
suspend operator fun invoke(id: String): Result<User> {
return repository.getUser(id)
}
}
API/DB 모델. @SerializedName, data class.
data class UserDto(
@SerializedName("id") val id: String,
@SerializedName("name") val name: String
) {
fun toEntity() = User(id = id, name = name)
}
API, Room, DataStore 등 원시 데이터 접근.
interface UserRemoteDataSource {
suspend fun fetchUser(id: String): UserDto
}
DataSource 사용, DTO → Entity 변환.
class UserRepositoryImpl(
private val remote: UserRemoteDataSource
) : UserRepository {
override suspend fun getUser(id: String): Result<User> = runCatching {
remote.fetchUser(id).toEntity()
}
}
UseCase 호출, StateFlow/SharedFlow로 상태 전달. viewModelScope.
class UserViewModel(
private val getUserUseCase: GetUserUseCase
) : ViewModel() {
private val _state = MutableStateFlow<UserState>(UserState.Loading)
val state: StateFlow<UserState> = _state.asStateFlow()
fun loadUser(id: String) {
viewModelScope.launch {
_state.value = UserState.Loading
getUserUseCase(id)
.onSuccess { _state.value = UserState.Success(it) }
.onFailure { _state.value = UserState.Error(it) }
}
}
}
ViewModel 주입, collectAsState()로 구독.
@Composable
fun UserScreen(
viewModel: UserViewModel = hiltViewModel(),
userId: String
) {
val state by viewModel.state.collectAsState()
LaunchedEffect(userId) { viewModel.loadUser(userId) }
// ...
}
// Domain
@Module
@InstallIn(SingletonComponent::class)
object UserModule {
@Provides
@Singleton
fun provideUserRepository(remote: UserRemoteDataSource): UserRepository =
UserRepositoryImpl(remote)
@Provides
@Singleton
fun provideGetUserUseCase(repository: UserRepository) =
GetUserUseCase(repository)
}
PascalCase.kt (주요 클래스명과 동일)GetXxxUseCase, SaveXxxUseCase — operator fun invoke() 권장XxxRepository (인터페이스), XxxRepositoryImpl (구현체)XxxViewModelXxxState (sealed class: Loading, Success, Error)