210531 Mon

Sunny·2021년 6월 2일
0

Today I Learned

목록 보기
66/88

1. 첫 번째 학습 내용: 카훗 퀴즈

  • 키-값 쌍의 데이터를 안전하게 보관할 수 있는 방법 중 대표적인 방법은? Key Chain
    사용자 계정 클라우드에 귀속되기 때문에 키체인의 정보는 앱을 삭제해도 남아있다
  • 캐쉬는 리모트에서도 이루어짐
  • NSCache는 디스크 캐시 전용이다 (X)
    주기억장치를 항상 RAM이 담당하는건 아니지만
    RAM = 주기억 장치 이렇게 생각해도 됨
    NSCache는 메모리 전용
    메모리에 캐시했다가
    앱을 종료하면
    캐시는 사라짐

2. 두 번째 학습 내용: CoreData / Database

데이터베이스

정형화되지 않은 데이터
(딕셔너리에 키와 밸류 쌍으로 넣고 빼고 하는 것)

생활기록부
몇 천명, 만명꺼를 똑같은 형식으로 저장한 것
= 데이터베이스

차곡차곡 쌓이는게 데이터베이스
그거를 반영구적으로 쌓아놨다가
필요할 때 싹 뽑아다가 가공해서 씀

e.g. 몇년치 학생들의 성적의 평균
성적만 뽑아서 평균을 내서 처리해서 보여주는 것
= 데이터베이스 매니지먼트 시스템들이 할 수 있는 역할

SQL

이제까지 가장 널리 쓰이는
관계형 데이터베이스에다가 명령을 주는
하나의 구조화된 언어

데이터베이스에다가 이런거 처리해주세요
입력을 할때 사용하는 언어

e.g. Git할 때 add, commit하면 입력되는
그럴때 사용하는 느낌

SQL은 삐끗하면 다 날려먹고
문법 자체도 헷갈림

편하게 사용할 수 있는 데이터베이스는 없을까?
문서형, 키밸류, 여러가지 종류를 다 만들어 놓음
e.g. mongoDB

현실 대세는 아직도 관계형 데이터베이스!
Why? 대규모 데이터 처리하는게 관계형 데이터베이스만큼 잘 처리되는게 없음

migration이란?

생활기록부
30년 전의 생활기록부
지금의 생활 기록부
똑같은 폼 사용하지 않을 것

새로운 양식 혹은 양식의 변화가 필요할 것
그거를 migration 한다고 함

기존의 쌓여있던 데이터를
수우미양가 → ABCDE로 바꿔야 함
그거를 전체적인 데이터를 새로운 폼에 맞게 업데이트 하는 것을 ‘migration’이라고 함

기존의 칸을 없애거나
기존의 칸을 새로운 형태로 변경하거나 하는 작업을 마이그레이션이라고 함

왜 이런 작업을 함?
폼이 변경되면
기존의 데이터도 변경해줘야지
읽을 수 있음

  • 데이터 베이스 = 데이터들을 묶어 놓은 저장소
  • 데이터 베이스 관리 시스템 = 저장소에 접근해서 일을 해주는 소프트웨어 시스템

mySQL은 어떤 데이터를 관리해주는 데이터베이스 시스템?

DBMS = 데이터베이스계의 운영체제
무료도 있고 유료도 있음

트렌드가 계속 바뀜
대부분 상위권은 잘 안바뀜
Oracle, mySQL, Microsoft SQL Server, PostgreSQL, MongoDB
이 5개 중에 1개 몽고만 document형 이고
나머지는 관계형 데이터베이스 시스템

회사에 가면 저 5개 중에 하나가 많을 것


데이터베이스 종류 관계형, 문서형, 키밸류형 등
그것을 다룰 수 있게 제공된 시스템, 소프트웨어로 오라클, MySQL 등이 있다.

DB 뭐 써?
MySQL 써
(정확히는 DBMS 뭐써?라고 묻는게 정확함)

Core Data

코어데이터는 데이터베이스가 아님!
코어데이터가 자료를 불러오면
메모리에 데이터가 올라오면

앱 안에서 데이터를 사용하려면
항상 메모리에 데이터가 올라와있어야 함
e.g. 변수에 담기든지

