iOS

[iOS] 7주차 세미나 정리

Eunice99 2022. 11. 7. 21:53

[미션 검사 및 피드백]

DispatchQueue 중에서 UI 업데이트 할때는 main, 그 외에는 global 활용

한가지 피드백 요소 : main 스레드 사용할때 항상 비동기방식으로만 사용해야한다. (multi스레드를 사용할때 동기방식을 사용하면, iOS 앱 자체가 기본적으로 메인 스레드에서 작동하는데, 특정 작업할때 메인 스레드에서 끌어와서 사용해버리면 앱이 죽어버림. -데드락 상태로 빠져버린다!) 동기방식으로 작동되는것도 상황에 따라있긴한데, 아직 개념이 익숙하지않은 상황에서는 main일땐, 비동기로 하는게 좋음

+ 런루프까지 공부해보기!

+ 스레드를 다루는것이 iOS에서는 정말 중요함! 운영체제 과목에 포함되어있는 요소라 공부할 분량이많지만, 공부해놓으면 활용할일이 진짜 많음!! 

 

[DB와 DBMS]

Q. 전산처리는 어떻게 진행될까?, 현금을 넣으면 통장에 어떻게 들어올까?

A. 데이터화가 되어 전산처리가 진행되는것!

 

  • 전산처리 구조

이렇게 단순하게 데이터들이 모여있는 집합을 데이터베이스, 줄여서 DB라고 부른다!

누군가가 현금인출기에서 돈을  빼면 그 데이터를 업데이트 시켜야하는 과정이 필요하다!

하지만, 고객이 정말 몇십만명이 있을텐데, 하루만해도 몇만건 이상이 은행 서비스가 활용될것이다.

그럴때마다 DB에 들어있는 데이터를 하나하나꺼내서 처리하게 되면 상당히 효율을 따져보면 비효율적일거고 많은 데이터를 관리하기 쉽지않을것인데, 이 DB를 다루는 소프트웨어가 바로 DBMS(데이터베이스 관리 시스템)이다!

DB를 편하게 관리하기 위한 관리 시스템

은행의 데이터에 접근할수있는 모든 요소들이 서비스를 이용하게 되면 이용하게 된 서비스에 따라서 DBMS를 통해 DB를 운영하게 된다.

ex) 한 은행의 고객이 ATM기기에서 돈을 인출한다하면  DBMS를 통해 인출하게 된다.

 

DBMS를 관리하는 시스템 (RDBMS)

- 관계형 데이터베이스 관리 시스템

관계형이란? 데이터들이 관계를 지니게 되는것
기존의 DB는 각각의 파일 형식으로 지니게 된다면, RDBMS는테이블 형식으로 지니게 된다.

테이블 형식의 스키마, 테이블끼리 관계성을 띄고있다!

 

데이블형식으로 데이터를 관리하게 되면서, 테이블을 관리하기 위한 방법이 필요함에따라 SQL이라는 프로그램이 도입하게됨!

- SQL : 테이블과 데이터를 관리하기위한 프로그래밍 언어

위 사진처럼 코드를이용해 원하는 데이터값을 꺼내오거나 생성하고 삭제함

체계적이고 표준화된 방식으로 데이터를 관리할 수 있다!

 

DBMS 예시

DBMS를 거쳐서 데이터에 접근해, 데이터를 활용하게 된다!

 

  • 최종정리

데이터들의 집합 : DB

데이터베이스를 관리하는 시스템 : DBMS

관계형 데이터베이스 관리 시스템 : RDBMS

RDBMS 데이터를 관리할때  사용하는 프로그래밍 언어 : SQL

 

이걸 배우는 이유는?

iOS에서도 데이터 활용, 저장하는 경우가 많아서 용어와 개념정도는 이해하고 넘어가는것이 좋음!

 

UserDefaults

iOS에서 기본적으로 제공해주는 DB

https://developer.apple.com/documentation/foundation/userdefaults

 

Apple Developer Documentation

 

developer.apple.com

앱이 실행될때, 키와값으로 데이터가 한쌍으로 묶여서 저장이됨 - 딕셔너리나 해쉬맵같은 자료구조가 떠오르면 됨!

 

+ 딕셔너리!(자료형)

// var dictionary = [String: String]() // 영단어 사전이라고 생각하면? -키를 넣으면 값이 나옴!, 키와값이 한쌍으로 묶여있음

