본문 바로가기
자동수익화 꿀팁

왕초보자 챗gpt로 앱 만들기 도전 (아이폰, 안드로이드)

by monkeymoney1 2025. 2. 19.
728x90
반응형

 

제미나이 pro

 

1단계: 앱 기획 (어떤 요리를 만들까?)

"할머니도 뚝딱 요리" 앱은 스마트폰 사용이 익숙하지 않은 어르신들을 위한 요리 레시피 앱입니다. 따라서 다음과 같은 특징을 갖도록 기획합니다.

  1. 앱 콘셉트 정의:
    • 주 사용자: 60대 이상 어르신
    • 핵심 가치: 쉽고 간편하게 요리 레시피를 찾고 따라 할 수 있도록 돕는다.
    • 차별화:
      • 큼지막한 글씨와 사진으로 시인성 확보
      • 복잡한 기능 최소화, 직관적인 사용성 제공
      • 음성 검색 지원
  2. 핵심 기능 정의:
    • 레시피 목록: 다양한 요리 레시피를 보여줍니다. (큰 글씨, 큰 사진)
    • 레시피 상세: 선택한 레시피의 재료, 요리 순서를 단계별로 보여줍니다. (사진, 설명)
    • 검색: 원하는 레시피를 찾을 수 있습니다. (음성 검색 지원)
    • : 좋아하는 레시피를 저장해 둡니다.
  3. 앱 이름 결정: "할머니도 뚝딱 요리" (또는 사용자가 원하는 다른 이름)
  4. 경쟁 앱 분석(선택사항)
    • 이 부분은 chatGPT에게 질문하여 만약 앱을 출시할 경우 경쟁상대가 될만한 앱을 분석합니다.

이 단계에서 ChatGPT 활용법:

  • "할머니, 할아버지들이 쓰기 쉬운 요리 레시피 앱에 꼭 필요한 기능 5가지 추천해줘. 최대한 간단한 기능 위주로!"
  • "요리 레시피 앱 중에서 사용자 평점이 높고, 사용하기 쉬운 앱 3가지를 추천하고, 각 앱의 장단점을 알려줘." (경쟁 앱 분석)
  • "앱 이름 아이디어 10개만 추천해줘."

2단계: 개발 환경 설정 (주방 도구 준비)

사용하는 스마트폰 종류(아이폰 또는 안드로이드)에 따라 개발 환경을 설정합니다.

  • 아이폰:
    1. Xcode 설치:
      • 앱 스토어에서 "Xcode"를 검색하여 설치합니다. (무료)
      • 설치 중 Apple ID 로그인이 필요할 수 있습니다.
      • 설치 중 문제 발생 시: ChatGPT에게 오류 메시지를 보여주고 해결 방법을 문의합니다. ("Xcode 설치 중 [에러 메시지] 오류가 발생했습니다. 해결 방법을 알려주세요.")
    2. SwiftUI:
      • Xcode에 포함된 "요리 도구"입니다. 별도로 설치할 필요는 없습니다.
      • 기초 학습: ChatGPT에게 아주 쉬운 SwiftUI 예제를 요청하여, 코드가 어떻게 작동하는지 살펴봅니다.
        • "SwiftUI로 화면에 '안녕하세요' 출력하는 코드 줘. 최대한 쉽게 설명해줘."
      • Xcode 실행 → '새 프로젝트 만들기' → 'iOS' → 'App' 선택 → 프로젝트 이름 입력 ('할머니도 뚝딱 요리') → 'Interface'는 'SwiftUI' 선택 → 'Next' → 저장 위치 선택 → 'Create'
  • 안드로이드:
    1. Android Studio 설치:
      • Android Studio 다운로드 페이지에서 설치 파일을 다운로드 받아 설치합니다.
      • 설치 과정이 다소 복잡할 수 있으므로, ChatGPT에게 단계별 설치 방법을 문의합니다.
      • 설치 중 문제 발생 시: ChatGPT에게 오류 메시지를 보여주고 해결 방법을 문의합니다. ("Android Studio 설치 중 [에러 메시지] 오류가 발생했습니다. 해결 방법을 최대한 쉽게 설명해주세요.")
    2. Kotlin, Jetpack Compose:
      • Android Studio에 포함된 "요리 도구"입니다. 별도로 설치할 필요는 없습니다.
      • 기초 학습: ChatGPT에게 아주 쉬운 Kotlin, Jetpack Compose 예제를 요청하여, 코드가 어떻게 작동하는지 살펴봅니다.
        • "Jetpack Compose로 화면에 '안녕하세요' 띄우는 코드 줘. 최대한 쉽게!"
      • Android Studio 실행 → '새 프로젝트 만들기' → 'Empty Activity' 선택 → 프로젝트 이름 입력 ('할머니도 뚝딱 요리') → 'Language'는 'Kotlin', 'Minimum SDK'는 적당히 선택 → 'Finish'

