JPA 52

12. 필드와 컬럼 매핑

테이블 @Entity 매핑은 그냥 뭐 이름정도 맞춰준다거나 별거 없는데, 필드랑 컬럼은 좀 타입이라던지 몇개 있음. 요구사항 1. 일반회원과 관리자로 구분 2. 회원가입일과 수정일이 있어야 함. 3. 회원을 설명할 수 있는 필드가 있어야 하며, 이 필드는 길이제한이 없다. ?? 3번은 좀 위험한거 아닌가.. 여튼 그러면 id, username, 생성일, 수정일, 설명, 역할 요 6개쯤? @Entity public class Member { @Id private Long id; @Column(name="name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; ..

JPA/JPA 기본 2023.10.21

11. DB 스키마 자동 생성

JPA는 매핑 정보만 봐도 어떤 테이블인지, 열은 뭔지, 어떤 쿼리를 만들어야 하는지 까지도 알기 때문에, 테이블도 자동으로 생성할 수 있다. 당연히 운영단계에서 사용하는 것은 아니고, 개발에서 테스트 할 때나 로컬PC에서 작업할 때 도움이 된다. 자동생성 된 것이므로, 약간 의도되지 않은 면 들이 있음. 근데 개발할때만 쓸거라 상관은 없음. 이걸 사용하려면 우리가 JPA에게 DB정보를 정의해 뒀던 persistence.xml에 속성을 추가 해 줘야 함. ddl auto를 create로 하겠다. 이렇게 하면은, 자동으로 테이블을 생성함. Hibernate: drop table if exists Member cascade Hibernate: create table Member ( id bigint not ..

JPA/JPA 기본 2023.10.21

10. 객체와 테이블의 매핑

영속성 컨텍스트 개념과 더불어 중요함. 매핑 순서? 매핑할 때 해야 할 것들은 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑 : @Column 기본 키 매핑 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn 연관관계 매핑은 관계형DB에서의 1대다, 다대다 등의 관계를 JPA에서는 어떻게 매핑할 것인가. 하는 것. @Entity 이게 붙은 클래스는 JPA가 관리하는 클래스이다. JPA를 사용하여 테이블과 매핑할 클래스는 이것이 필수이다. 그리고, JPA가 다루는 클래스는 기본생성자(파라미터 없는 생성자를 public이나 protect로)가 꼭 있어야 하며, final, enum, interface, inner 클래스를 사용하면 안된다. 저장하고 싶은 필드에 fi..

JPA/JPA 기본 2023.10.21

9. 준영속 상태

영속 상태는 영속성 컨텍스트 안에 있는 상태 준영속 상태는 엔티티가 영속성 컨텍스트에서 분리된 상태. 영속상태는 persist 하거나 find 해서 DB에서 찾아왔을 때 영속성 컨텍스트의 1차 캐시에 넣어지면서 이렇게 영속성 컨텍스트 안에서 관리되게 되는 것 들을 영속 상태 라고 함. 준영속은 영속성 컨텍스트에서 벗어난 거니 영속성 컨텍스트가 관리해주는 대상에 포함되지 않음. 더티체킹 등. 준영속으로 만드는 방법은 em.detach(member); //특정 엔티티를 준영속 상태로 만듦. em.clear(); //영속성 컨텍스트를 완전히 clear 함 em.close(); //아예 영속성 컨텍스트를 닫아버림. detach()를 쓰면 member와 관련된 모든 것들이 영속성 컨텍스트에서 빠져나감. 뭐 스냅샷..

JPA/JPA 기본 2023.10.20

8. 플러시

플러시란, 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것, 즉 쿼리를 날리는 것 일듯. 플러시가 발생하면 일어나는 일 변경 감지 엔티티의 변경된 사항을 SQL로 번역하여 쓰기 지연 SQL 저장소에 등록 쓰기 지연 SQL 저장소에 있는 쿼리들을 DB에 날림. 아마 긴 문장으로 같이 전송하지 않을까..? 플러시 직접 쓸 일은 없는데 테스트 등 알아는 놔야 한다고 함. em.flush() 이게 플러스 직접 호출 나머지 자동 호출임. 트랜잭션 commit 시점에. JPQL 했을때도 자동호출이라는데 지금은 그냥 알아두기만 하라고 함.. 플러시의 행동은, 위에 말했던 게 다임. 짧게 얘기하면, 그냥 변경감지 하고 변경된거 있으면 쓰기 지연 SQL 저장소에 들어가고, 쓰기 지연 SQL 저장소에 있는 쿼리들을 DB..

JPA/JPA 기본 2023.10.20

7. 영속성 컨텍스트 2

Member member= new Member(); member.serId("member1"); member.setUsername("회원1"); em.persist(member); 저렇게 EntityManager 내부에 있는 영속 컨텍스트에 EntityManager를 통해 persist로 영속화 시키면, 저렇게 키가 id, Entity가 그 객체가 된 상태로 영속 컨텏트에 저장된다. 이것이 캐싱이다. 이렇게 하면 이점이, Member findedMember = em.find(Member.class, 1L); 이렇게 조회 시에, 먼저 캐싱된 거에 있는지 id로 조회해본다. 그럼 DB를 안거치기 때문에 성능이점이 있다. 없으면 DB에서 조회해 온 다음, 또 그걸 영속성 컨텍스트에 저장시켜 캐싱한다. (참고로..

JPA/JPA 기본 2023.10.20

6. 영속성 컨텍스트

JPA에서 가장 중요한 2가지 객체와 RDB 매핑 영속성 컨텍스트 앞서, EntityManagerFactory와 EntityManager EntityManagerFactory에서 앞서 우리가 명시한 persistence,xml대로 EntityManagerFactory가 만들어 지고, 거기서 이름을 지정하여 EntityManager를 생성할 수 있다. 그럼 이 EntityManager는 내부적으로 커넥션을 사용하여 DB와 소통한다. 영속성 컨텍스트란 엔티티를 영구 저장하는 환경. 우리가 EntityManager.persist(entity); 하면 entity를 DB에 저장한다, 이렇게 배웠는데, 더 정확하게 말하면, 영속성 컨텍스트를 통해서 저 엔티티를 영속화 한다는 뜻이다. 즉, 저 순간 DB에 쿼리를 ..

JPA/JPA 기본 2023.10.20

5. 개발

JPA 구동 방식 JPA는 Persistence라는 클래스가 있는데, 저게 persistence.xml을 읽어서 EntityManagerFactory라는 클래스를 만듦. 그 후, 필요할 때 마다 EntityManager라는 것을 생성해서 그걸 사용하면 됨. 자 여튼 본격적으로 실습해 보자면, public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); } } 이렇게 팩토리 생성해서 "hello"해서 저기에 관한 정보들로 구성된 팩토리를 생성해 주고 한번 실행해봤는데 막 빨간줄로 쫘라락 뜸. 근데 이렇게 된거면 잘한거라..

JPA/JPA 기본 2023.10.19

4. 프로젝트 생성

강의가 옛날거라 Maven 써서 좀 그렇다.. 스프링 부트도 안쓴다.. 근데.. 저 groupId 할 때 - 썼더니 저게 패키지 src java 내부에 패키지로도 생성되고 거기에 메인 패키지가 생기는데 패키지이름으로 - 이거 쓰면 안되는 듯? refactor -> rename 해주면 정상적으로 되긴 함. 아니면 아예 그 생성된 패키지 자체를 지워버리고, 새로 패키지 만들어서 거기 안에 main 클래스 만들고 main 메소드 넣어줘도 되긴 함. 보면 pom.xml이 생기는데 이게 build.gradle 역할 4.0.0 jpa-basic ex-hello-jpa 1.0-SNAPSHOT 17 17 UTF-8 이렇게 되어 있음. 이제 종속성, 즉 라이브러리 추가해 줘야 함. 4.0.0 jpa-basic ex-he..

JPA/JPA 기본 2023.10.19

3. JPA

Java Persistence API 자바 영속성 API 자바 진영의 ORM 기술 표준 Object-Relational Mapping 오브젝트 관계 매핑 말 그대로 오브젝트랑 관계형 DB 매핑 기술 패러다임 불일치 등 해결해 줌 대부분 대중적인 언어는 ORM 기술 존재 JPA도 결국 JDBC를 쓰는 거. 저장 하면 (persist가 insert 하면서 저장시키는 거임) JPA 내부에선 먼저 객체를 분석하고 그에 따라 insert 쿼리를 생성하고 그걸 JDBC를 통해 DB에 날림. find 하면 쿼리 생성하고 JDBC를 통해 DB에 쿼리 날림 DB에서 결과 반환된 걸 JDBC로 받고, JDBC에서 받은 ResultSet JPA에서 지정한 엔티티와 매핑하고 돌려줌 JPA는 표준임. 아래가 구현체들. 보통 거..

JPA/JPA 기본 2023.10.19