데이터베이스는 디스크에 있다가
값을 불러온다
= 메모리에 가져온다

코어데이터는 데이터를 메모리에 로딩해야 한다
= 디스크에 있던 거를 꼭 메모리로 갖고 와야지 작업을 할 수 있다

근데 최적화가 돼서
예전처럼 모든걸 갖고 오진 않고
일부만 필요한 것들 비동기적으로 갖고 올 것임

불러온 데이터를 클로저에서 사용함

코어데이터도 디스크에 있던 거를 불러와서
사용할 때 비동기적으로 불러옴
이유? 디스크에서 불러와서 메모리에 올리기까지
아무리 짧더라도 시간이 걸릴거임
(그 시간 동안 앱이 멈추지 않도록)

반대로
메모리에 만들어 놓은 데이터
데이터베이스에 저장하고 싶으면

그럴때 메모리에 있던 거를 데이터베이스에 저장하려면
시간이 걸림
동기적으로 처리하는게 아니고
비동기적으로 처리하는 거임

  • 모든 DB 쿼리를 처리할 수 없다
    = 모든 SQL 문법을 다 지원하는 건 아님
    일부 제한적인 SQL을 사용할 수 있다

DBMS에게 명령을 전달하는게 코어 데이터!
실질적인 계란 노른자는
DB, DBMS인데
한 단계 더 감싸놓은게 코어데이터

안에 알갱이가 뭔지 몰라도
DBMS가 적당히 꺼내서
(추상화)
코어데이타에 데이타를 넘겨줄 것
= 종속성이 사라지고 재사용과 유지보수가 편리하다

모델이 변경됐다
= 양식이 바뀌었다
→ 마이그레이션을 해야 한다

모바일에서 데이터베이스를 운영하는게 너무 무겁기 때문에
굳이 모바일에서 큰 DBMS를 사용하지 않음
왜냐면 DBMS 메모리 몇 기가씩 씀
그거를 모바일에 올리기 힘듦

SQLLite를 사용해서
경량화된 단순한 모바일 DB 시스템을 라이브러리로 만들어 둔 것
→ 꼭 모바일에서만 SQLLIte를 쓸 수 있다는 건 아님
SQLLIte는 SQL 문법을 알고 있어야지 쓸 수 있음

코어데이터는
내부의 문법을 몰라도
직접적으로 명령을 코어데이터에만 하는 것

데이터베이스매니지먼트 시스템은 DB를 읽고 쓰고 함
코어데이터는 우리가 코어데이터에 명령을 주고 받을건데
DBMS와 명령을 주고 받음
DBMS가 SQLLite든 뭐든 상관없음

결과적으로 DB를 뭘 쓸지
코어 데이터한테 얘기만 하면
DBMS, DB의 관계 잘 몰라도 됨
= 추상화

코어데이터 사용하면 기능이 많음
데이터를 가공을 한다든지
필터링 한다든지
복잡한 연산이나
데이터 관리는
딕셔너리, 모델을 사용하는 것보단
사용해줄 수 있음 ??

Database ORM

데이터는 바로 가져다 쓸만큼 1:1 매칭이 안됨
모든 데이터를
데이터베이스 테이블에 모아 놓는 게 아니고
테이블을 분리해놓고
서로 관계를 맺어놓음

데이터를 가져다 쓸때는
써니의 생활기록부
기본 인적사항 적어놓고

체육 성적
= 1~6학년 때까지의 체육성적표에 저장해놓고

국어 성적
= 국어 성적표에 따로 저장해놓음

이걸 사용할때는
써니라는 객체를 만들 때
체육 성적과 국어 성적을 하나의 객체에 담아서 쓰고 싶음

데이터베이스에 저장된 데이터랑
우리가 실제 쓰는 인스턴스의 모양이
매칭이 딱 1:1이 안됨

여기서 꺼내온 데이터
저기서 꺼내온 데이터를
하나로 묶어줘서
매핑을 시켜준다
= 중간 다리 역할

SQL을 사용하지 않고서도
관계형 데이터베이스를 좀 더 편하게 사용할 수 있게
주로 라이브러리 형태로 제공됨

애플은 코어데이터가 ORM이 아니라고 함

profile
iOS Developer

0개의 댓글