[자바 ORM 표준 JPA 프로그래밍] 4장_앤티티 매핑

엔티티와 테이블을 정확히 매핑하기 위해 JPA 는 다양한 어노테이션을 지원한다.

  1. 객체와 테이블 매핑 : @Entity, @Table
  2. 기본 키 매핑 :@Id
  3. 필드와 컬럼 매핑 : @Column

@Entity

JPA 를 사용해서 테이블을 매핑할 클래스는 @Entity 를 필수로 붙여야한다.
그리고, @Entity 적용시 기본 생성자는 필수이다.

@Table

엔티티와 매핑할 테이블을 지정한다.

데이터베이스 스키마 자동 생성

JPA 는 클래스의 매핑 정보와 Database Dialect 을 사용해서 데이터베이스 스키마를 생성한다.
create / create-drop / update / validate / none 옵션이 있다.
다음과 같이 설정하면 기존 테이블은 삭제하고 새로 생성한다. ( DROP + CREATE )

1
spring.jpa.hibernate.ddl-auto=create

Primary Key 매핑

Read more

[자바 ORM 표준 JPA 프로그래밍] 3장_영속성 관리

Entity 를 Entity Manager 를 통해 어떻게 사용하는지 정리하자.

Entity Manager Factory, Entity Manager

엔티티 메니저 펙토리는 한 개만 만들어서 애플리케이션 전체에서 공유한다.
엔티티 메니저 펙토리는 서도 다른 스레드 간에 공유해도 되지만
엔티티 메니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안된다.

Persistence Context

엔티티를 저장하는 환경이다.
엔티티 메니저로 엔티티를 저장하거나 조회하면 엔티티 메니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

엔티티의 생명주기

네 가지 상태가 있다.

  1. 비영속
    영속성 컨텍스트와 관계 없는 상태
  2. 영속
    영속성 컨텍스트에 저장된 상태
  3. 준영속
    영속성 컨텍스트에 저장되었다가 분리된 상태
  4. 삭제
    삭제된 상태

영속성 컨텍스트의 특징

  1. 영속 상태는 식별자 값이 반드시 있어야한다.
  2. 보통 Transaction 을 Commit 하는 순간 영속성 컨텍스트에 저장된 엔티티를 데이터베이스에 반영한다. (Flush)
  3. 1차 캐쉬 / 동일성 보장 / 쓰기 지연 / 변경 감지 / 지연 로딩
Read more

패러다임의 불일치

객체 모델과 관계형 데이터베이스 모델은 지향하는 페러다임이 서로 다르다.
페러다임의 불일치 문제를 해결하기 위한 결과물이 ‘JPA’ 이다.
객체 모델과 관계형 데이터베이스 모델의 페러다임 차이를 비교해보자.

Granularity (밀도)

  • 객체
    • 다양한 크기의 객체
    • 커스텀한 타입
  • 릴레이션
    • 테이블
    • 기본 데이터 타입 (UDT는 비추)

Subtype

  • 객체
    • 상속 구조
    • 다형성
  • 릴레이션
    • 테이블 상속 無 (상속 기능을 구현했다 하더라도 표준 기술이 아닙니다.)
    • 다형적인 관계 無

Identity

  • 객체
    • 레퍼런스 동일성 (==)
    • 인스턴스 동일성 (equals() 메소드)
  • 릴레이션
    • 주키 (primary key)

Association

  • 객체
    • 객체 레퍼런스로 관계 표현
    • 방향이 존재
    • 다대다 관계 가능
  • 릴레이션
    • Foreign Key 로 관계 표현
    • 방향이라는 의미가 無
    • 다대다 관계 불가능. (조인 테이블 또는 링크 테이블을 사용해서 두개의 1대다 관계로 풀어야 )

Data Navigation

Read more

길찾기

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14geLqABQCFAYD&categoryId=AV14geLqABQCFAYD&categoryType=CODE

오랜만에 푸는 관계로, 쉬운 문제를 선택하였습니다. 탐색 기본 문제입니다.

풀이

https://github.com/KoJunHee/algorithm/blob/master/src/swa_1219/Solution.java

  1. 그래프 그리기

    주어진 그래프를 두 개의 배열로 표현합니다. 한 지점에서 최대 두 개의 길이 있기 때문입니다.

    예를 들어, 1번 지점에서 3번과 4번의 길로 갈 수 있다면 다음과 같이 배열에 저장합니다.

    arr01[1] =3 , arr02[1] =4

    마찬가지로 3번 지점에서 7번 길로만 갈 수 있다면 다음과 같이 배열에 저장합니다.

    arr01[3] = 7, arr02[3] = 0

  2. 경로 유무 찾기

    DFS를 사용합니다. 최대한 깊게 들어가다가 99번 위치에 도착하면 탐색을 종료합니다.

Read more

숫자 고르기

https://www.acmicpc.net/problem/2668

오답 풀이

https://github.com/KoJunHee/algorithm/blob/master/src/bj_2668/Main.java

완전 탐색으로 풀었다. 가능한 모든 경우를 조사하였다. 깊이 들어갈 때 마다, 두 집합이 일치하는지, 깊이는 몇인지 체크한다. 시간 초과가 났다. 모든 경우를 완전 탐색으로 찾으며 푸는것이 아니란 것이다.

정답 풀이

https://github.com/KoJunHee/algorithm/blob/master/src/bj_2668_02/Main.java

사이클 여부를 조사한다. 다음 이동할 지점이 시작점이면 사이클을 이룬 것이다. 문제에서 주어진 예시를 그림으로 그려보자.

1을 시작으로 dfs를 시작하자. 1 방문 체크를 한다. 다음 위치는 3이다. 3 방문 체크를 한다. 다음 위치는 1이다. 이미 방문한 곳이다. 시작점으로 돌아왔으니 싸이클을 이루었다. 시작점인 1을 리스트에 저장한다. 이번 dfs는 끝났다.

2를 시작으로 dfs를 시작하자. 2 방문 체크를 한다. 다음 위치는 1이다. 1 방문 체크를 한다. 다음 위치는 3이다. 3 방문 체크를 한다. 다음 위치는 1이다. 이미 방문한 곳이다. 이미 방문 한곳이 시작점이 아니기 때문에 사이클을 이루지 않는다. 이번 dfs는 끝났다.

Read more