월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
값타입에서 엠비디드를 사용할 때 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Address를 만들 때 값 타입은 불변으로 만들어야 해서 setter을 빼라고 말씀하셨고 생성할 때 new Address로 해서 만들던데 혹시 @builder도 사용하면 안되나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티매니저의 flush(), clear() 호출 빈도가 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]>> 개발환경hibernate-core:5.6.15.Final자바 17>> 질문안녕하세요. Team team = new Team(); team.setName("teamA"); manager.persist(team); Member member1 = new Member(); member1.setName("hello1"); member1.setTeam(team); manager.persist(member1); manager.flush(); manager.clear(); Member m = manager.find(Member.class, member1.getId()); System.out.println("m = " + m.getTeam().getClass()); // Proxy System.out.println("=============="); m.getTeam().getName(); System.out.println("=============="); System.out.println("m = " + m.getTeam().getName());프록시 설명해주실 때 엔티티 매니저의 flush(), clear()를 호출해서 1차 캐시를 비웁니다. 실무에서 이렇게 코드 중간에 1차 캐시를 비우는 일이 잦은가요? 프록시 객체의 존재를 확인시켜주기 위해서 호출하신 건지, 실제로 실무에서 프록시 객체를 사용하기 위해(?) 중간에 flush(), clear()을 사용하는 일이 있는지 궁금합니다 1차 캐시를 강제로 비우지 않는 한은 Query 문 나갈 일 없이 영속성 컨텍스트에서 데이터를 가져오는 일이 대부분일 것 같아서요! 복잡한 쿼리를 JPQL로 작성할 때는 Lazy loading을 적용하고 필요한 객체들이 그때그때 프록시를 통해 초기화되는 일이 자주 있겠지만, 강제로 1차 캐시를 비우는 일은 거의 없지 않나 하는 생각이 들어 질문드립니다.감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
기본 인텔리제이 maven 세팅관련
우선 저는 일반 Maven이 아니라 Maven archetype 으로 프로젝트가 생성이 되더라고요 찾아보니 큰 문제는 아닌 거 같아 진행을 하였습니다.우선적으로 자바 18을 사용하려니 사용이 안돼서 jdk 1.8.0 사용하였고 아래와 같이 h2는 지금 다운받은 서버 버전을 하이버네이트는 강의 pdf그대로 사용하였습니다. 아래처럼 경고는 아니지만 위험표시정도가 뜨는것을 확인할 수 있었고 버전 업그레이드 권장인거 같길래 넘어가고 persistence.xml 설정을 해주었습니다. 우선적으로 저는 resource 밑에 META_INF.maven이라는 파일이 존재하기에 해당 파일에 persistence.xml을 붙여 놓고 빌드를 해주었고 그 상태로 JpaMain을 다음과 같이 작성하고 빌드한 결과 위처럼 강의와는 다른 내용의 오류가 떴습니다. 아무래도 META_INF.maven하위의 persistence 를 인식 못하는것 같아 META_INF 디렉토리를 새로만들어주고 persistence.xml을 옮겨주었지만 그래도 똑같은 오류가 발생합니다 . 이유가 무엇일까요..
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값 타입 컬렉션 삭제부분에서 이해가 안가는곳이 있는데요
챕터9 값 타입 컬렉션 25분Address 값 타입 컬렉션 삭제 부분입니다. 우선 삭제되는 부분만 확인하고 싶어서, 새로운 값을 추가하지는 않았습니다.System.out.println("========== 값 타입 컬렉션 주소 삭제================"); findMember.getAddressHistory().remove(new Address("old1", "street", "zipcode")); 데이터는 정상적으로 삭제되었는데, 저는 왜 Member테이블에 대해 update쿼리가 나가는지가 이해가 안가는데요,Member 테이블에서는 수정사항이 발생할게 없는데 왜 update쿼리도 발생했는지 알 수 있을까요? 혹시 몰라 코드 전체와 결과 남깁니다. Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(new Address("homeCity","street","zipcode")); member.getFavoriteFoods().add("꾸부라꼬"); member.getFavoriteFoods().add("카페라떼"); member.getFavoriteFoods().add("회"); member.getAddressHistory().add(new Address("old1", "street", "zipcode")); member.getAddressHistory().add(new Address("old2", "street", "zipcode")); em.persist(member); em.flush(); em.clear(); System.out.println("================== 조회 시작 =================="); Member findMember = em.find(Member.class, member.getId()); System.out.println("================== 컬렉션은 지연로딩, Addr 조회 =================="); List<Address> addressHistory = findMember.getAddressHistory(); for(Address address : addressHistory) { System.out.println("address = " + address.getCity()); } System.out.println("================== 컬렉션은 지연로딩, favorite food 조회 =================="); Set<String> favoriteFoods = findMember.getFavoriteFoods(); for(String favoriteFood : favoriteFoods) { System.out.println("favoriteFood = " + favoriteFood); } Address homeAddress = findMember.getHomeAddress(); findMember.setHomeAddress(new Address("new change city", homeAddress.getStreet(), homeAddress.getZipcode())); findMember.getFavoriteFoods().remove("꾸부라꼬"); findMember.getFavoriteFoods().add("무화과 크림치즈 베이글"); System.out.println("========== 값 타입 컬렉션 주소 삭제================"); findMember.getAddressHistory().remove(new Address("old1", "street", "zipcode")); tx.commit(); Hibernate: /* insert hellojpa.Member */ insert into Member (city, street, zipcode, USERNAME, MEMBER_ID) values (?, ?, ?, ?, ?) Hibernate: /* insert collection row hellojpa.Member.addressHistory */ insert into ADDRESS (MEMBER_ID, city, street, zipcode) values (?, ?, ?, ?) Hibernate: /* insert collection row hellojpa.Member.addressHistory */ insert into ADDRESS (MEMBER_ID, city, street, zipcode) values (?, ?, ?, ?) Hibernate: /* insert collection row hellojpa.Member.favoriteFoods */ insert into FAVORITE_FOOD (MEMBER_ID, FOOD_NAME) values (?, ?) Hibernate: /* insert collection row hellojpa.Member.favoriteFoods */ insert into FAVORITE_FOOD (MEMBER_ID, FOOD_NAME) values (?, ?) Hibernate: /* insert collection row hellojpa.Member.favoriteFoods */ insert into FAVORITE_FOOD (MEMBER_ID, FOOD_NAME) values (?, ?) ================== 조회 시작 ================== Hibernate: select member0_.MEMBER_ID as member_i1_6_0_, member0_.city as city2_6_0_, member0_.street as street3_6_0_, member0_.zipcode as zipcode4_6_0_, member0_.USERNAME as username5_6_0_ from Member member0_ where member0_.MEMBER_ID=? ================== 컬렉션은 지연로딩, Addr 조회 ================== Hibernate: select addresshis0_.MEMBER_ID as member_i1_0_0_, addresshis0_.city as city2_0_0_, addresshis0_.street as street3_0_0_, addresshis0_.zipcode as zipcode4_0_0_ from ADDRESS addresshis0_ where addresshis0_.MEMBER_ID=? address = old1 address = old2 ================== 컬렉션은 지연로딩, favoritfood 조회 조회 ================== Hibernate: select favoritefo0_.MEMBER_ID as member_i1_4_0_, favoritefo0_.FOOD_NAME as food_nam2_4_0_ from FAVORITE_FOOD favoritefo0_ where favoritefo0_.MEMBER_ID=? foavortefood = 꾸부라꼬 foavortefood = 회 foavortefood = 카페라떼 ========== 값 타입 컬렉션 주소 삭제================ Hibernate: /* update hellojpa.Member */ update Member set city=?, street=?, zipcode=?, USERNAME=? where MEMBER_ID=? Hibernate: /* delete collection hellojpa.Member.addressHistory */ delete from ADDRESS where MEMBER_ID=? Hibernate: /* insert collection row hellojpa.Member.addressHistory */ insert into ADDRESS (MEMBER_ID, city, street, zipcode) values (?, ?, ?, ?) Hibernate: /* delete collection row hellojpa.Member.favoriteFoods */ delete from FAVORITE_FOOD where MEMBER_ID=? and FOOD_NAME=? Hibernate: /* insert collection row hellojpa.Member.favoriteFoods */ insert into FAVORITE_FOOD (MEMBER_ID, FOOD_NAME) values (?, ?) Process finished with exit code 0
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
여러 계층의 상속관계 질문
안녕하세요.상속관계 매핑을 할 때 예를 들어 위와 같이 Item을 상속받는 Book, Album, Movie, TVSerise의 4개의 품목이 있다고 했을 때, 비슷한 속성끼리 중간에 묶는 방법에 대해 질문드리고 싶습니다.상속관계를 한 단계 더 쓰고 싶은 이유는 일부 항목들끼리는 자주 엮어서 조회할 일이 있는데 그 때마다 두 객체를 모두 불러오는 게 번거롭게 느껴져서 입니다.이전에 비슷한 질문을 드렸었는데 김영한 강사님께서 이런 경우 상속관계보다는 연관관계를 사용하기를 추천하신다고 말씀 주셨었어요. 조금만 더 자세히 설명 부탁드리겠습니다.감사합니다!ps. 다른 글에서 추천해주신 draw.io 좋아요. 감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
변경감지를 사용하여 db 데이터 업데이터 시 sql이 2번 실행되는 것에 대한 성능
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.김영한님 JPA 강의를 다 듣고 개발을 하던 도중 궁금한게 생겼습니다.Entity를 변경 감지를 통해 데이터를 바꿀 시 select 쿼리를 통해 데이터를 불러오고 수정하게 되면 update 쿼리가 한번사용되어 총 2번의 sql로 데이터를 바꾸게 되는데,그냥 "update ~~~ where id = ?" 이런 식으로 데이터를 바꾸게 되면 한 번의 sql로 데이터를 바꾸니까 성능 상 더 좋은 부분이 생길수도 있나? 라는 생각을 하게됩니다. 여기서 답변 받고 싶은 부분은이 부분은 아주 미묘한 차이니까 무시하는 것인가?실제로 자주 변경되는 데이터는 성능상에 이유로 update 쿼리를 한 번만 직접 날려 처리하는 경우도 있는가? (벌크 연산제외)변경 감지로 데이터를 update하는 것의 장점들도 궁금합니다. 제가 예전에 강의를 들어서 혹시 영한님이 언급하셨는데 못 찾고 있는건가라는 생각도 들지만 궁금해서 여쭤봅니다!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
onetoone 페치전략 설정 질문입니다
0:21 에 @ManyToOne 과 @OneToOne은 기본이 즉시로딩이므로 지연로딩으로 변경하라는 설명입니다.제가 궁금한것은 @OneToOne 단방향은 jpa에서 지원이 안되고 양방향으로 설정해야하고 이때 지연로딩으로 설정하거나 아예 설정자체를 하지않아도 기본적으로 즉시로딩으로 된다고 알고있는데 제가 잘못알고있는건가요?=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.find의 궁금점
안녕하세요. 공부를 하다가 궁금증이 생겨 남깁니다.위와 같은 코드를 실행했을 때 영속성 컨텍스트가 비어 있기에 아무것도 반환하지 못하는 것이라고 이해했는데 그렇다면 print가 찍히지 않는 이유는 무엇인가요? try catch로 nullpointerException인지 확인해봤는데 null은 아닌 것 같아서 문의 남깁니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
PPT 내용 중, DB 관계 그림 질문있습니다.
위 그림 1:N 관계에서 어떤 쪽은 삼각형에 동그라미가 붙어있고 어떤 쪽은 안붙어있는데 차이가 뭔가요?? 감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
상속 관계 엔티티 로직을 분기처리 하는 법?
안녕하세요 상속관계 엔티티를 다루는 방법에 대해 궁금한 점 있어 질문 드립니다상속관계의 엔티티가 존재하고, 자식 엔티티마다 서비스 로직이 다를 수 있을 때 어떻게 분기처리하는지 알고 싶어 질문 드립니다 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "base_type") public abstract class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String description; @Column(name = "base_type", updatable = false, insertable = false, length = 30) private String baseType; protected BaseEntity(Long id, String title, String description) { this.id = id; this.title = title; this.description = description; } } @Entity @DiscriminatorValue(value = "FIRST") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class FirstEntity extends BaseEntity{ private int like; @Builder public FirstEntity(Long id, String title, String description, int like) { super(id, title, description); this.like = like; } } @Entity @DiscriminatorValue(value = "SECOND") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class SecondEntity extends BaseEntity { private String redirectUrl; @Builder public SecondEntity(Long id, String title, String description, String redirectUrl) { super(id, title, description); this.redirectUrl = redirectUrl; } }이러한 상속구조 엔티티가 있고, 두 자식의 서비스 로직이 다를 수 있을 때컨트롤러에서 분기처리를 어떻게 하는지 알고 싶습니다@RestController @RequiredArgsConstructor @RequestMapping("/v1/test") public class TestController { private final TestService testService; @GetMapping public void findEntity(@RequestParam String type) { if(type.equalsIgnoreCase("first")) { } else if(type.equalsIgnoreCase("second")) { } //... //... //... } }만약 이러한 구조로 간다면, 자식클래스가 늘어났을 때 또 if문을 추가해야해서 효율적이지 못할 것 같아서요!지금 생각한 것은 상태 패턴을 이용하면 어떨까 하는데, 이게 좋은지 잘 모르겠습니다..public interface BaseContext { boolean support(String type); void executeFind(); }이렇게 인터페이스를 만들어주고@Component public class FirstContext implements BaseContext{ private static final String TYPE = "FIRST"; private final FirstService firstService; public FirstContext(FirstService firstService) { this.firstService = firstService; } @Override public boolean support(String type) { return TYPE.equalsIgnoreCase(type); } @Override public void executeFind() { firstService.find(); } }자식클래스의 상태를 구현하는 클래스를 만들어주고@RestController @RequiredArgsConstructor @RequestMapping("/v1/test") public class TestController { private final List<BaseContext> contexts; @GetMapping public void findEntity(@RequestParam String type) { BaseContext findContext = contexts.stream() .filter(context -> context.support(type)) .findAny() .orElseThrow(() -> new IllegalStateException("Error")); findContext.executeFind(); } } 컨트롤러에서는 이렇게 받아주면자식 엔티티가 늘어나도 if-else를 하지 않아도 된다고 생각했습니다다만, 자식 엔티티가 추가될 때 마다 Context를 추가해야 한다는 점과Context가 Service를 바라보고있어 Service가 수정되면 Context와 Service 2가지 모두 수정해야한다는 점이 마음에 걸립니다보통 상속관계의 엔티티를 다룰 때 어떤식으로 분기처리를 하나요??강사님이 아니시더라도 다른 수강생분들의 의견도 달아주시면 좋겠습니다!!
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계의 필요성
안녕하세요. 공부를 하다가 궁금한 부분이 생겨 질문 남깁니다.강의에서 최대한 모든 테이블을 단방향으로 설계하고 필요할 때만 양방향 연관관계를 맺어주면 된다고 하셨는데요. 양방향 연관관계가 어떤 상황에서 필요할까 고민하다가 제가 생각할 수 있는 모든 상황에서 어떻게든 단방향으로 처리할 수 있을 것 같다는 결론이 났습니다.하지만 분명 양방향이 필요한 순간이 있을 것 같은데, 어떤 상황에서 양방향 연관관계가 사용될까요?+ 좀 더 고민해보던 중에 예를들어 게시글과 댓글에 관계에서 게시글 내용조회와 함께 댓글 리스트가 필요할 때 단방향이라면 쿼리를 2번 날려야하는 반면 양방향으로 매핑이 되어있다면 페치조인등을 통해서 한번의 쿼리로 조회할 수 있다는 점이 필요성을 가지게 한다고 생각했는데 맞을까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
사용자 정의 함수가 안됩니다..
persistence.xml 하이버네이트 6.2.2 final 입니다.<persistence-unit name="jpql"> <!-- spring --> <class>jpabasic.ex1hellojpa.jpql.Product</class> <class>jpabasic.ex1hellojpa.jpql.Address</class> <class>jpabasic.ex1hellojpa.jpql.Team</class> <class>jpabasic.ex1hellojpa.jpql.Member</class> <class>jpabasic.ex1hellojpa.jpql.Order</class> <properties> <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver" /> <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/jpabook" /> <property name="jakarta.persistence.jdbc.user" value="sa" /> <property name="jakarta.persistence.jdbc.password" value="" /> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql " value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create"/> </properties> </persistence-unit>아예 빨간줄이 나오면서 등록이 되지 않아요.. 도와주세요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
서브쿼리에서 사용한 ALL에 대한 궁금증이있습니다.
제가 작성한 JPQL 입니다"select o from Order o where o.orderAmount > ( select x.stockAmount from o.product x)"강사님이 작성한 JPQL 입니다."select o from Order o where o.orderAmount > ALL ( select x.stockAmount from o.product x)"// 전체 상품 각각의 재고보다 주문량이 많은 주문들이 조회를 하기 위해서 JPQL을 작성했는데요 첫번째 코드나 두번째 코드나 결과는 같다고 생각이 들었어요두 코드 모두select p2_0.stockAmount from Product p2_0 where p2_0.id=o1_0.product_id이 코드가 동작하게 되는데Product와 Order는 1:M인 관계로 stockAmount는 (1x1)이 나오게 되는데ALL을 사용할 이유가 있나해서 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
패치조인 할 경우 궁금한게 있습니다.
패치 조인시 연관된 엔티티를 한번에 조회 하는 걸로 이해했습니다.근데 LAZY 가 아닌 EAGER 로 연관관계를 했을 경우도한번에 가져오는 걸로 아는데,String query = "SELECT t FROM Team t JOIN t.members "; List<Team> resultList = em.createQuery(query, Team.class) .getResultList(); for(Team team: resultList){ System.out.println("team : " + team.getName() + ", member size = : " +team.getMemberList().size()); }위에 코드를 실행했을 경우, EAGER로 연관관계 설정을 해서패치 조인과 같이 한번에 조회 될거라고 생각되었는데, 그렇치 안더라구요. 이유를 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
could not initialize proxy 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의를 수강중에 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일때 프록시를 초기화 하면 해당 예외가 나온다고 들었습니다. 강의 중에는 나중에 개발하다가 이런 에러를 만나면 지금 말한걸 생각해주시면 된다 까지만 말씀해주셨는데요.. ㅎ 사실 제가 저 에러메세지를 해결못하고 있던차에 지금 강의를 수강한거라 그 해답이 궁금합니다. 혹시 강의의 부분이 could not initialize proxy 에러를 해결하는데 도움이 될까요? JPA기본편 강의 내용이 아니어도 좋습니다. 영한님 강의중에 이 부분을 실제 개발하시며 다루시는 부분이 있는지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
검증을 사용할때
만약 Member에 검증이 필요하다고 하면검증객체를 따로 클래스로 만들어서 사용하나요?엔티티에 덧붙여서 사용하나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.find 시 쿼리문 2번 수행
답변 없으셔서 다시 남깁니다. 영속성 컨텍스트 2 강의의 약 7분 쯤 em.find를 2번하게 되어도 1차캐시 조회에 의해 쿼리문이 한번만 출력된다고 하셨는데저는 2번 출력되네요.. 문제가 뭘까요 https://drive.google.com/drive/folders/1rLlWTlGVWyFRoL-HXbvyWREnpHBC7OBe?usp=sharing 추가로 질문이 하나 더 있는데강의에서는 JPAMain 자바 파일의 try문을 수행하면 db에 바로 저장이 되는데저는 저장이 안됩니다.이것도 한번 확인 부탁드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
불변 제약 대체
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요! 불변 객체를 공부하다 궁굼점이 생겨 문의드립니다.부작용 차단을 위한 불변 제약을 두는 대신Member.classpublic void setAddress(Address address) { this.address = new Address(address); } Address.classpublic Address(Address address) { this.city = address.city; this.street = address.street; this.zipcode = address.zipcode; }와 같이 항상 새로운 객체를 생성하여 할당하는 방식을 사용한다면 값 변경에도 자유로울 수 있을 것 같은데 문제될 수 있는 부분이 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계 순환참조 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강의 잘 듣고 있습니다.강의를 듣다가 궁금증이 생겨 질문 드립니다. 양방향 연관관계의 설정이 언제 필요할지 생각을 해보았는데 게시글과 댓글의 일대 다 관계에서게시글을 조회할때 댓글이 같이 조회되는것을 원하는 경우가 있을 것 같습니다. 그렇다면 이전강의에 말씀하셨던 무한 루프(?)에 빠질 수 있을 것 같은데요. 아마 이걸 순환참조라고 말한다고 알고 있습니다. 그러면 애초에 댓글은 댓글대로 따로 조회하고 게시글을 조회할때 댓글 조회하는 방식 즉 연관관계의 주인이 아닌곳에서 리스트를 조회하려고 하는 방식은 안쓰는것이 좋은것인가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
cascade 부모, 자식 동시 적용
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요,cascade 설정과정에서 궁굼증이 생겨 문의드립니다.부모 객체와 자식객체 양쪽다 CascadeType.ALL 옵션을 주고, 부모쪽에 orphanRemoval = true 옵션을 준 상태에서Parent parent = new Parent(); Child child = new Child(); Child child2 = new Child(); parent.addChild(child); parent.addChild(child2); Team findParent = em.find(Parent.class, 1L); findParent.getChild().remove(0);와 같이 진행 했을때,child가 삭제됨child가 삭제되며 cascade 옵션에 의해 부모인 team을 삭제함team을 삭제하기 전 cascade 옵션에 의해 자식에 포함된 child를 모두 삭제함team이 삭제됨이렇게 이해했고 실제로 parent, child, child2 모두 삭제 되었습니다. 그런데Parent parent = new Parent(); Child child = new Child(); Child child2 = new Child(); Child child3 = new Child(); ... Child childN = new Child(); parent.addChild(child); parent.addChild(child2); parent.addChild(child3); ... parent.addChild(childN); Team findParent = em.find(Parent.class, 1L); findParent.getChild().remove(0);이렇게 자식을 3개 이상 넣어줬을경우 자식객체 2개만 삭제(remove에 넣어주는 index에 따라 2개 삭제될 자식이 결정됨)되고 나머지 자식과 부모는 남아있는걸로 확인되는데... 어떤 매커니즘때문에 이런 현상이 나오는걸까요?..