1. 개요 JPA는 데이터 타입을 크게 두 가지로 분류합니다. Entity 타입 Value 타입 이 중 Value 타입에 대해 살펴보겠습니다. 2. Value 타입 Value 타입은 값의 변경을 추적할 수 없는 타입을 말합니다. int, double와 같은 Primitive 타입뿐만 아니라, Integer, String과 같은 클래스도 참조는 가지지만 값의 변경을 추적할 수 없기 때문에 마찬가지로 Value 타입에 속합니다. (값의 변경을 추적할 수 없다는 말은 값을 변경할 수 없다는 의미입니다. Integer, String의 값을 변경하면 참조하는 주소가 바뀝니다.) JPA의 Value 타입은 세 가지로 나눠 생각해볼 수 있습니다. 기본 값 타입: int, double와 같은 Java의 Primitiv..
1. 프록시(Proxy) JPA의 Proxy 특징은 다음과 같습니다. 프록시 객체는 처음 사용할 때 한 번만 초기화합니다. 프록시 객체를 초기화할 때, 프록시 객체가 실제 Entity로 바뀌는 것은 아닙니다. (프록시 클래스의 필드로 Entity를 가집니다.) 초기화되면 Proxy 객체를 통해서 실제 Entity에 접근할 수 있습니다. Proxy 객체는 Entity 클래스를 상속받습니다. 따라서 타입 비교시 주의해야 합니다. (instance of 사용) 영속성 컨텍스트에 찾는 Entity가 이미 있으면 em.getReference()를 호출해도 실제 Entity가 반환됩니다. 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제가 발생합니다. (이 경우 Hibernate는..
[Spring Data JPA] 고급 매핑(상속 관계 매핑, @MappedSuperclass)
2021.11.16
1. 상속 관계 매핑 객체 모델에서 상속관계는 아주 흔합니다. 그런데 관계형 DB는 상속관계가 없는데 어떻게 해야 할까요? 관계형 DB에는 슈퍼타입-서브타입 관계라는 모델링 기법이 있는데, 이 모델로 객체의 상속관계와 매핑할 수 있습니다. 위 슈퍼/서브 타입 논리 모델을 가지고 설명해보겠습니다. 우선, 슈퍼/서브 타입 모델은 논리적인 데이터 모델에서만 이용되는 형태이기 때문에 물리적인 데이터 모델로 변환 작업이 필요합니다. 슈퍼/서브 타입 논리 모델을 물리 모델로 변환하는데에는 3가지 방법이 있습니다. 각각 테이블로 변환(JOINED 전략) - 위 형태 그대로 테이블을 만들어 item_id 와 같은 컬럼으로 JOIN하는 방법 통합 테이블로 변환(SINGLE_TABLE 전략) - 위의 예에서 ITEM 테이..
1. 개요 이전 포스팅에서 객체 연관관계에서의 단방향 관계, 양방향 관계에 대해 살펴봤습니다. 이제 DB 테이블 기준으로 경우의 수를 나눠서 생각해보겠습니다. DB 테이블의 관계는 총 4가지로 나뉩니다. 다대일 N:1 일대다 1:N 일대일 1:1 다대다 N:M 위 관계는 좌측 테이블을 기준으로 잡고 좌측에 외래 키가 있는 경우를 나타냈습니다. 예를 들어, N:1 관계는 N쪽에 외래 키가 있는 경우고, 1:N 관계는 1쪽에 외래 키가 있는 경우입니다. 위와 같은 4개의 DB 테이블 관계에 대해 나눠서 살펴보겠습니다. 2. N:1 이전 포스팅에서도 살펴봤듯이, 가장 일반적이고 대표적이고 직관적인 모델입니다. 아래 N:1 테이블을 기준으로 설명하겠습니다. 두 가지 경우로 나눠보겠습니다. Member->Team..
1. DB 테이블 중심으로 Entity 클래스를 설계했을 때의 문제점 다음과 같은 관계를 가지는 테이블을 가지고 설명하겠습니다. DB 테이블에 맞춰 Member Entity 클래스를 설계하면 다음과 같이 될 것입니다. @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long memberId; private String username; private Long teamId; } 보시면 테이블의 컬럼에 맞춰서 Entity 클래스의 필드를 정의했습니다. 이러면 멤버와 멤버가 속한 팀을 조회할 때 멤버를 우선 조회한 후, 가져온 teamId 값으로 다시 Team 테이블을 조회해야 합니다. Member..
1. Hibernate의 DB 테이블 자동 생성 들어가기에 앞서, 개발 및 로컬 환경에서 테스트를 용이하게 하는 DB 테이블을 자동으로 생성해주는 기능을 알아보겠습니다. 보통 개발할때 DB 테이블을 먼저 만드는데요, Hibernate에서 지원하는 DB 테이블 생성 기능을 사용하면 이 과정을 생략할 수 있습니다. /META-INF/persistence.xml 설정 파일에 다음과 같이 hibernate.hbm2ddl.auto 옵션을 설정해줍니다.
1. 영속성 컨텍스트 영속성 컨텍스트는 객체와 관계형 데이터베이스 사이에 위치하는 공간, 즉 중간 계층입니다. 영속성 컨텍스트라는 중간 계층을 둠으로써 얻는 이점은 다음과 같습니다. 1차 캐시 조회한 entity 객체의 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연 변경 감지(Dirty Checking) 지연 로딩(Lazy Loading) 위 5가지 이점을 차례로 살펴보겠습니다. 우선 1차 캐시부터 살펴보겠습니다. 1.1 1차 캐시 다음과 같이 entity 객체를 생성하고 .persist() 메서드를 이용해 entity 객체를 영속시킨다고 해보겠습니다. Member member = new Member(); member.setId("member1"); member.setUsername("회원..
1. JPA를 이용한 CRUD /META-INF/persistence.xml 파일에 JPA 설정값을 정의합니다. (어떤 DB를 사용할지, 계정 정보, Hibernate 관련 추가 속성) 다음으로 main 메서드에서 EntityManager를 이용한 코드입니다. public class Main { public static void main(String[] args) { // 파라미터는 /META-INF/persistence.xml 이라는 JPA 설정 파일에 정의해놓은 // 를 의미합니다. EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("hello"); // EntityManager가 DB 커넥션을 물고 있기 때문에 사용 후 ..
1. Intent란? 안드로이드 앱을 구성하는 4대 컴포넌트는 다음과 같습니다. Activity Broadcast Receiver Content Provider Service 컴포넌트 클래스는 시스템이 생성해서 실행하는 클래스입니다. 그래서 컴포넌트를 실행하고 싶다면 시스템에 제 의도를 담은 메시지를 전달해 컴포넌트 실행을 요청해야 합니다. 이를 위해 Intent 객체가 사용됩니다. 다음은 MainActivity에서 명시적 인텐트를 이용해 SubActivity 실행을 요청하는 코드입니다. class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedIn..
1. 개요 Java를 이용해 DB 작업을 할때 최초에는 가장 네이티브한 JDBC API를 이용했습니다. JDBC API를 사용해보신 분들은 아시겠지만, 항상 Connection 객체를 받아와서.. SQL 코드 적고, 실행한 후 마지막에는 .close() 로 자원을 해제해줘야 합니다. 중복 및 불필요한 코드 때문에 생산성이 너~무나 떨어졌습니다. 그래서 자원 관리는 누가좀 알아서 해주고 개발자는 SQL 코드만 신경쓸 수 있게하자 해서 나온게 MyBatis, Spring JDBC와 같은 SQL 매퍼입니다. SQL 매퍼를 사용하면 자원 관리를 알아서 해주니 너무 편리했습니다. 하지만 개발자가 SQL을 직접 작성한다는 것으로 인해 여전히 몇 가지 문제가 남아있었습니다. // 개발자가 SQL을 직접 작성해야한다면..
1. 트랜잭션이란? 트랜잭션은 DB의 작업 처리 단위를 말합니다. 대표적인 예가 입출금인데 제가 홍길동에게 100원을 송금한다고 가정해보겠습니다. 내 통장에서 100원이 감소한다. 홍길동 통장에 100원이 증가한다. 위 두 과정은 한 묶음으로 반드시 모두 실행됨을 보장하여야합니다. 내 통장에서는 100원이 감소되었는데, 홍길동 통장에는 100원이 증가되지 않는 불상사를 막기 위해서입니다. 이 묶음이 모두 정상적으로 실행되었다면 COMMIT을 해주고, 중간에 에러가 났다면 ROLLBACK을 하여 그동안의 작업을 모두 되돌립니다. 트랜잭션은 4가지의 특징을 가집니다. 이 4가지 특징의 앞글자만 따서 ACID라고 부릅니다. 원자성(Atomicity): 트랜잭션은 더 이상 분해가 불가능한 최소한의 작업 처리 단..
1. 문제 이 문제는 아주 평범한 배낭에 관한 문제이다. 한 달 후면 국가의 부름을 받게 되는 준서는 여행을 가려고 한다. 세상과의 단절을 슬퍼하며 최대한 즐기기 위한 여행이기 때문에, 가지고 다닐 배낭 또한 최대한 가치 있게 싸려고 한다. 준서가 여행에 필요하다고 생각하는 N개의 물건이 있다. 각 물건은 무게 W와 가치 V를 가지는데, 해당 물건을 배낭에 넣어서 가면 준서가 V만큼 즐길 수 있다. 아직 행군을 해본 적이 없는 준서는 최대 K만큼의 무게만을 넣을 수 있는 배낭만 들고 다닐 수 있다. 준서가 최대한 즐거운 여행을 하기 위해 배낭에 넣을 수 있는 물건들의 가치의 최댓값을 알려주자. 2. 입력 첫 줄에 물품의 수 N()과 준서가 버틸 수 있는 무게 K($1 \le..