월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 select관련해서 질문드립니다!
EntityManager가 tx종료와 동시에 지워진다고 하셨는데,만약 dml쿼리없이 단순 select만 하게되어서EntityTransaction tx = em.getTransaction(); tx.begin();위의 코드없이 select만 여러번 실행하게될 경우 em가 생겼다 지워졌다 생겼다 지워졌다가 반복된다고 보면 될까요??위와같이 이해를 하여서, 위의 코드를 지우고 아래의 코드를 실행하면, 하나의 트랜잭션으로 묶지 않았기에 두번의 쿼리가 나갈것이라 예상했지만, 쿼리가 한번만 나가는것 같아서요Member member1 = em.find(Member.class, 101L); Member member2 = em.find(Member.class, 101L);
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다 데이터 조회 질문입니다.
강사님 강의를 보고 최근에 프로젝트를 하다 궁금한게 생겨 질문 남기게 되었습니다. Product <-> Category Entity 다대다 매핑을 위해product(OneToMany) <-> product_category(ManyToOne) <-> category(OneToMany)위와 같은 테이블로 매핑한 상태이고 join 상속 전략으로 district_category 테이블도 생성 하였습니다.district_category를 쿼리 파라미터로 받고 해당 district_category를 갖고 있는 상품들을 검색하고 페이징을 하는 로직을 짠다고 했을때 두가지 방법이 생각났는데 둘 중 어느게 더 적합한지 모르겠습니다 검색어를 바탕으로 product_category에서 Product를 EntityGraph로 같이 찾은 후에 찾은 ProductCategory.getproduct() 와 같은 방식SearchServiceCategory category = districtCategoryRepository.findByDistrictEnum(districtEnum) .orElseThrow(() -> new ProductException(ProductExceptionType.CATEGORY_NOT_FOUND)); return new ProductCategoryToProductPage(productCategoryRepository.findAllByCategory(pageable, category));ProductCategoryRepository@EntityGraph(attributePaths = "product") Page<ProductCategory> findAllByCategory(Pageable pageable, Category category);ProductCategoryToProduct public ProductCategoryToProductPage(Page<ProductCategory> page) { this.content.addAll(page.getContent().stream() .map(ProductCategory::getProduct) .map(ProductListGetResponseDTO::new) .collect(toList())); this.totalPages = page.getTotalPages(); this.totalElements = page.getTotalElements(); this.pageNumber = page.getNumber() + 1; this.size = page.getSize(); } 발생 쿼리문selectdistrictca0_.category_id as category2_1_,districtca0_1_.parent_id as parent_i3_1_,districtca0_.district_enum as district1_2_fromdistrict_category districtca0_inner joincategory districtca0_1_on districtca0_.category_id=districtca0_1_.category_idwheredistrictca0_.district_enum=?selectproductcat0_.product_category_id as product_1_8_0_,product1_.product_id as product_1_7_1_,productcat0_.category_id as category2_8_0_,productcat0_.product_id as product_3_8_0_,product1_.created_date as created_2_7_1_,product1_.content_detail as content_3_7_1_,product1_.product_content as product_4_7_1_,product1_.product_name as product_5_7_1_,product1_.product_price as product_6_7_1_,product1_.product_status as product_7_7_1_,product1_.product_thumbnail as product_8_7_1_fromproduct_category productcat0_left outer joinproduct product1_on productcat0_.product_id=product1_.product_idwhereproductcat0_.category_id=? limit ?selectcount(productcat0_.product_category_id) as col_0_0_fromproduct_category productcat0_whereproductcat0_.category_id=? 검색어를 바탕으로 product에서 직접 찾기 (데이터 뻥튀기의 문제는 쿼리dsl 이용 productId로 groupBy로 해결) 글 쓰고 생각해보니 A카테고리는 B라는 상품 안에서는 하나밖에 있을 수가 없으니 굳이 groupBy를 안써도 될거 같네요SearchService Category category = districtCategoryRepository.findByDistrictEnum(districtEnum) .orElseThrow(() -> new ProductException(ProductExceptionType.CATEGORY_NOT_FOUND)); return productRepository.findAllByCategory(pageable, category);ProductRepository @Override public Page<Product> findAllByCategory(Pageable pageable, Category category) { List<Product> content = queryFactory.selectFrom(product) .join(product.productCategories, productCategory) .where(productCategory.category.categoryId.eq(category.getCategoryId())) .groupBy(product.productId) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); Long total = queryFactory .select(Wildcard.count) .from(product) .join(product.productCategories, productCategory) .where(productCategory.category.categoryId.eq(category.getCategoryId())) .fetchOne(); return new PageImpl<>(content, pageable, total); } 발생 쿼리문selectdistrictca0_.category_id as category2_1_,districtca0_1_.parent_id as parent_i3_1_,districtca0_.district_enum as district1_2_fromdistrict_category districtca0_inner joincategory districtca0_1_on districtca0_.category_id=districtca0_1_.category_idwheredistrictca0_.district_enum=?selectproduct0_.product_id as product_1_7_,product0_.created_date as created_2_7_,product0_.content_detail as content_3_7_,product0_.product_content as product_4_7_,product0_.product_name as product_5_7_,product0_.product_price as product_6_7_,product0_.product_status as product_7_7_,product0_.product_thumbnail as product_8_7_fromproduct product0_inner joinproduct_category productcat1_on product0_.product_id=productcat1_.product_idwhereproductcat1_.category_id=?group byproduct0_.product_id limit ?selectcount(*) as col_0_0_fromproduct product0_inner joinproduct_category productcat1_on product0_.product_id=productcat1_.product_idwhereproductcat1_.category_id=?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
변경감지 질문입니다.
변경감지가 되어 .persist없이 update문이 발생하는건 객체가 영속성 컨테이너에서 관리되고 있을때 만 변경감지가 일어아는건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa repository.save 메서드 구현 코드를 보고 싶습니다
강사님 안녕하세요~ 회사에서jpa 사용하면서 깊이 생각 안하고 사용하다가궁금한점이 생겼습니다 특정 리포지토리가 있다고 가정하겠습니다@Repositorypublic interface 리포지토리 extends JpaRepository<도메인, Long>, JpaSpecificationExecutor<도메인> { 리포지토리.save(); 하면 스프링프레임웍 하이버네이트 구현체가 실행해준다고 하는데저는 실제 프레임웍 구현체 소스 코드를 보고 싶습니다제가 IDE 이클립스를 사용중인데 어디라이브러리나소스 코드를 보면 될까요리포지토리.save() -> █이메서드를 클릭하면org.springframework.data.repository.CrudRepository 다시 인터페이스이고 @NoRepositoryBeanpublic interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S entity);=> █ CrudRepository 인터페이스의 save 메서드를 구현코드는또 어느라이브러리에 어떤 메서드를 확인하면 될까요? *.스프링, 스프링부트 강의 수강하며 계속 반복되는 얘기가유연하게 적용하기위해 많은 인터페이스를 사용하고구현체가 있다고 계속 얘기되는데그럼 그런 구현체를 최 하위의 클래스 메서드를 보는 방법이 어떻게 되는지 궁금하네요.. *.추가적으로 소스코드에는리포지토리.save(); =>인터페이스.save();인터페이스.메서드 를 호출했는데스프링 프레임웍에서 어떤 원리로인터페이스.메서드 => 구현체클래스.메서드가 호출되는지이해가 가지 않습니다 바쁘시겠지만 시간 나실때 답변 주시면 감사하겠습니다수고하세요.. #JPA#구현체#하이버네이트#hibernate
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
mappedBy 하실때 "" 따옴표 안에서 자동완성 방법
강사님처럼 mappedBy 따옴표 안에서ctrl + space 눌러봐도 자동완성 제안이 안내려옵니다..인텔리제이는 아래 버전 사용하고 있습니다
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
불변 클래스 정의와 관련된 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]불변 클래스를 정의하기 위해서 세터 메서드를 빼거나 private로 둘 수 있다고 하셨는데, JPA 내부적으로 테이블에서 가져온 값을 객체로 주입하기 위해서 세터 메서드를 호출하기 때문에 저렇게 할 수 없지 않나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
from절 서브쿼리 예시
hibernate 6부터 from절 subquery가 지원된다고 하셨는데 혹시 예시를 볼수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 전이+고아 객체 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 공부하다가 궁금한점이 생겨 질문 드립니다.CascadeType.ALL을 하면 굳이 orphanRemoval = true로 하지 않아도 em.remove(parent)나 parent.getChildList().remove()를 하는 경우 자식 엔티티가 제거된다고 이해를 하였습니다. 그러면은 CascadeType.ALL만 해줘도 부모 엔티티를 통해서 자식 엔티티의 persist, remove가 모두 가능하니 생명 주기를 관리할 수 있는 것 아닌가요? 굳이 orpahnRemoval = true를 해주어야 하는 이유가 궁금합니다. 제가 잘못 이해한 부분이 있는지 알려주시면 감사하겠습니다!
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
toString() 만 사용해도 프록시객체가 초기화되는 것이 맞나요?
일전에, 지연로딩 을 사용하면 객체의 참조를 얻을 때가 아닌, 실제 필드(메서드 포함) 에 접근할 때 프록시 객체가 진짜 객체로 초기화 되는 것으로 이해했습니다.그런데 아래와 같이 코드를 짜고 실행해보니, 객체의 참조를 얻을 때 쿼리가 나가는 것 처럼 보이더라고요.// 팀 Team teamA = new Team(); teamA.setName("팀A"); em.persist(teamA); Team teamB = new Team(); teamB.setName("팀B"); em.persist(teamB); // 회원: member1, 2 는 팀A 소속. member3은 팀B 소속 Member member1 = new Member(); member1.setUsername("회원1"); member1.setTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("회원2"); member2.setTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("회원3"); member3.setTeam(teamB); em.persist(member3); em.flush(); em.clear(); // Query String query = "select m from Member m"; List<Member> findMembers = em.createQuery(query, Member.class) .getResultList(); for (Member member : findMembers) { System.out.println("member = " + member.getUsername() + ", " + member.getTeam()); } tx.commit(); (나간 쿼리)Hibernate: /* select m from Member m */ select member0_.MEMBER_ID as MEMBER_I1_7_, member0_.createdBy as createdB2_7_, member0_.createdDate as createdD3_7_, member0_.lastModifiedBy as lastModi4_7_, member0_.lastModifiedDate as lastModi5_7_, member0_.COMPANY_CITY as COMPANY_6_7_, member0_.COMPANY_STREET as COMPANY_7_7_, member0_.COMPANY_ZIPCODE as COMPANY_8_7_, member0_.city as city9_7_, member0_.street as street10_7_, member0_.zipcode as zipcode11_7_, member0_.LOCKER_ID as LOCKER_15_7_, member0_.TEAM_ID as TEAM_ID16_7_, member0_.USERNAME as USERNAM12_7_, member0_.endDate as endDate13_7_, member0_.startDate as startDa14_7_ from Member member0_ Hibernate: select team0_.TEAM_ID as TEAM_ID1_10_0_, team0_.createdBy as createdB2_10_0_, team0_.createdDate as createdD3_10_0_, team0_.lastModifiedBy as lastModi4_10_0_, team0_.lastModifiedDate as lastModi5_10_0_, team0_.name as name6_10_0_ from Team team0_ where team0_.TEAM_ID=? member = 회원1, hellojpa.domain.Team@26ae880a member = 회원2, hellojpa.domain.Team@26ae880a Hibernate: select team0_.TEAM_ID as TEAM_ID1_10_0_, team0_.createdBy as createdB2_10_0_, team0_.createdDate as createdD3_10_0_, team0_.lastModifiedBy as lastModi4_10_0_, team0_.lastModifiedDate as lastModi5_10_0_, team0_.name as name6_10_0_ from Team team0_ where team0_.TEAM_ID=? member = 회원3, hellojpa.domain.Team@6bd16207 저는 위 코드 중 System.out.println 과정 중 프록시 객체가 초기화가 되어서 위같은 쿼리가 나왔다고 생각하는데 제 판단의 근거가 맞는지 궁금합니다.System.out.println("member = " + member.getUsername() + ", " + member.getTeam());System.out.println 을 사용하면 자동으로 객체.toString() 이 호출되고, 따라서 필드(메서드)에 접근 했으므로 이 시점에 프록시 객체가 엔티티로 초기화 되었다. 위 처럼 이해하는게 맞을까요? 항상 애써주시는 영한님과 서포터님들께 감사드립니다!!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
left join 시 on 부분 질문있습니다
JPQL:SELECT m FROM Member m LEFT JOIN m.team t on t.name = 'A'SQL:SELECT m.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A' 이와 같은 부분에서 left outer join 시 SQL에ON m.TEAM_ID=t.id이 부분은 왜 자동으로 추가가 되는 것인지 궁금합니다. inner join의 경우에는 조인 조건에 동일한 값을 가진 행을 결과에 표기하는 것이니 해당 부분이 추가되는 것이 이해가 가는데left outer join의 경우 m.TEAM_ID=t.id 이 성립하지 않는, m에만 값이 존재하는 부분까지 포함해서 왼쪽 테이블의 전부가 결과에 표기되는 방식이 아닌가요? 그냥 단순히 'm의 TEAM_ID 와 t의 id가 연관관계를 이룬다' 는 의미라고 이해하면 되는 부분일까요? 그리고 left outer join 시 on 절에 필터링 조건을 추가해도 left outer join 특성상 필터링으로 걸러진 행까지 다시 포함되서 결과가 반환되는데 무슨 의미가 있는지 잘 이해가 가지 않습니다. 제 생각으로는 select의 주체가 되는 값만 영속성 컨텍스트에 저장하는 일반 join에서는 의미가 없고 fetch join 같은 경우에 의미를 가진다고 생각되는데 제 생각이 맞는 걸까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블 연관관계 질문
예를들어, 하나의 주문에 짜장면2개, 짬뽕2개를 했다고 가정하면Order테이블에서는 1개의 데이터가 생성,OrderItem테이블에서는 2개의 데이터가 생성 되는게 맞을까요?그렇다고 한다면 Order에 대한 총액이 궁금할 때에는 Order에서 OrderItems를 구한 뒤, 각각의 orderPrice를 더하면 될까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
디비에 물리적 FK를 설정 하지 않고도 JPA 연관관계 사용이 가능한가요?
안녕하세요.좋은 강의 덕분에 학습 잘하여 정말 감사하다는 말씀 부터 드립니다.다름아니라, 디비에 물리적 fk를 설정하지 않고 테이블 연관관계 매핑을 하였을시 별다른 문제없이 JPA 연관관계를 사용할 수 있는지 궁금하여 질문드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
자식엔티티, 부모엔티티
강의를 보다보면 자식엔티티, 부모엔티티라는 말이 많이 나오는데 ManyToMany OneToOne ManyToOne OneToMany에서 자식엔티티, 부모엔티티를 어떻게 구분하나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
고아객체
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, orphanRemoval = true, cascade = CascadeType.PERSIST ) List<Child> children = new ArrayList<>();위에 코드에서 고아객체를 삭제했기 때문에 children.remove(0); 을 하면 첫번째 child가 삭제되어야 하지만 cascade = CascadeType.PERSIST를 제거하면 delete쿼리가 발생하지 않습니다 PERSIST는 영속화될 때 같이 영속화하는 속성으로 알고있는데 제거하면 고아객체 삭제가 왜 되지 않는것인지 궁금합니다. 그리고 mappedBy를 사용한 children은 주인이 아니라서 chindlren.add(child)를 해도 반영이 되지 않는걸로 알고있는데 PERSIST속성을 주면 주인이 아니여도 둘 다 영속화가 되는것인지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
스칼라타입 형변환 질문드립니다
기본적인 개념같아서 구글링도 해봤는데 object 와 object[] 배열간의 형변환에 대한 내용이 안보여서 질문드립니다. 다름이 아니라Object o = resultList.get();Object[] result = (Object[])0;에서 왜 Object 타입에서 Object[] 타입으로 형변환을 해야하는지, 그냥 o[0], o[1] ... 로 쓰면 왜 컴파일 오류가 나는지 궁금합니다.Object 타입에서 어떻게 Object[] 타입으로 형변환이 가능한지 궁금합니다. Obect[] 배열은 Object가 여러개 포함된 배열 아닌가요?.. 아니면 Object 타입이 Object[] 타입까지도 포함한 포괄적인 개념이라 위처럼 형변환이 가능한 건가요? 기본적인 내용같은데 개념이 잘 이해가 안가서 질문드립니다 ㅠㅠ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
1대1 관계에서 잘 작성한것같은데 locker가 drop table이 안됩니다!
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요?네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?네3. 질문 잘하기 메뉴얼을 읽어보셨나요?네[질문 내용]질문 그대로입니다.JPAMain에서 여러가지 해보던 중 Locker에 값을 넣어 놨는데 그 뒤로 create 모드 인데도 삭제가 안됩니다 drop table 이 안됩니다ㅜㅜ근데 chat gpt 한테 물어보니 외부키값이 있으며 drop이 안됩니다 이런 식으로 나오더군요. 그렇게 따지면 1대 다 관계에서도 외부키값으로 여차저차 했는데 이 경우 삭제(drop table)은 잘만 되는데 왜 안될까요 ㅠㅠ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트에 프록시 객체도 저장이 되나요?
영속성 컨텍스트에 프록시 객체도 저장이 되나요?강의 내용중 프록시 객체의 초기화를 보면 getName()을 요청했을때 최초의 요청이면 영속성 컨텍스트에서 조회를 하고 DB에서 조회를 한다고 나와있는데 .getReference를 했을때 생성되는 프록시객체도 영속성컨텍스트에서 관리를 하나요? 그리고 .getName을 요청해서 실제 엔티티를 받아오게되면 이 객체도 영속성 컨텍스트에서 관리를하나요?그리고 2번째 .getName 메서드를 요청해도 꼭 프록시 객체를 거쳐서 값을 받게되나요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
값타입 컬렉션 질문 있습니다 21분 50초
findMember.getFavoriteFoods().remove("치킨");findMember.getFavoriteFoods().add("한식");에서 치킨만 삭제되고 한식이 더해지는 것인지,아니면 뒤에 주소 변경하는것처럼 [치킨,족발, 피자] 모두 삭제한 다음에 [한식, 족발, 피자] 가 더해지는 것인지 궁금합니다. 이해하기로는 치킨만 삭제되고 한식이 더해지는 것으로 이해했는데 favoriteFoods 와 addressHistory 모두 값타입 컬렉션인데어떠한 차이 때문에favoriteFoods 의 값을 변경할 땐delete from favorite_food where member_id =? and food_name = ? 로 지정한 food_name 만 지우고addressHistory는 delete from address where member_id =? 해서 address 테이블을 통째로 지우나요? Address의 테이블을 보면 값을 변경하면 추적이 어렵기 때문에 통째로 지우고 입력하는 것이고favoriteFoods는 정확하게 food_name을 찾아서 지울 수 있기 때문에 그런건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.flush(), em.clear() 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. flush와 clear를 하시는 이유가 영속성 컨텍스트에 있는 데이터들을 DB에 옮기고 영속성 컨텍스트는 비워두기 위해서 하시는 거로 이해를 했는데, 굳이 DB에서 조회하지 않고 영속성 컨텍스트에 있는 데이터를 조회해서 써도 되지 않나요?? flush와 clear하시는 정확한 이유가 궁금합니다!!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
오류문제..
Member랑 Team만 만들어서 연관관계 한건데 왜 오류가 나는지 모르겠습니다..ㅜㅜhttps://drive.google.com/file/d/1kojF4qnStbtgmlSJwxS2lw4EtgpbKli6/view?usp=share_link