이 단계에서 ChatGPT 활용법:

  • "[운영체제]에 Xcode (또는 Android Studio) 설치하는 방법을 초보자도 이해할 수 있게 단계별로 알려주세요."
  • "SwiftUI (또는 Jetpack Compose)로 화면에 '안녕하세요' 출력하는 코드를 아주 쉽게 설명해주세요."
  • "Xcode (또는 Android Studio) 설치 중 [오류 메시지] 오류가 발생했습니다. 해결 방법을 알려주세요."

3단계: 레시피 목록 화면 만들기 (핵심 기능 구현)

이제 "할머니도 뚝딱 요리" 앱의 핵심 기능인 레시피 목록 화면을 만들어 보겠습니다.

  1. 코드 생성: ChatGPT에게 레시피 목록 화면을 만드는 코드를 요청합니다.
    • 요청 예시 (SwiftUI): "SwiftUI로 요리 레시피 목록을 보여주는 화면을 만들고 싶어. 레시피 제목이랑 사진이 크게 나오게 하고 싶고. 코드 줘."
    • 요청 예시 (Jetpack Compose): "Jetpack Compose로 요리 레시피 목록을 보여주는 화면을 만들고 싶어. 레시피 제목이랑 사진이 크게 나오게 하고 싶고. 코드 줘."
  2. 코드 붙여넣기: ChatGPT가 제공한 코드를 Xcode (또는 Android Studio)의 적절한 위치에 붙여넣습니다.
    • 주의!: 코드를 붙여넣기 전에, ChatGPT에게 어느 파일의 어느 부분에 코드를 넣어야 하는지 반드시 물어보세요.
  3. 코드 수정 (필요한 경우): ChatGPT가 제공한 코드는 완벽하지 않을 수 있습니다.
    • 레시피 제목, 사진 등을 실제 데이터로 변경합니다.
    • 디자인(글자 크기, 색상, 간격 등)을 원하는 대로 수정합니다.
    • 수정 중 문제 발생 시: ChatGPT에게 코드의 특정 부분을 수정하는 방법을 문의합니다. ("이 코드에서 글자 크기를 더 크게 하려면 어떻게 해야 해?")
  4. 실행 및 확인: Xcode (또는 Android Studio)의 실행 버튼(▶️)을 눌러 앱을 실행하고, 레시피 목록 화면이 잘 나타나는지 확인합니다.

이 단계에서 ChatGPT 활용법:

  • "SwiftUI (또는 Jetpack Compose)로 요리 레시피 목록을 보여주는 화면을 만들고 싶어. 레시피 제목이랑 사진이 크게 나오게 하고 싶고. 코드 줘."
  • "[코드의 일부분] 이 코드는 무슨 뜻이야? 최대한 쉽게 설명해줘"
  • "이 코드에서 글자 크기를 더 크게 하려면 어떻게 해야 해?"
  • "앱을 실행했는데 [에러 메시지] 오류가 발생했어. 어떻게 고쳐야 해?"
  • "레시피 이미지를 assets에 추가했는데, 코드에서 어떻게 불러와야 해?"
  • "레시피 목록이 너무 길어서 스크롤이 필요한데, 어떻게 해야 해?

 

