[JPA] 7. 값 타입
·
Back-End/JPA
JPA의 데이터 타입 JPA의 데이터 타입은 Entity 타입과 값 타입, 2가지로 나뉜다 Entity 타입은 기존에 @Entity Annotation으로 수식해주는 객체이고, Id를 가지고 있어 직접 DB 테이블에 매핑된다 값 타입은 int, Integer, String 처럼 단순히 값으로 사용되는 자바 기본 객체를 칭한다 엔티티에 속하므로 생명주기는 엔티티에 의존하게 된다 @Entity public class Member { private String text; // Member가 사라지면 당연히 text도 사라진다! } 임베디드 타입 값 타입에는 기본 값 타입 이외에도 임베디드 타입(복합 값 타입)이 있는데 프로그래머가 새롭게 정의한 객체라고 생각하면 된다. 예를들어 Member가 다음과 같은 필드..
[JPA] 6. 프록시와 Cascade 및 고아 객체
·
Back-End/JPA
프록시 프록시 패턴에서 나오는 그 프록시이다 프록시란 원래의 객체 인스턴스를 상속받는 새로운 클래스를 칭한다 왜 프록시가 필요한지 생각해보자 Persist Context에서 객체를 EntityManager.find()로 가져올 때, 만약 객체가 다른 객체를 레퍼런스로 가지고 있다면 해당 객체까지 SELECT 쿼리가 나갈 것이다. public class Member { private Long id; private Team team; } public class Team { } public static void Main(){ Member member = new Member(); member.setId(1L); EntityManager.persist(member); EntityManager.flush(); En..
[JPA] 5. 상속관계 Mapping & Mapped Superclass
·
Back-End/JPA
상속관계 Mapping 계속해서 DB와 OOP의 패러다임 문제가 발생하는데, 이번에는 상속문제이다 OOP는 상속을 중요시하기에 언어적으로 완벽히 지원해준다 하지만 RDB는 상속을 일부 지원하긴 하지만 완벽히 지원해주지 않는다 대신 슈퍼타입과 서브타입이란걸 지원해주는데 JPA는 이 상속문제를 해결하는 3가지 전략을 제공한다 조인 전략 단일 테이블 전략 구현 클래스마다 테이블 전략 부모 클래스에 다음과 같은 Annotation을 붙여주면 된다 @Entity @Inheritance(strategy=InheritanceType.XXX) public class Parent { } @Entity public class Children1 extends Parent{ } 따라서 테이블 전략을 바꾸더라도 전체 코드를 바..
[JPA] 4. Entity간의 연관관계 Mapping
·
Back-End/JPA
연관관계 JPA에 의해 관리되는 Entity들의 실제 DB Table에서, Join Query를 통해 연관관계가 필요한 Table이 있다. Foreign Key를 통해서 Join을 한 다음에 연관관계를 맺어주는데, (RDB에서는) JPA에서는 이런 관계를 어떻게 맺어줄 수 있을까? 실제 테이블에 맞춰보기 Member는 Team에 소속될 수 있다 현재 자신이 속한 Team을 DB에 저장하기 위해, Team의 PK인 TEAM_ID를 자신의 FK로 가지고 있다 Table 구조상 문제될건 없지만, 객체 구조가 저렇게 된다면 JPA를 쓰는 목적에 어긋나게 된다 우리는 처음에 객체지향적으로 DB를 사용하고 싶어서 JPA를 쓴 것이었다 Member가 속한 Team을 찾고 싶다면 다음과 같이 코드를 작성할 것이다 Me..
[JPA] 3. Entity Mapping
·
Back-End/JPA
Entity JPA에게 관리를 맡길 객체. @Entity로 객체를 수식해준다 @Entity class Member { public Member() { } } 이때 주의해야할 점은 해당 객체는 파라미터가 없는 기본 생성자가 있어야 한다는 것이다. JPA는 리플렉션 기능을 이용해 인스턴스를 동적으로 생성하기 때문에 필요하다는데 리플렉션이 C#에만 있는줄 알았는데 Java에도 있어서 신기했다 Java Annotation에는 속성을 줄 수 있는데 Entity Annotation에서 사용하는 속성은 아래와 같다. name : JPA에서 사용할 Entity name, 이름이 같은 클래스를 사용해야 하는 문제를 해결하기 위함 Table : Entity와 매핑할 Table 지정 name : Table 이름 unique..
[JPA] 2. Persistent에 대한 이해
·
Back-End/JPA
Persistent JPA는 이름에서 알 수 있듯이 'Persistent' 라는 개념위에서 동작하게 된다. 위의 그림을 보면 애플리케이션에 유일하게 존재하는 Entity Manager Factory에서 Request들을 처리하기 위해 Entity Manager를 내어준다. 각 Request들은 DB를 사용하게 되는데, 이때 Entity Manager가 갖고 있는 Persistent를 통해 사용하게 된다 EntityManager.persist(member); // DB에 Member Entity 저장 예시 주석으로 DB에 저장한다고 써놓았지만, 사실 DB에 바로 저장이 되는것이 아닌 Entity Manager가 관리하는 Persistent에 저장된다. Entity의 생명주기 Persistent에 저장되는 ..
[JPA] 1. JPA에 대한 이해
·
Back-End/JPA
JPA(Java Persistent API) JPA에 대해서는 이름만 들어보다가 이번에 학회에서 같이 스터디를 하게 되어 공부를 시작했다. JPA는 Java진영의 표준 ORM(Object-Relational-Mapping)기술로써, 별도의 쿼리 및 테이블 설계 없이 오직 자바 코드로만 RDB를 자유자재로 이용할 수 있게 해주는 기술이다. 근데 ORM이 뭐지? ORM(Object-Relational-Mapping) 이름에서 알 수 있듯이, Object와 Relational을 Mapping 해주는 기술이다. 여기서 Object란 OOP(Java, C#, Python) 언어이고 Relational은 RDB(MySQL, Postgresql, MariaDB)등을 말한다. 즉, RDB의 기본 쿼리와 테이블 설계를 ..