이전 시간에 배운 것

1. JPA란?

  • JPA는 Java Persistence API이다.

  • JPA는 ORM 기술이다.
    ORM은 Object Relational Mapping의 약자로, 오브젝트를 데이터베이스에 연결하는 방법론 중 하나이다. 
    "ORM은 나의 하인 같은 기술"
    추상적인 개념을 현실세계로 뽑아내는 개념을 모델링이라고 한다.
    Team 테이블에 ID, Name, Year를 넣고 자바에서 사용을 할텐데, Input과 Output이 각각 DML(Delete, Update, Insert), Select라고한다. 자바는 테이블 데이터 타입을 가지지 않는다. 따라서 클래스를 통해서 데이터베이스의 테이블을 모델링해야한다.

class Team{
	int id;
    String name;
    String year;
}

DB 세상에 있는 데이터를 자바 세상에 모델링한다. 

그런데 ORM은 Class를 먼저 만들고 DB를 자동생성할 수 있는 기술이다. JPA가 가지고 있는 인터페이스 덕분에 자바 클래스를 짜면 테이블을 만들 수 있다. 

  • JPA는 반복적인 CRUD 작업을 생략하게 해준다.
    Select 1건
    Select All 전체
    Delete 1건
    Update 1건
    Insert 1건
    자바에서 DB로 연결하기위해서 신원을 확인하고 DB가 세션을 오픈하면 커넥션 시킬 수 있다. 이때 자바가 쿼리를 전송한다. DB는 해당 쿼리를 통해, 어떤 작업을 통해 데이터를 만들어내고, 자바에 응답한다. 응답시 DB 타입값과 자바 타입값이 다르기 때문에 자바 Object로 바꿔야한다. 이때 자바 Object로 바꾸는 작업은 단순한 반복노동이기에 JPA를 사용해서 전송된 쿼리에 대한 응답이 있을때 이 데이터를 받고 자바 오브젝트로 바꾸고 연결된 세션을 끊고, 연결된 커넥션을 끊고하는 이러한 모든 일련의 과정들을 함수 하나로 제공해준다. 기본적인 CRUD를 단순하게 처리하도록 도와준다. 이런 단순한 CRUD를 도와주는 것도 ORM이 해준다.

다음 시간에 배울 내용

  • JPA는 영속성 컨텍스트를 가지고 있다.
  • JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체저장 불가능)
  • JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 콤포지션, 연관관계)
  • 방언 처리가 용이하여 Migration하기 좋음. 유지보수에도 좋음
  • JPA는 쉽지만 어렵다.
이 블로그 포스팅은 인프런 최주호님의 스프링부트 개념정리(이론) 강의에 대한 정리 포스팅입니다. 
다음은 강사님의 강의 링크입니다. 무료 강의라서 가입만 하면 볼 수 있습니다. (강의 링크)

이전 시간에 배운 것

1. 스프링은 프레임워크이다.
2. 스프링은 오픈소스이다.
3. 스프링은 IoC 컨테이너를 가진다.
4. 스프링은 DI를 지원한다.
5. 스프링은 엄청나게 많은 필터를 가지고 있다.
6. 스프링은 엄청나게 많은 어노테이션을 가지고 있다.
7. 스프링은 MessageConverter를 가지고 있다. 기본값은 현재 Json이다.
8. 스프링은 BufferedReader와 BufferWriter를 쉽게 사용할 수 있다.
9. 스프링은 계속 발전중이다.