SwiftUI 코드 (Xcode 사용):

Swift
 
// 요리 레시피 정보를 담는 '그릇'을 만듭니다.
struct Recipe: Identifiable {
    let id = UUID() // 각 레시피를 구별하기 위한 고유 번호 (사람으로 치면 주민등록번호)
    let title: String // 레시피 제목
    let imageName: String // 레시피 사진 파일 이름
}

// 앱 화면을 구성하는 '도면'을 만듭니다.
struct ContentView: View {
    // 여러 개의 레시피 정보를 담는 '목록'을 만듭니다. (실제 앱에서는 이 목록을 데이터베이스나 서버에서 가져옵니다.)
    let recipes = [
        Recipe(title: "김치찌개", imageName: "kimchi"), // 첫 번째 레시피
        Recipe(title: "된장찌개", imageName: "doenjang"), // 두 번째 레시피
        Recipe(title: "미역국", imageName: "miyeok"),  // 세 번째 레시피
        // ... 더 많은 레시피를 추가할 수 있습니다.
    ]

    // 화면에 무엇을 어떻게 보여줄지 결정합니다.
    var body: some View {
        NavigationView { // 네비게이션 바를 추가합니다(있어도 되고 없어도 됩니다.)
            ScrollView { // 스크롤 기능을 추가합니다.
                VStack(spacing: 20) { // 레시피들을 세로로 나열하고, 간격을 20으로 줍니다.
                    ForEach(recipes) { recipe in // 레시피 목록에 있는 각 레시피에 대해 반복합니다.
                        HStack { // 레시피 사진과 제목을 가로로 나열합니다.
                            Image(recipe.imageName) // 레시피 사진을 표시합니다.
                                .resizable() // 사진 크기를 조절할 수 있게 합니다.
                                .scaledToFit() // 사진 비율을 유지하면서, 지정된 크기에 맞게 조절
                                .frame(width: 150, height: 150) // 사진 크기를 가로 150, 세로 150으로 설정합니다.
                                .cornerRadius(15) //사진 모서리 둥글게
                            Text(recipe.title) // 레시피 제목을 표시합니다.
                                .font(.title) // 글자 크기를 '제목' 크기로 설정합니다.
                                .fontWeight(.bold) // 굵게
                        }
                        .padding() // padding을 추가하여 여백을 줍니다.
                        .background(Color.yellow.opacity(0.2)) // 배경색을 투명도가 있는 노란색으로
                        .cornerRadius(20) // 모서리를 둥글게 만듭니다.

                    }
                }
                .padding() // 상하좌우에 여백을 줍니다.

            }
            .navigationTitle("할머니도 뚝딱 요리") // 화면 상단에 제목을 표시합니다. ("할머니도 뚝딱 요리")
        }
    }
}

