월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate.hbm2ddl.auto 속성 적용이 안됩니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]데이터베이스 스키마 자동생성 부분에서 hibernate.hbm2ddl.auto 속성이 적용되지 않습니다. 강의에서는 drop table Member if exists 로그가 찍히는데 저는 속성이 안되는 것인지 아무것도 뜨지 않습니다. Table도 다시 생성되어야하는데 생성되지 않습니다.H2 버전은 1.4.200입니다.프로젝트 zip 파일입니다.https://drive.google.com/file/d/1-USqDSZYjzSjQuMZ4t8cQSMsS6j4ez-s/view?usp=drive_link
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
커밋이 안됩니다...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 위처럼 비밀번호랑 경로 전부 같게 하고 연결해서 커밋해보면 커밋이 되지 않는데 어찌해야하나요...
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
sequence 전략 allocation 사이즈
2서버를 운영할 때 allocation 사이즈를 50 준다면 A B가 동시 실행될 때 A = Seq 1~50B = Seq 51 ~ 100 씩 할당 받게된다면 insert문 발생시B는 id값이 51부터 사용되어서 저장되어지나요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다 연관관계에 관해서
@JoinColumn의 경우 주인이 되는 테이블의 컬럼을 넣는 것으로 알고 있습니다.@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)@JoinColumn(name = "MEMBER_ID")private List<AddressEntity> addressHistory = new ArrayList<>();의 코드에서 혹시 반대로 AddressEntity에서 다대일 관계를 만들어 주고 싶은 상황이라면 (현재 강사님 코드에는 AddressEntity클래스에 Member엔티티에 대한 객체가 없는 상황) AddressEntity 클래스에 @ManyToOne@JoinColumn(name = "MEMBER_ID"private Member member를 생성해주는게 맞는 궁금하여 문의 남깁니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.close()한 경우에도 업데이트 문이 실행되는데요.
이렇게 실행했는데, 로그에 업데이트 쿼리가 찍히네요.실제 사용할때는 트랜잭션 종료 이후에 em.close() 실행될텐데...테스트 코드라서 이상한긴 한데 좀 궁금하네요.public class JpaDetachMain {public static void main(String[] args) {final EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); final EntityManager em = emf.createEntityManager(); final EntityTransaction tx = em.getTransaction(); tx.begin(); try{//영속 Member member = em.find(Member.class, 10L); member.setName("111"); em.close(); System.out.println("=============="); tx.commit(); }catch (Exception e){tx.rollback(); }finally {em.close(); emf.close(); }}}
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
복합키(EmbeddedId) 사용시 도커환경에서 API Empty Value 반환 이슈
안녕하세요 영한님,영한님 강의중 QueryDsl, JPA 다 시청한 수강자인데따로 복합키 복합키 EmbeddedId 를 언급하는 강의가 없어 여기에 질문 남기는점 죄송합니다,현재 복합키로 구성되어있는 엔티티를 QueryDSL로 조회하여 반환하는 API를 설계했는데 로컬 IDE 즉 제 로컬 인텔리제이에서 빌드해서 Application을 띄울 시에 원하는 시나리오대로 DB의 저장되어있는 데이터를 반환하지만, Image 환경 즉 Docker Container, ECS 환경에서 이 JAR 파일을 빌드시에 쿼리는 잘 나가지만 데이터가 불러와지지 않는 현상이 발견됩니다,(제 로컬에서 터미널을 통해 Jar파일을 빌드해도 잘 됩니다.)복합키로 구성되어있는 테이블중 다른 일반타입의 필드(컬럼)만을 조회할땐 문제가 없지만 복합키중 일부 컬럼을 같이 조회할 시 이런 현상이 발견되고 있습니다.. 이런 이슈를 겪어본적이 있으신지 아니면 이 문제에 대해 해결방법이 있는지 궁급합니다. +++@Query 어노테이션으로 네이티브 쿼리를 짜봐서 도커 환경에서 테스트 해봤는데 네이티브 쿼리는 또 정상작동을 하네요...
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate.hbm2ddl.auto create로 했을 때
외래키 제약들이 걸려있어서 테이블이 삭제 될 때 순서대로 삭제하는 것이 아니라 막 삭제해서 제대로 테이블이 삭제되지않습니다org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "CATEGORY" because "FKPEKL6BDCJ36BTQ87GKJ9MLDNQ" depends on it; SQL statement해당 경우는 어떻게 해결하나요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
낙관적 락 엔티티 관련
안녕하세요.낙관적 락을 공부하며 생긴 질문을 드립니다..@Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long productId; private Long quantity; @Version private Long version; @Builder public Stock(Long productId, Long quantity) { this.id = null; this.productId = productId; this.quantity = quantity; this.version = 0L; } public void decrease(Long quantity) { if(this.quantity - quantity < 0) throw new IllegalArgumentException("재고가 부족합니다."); this.quantity -= quantity; } }위와 같이 Entity 를 작성하였습니다. 실행환경은 MySQL 입니다. 동작 과정은 다음과 같습니다.엔티티를 생성하고..JpaRepository 인터페이스를 상속받은 Repository 의 save 메서드의 파라미터로 엔티티를 전달하였습니다..저는 여기서 파라미터로 전달한 엔티티 인스턴스가 영속 상태로 관리될 것이라 생각했습니다.(일반적으론 그렇더라구요..)그런데 version 프로퍼티 때문인지.. 영속성 컨텍스트에 관리되는 엔티티는 파라미터로 전달한 엔티티 인스턴스가 아니라.. JPA 가 만들어낸 새로운 인스턴스였습니다..(파라미터로 전달한 엔티티 인스턴스에는 id 가 채워지지 않았습니다.) 해당 상황에 대해.. 원리와 이유가 궁금합니다.. 늘 감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA 쿼리 로깅 관련해서 질문이 있습니다.
선생님 안녕하세요 하나 질문이 있습니다. Jpa 사용할때 쿼리를 로그에 찍도록 설정했고 잘 동작합니다. 그런데 그냥 실행시킬때는 찍히지 않는 쿼리가 브레이크 포인트를 걸어서 한줄씩 실행시킬때는 로그에 출력되는 경우가 있습니다. 혹시 이유가 있을까요? 브레이크 포인트를 걸면 select 쿼리가 더 많이 찍혀서 궁금해 문의드립니다.
- 해결됨자바 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번 날려야하는 반면 양방향으로 매핑이 되어있다면 페치조인등을 통해서 한번의 쿼리로 조회할 수 있다는 점이 필요성을 가지게 한다고 생각했는데 맞을까요?