본문 바로가기
개발하기/SwiftUI

Xcode에서 SwiftUI를 사용하여 Mysql 연결하는 방법

by lovedeveloping 2024. 9. 20.
반응형

안녕하세요! 저는 주식만 하고 있어서 코인은 잘 모르는데요, 예전에 파이썬으로 자동화 프로그램을 만든 적이 있어서

출근해서 퇴근할 때까지 사용할 자동화 앱을 만들어 보고 싶어 기획 중입니다.

간단하게 현재 UI를 만들고 구상하던 중 DB에 저장해서 사용해야 코인 종목과 가격을 더 편하게 관리할 수 있을 것 같았습니다.

Mysql을 연동해야 하는데, 생각보다 복잡한 방법밖에 안 나오는 것 같아 열심히 검색해서 찾아 결정했습니다.

서론이 길었으니 바로 시작하겠습니다.

MySQLKit 패키지  

SQLKit

링크: https://github.com/vapor/mysql-kit

이 패키지를 선택한 이유

  1. SwiftNIO 기반의 비동기 지원
  2. 간결한 API
  3. MySQL 기능 지원

 

이 패키지를 실행하기 전 해야 할 게 있습니다. 

1. MySQL Workbench

Workbench

링크: https://dev.mysql.com/downloads/workbench/

 

데이터를 저장하기 위해선 필수로 다운로드하여야 하는 툴입니다.

 

해야 할 것:

  1. DB에 로그인
  2. 스키마 만들기(작성자는 Trading으로 하였습니다.)

 

2. Xcode

 

링크:  https://apps.apple.com/kr/app/xcode/id497799835?mt=12

 

 

AppStore에서 다운로드하실 수 있습니다. 용량이 생각보다 커서 오래 걸립니다.

 

 

 

 

3. 구현하기

이제 준비는 모두 끝났습니다.  기본적인 건 건너뛰고 바로 코드로 넘어가겠습니다. 

저희는 맥북에서 앱을 만들 것이기에 macos 프로젝트를 사용합니다.

패키지 다운로드
패키지 다운 받기

 

MySQLKit 링크를 붙여 넣어 패키지를 다운로드하여줍니다. 저는 이걸 Xcode에 장점이라고 생각합니다. url을 통해 간단하게 필요한 패키지를 다운로드할 수 있다는 것은 초보인 저에게 아주 좋은 기능입니다. (쉘을 잘 못 다룹니다)

@State private var connectionStatus: String = "연결 대기 중..."

    var body: some View {
        VStack {
            Text(connectionStatus)
                .padding()
            
            Button("MySQL 연결 테스트") {
                Task {
                    await testMySQLConnection()
                }
            }
        }
    }

 

버튼을 눌러 정상적으로 연결 됐는지 확인하기 위한 간단한 UI입니다.

func testMySQLConnection() async {
        let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
        defer {
            try? eventLoopGroup.syncShutdownGracefully()
        }
        
        let logger = Logger(label: "mysql")
        
        let mysqlConfiguration = MySQLConfiguration(
            hostname: "localhost",
            port: 3306,
            username: "MySQL 아이디 입력",
            password: "MySQL 비밀번호 입력",
            database: "Trading",
            tlsConfiguration: .forClient(certificateVerification: .none)
        )
        
        do {
            let address = try await mysqlConfiguration.address()
            let conn = try await MySQLConnection.connect(
                to: address,
                username: mysqlConfiguration.username,
                database: mysqlConfiguration.database!,
                password: mysqlConfiguration.password,
                tlsConfiguration: mysqlConfiguration.tlsConfiguration,
                logger: logger,
                on: eventLoopGroup.next()
            ).get()
            
            defer {
                try? conn.close().wait()
            }
            
            let rows = try await conn.simpleQuery("SELECT 1").get()
            
            if rows.count > 0 {
                await MainActor.run {
                    connectionStatus = "MySQL 연결 성공!"
                }
            } else {
                await MainActor.run {
                    connectionStatus = "MySQL 연결 실패: 결과 없음"
                }
            }
        } catch {
            await MainActor.run {
                connectionStatus = "MySQL 연결 실패: \(error.localizedDescription)"
            }
        }
    }

엄청 간단하죠? 다른 게시물을 제가 많이 찾아봤는데, 설정할 것도 많고 복잡해서 이해가 부족한 저는 따라 하지 못했습니다.

이 코드 하나면 간단하게 확인 가능합니다. 아래는 결과물입니다.

최종 결과물
최종 결과물

전체 코드가 궁금하신 분들은 댓글 주시면 파일 보내드리겠습니다.!

이제 이어서 작성해야겠습니다!! 감사합니다~

반응형