코드 설명 (최대한 쉽게):

  1. Recipe 구조체:
    • 요리 레시피 정보를 담는 "그릇"이라고 생각하면 됩니다.
    • id: 각 레시피를 구분하기 위한 고유 번호 (사람의 주민등록번호와 비슷).
    • title: 레시피 제목 (예: "김치찌개").
    • imageName: 레시피 사진 파일 이름 (예: "kimchi.jpg").
  2. recipes 배열:
    • 여러 개의 Recipe (레시피 정보)를 담는 "목록"입니다.
    • Recipe(title: "김치찌개", imageName: "kimchi"): "김치찌개" 레시피 정보를 담는 Recipe 객체를 생성합니다.
    • 이 목록에 원하는 만큼 레시피를 추가할 수 있습니다.
  3. ContentView 구조체:
    • 앱 화면을 구성하는 "도면"이라고 생각하면 됩니다.
    • body: 화면에 무엇을, 어떻게 보여줄지 결정하는 부분입니다.
  4. NavigationView: 화면 상단에 제목 표시줄(네비게이션 바)을 추가합니다. (선택 사항)
    • .navigationTitle("할머니도 뚝딱 요리"): 제목 표시줄에 "할머니도 뚝딱 요리"라는 텍스트를 표시합니다.
  5. ScrollView:
    • 레시피 목록이 화면보다 길 경우, 스크롤해서 볼 수 있게 해줍니다.
  6. VStack:
    • 레시피들을 세로로 차곡차곡 쌓아줍니다.
    • spacing: 20: 레시피들 사이의 간격을 20으로 설정합니다.
  7. ForEach:
    • recipes 목록에 있는 레시피들을 하나씩 꺼내서 반복합니다.
    • 각 레시피에 대해, HStack 안에 있는 내용을 반복해서 화면에 표시합니다.
  8. HStack:
    • 레시피 사진과 제목을 가로로 나란히 배치합니다.
  9. Image:
    • recipe.imageName에 해당하는 사진을 화면에 표시합니다.
    • .resizable(): 사진 크기를 조절할 수 있게 합니다.
    • .scaledToFit(): 사진의 가로세로 비율을 유지하면서, 지정된 크기(frame)에 맞게 사진 크기를 조절합니다.
    • frame(width: 150, height: 150): 사진의 크기를 가로 150, 세로 150으로 설정합니다.
  10. Text:
    • recipe.title에 해당하는 레시피 제목을 화면에 표시합니다.
    • .font(.title): 글자 크기를 "제목" 크기로 설정합니다.
    • .fontWeight(.bold): 글자를 굵게 표시.

코드 적용 방법:

  1. Xcode 실행: Xcode를 실행하고, "할머니도 뚝딱 요리" 프로젝트를 엽니다.
  2. ContentView.swift 파일 열기: 왼쪽 파일 목록에서 ContentView.swift 파일을 찾아서 엽니다.
  3. 기존 코드 삭제: ContentView.swift 파일에 이미 있는 코드를 모두 삭제합니다.
  4. 코드 붙여넣기: 위에서 제공한 코드를 복사하여 ContentView.swift 파일에 붙여넣습니다.
  5. 사진 추가:
    • 프로젝트에 사용할 레시피 사진 파일(예: kimchi.jpg, doenjang.jpg, miyeok.jpg)을 준비합니다.
    • Xcode 왼쪽 파일 목록에서 Assets.xcassets를 선택합니다.
    • 준비한 사진 파일들을 Assets.xcassets 창으로 드래그 앤 드롭하여 추가합니다.
  6. 실행: Xcode 상단의 실행 버튼(▶️)을 눌러 앱을 실행합니다.

결과:

시뮬레이터(또는 실제 아이폰)에 레시피 제목과 사진이 큼지막하게 표시된 목록이 나타날 것입니다.

다음 단계:

이 코드는 레시피 목록 화면의 기본적인 틀을 제공합니다. 이제 이 코드를 바탕으로,

  • 레시피 상세 화면 만들기
  • 검색 기능 추가
  • 찜 기능 추가

등의 작업을 진행할 수 있습니다. 각 단계마다 ChatGPT에게 구체적인 코드를 요청하고, 제공된 코드를 이해하고 수정하는 과정을 반복하면 됩니다.

 

 

Jetpack Compose 코드 (Android Studio 사용, Kotlin):

Kotlin
 
// 필요한 기능들을 가져옵니다. (마치 요리 레시피에서 "밀가루 2컵, 설탕 1컵..." 하는 것처럼)
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp

// 요리 레시피 정보를 담는 '그릇'을 만듭니다.
data class Recipe(
    val title: String, // 레시피 제목
    val imageName: String // 레시피 사진 파일 이름 (확장자 제외)
)