1. JPA란?

  • JPA는 Java Persistence API이다.
    Persistence: 영속성, 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다. 
    RAM은 휘발성 데이터를 저장한다. (전기로 데이터를 저장하기 때문) 이뜻은 컴퓨터가 꺼지면 다 사라진다는 말이다.
    이 데이터가 날라가지 않도록 램에있는 소중한 데이터들을 하드디스크에 기록하게 되면 하드디스크는 비휘발성이기 때문에 영구적으로 저장이 된다. 데이터가 영구히 기록되는것 = 영속성
    자바에서는 데이터 저장을 DBMS에 한다. 하드의 특정 영역을 잘라서 그 부분을 DBMS로 관리를 한다. 
    JAVA Persistence API라는 것은 자바에 있는 데이터를 영구히 기록할 수 있는 환경을 제공하는 API를 말한다.
    API는 무엇일까? : Application Programming Interface의 약자로, 프로그램을 만들기 위해 제공해주는 인터페이스이다.
    프로그래밍에는 프로토콜, 인터페이스 라는 개념이 있음
    둘다 약속을 의미하는데 방식이 조금 다르다.
    A와 B와 C라는 사람이 있다.
    1. B가 힘이 가장 세서 '이제부터 내게 연락을 할 때에는 전화하지말고 직접 찾아와라'라고 얘기를 했다. 이때 A와 C는 힘이 없기 때문에 B가 말한 규칙을 어쩔수 없이 지켜야한다. : 이때의 규칙을 인터페이스라고 한다. "상하관계가 존재하는 약속"
    2. 모두가 힘이 동일하면 A와 C는 싫다고 말할 수 있다. 그럼 B는 이 규칙을 내세울 수가 없다. 다른 대안책을 제시하고 서로에게 동의할 수 있는 약속을 만들어야한다. 이렇게 프로토콜은 동등한 관계에서의 약속이다. 

    JPA는 Java Persistence Application programming interface
    자바 프로그래밍을 할 때 영구적으로 저장을 하기 위해서 필요한 인터페이스를 의미한다.

  • JPA는 ORM 기술이다.
    ORM은 Object Relational Mapping의 약자로, 오브젝트를 데이터베이스에 연결하는 방법론 중 하나이다. 
    "ORM은 나의 하인 같은 기술"
    추상적인 개념을 현실세계로 뽑아내는 개념을 모델링이라고 한다.
    Team 테이블에 ID, Name, Year를 넣고 자바에서 사용을 할텐데, Input과 Output이 각각 DML(Delete, Update, Insert), Select라고한다. 자바는 테이블 데이터 타입을 가지지 않는다. 따라서 클래스를 통해서 데이터베이스의 테이블을 모델링해야한다.

class Team{
	int id;
    String name;
    String year;
}

DB 세상에 있는 데이터를 자바 세상에 모델링한다. 

그런데 ORM은 Class를 먼저 만들고 DB를 자동생성할 수 있는 기술이다. JPA가 가지고 있는 인터페이스 덕분에 자바 클래스를 짜면 테이블을 만들 수 있다. 

  • JPA는 반복적인 CRUD 작업을 생략하게 해준다.
    Select 1건
    Select All 전체
    Delete 1건
    Update 1건
    Insert 1건
    자바에서 DB로 연결하기위해서 신원을 확인하고 DB가 세션을 오픈하면 커넥션 시킬 수 있다. 이때 자바가 쿼리를 전송한다. DB는 해당 쿼리를 통해, 어떤 작업을 통해 데이터를 만들어내고, 자바에 응답한다. 응답시 DB 타입값과 자바 타입값이 다르기 때문에 자바 Object로 바꿔야한다. 이때 자바 Object로 바꾸는 작업은 단순한 반복노동이기에 JPA를 사용해서 전송된 쿼리에 대한 응답이 있을때 이 데이터를 받고 자바 오브젝트로 바꾸고 연결된 세션을 끊고, 연결된 커넥션을 끊고하는 이러한 모든 일련의 과정들을 함수 하나로 제공해준다. 기본적인 CRUD를 단순하게 처리하도록 도와준다. 이런 단순한 CRUD를 도와주는 것도 ORM이 해준다.

  • JPA는 영속성 컨텍스트를 가지고 있다.
    영속성 : 데이터 -> 영구적으로 저장하는 속성 (자바에서는 DB에 저장)
    컨텍스트란? Context: 모호한 개념 중 하나. 모든 컨텍스트를 가지고 있다 == 모든 정보를 가지고 있다. "대상의 모든 정보"
    영속성 컨텍스트에 있는 데이터와 DB 데이터는 동기화가 됨. 따라서 동물 데이터를 영속성 컨텍스트를 통해 DB에 입력했을때, 영속성 컨텍스트 내의 동물 데이터를 지우면 DB의 동물 데이터도 같이 지워짐. Select를 통해서 DB의 과일 데이터에 접근시 영속성 컨텍스트를 거쳐서 DB로 이동함. 영속성 컨텍스트에는 과일 데이터가 없기 때문에 자바 오브젝트로 바꾼 과일 데이터를 가진다. 영속성 컨텍스트는 자바 오브젝트 타입의 과일데이터를 자바에게 넘겨준다. 

    이때 자바, 영속성 컨텍스트, DB의 데이터는 서로 일치하는데, 자바에서 과일 데이터 중 사과를 딸기로 변환하면 영속성 콘텍스트에 있는 과일 데이터가 딸기로 변하고 커밋해서 밀어넣는 경우 과일 데이터의 형상이 달라져서 insert가 아니라 update가 일어난다. 

    자바는 항상 영속성 컨텍스트를 통해서 디비에 데이터를 저장하고, 데이터베이스의 데이터도 영속성 컨텍스트를 통해서 자바쪽으로 전달이 된다. 그리고 영속성 컨텍스트에서 일어난 모든 일들은 자동으로 처리가 된다.

  • JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체저장 불가능)
    야구 DB에 team(ID, Name, year)과 player(ID, Name, teamId) 테이블이 있다고 하자.
    각 컬럼들은 가질 수 있는 데이터가 기본 자료형이다. Object를 데이터로 가지지 않는다.
    자바의 관점에서 보면, 

