반응형 Data Base/JPA18 [JPA] : 일대일, 1:1 1 : 1은 반대도 일대일이다. 외래키를 둘 중 한 곳에만 넣으면 된다. 외래키에 데이터베이스 유니크 제약조건을 추가를 해야한다. 일대일 관계는 간단하게 구현할 수 있다. @Entity public class Locker { @Id @GeneratedValue private Long id; private String name; } Locker에 간단하게 id와 name를 만들어준다. @Entity public class Member { @OneToOne @JoinColumn(name = "LOCKER_ID") private Locker locker; } Member에서 @OneToOne를 통해 Locker를 1대1 매핑한다. @JoinColumn 어노테이션 정도는 사용해 줘야 깔끔하게 정리가 된다. 여기.. 2022. 4. 13. [JPA] : 일대다, 1:N 일대다는 추천하지 않지만 일대다 양방향 매핑은 사용해도 좋다. 일대다 양방향 매핑은 공식적으로 존재하지 않지만 아래와 같이 사용할 수 있다. @ManyToOne @JoinColumn(name = "TEAM_ID", insertable = false, updatable = false) private Team team; insert와 update를 하지 않는다는 뜻으로 읽기 전용 필드를 생성한다. 이 읽기 전용 필드를 통해 앙방향 처럼 사용할 수 있다. 결국, 테이블 매핑은 단순해야 한다. 항상 유의하자. 기출로 대비하는 개발자 전공면접 [CS 완전정복] 을 참고해서 공부하였습니다. 2022. 4. 13. [JPA] : 다대일, N:1 연관관계 매핑 시 고려사항 다중성 단방향, 양방향 연관관계 주인 다중성 데이터베이스 관점으로 고려하자. 다대일 @ManyToOne 일대다 @OneToMany 일대일 @OneToOne 다대다 @ManyToMany 애매할 땐 반대로도 체크해 보면 된다. 대칭성 이용 다대일 반대는 일대다.. 등등 다대다는 사용하면 안 된다. 단방향, 양방향 테이블 외래키 하나로 양쪽 조인이 가능하다. 방향 개념이 없다. 객체 참조용 필드가 있는 쪽으로만 참조가 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 단방향이 두 개라고 보면 된다. 연관관계 주인 테이블은 외래키 하나로 두 테이블이 연관관계를 맺는다. 연관관계의 주인은 외래키를 관리하는 참조이다. 주인의 반대편은 외래키에 영향을 주지 않고 단순 조회만 가능하다.. 2022. 4. 11. [JPA] : 연관관계 매핑 시작하기 // @Column(name = "MEMBER_ID") // private Long memberId; @ManyToOne @JoinColumn(name = "MEMBER_ID") private Member member; 주석 부분은 이제 사용하지 않는다. 다대일을 설정해 준다. MEMBER_ID에 조인을 걸어준다. 만약, 양방향 매핑을 하고 싶다면 member에서 매핑을 해주면 된다. 일단 지금은 하지 않는다. 가능하면 단방향 매핑이 좋다. 객체 입장에서 양방향은 양쪽 다 신경을 써야해서 별로 좋지 않다. 개발하다 필요할 때 양방향을 넣어준다. 실전에서 JPQL을 많이 쓰는데 이떄 양방향 연관관계가 필요하긴 하다. // @Column(name = "ORDER_ID") // private Long orde.. 2022. 4. 9. [JPA] : 양방향 연관관계와 연관관계의 주인(Owner)에 대한 주의점 양방향 매핑 시 가장 많이 하는 실수 //저장 Member member = new Member(); member.setUsername("member1"); em.persist(member); Team team = new Team(); team.setName("TeamA"); team.getMembers().add(member); em.persist(team); em.flush(); em.clear(); tx.commit(); 이렇게 코드를 바꾸고 실행을 해 본다. TEAM_ID가 null이 뜬다. //저장 Team team = new Team(); team.setName("TeamA"); //team.getMembers().add(member); // 2022. 4. 8. [JPA] : 양방향 연관관계, 연관관계 주인(Owner) 양방향 매핑 지금까지 코딩한 부분은 Member에서 Team으로는 갈 수 있지만 반대로 Team에서 Member로는 갈 수 없다. 근데 사실, 양 쪽은 왔다갔다 할 수 있어야 한다. 그렇게 만들면 양방향 연관관계라고 한다. 테이블의 연관관계는 외래키 하나로 양방향이 다 있는 것이다. 사실, 테이블의 연관관계는 방향이랄 게 없다. 외래키를 넣으면 된다. 문제는 객체이다. Team에서 Member로 갈 수 없는 문제가 있다. 어떻게 해결하나? Team에 List members를 넣어주면 된다. @OneToMany(mappedBy = "team") private List members = new ArrayList(); @OneToMany일대다 mappedBy = "team"나는 team으로 매핑이 되어있다. .. 2022. 4. 8. [JPA] : 연관관계 매핑 기초 좀 더 연관관계를 맺어서 객체지향적으로 설계를 할 지에 대해 공부한다. 기본 매핑 같이 1대1로 매핑하는 것은 쉽고 이것은 객체가 지향하는 패러다임과 관계형이 지향하는 패러다임 이 사이에서 무언가를 잘 찾아야 하는 어려움이 있다. 방향, 다중성, 연관관계의 주인 연관관계의 주인이 어렵다. 책 추천 (조영호) 객체지향의 사실과 오해 오브젝트 Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); member.setTeamId(team.getId()); em.persist(member); 외래키 식별자를 직접 다뤄 데이터를 넣을 수 있다. .. 2022. 4. 6. [JPA] : 기본 매핑하기 @Id @GeneratedValue @Column(name = "ITEM_ID") private Long id; 컬럼명을 따로 정해줄 수 있다. @Entity @Table(name = "ORDERS") // order가 예약어로 걸려있는 경우가 있따. // order by 때문에 그래서 orders라고 쓴다. public class Order { @Id @GeneratedValue @Column(name = "ORDER_ID") private Long id; @Column(name = "MEMBER_ID") private Long memberId; 테이블 이름도 지정해 줄 수 있는데 ORDER가 ORDER BY 예약어로 걸려있는 경우가 있어서 ORDERS로 주로 사용한다. 다른 컬럼도 이름을 걸어줄 수 .. 2022. 4. 6. [JPA] : 기본 키 매핑 키본 키를 매핑하는 방법은 직접 할당과 자동 생성이 있다. 직접 할당은 @Id를 사용하면 된다. 자동 생성은 @GeneratedValue 를 사용하면 된다. 옵션 AUTO : 방언에 따라 자동 지정, 요즘엔 또 다를 수도 있어서 보고 사용해야 한다. IDENTITY : 데이터베이스 위임. MYSQL 기본키 생성을 데이터베이스에 위임한다. SEQUENCE : 데이터베이스 시퀸스 오브젝트 사용, ORACLE TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용한다. @SequenceGenerator @Entity //JPA가 관리하는 객체고 데이터베이스 테이블과 매핑해서 사용하는구나! 하고 알면 된다. //@Table(name = "MBR") //데이터베이스 MBR 테이블이랑 매핑된다. 즉, 매핑 할 .. 2022. 4. 5. [JPA] : 필드와 컬럼 매핑 @Id @Column(name = "name") @Enumerated(EnumType.STRING) @Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP) @Lob //varchar를 넘어서는 큰 데이터를 사용할 때 매핑 어노테이션을 몇 가지 보면 위와 같다. Column으로 컬럼을 매핑한다. temporal으로 날짜 타입을 매핑한다. 세 가지를 지원한다. 요즘에는 temporal보다 LocalDate를 그냥 사용한다. Enumerated enum 타입을 매핑한다. DB에는 enum타입이 없을 수 있으므로 EnumType로 값을 설정해 준다. enum의 ordinal을 사용하면 순서에 대한 오류가 터질 수 있다. → String을 사용하자.. 2022. 4. 5. [JPA] : 데이터베이스 스키마 자동 생성하기 위 코드를 추가하면 데이터베이스 스키마가 자동으로 생성된다. value 부분에 여러 옵션을 사용할 수 있다. create는 기존 테이블을 삭제 후에 다시 생성하고, drop 후 create create-drop은 create와 같으나 종료 시점에서 drop하고, 테스트 케이스를 실행하고 마지막에 깔끔하게 할 때 주로 사용한다. update는 변경분만 반영하고(운영 DB에는 사용하면 안 된다.) validate는 엔터티와 테이블이 정상 매핑되었는지 확인하고 none는 사용하지 않는다. 사실 none는 없는 키워드인데 관례상 쓰는 것이다. 막 써넣는 것과 별 다른 게 없다. 운영 장비에는 절대로 create create-drop update를 사용하면 안 된다고 한다. 테스트한 데이터가 다 날라가버려서 그렇.. 2022. 4. 5. [JPA] : 엔티티 매핑과 매핑 종류 엔티티 매핑 매핑 종류는 여러 종류가 있다. 객체와 테이블 매핑 @Entity, @Table 필드와 컬럼 매핑 @Column 키본 키매핑 @Id 연관관계 매핑 @ManyToOne, @JoinColumn @Entity @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. JPA를 사용해 테이블과 매핑할 클래스는 @Entity가 필수이다. 주의사항도 있다. 기본 생성자가 필수이다. 파라미터가 없는 public, protected 생성자 final 클래스, enum, interface, inner 클래스를 사용하면 안된다. DB에 저장하고 싶은 필드에는 final을 사용하면 안된다. name 속성이 있는데 기본적으로 클래스 명과 동일한 name가 설정된다. 기본 값은 Member여서 Member 테이블.. 2022. 3. 23. [JPA] : 준영속 상태 지금은 어렵다. 나중에 실전에서 웹 애플리케이션을 만들 때 배우는 게 더 좋다. 추후에 다시 다룬다. 영속에서 준영속으로 가는 게 em.persist(member); 이렇게 사용하거나 em.find(member)로 가져올 수 있다. 영속 상태의 엔티티가 영속성 컨텍스트에서 detached 되는 것 즉, 다 떼어 버리는 것이다 영속에서 준영속으로 빠진 상태를 준영속 상태라고 하는 것이다. //영속 Member member = em.find(Member.class, 150L); // member는 영속 상태이다. member.setName("AAAA"); //데이터 변경 em.detach(member); //영속성 컨텍스트에서 관리하지 마! 해버린 것이다. 영속성에서 빠지게 된다. System.out.pri.. 2022. 3. 23. [JPA] : Flush(), 플러시에 대해서.. 플러시, flush 간단 설명 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영 변경 사항과 데이터베이스를 맞추는 것으로 쿼리를 날려주는 것이라고 보면 된다. 플러시가 발생하면 어떻게 되나? 변경 감지가 일어나고 수정된 엔티티가 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. ( 등록, 수정, 삭제 쿼리 등) 플러시가 발생된다고 Commit 되는 것은 아니다. 영속성 컨텍스트를 어떻게 플러시하나? em.flush() 직접 호출한다. 트랜잭션을 커밋하면 자동으로 호출된다. 플러시를 실행해도 1차 캐시가 지워지지는 않고 쓰기 지연 SQL 저장소에 있는 것들이 데이터베이스에 반영이 되는 과정이다.데이터베이스에 쿼리가 즉시 나가고 그 다음에 Commit된다. Me.. 2022. 3. 23. [JPA] : JPA 영속성 컨텍스트(2) 영속성 컨텍스트의 이점은 동일성을 보장하고 트랜잭션을 지원하는 쓰기 지연과 변경 감지, 지연 로딩이다. Member member1 = em.find(Member.class, "member1"); Member member2 = em.find(Member.class, "member2"); 동일성을 비교했을 때 true가 나온다 1차 캐시로 반복 가능한 읽기 등급의 트랜적션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공한다. transaction.begin(); em.persist(member1); em.persist(member2); transaction.commit(); 트랜잭션을 시작하고 em.persist를 해도 INSERT SQL을 데이터베이스에 보내지 않는다. 마지막에 commit을 진.. 2022. 3. 22. [JPA] : 영속성 컨텍스트(1) 영속성 컨텍스트는 JPA를 이해하는데 가장 중요한 용어로 “엔티티를 영구 저장하는 환경”이라는 뜻이다. EntityManager.persist(entity); 엔티티 매니저와 영속성 컨텍스트가 무엇일까? 영속성 컨텍스트는 논리적인 개념으로 눈에 보이지 않고 엔티티 매니저를 통해 영속성 컨텍스트에 접근하는 것이다. 엔티티 매니저가 생성하면 1:1로 영속성 컨텍스트가 생성이 된다. 즉, 엔티티 매니저 안에 눈에 보이지 않는 영속성 컨텍스트가 생기게 되는 것이라고 보면 된다. 엔티티의 생명주기도 알아두면 좋은데 비영속, 영속, 준영속, 삭제가 있다. 비영속은 new 상태라고 하고 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다. 영속은 Managed 상태로 영속성 컨텍스트에 관리되는 상태이다. 준영속은 d.. 2022. 3. 21. [JPA] : JPA 간단 개발과 JPQL 확인하기 데이터베이스에 데이터를 넣어 테스트를 하는 강의를 진행했다. @Entity public class Member { @Id private Long id; private String name; 객체와 테이블을 생성하고 매핑을 먼저 해준다. Entity는 JPA가 관리할 객체이고 Id는 PK설정으로 데이터베이스 PK와 매핑된다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // 팩토리는웹 서버가 올라오는 시점에 DB당 하나만 생성된다. EntityManager em = emf.createEntityManager(); // 고객의 요청이 올 때 마다 썼다가. 버렸다가. 반복해서 동작한다. 때문에 쓰레드간에 공유를 하면 안.. 2022. 3. 20. [JPA] : JPA 사용을 위한 프로젝트 셋팅과 간단 설명 Spring Boot MVC2편을 마치고 JPA 로드맵을 수강한다. 먼저, http://www.h2database.com/html/main.html에서 H2 데이터베이스를 설치하고 실행해 주었다. 윈도우는 /h2/bin/h2.bat을 실행시켜주면 된다. 명령 프롬프트로 실행을 시켜주니 바로 콘솔이 나온다. H2는 실습용으로 강력 추찬하고 있다고 한다. 왜냐하면 일단 가볍고, 웹용 쿼리 툴을 제공한다. MySQL과 Oracle 데이터베이스 시뮬레이션 기능이 있고 시퀸스와 AUTO INCREMENT 기능을 지원하기 때문이다. 이번 프로젝트는 Maven을 사용한다. 메이븐은 자바 라이브러리, 빌드를 관리하고 라이브러리 자동 다운로드 및 의존성을 관리한다. JPA파일 중 일부를 가져왔다. JPA 설정 파일은 고.. 2022. 3. 19. 이전 1 다음 반응형