// 앱 화면을 구성하는 '도면'을 만듭니다.
@Composable
fun RecipeListScreen() {
    // 여러 개의 레시피 정보를 담는 '목록'을 만듭니다.
    val recipes = listOf(
        Recipe("김치찌개", "kimchi"), // 첫 번째 레시피
        Recipe("된장찌개", "doenjang"), // 두 번째 레시피
        Recipe("미역국", "miyeok"),  // 세 번째 레시피
        // ... 더 많은 레시피를 추가할 수 있습니다.
    )

    // 화면에 무엇을 어떻게 보여줄지 결정합니다.
    LazyColumn( // 스크롤 기능을 추가합니다.
        modifier = Modifier.padding(16.dp) // 상하좌우에 16dp만큼 여백을 줍니다.
    ) {
        items(recipes) { recipe -> // 레시피 목록에 있는 각 레시피에 대해 반복합니다.
            RecipeItem(recipe) // 각 레시피를 화면에 표시하는 함수를 호출합니다.
        }
    }
}

// 각 레시피를 화면에 어떻게 표시할지 결정하는 함수입니다.
@Composable
fun RecipeItem(recipe: Recipe) {
    Card(
        modifier = Modifier
            .fillMaxWidth() // 가로로 꽉 채웁니다.
            .padding(bottom = 16.dp), // 아래쪽에 16dp만큼 여백을 줍니다.
        shape = RoundedCornerShape(16.dp) // 모서리를 둥글게 만듭니다.

    ) {
        Column {
            Image(
                painter = painterResource(id = getResourceId(recipe.imageName)), // 레시피 사진을 표시합니다.
                contentDescription = "요리 사진", // 이미지 설명(접근성을 위해)
                modifier = Modifier
                    .fillMaxWidth() // 가로로 꽉 채웁니다.
                    .height(200.dp) // 높이를 200dp로 설정합니다.
                    .clip(RoundedCornerShape(16.dp)),
                contentScale = ContentScale.Crop // 이미지가 잘리지 않고 꽉 차도록
            )
            Spacer(modifier = Modifier.height(8.dp))
            Text(
                text = recipe.title, // 레시피 제목을 표시합니다.
                style = MaterialTheme.typography.headlineMedium, // 글자 크기를 크게 설정합니다.
                modifier = Modifier.padding(horizontal = 16.dp) // 양옆에 16dp 여백
            )
            Spacer(modifier = Modifier.height(16.dp))
        }
    }
}

// 이미지 파일 이름을 받아서, 실제 이미지 리소스 ID를 찾아주는 함수 (이건 그냥 복사해서 쓰세요!)
@Composable
fun getResourceId(imageName: String): Int {
    return LocalContext.current.resources.getIdentifier(
        imageName,
        "drawable",
        LocalContext.current.packageName
    )
}

// 미리보기 (앱을 실행하지 않고도 화면을 미리 볼 수 있습니다.)
@Preview(showBackground = true)
@Composable
fun RecipeListScreenPreview() {
    RecipeListScreen()
}