Class Team {
	int id;
    String name;
    String year;
}

Class player {
	int id;
    String name;
    int teamId;
}

자바는 object를 저장할 수 있기 때문에,

Class Team {
	int id;
    String name;
    String year;
}

Class player {
	int id;
    String name;
    Team team;
}

이 될 수 있음. 
ORM 덕분에 자바가 주도권을 쥐고 있는 모델을 만들 수 있음.
또, JPA가 자동으로 DB에 FK(외래키) 데이터를 넣어줌.

  • JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 콤포지션, 연관관계)
  • 방언 처리가 용이하여 Migration하기 좋음. 유지보수에도 좋음
  • JPA는 쉽지만 어렵다.
이 블로그 포스팅은 인프런 최주호님의 스프링부트 개념정리(이론) 강의에 대한 정리 포스팅입니다. 
다음은 강사님의 강의 링크입니다. 무료 강의라서 가입만 하면 볼 수 있습니다. (강의 링크)

이번 기술 공유를 통해 만든 키노트입니다.

코어 데이터란 무엇일까요?

코어데이터는 iOS 프레임워크입니다. 프레임 워크는 객체 생명주기와 객체 그래프관리에 관련된 솔루션을 제공합니다. 우리가 데이터베이스처럼 사용할 Persistence 객체 그래프 관리에 포함이 됩니다.