var dictionary = ["apple" : "사과", "banana" : "바나나"]
print(dictionary["apple"]!)

딕셔너리 이용 예시)

https://org9899.tistory.com/56

 

[SWIFT] 기초문법 뽀개기 -딕셔너리

참고 (키 : 값) https://jusung.gitbook.io/the-swift-language-guide/language-guide/04-collection-types 콜렉션 타입 (Collection Types) - The Swift Language Guide (한국어) let oddDigits: Set = [1, 3, 5, 7, 9] let evenDigits: Set = [0, 2, 4, 6, 8] l

org9899.tistory.com

 

[DB 실습]

이름과 비밀번호를 넣고 데이터베이스에 있는 유효한 데이터라면 로그인이되게 처리하고, 회원가입한 데이터가없다면, 회원가입 화면으로 넘어간후, 이름과 비밀번호를 받아서 회원가입을 할 수 있도록!

 

1. 화면을 넘길것이므로 navigation controller 임베디드!

 

2. ViewController

//
//  ViewController.swift
//  week7
//
//  Created by 김민경 on 2022/11/07.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    
    @IBAction func loginButtonDidTap(_ sender: Any) {
        guard let name = nameTextField.text else {return}
        guard let password = passwordTextField.text else {return}
        
        // 값 꺼내오기
        UserDefaults.standard.string(forKey: name)
        
        // 이름, 비밀번호가 올바르게 매칭되는지 확인
        if UserDefaults.standard.string(forKey: name) == nil { // 회원가입이 되어있는지부터 확인
            print("데이터가 없습니다.")
        } else if password != UserDefaults.standard.string(forKey: name) {
            print("비밀번호가 알맞지 않습니다.")
        } else {
            print("로그인 성공!")
        }
        
        // 유저 정보 : 이름, 전화번호, 이메일 주소, 비밀번호
        // 단점 : 유저에 대한 정보를 한번에 꺼내고 싶으면 유저 디폴트를 따로 저장하고 if문을 통해 꺼내야하는 한계점이있다.
        // 장점 : 그냥 활용하기 편함 - 주로 자동 로그인을 구현할때 사용함
        // 자동 로그인? - 한번 로그인했으면 자동적으로 로그인되어있게!
        // 키 -> 로그인을 한 적이있나?
        // 값 -> 결과를 저장
        // 앱을 껏다켜도 로그인 과정을 스킵할 수 있게 사용!
    }
    
    
    @IBAction func signUpButtonDidTap(_ sender: Any) {
        guard let signupViewController = UIStoryboard(name:"Main", bundle:nil).instantiateViewController(withIdentifier: "SignUPViewController") as? SignUPViewController else {return}
        
        navigationController?.pushViewController(signupViewController, animated: true)
                
    }
    
}

 

3. SignUPViewController

//
//  SignUPViewController.swift
//  week7
//
//  Created by 김민경 on 2022/11/07.
//

import UIKit

class SignUPViewController: UIViewController {
    
    
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // 이름을 넣으면 비밀번호가 나오도록
    @IBAction func signupButtonDidTap(_ sender: Any) {
        guard let name = nameTextField.text else {return}
        guard let password = passwordTextField.text else {return}
        
        // UserDefaults의 기본 클래스에 접근
        UserDefaults.standard.set(password, forKey: name) // "키" : "값"
        
        print("이름 : \(name), 비밀번호 : \(password)")
        // 회원가입이 되었을때 자동으로 화면이 나가지도록
        navigationController?.popViewController(animated: true)
    }
    
    
    @IBAction func cancelButtonDidTap(_ sender: Any) {
        navigationController?.popViewController(animated: true)
    }
    
}

 

  • 시연화면

 

+ DB특징 추가

영속성? 앱을 끄고 켜도 데이터가 보존된다!

앱을껏다켜도 데이터가 잘 저장되어있다는것을 확인할 수 있음!

기본적으로 제공해주는 데이터 저장 인터페이스 = UserDefaults

[미션 안내]

  • 스탠다드 미션

- 지난주 스탠다드 미션 (알람시계 만든거에) 데이터를 저장하는걸 추가,,,(조건은 저번주 스탠다드 미션 앱에 데이터베이스 기능 부착해서 앱을 껏다켜도 남아있게)

  • 챌린지 미션

- 이전 미션에 데이터베이스 기능을 부착해서 만들기

 

+ 공부해두면 좋을 내용들