월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 양방향 연관관계에서 N+1 문제
엔티티 연관 관계Recruitment <(1)---(1)> Study 엔티티 코드@Entity public class Recruitment { @Id @GeneratedValue @Column(name = "recruitment_id") private Long id; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "id") private Study study; }@Entity public class Study { @Id @GeneratedValue @Column(name = "study_id") private Long id; @OneToOne(mappedBy = "study", fetch = FetchType.LAZY) private Recruitment recruitment; } 질문Recruitment 를 조회하고 Study 프록시 객체에 접근할 때, Recruitment 조회 쿼리가 한 번 더 나가는 이유를 모르겠습니다. (자세한 내용은 아래 코드의 주석으로 추가했습니다.) 테스트 코드 @Test @Transactional void test() { Study study = new Study(); study.setTitle("스터디A"); studyRepository.save(study); Recruitment recruitment = new Recruitment(); recruitment.setStudy(study); recruitment.setTitle("스터디A의 모집공고"); recruitmentRepository.save(recruitment); entityManager.flush(); entityManager.clear(); // ---------------------// Recruitment findRecruitment = recruitmentRepository.findById(1L).get(); // Recruitment 조회 System.out.println("findRecruitment.getStudy() start"); Study findStudy = findRecruitment.getStudy(); System.out.println("findRecruitment.getStudy() end"); System.out.println("findStudy.getTitle() start"); String title = findStudy.getTitle(); // Study 지연로딩만 나갈 것으로 예상했지만, Recruitment 조회도 발생함 System.out.println("findStudy.getTitle() end"); }SQL 로그select r1_0.recruitment_id, r1_0.id, r1_0.title from recruitment r1_0 where r1_0.recruitment_id=? // "findStudy.getTitle() start" (Study 지연 로딩) select s1_0.study_id, s1_0.title from study s1_0 where s1_0.study_id=? select // Recruitment 조회 로직이 왜 또 나가는가? r1_0.recruitment_id, r1_0.id, r1_0.title from recruitment r1_0 where r1_0.id=? // "findStudy.getTitle() end"
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
entity 필드의 접근 제한자를 private으로 줘야 하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.영한님 안녕하십니까. jpa 공부하면서 프로젝트 진행 중에 문제가 있어 질문 드립니다.entity의 경우 필드값을 private 접근 제한자를 줘야 하는 이유가 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
고아객체..이해가안되요
cascadeType.ALL 로 했을때부모엔티티 삭제하면 당연히 자식도 다 삭제되자나요?그런데 orphanRemoval = true가 왜 필요한가요?어차피cascadeType.ALL 로 하면 부모가 사라졌을때 자식도 다 삭제되는데..
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티매니지먼트팩토리 생성질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]수업내용에서 엔티티매니저팩토리는 생섭 비용이 많이 들어서 애플리케이션에 보통 한 개만 생성한다고 하셨는데persistence.xml 파일에 엔티티매니저팩토리를 하나만 생성해야 한다는 의미 인가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
AddressEntity delete
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 강의 후반부에서 member의 addressHistory에 AddressEntity를 추가하는 것까지 알려주셨는데member의 addressHistory에서 AddressEntity 값 하나를 삭제하고 싶을때이런 방식으로 하는게 맞는지 궁금합니다.equals와 hashCode도 잘 고친건지도 궁금합니다. //Address의 equals, hashCode @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Address address = (Address) o; return Objects.equals(getCity(), address.getCity()) && Objects.equals(getStreet(), address.getStreet()) && Objects.equals(getZipcode(), address.getZipcode()); } @Override public int hashCode() { return Objects.hash(getCity(), getStreet(), getZipcode()); } //AddressEntity의 equals, hashCode @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; AddressEntity that = (AddressEntity) o; return Objects.equals(getId(), that.getId()) || Objects.equals(getAddress(), that.getAddress()); // } @Override public int hashCode() { return Objects.hash(getId(), getAddress().getCity(), getAddress().getStreet(), getAddress().getZipcode()); // } Member findMember = em.find(Member.class, member.getId()); List<AddressEntity> addressHistory = findMember.getAddressHistory(); addressHistory.remove(new AddressEntity("city1", "street", "zipcode"));
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 flush 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]이전에 동일한 질문을 주신 분들이 있었는데 답변이 잘 이해가 가지 않아 질문 드립니다.영속성 컨텍스트에서 flush() 메소드를 직접 호출하면DB에 바로 요청이 나간다고 강의에 나와있습니다. (DB 반영은 X)이 부분 까지는 이해가 갑니다. 그런데 이전 강의에서 commit() 가 동작하면 flush() 가 동작한다고 했습니다.그러면 결국 코드상에서 flush()가 2번 요청이 되어 쿼리가 2번 나가야 맞는거 같은데 이해가 안가서 질문드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
어떤 경우에 양방향 연관관계를 사용하나요??
[질문 내용] 제가 생각하는 양방향 연관관계를 사용하는 이유는 다음과 같습니다. 1) 조회 : team.getMembers().stream ... 근데 이러면 모든 Member 들이 DB에서 불러와지니까 만약 조회해야 할 대상이 많은 경우(members가 너무많아서 페이징 처리를 해야 하는 경우) 는 양방향 연관관계를 삭제하고 그냥 JpaRepository 에서 쿼리로 페이징 쿼리를 작성해야 한다. 2) CascadeType.all 혹은 orphanRemoval true 를 위한 매개체 1번, 2번 이외에는 쓸데없는 것 맞을까요?? 특히 강조한 부분의 제 생각이 맞는지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계와 연관관계의 주인
안녕하세요! 현재 열심히 공부하고 있는 취준생입니다. 다름이 아니라 지금 복습을 하다가 연관관계의 주인 쪽이 좀 살짝 헷갈려서 질문을 남기게 되었습니다. 제가 이해한 바로는 다대일, 일대다 -> 다(N) 이 연관관계의 주인 , 연관관계의 주인만이 외래키를 등록, 수정 가능하다로 이해했습니다. 지금 제가 첨부한 2번째 사진을 보면 MEMBER 에 TEAM_ID 라는 외래키가 있고 MEMBER 가 다(N) 이기 때문에 연관관계의 주인이다. 여기까지는 완벽하게 이해를 했습니다.근데 제가 지금 헷갈리는 포인트가 뭐냐면, 주인은 mappedBy 속성을 사용할 수 없다고 했습니다. 근데 mappedby 뜻 자체가 ~에 의해 되었다 니까 mappedby = "" 에 오는게 주인 아닌가요?? 결론적으로 제가 궁금한것은 3번째 사진에 @OneToMany(mappedby = "team") 이 부분인데, team 객체와 TEAM_ID 라는 외래키가 연관관계를 맺고 있어서 해준건가요?....ㅠㅜㅜㅜ 너무 헷갈리네요 ㅜㅜㅜㅜㅜ 지금 Member 클래스에 private Team team; 이라는 코드가 있는데, mappedby 뒤에 온 team 이 private Team team 이 team 인거 같은데 왜 mappedby = "team" 이렇게 된건가요?? 외래키와 연관관계를 맺고 있어서 그런건가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계
사진속에서 List memebrs 가 있는 이유가 Team 과 Member 가 서로를 조회하기 위해서 있는게 맞는건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값 타입 컬렉션 중복저장
강의에서 값 타입 컬렉션은 모든 컬럼이 기본키가 되기 때문에 중복저장이 되지 않는다고 하셨는데 중복 저장이 가능하여 문의 드립니다.public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { Address address = new Address("city", "street", "1"); Member member = new Member(); member.setUsername("member1"); member.setWorkAddress(address); member.getFavoriteFoods().add("치킨"); member.getFavoriteFoods().add("피자"); member.getAddressHistory().add(address); member.getAddressHistory().add(address); em.persist(member); em.flush(); em.clear(); System.out.println("====================="); Member findMember = em.find(Member.class, member.getId()); List<Address> addressHistory = findMember.getAddressHistory(); addressHistory.forEach(Address::getCity); Set<String> favoriteFoods = findMember.getFavoriteFoods(); favoriteFoods.forEach(System.out::println); findMember.setHomeAddress(new Address("newCity", address.getStreet(), address.getZipcode())); // 치킨 -> 한식 findMember.getFavoriteFoods().remove("치킨"); findMember.getFavoriteFoods().add("한식"); // 주소 변경 findMember.getAddressHistory().remove(new Address("city", "street", "1")); findMember.getAddressHistory().add(new Address("newcity", "new", "100")); tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { em.close(); } emf.close(); }
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실전 예제 1 인텔리제이 무료 버전 프로젝트 생성
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 질문 1.현재 인텔리 제이 무료 버전을 사용하고 있는 수강생입니다.실전 예제 1 - 요구사항 분석과 기본 매핑을 시작하려는데강의에서 프로젝트를 새로 생성하는 부분에서[위 사진은 강의 영상][위 사진은 인텔리 제이 무료 버전 사진] 일단 강의와 프로젝트 생성 부분이 다르며,maven Archetype으로 선택하여 같은 부분에jpabook, jpashop을 작성하고 create하면[아래 사진처럼 빨간부분을 선택하라고 나옵니다.]여기 부분을 어떤걸 선택하여 프로젝트를 생성해야 할까요??? 질문 2.인텔리제이 무료 버전은 이것만 나오는지도 궁금합니다. 답변 주시면 감사하겠습니다.!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
CascadeType 자식 엔티티 삭제
public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tr = em.getTransaction(); tr.begin(); try{ Parent parent = new Parent(); Child child = new Child(); Child child1 = new Child(); parent.addChild(child); parent.addChild(child1); em.persist(parent); em.flush(); em.clear(); Parent newParent = em.find(Parent.class, parent.getId()); Child child2 = newParent.getChildList().get(0); em.remove(child2); tr.commit(); } catch (Exception e){ tr.rollback(); e.printStackTrace(); } finally { em.close(); } emf.close(); } }안녕하세요 CascadeType 관련해서 질문을 남깁니다. Parent에 CascadeType을 ALL 또는 PERSIST로 했을 때 위에서 child 삭제 쿼리가 나가지 않습니다. 다른 속성들은 모두 잘 동작을 하는데 왜 저 두 속성만 안되는건지 혹시 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
어떤 경우 cascade 를 적용해도 되는지 이해가 되지 않습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]스프링 cascade 활용도 측면에서 궁금한 것이 있습니다. 영한님 - 인프런 (inflearn.com)이 질문을 남겼었던 수강생입니다! 잠깐 상황을 요약하면 Program 과 Review 그리고 User 가 다대 1 1대 다 로 묶여 있는 상황입니다. program 에서 program.addReview 메서드를 활용하기 위해 cascade type 을 적용하였었습니다. 하지만 영한 님은 이부분의 코드는 별로 좋은 코드가 아니다! cascade 옵션 질문 - 인프런 (inflearn.com)를 참고해서 보아라. 라고 하셨습니다. 위 질문의 요약은 강의에서 Order 는 OrderItem 을 개인 소유 하나, Order 와 Delivery 는 Delivery 가 여러 곳에서 참조할 수 있으므로 개인 소유 하지 않는다. 라고 읽었습니다. 참조 하는 것과 Cascade Type .all 이 무슨 관계가 있는지 모르겠습니다. 6줄요약하면: Delivery 와 Review 는 여러 곳에서 참조할 수 있으므로 CascadeType all 을 붙이지 말라고 하신 것 같은데 여러 곳에서 참조가능성이 있으면 CascadeType all 을 왜 붙이지 말아야 하는지 궁금합니다. 단순히 계속 코드를 보며 추적해야 하는 것 때문인가요?? 이 부분이 와닿지 않습니다. 혹시 실제 예를 들어 설명해주실수 있나요??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 내 커리큘럼 엑셀로 받아볼 수 있나요
복습용으로 강의 내 커리큘럼 리스트를 받아보려고 하는데 일일이 수작업으로 하려고 하니 좀 번거로워서 문의드립니다. 혹시 커리큘럼을 export 할 수 있는 기능이 있나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
9:52초 테이블 생성 부분 질문드립니다.
ORDERS 테이블의 ORDER_ID 컬럼은 만들지 않으신 것 같은데 혹시 이 부분 생략하신건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
EntityManager의 쿼리 순서 보장
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. JPA의 영속성 컨텍스트의 쿼리 순서 보장에 대해 궁금한 점이 있어 연락드렸습니다.@Transactional public void deleteUser(Long userId) { seniorRepository.findByUserId(userId).stream() .forEach(seniorService::deleteSenior); User user = findUserById(userId); userRepository.delete(user); } senior 객체가 user객체를 외래키로 가지는 상태입니다.user 객체를 삭제하고, senior 객체는 삭제하지 않기 위해서 위와 같은 코드를 작성하였습니다. deleteSenior 메서드에서는 senior의 User 참조 값을 null로 바꾸어 주는 역할을 수행합니다.그리고 같은 트랜잭션 내에서 user까지 삭제하는 코드입니다. 위 코드에서 senior의 User 참조 값을 null로 변경하는 update 로직과, user를 삭제하는 delete 로직이 트랜잭션이 종료된 시점에 한번에 쿼리로 생성되어 데이터베이스로 날아가는것이 맞는지 궁금합니다. 만약 그렇다면, 두 쿼리의 순서를 보장할 수 있는지 궁금합니다.엔티티 매니저는 key-value 형태로 정보를 저장한다고 하여 순서가 보장되지 않을 것 같은데, 순서가 보장된다면 어떤 것에 의해서 순서가 보장되는지도 알려주시면 감사하겠습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
H2데이터 베이스에 데이터가 사라져요
===[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Member를 생성할 때까진 잘 되다가 조회하는 단계에서System.out.println 출력문은 안뜨는 이유가 무엇일까요? h2 데이터베이스에 가보면 저장했던 member가 사라져있습니다. 영속성이 사라진 건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
임베디드타입과 @MappedSuperclass의 차이
둘 다 상속관계 매핑과 관련 없고 속성만 상속받기 위해 사용되는 것 같은데 어떤 차이가 있는지 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL 숫자 연산 함수 관련해서 문의드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. COUNT(*) 함수를 사용해서 Member의 수를 카운트 하는 테스트를 했는데, 반환 타입을 Integer로 넣어서 Integer가 나올 것으로 기대했으나 IillegalArugumentException이 발생했습니다. 문제는 아래 쿼리에서 컴파일 오류가 발생하지 않았다는 점인데, 실제로 실무에서는 SELECT절 함수를 통한 값을 얻어 올 때 어떻게 사용하는지 궁금합니다.예를 들어 타입드 쿼리 대신 Query를 사용해 Object를 받아 인티저 타입으로 캐스팅한다던지, 함수가 반환하는 명확한 타입을 모두 알고 사용해야 하는 것인지, 또는 위 문제를 해결 할 수 있는 다른 방법이 있는지 알려주실 수 있나요 ? TypedQuery<Integer> query1 = em.createQuery("SELECT count(m) from Member m", Integer.class);
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
매핑 어노테이션에 대한 궁금증
복습 중 매핑 어노테이션들에 대한 궁금증이 생겼습니다. 1. 해당 매핑 어노테이션들이 강의의 예제처럼 ddl-auto에서 create 옵션을 주는 상황처럼, JPA에서 자체적으로 테이블을 생성하는 경우에 적용되는것인가.2. 혹은 해당 어노테이션들이 사용자가 따로 DB에서 테이블을 미리 생성해둔 경우에 객체와 관계형 데이터페이스를 매핑하기 위한 용도로 사용되는 것인가.혹은 매핑 어노테이션 1, 2번 모두에 해당되는건가요?