객체그래프 관리 내용 추가(https://velog.io/@ssionii/Core-Data%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%84%EB%9D%BC%EB%B3%B4%EC%9E%90-1-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90)

코어 데이터로 있는 기능들입니다. 하지만, 대부분의 아카데미 러너들이 그랬듯이, 이번 키노트에서는 Persistence 사용한 데이터 저장, 읽기, 수정, 삭제에 대해서만 다룰 예정입니다.

코어 데이터의 대부분 기능들은 애플리케이션의 Entity, Property, relationship 사이의 관계를 설명하기 위해 생성하는 스키마에 따라 결정됩니다. CoreData NSManagedObjectModel 인스턴스인 관리 객체 모델 (Managed Object Model)이라는 스키마를 사용합니다. 이러한 모델이 많을 수록 CoreData 좋게 앱을 지원해 있습니다.

우선 지금까지 해왔던 것처럼 프로젝트를 생성해줍니다.

그리고 옵션 설정에서 Use CoreData 선택해줍니다.

그러면 평소에 보던 화면이랑 약간 다른 느낌의 창이 뜹니다. ContentView Hello World 사라졌습니다.

디바이스를 iPhone으로 바꿔주면,

이렇게 타임 스탬프가 찍혀져 있고 추가 수정이 가능해 보이는 리스트가 나옵니다.

또한 네비게이션 영역에 프로젝트 이름과 똑같은 xcdatam…파일이 보입니다.

들어가서 보니 xcodeproj 파일이랑 비슷한 느낌으로 구성되어있는 것을 확인할 있습니다.

자동으로 생성되어 있는 item 엔티티와 timestamp Attribute 확인할 있습니다.

엔티티와 어트리뷰트 설명 추가

Entity를 추가하려면 하단의 add entity 누르면 되고, Attribute 추가하려면 하단의 add atribute 혹은 attribute 테이블 안에 있는 + 버튼을 클릭하면 됩니다.

Entity나 Attribute를 삭제하려면 선택한 상태에서 백스페이스버튼을 눌러주면 됩니다.

엔티티를 누르고 인스펙터창을 보면 일단 먼저 이름 설정칸과 Codegen이라는 칸이 있습니다.

Codegen 설명 추가

Attribute를 선택후 인스펙터 창을 보면 이름과 타입이 있습니다. 애플 공식문서(아카이브)에서는 디폴트인 Optional 사용하는 것을 권장합니다. 왜냐하면 값이 0일때, 없을때를 구분해주기 때문입니다. 여기서 옵셔널은 스위프트 문법이 아닌 SQL에서의 문법입니다.

하단의 에디터 스타일을 변경하면 UML 다이어그램으로 관계를 있습니다. 하지만, relationship을 사용하지 않는다면 쓸모는 없을 것입니다.

우리가 앞으로 진행해야할 과정입니다.

구조체를 생성후, 인스턴스를 만들고 저장하는 과정을 거칩니다.(1 - 2과정)

코어데이터에 저장이 되었는지 불러오기를 통해 확인합니다.(3 - 5과정)

그러기 위해서는 우선 코어 데이터 스택이란 것에 대해서 알고가야 합니다.

NSManagedObjectModel 인스턴스는 properties relationships 포함하여 app's types 설명합니다.

Entity 설명하는 DB 스키마라고 합니다.

Managed object Structure 정의합니다.

NSManagedObjectContext 인스턴스는 app's types 인스턴스에 대한 변화를 추적합니다. 객체를 통해서 create, delete, fetch, update 작업을 있습니다. (core data 메모리에 로드된 상태로 처리되는데, 때의 메모리가 context 의미합니다.)

여기서 Context가 Transaction 이라는 설명도 있었습니다.

NSPersistentStoreCoordinator 인스턴스는 store 에서 app's types 인스턴스를 저장하고 가져옵니다. (Context Container 사이를 통신합니다.)

Persistent storage managed object model 연결합니다.

NSPersistentContainer 인스턴스를 사용해서 model, context, store coordinator 동시에 설정합니다. (전체적으로 관리하는 최상단의 객체)

Core Data Stack 나타내는 필요한 모든 객체를 포함한다.

그리고 우리가 사용하기 편하게 위의 데이터 스택들을 관리해주는 PersistenceManager를 만들어 줍니다.

NearCat:ch에 대한 설명은 여기

우리가 DB용으로 사용하는 CoreData를 이 파일에서 전체적으로 다루겠다! 그런 의미로 생각하면 됩니다.

우선 PersistenetContainer는 다음 코드처럼 만들어집니다.

밑의 코드 내용 설명 보강

NSPersistentContainer 키워드를 사용하여 만들어집니다.

데이터베이스에서 기본적으로 해줘야할 CRUD는 다음처럼 구현합니다.

키워드 위주로만 설명이 될텐데 생성을 담당하는 키워드는 save가 있습니다.

불러오기, 읽기를 담당하는 키워드는 fetch입니다.

rollback 키워드를 통해 업데이트 할 수 있습니다.

delete 키워드를 통해 삭제가 가능합니다.

이번 키노트를 만들면서 많이 도움이 되었던 사이트들입니다.

 

+ Recent posts