코드 설명 (최대한 쉽게):

  1. import: 필요한 기능들을 가져옵니다. (마치 요리 레시피에서 "밀가루 2컵, 설탕 1컵..." 하는 것처럼).
  2. Recipe 데이터 클래스:
    • 요리 레시피 정보를 담는 "그릇"입니다.
    • title: 레시피 제목.
    • imageName: 레시피 사진 파일 이름 (확장자 제외).
  3. recipes 리스트:
    • 여러 개의 Recipe (레시피 정보)를 담는 "목록"입니다.
    • Recipe("김치찌개", "kimchi"): "김치찌개" 레시피 정보를 담는 Recipe 객체.
  4. RecipeListScreen 컴포저블 함수:
    • 앱의 메인 화면("레시피 목록")을 구성하는 "도면"입니다.
    • LazyColumn: 스크롤 가능한 목록을 만듭니다.
    • items(recipes): recipes 목록에 있는 각 레시피에 대해 RecipeItem 함수를 호출합니다.
  5. RecipeItem 컴포저블 함수:
    • 각각의 레시피를 화면에 어떻게 표시할지 ("레시피 하나하나를 어떻게 그릴지") 결정합니다.
    • Card: 레시피 정보를 감싸는 네모난 상자(카드)를 만듭니다.
      • .fillMaxWidth(): 가로 길이를 꽉 채웁니다
      • .padding(bottom = 16.dp): 아래에 여백을 추가합니다.
      • shape = RoundedCornerShape(16.dp): 모서리를 둥글게 합니다.
    • Column: 카드 안에 내용을 세로로 배치
    • Image: 레시피 사진을 표시합니다.
      • painter = painterResource(id = getResourceId(recipe.imageName)): 이미지 파일을 불러옵니다.
      • contentDescription = "요리 사진": 이미지 설명 (음성 안내 등을 위해 필요).
      • .fillMaxWidth().height(200.dp): 가로를 꽉 채우고, 높이를 200dp로 설정합니다.
      • .clip(RoundedCornerShape(16.dp)): 이미지의 모서리를 둥글게 합니다.
      • contentScale = ContentScale.Crop: 이미지가 잘리지 않고, 비율을 유지하면서 채웁니다.
    • Text: 레시피 제목을 표시합니다.
      • text = recipe.title: 표시할 텍스트 내용.
      • style = MaterialTheme.typography.headlineMedium: 글자 크기, 스타일 등을 설정 (여기서는 "headlineMedium" 스타일 사용).
  6. getResourceId 함수: (이건 그냥 복사해서 쓰세요!)
    • 사진 파일 이름(예: "kimchi")을 받아서, 안드로이드 시스템이 그 사진을 찾을 수 있는 주소(ID)로 바꿔주는 역할.
  7. @Preview:
    • 앱을 실행하지 않고도, RecipeListScreen이 어떻게 보일지 미리 볼 수 있게 해줍니다. (Android Studio의 "Design" 탭에서 확인)

코드 적용 방법:

  1. Android Studio 실행: Android Studio를 실행하고, "할머니도 뚝딱 요리" 프로젝트를 엽니다.
  2. MainActivity.kt 파일 열기: 왼쪽 프로젝트 탐색기에서 app → java → [패키지 이름] → MainActivity.kt 파일을 엽니다.
  3. 기존 코드 수정: MainActivity.kt 파일의 setContent 블록 안에 있는 내용을 다음 코드로 바꿉니다:
  4. Kotlin
     
    setContent {
        할머니도뚝딱요리Theme { // 이 부분은 프로젝트 생성 시 자동 생성된 테마 이름에 따라 달라질 수 있습니다.
            Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
                RecipeListScreen() // 우리가 만든 레시피 목록 화면을 표시합니다.
            }
        }
    }
    
  5. 코드 붙여넣기: 위에서 제공한 Jetpack Compose 코드를 MainActivity.kt 파일의 setContent 블록 아래, MainActivity 클래스 안에 붙여넣습니다. (import 문은 파일 맨 위에)
  6. 사진 추가:
    • 프로젝트에 사용할 레시피 사진 파일(예: kimchi.jpg, doenjang.jpg, miyeok.jpg)을 준비합니다.
    • Android Studio 왼쪽 프로젝트 탐색기에서 app → res → drawable 폴더를 우클릭하고, 'Reveal in Finder' (또는 'Show in Explorer')를 선택합니다.
    • 탐색기(또는 파인더) 창이 열리면, 준비한 사진 파일들을 drawable 폴더 안에 복사합니다.
    • 주의!: 사진 파일 이름은 영어 소문자, 숫자, 밑줄(_)만 사용해야 합니다. (예: kimchi_soup.jpg)
  7. 실행: Android Studio 상단의 실행 버튼(▶️)을 눌러 앱을 실행합니다.

결과:

에뮬레이터(또는 실제 안드로이드 폰)에 레시피 제목과 사진이 큼지막하게 표시된 목록이 나타날 것입니다.

다음 단계:

이 코드는 레시피 목록 화면의 기본적인 틀을 제공합니다. 이제 이 코드를 바탕으로,

  • 레시피 상세 화면 만들기
  • 검색 기능 추가
  • 찜 기능 추가

등의 작업을 진행할 수 있습니다. 각 단계마다 ChatGPT에게 구체적인 코드를 요청하고, 제공된 코드를 이해하고 수정하는 과정을 반복하면 됩니다.

728x90
반응형