묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
다대다 관계 시 insert 질문입니다.
안녕하세요 영한님! 강의 들으면서 개인적으로 작은 프로젝트를 하나 만들어 보고 있습니다. 다대다 관계 시 insert 방법이 궁금합니다. 아래와 같이 erd가 구성되어 있습니다. 회원 테이블, 상품 테이블 그리고 회원이 찜한상품 테이블 총 3개가 있고 찜한상품 테이블이 회원과 상품 테이블을 연결하는 연결테이블입니다. entity는 테이블과 같이 총 3개를 생성했습니다. (@ManyToMany는 사용하지 않고 비식별관계로 만들었습니다.) 1) UserRepository를 생성해서 User를 저장하고 2) ItemRepository를 생성해서 Item을 저장하고 3) ItemLikeRepository를 생성하고 ItemLike 객체를 생성 후 저장된 User와 Item의 연관관계를 설정하고 저장 이렇게 3단계를 거쳐서 모든 데이터를 저장하고 있는데요. 연결테이블의 저장소인 ItemLikeRepository를 생성해서 저장을 해야 될까..? 라는 의문점이 듭니다. ItemLikeRepository는 save() 외에는 거의 사용할 일이 없을거 같은데 구지 생성을 해야 될까 생각도 들고.. 다대다 관계 저장 시 효율적인 방법이 있을까요?? 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
static에 관한 질문이 있습니다.
안녕하세요 강의를 시청하고 있는 학생입니다. 교수님께서 CreateMemberResponse와 CreateMemberRequest 클래스들을 static 으로 만드셨는데 혹시 어떤이유에서 static 선언을 하신건가요??? 항상 유익한 강의를 만들어주셔서 감사합니다
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ManyToMany 관계 동작이 조금 어렵네요..
강의를 들으면서 토이 프로젝트를 진행중에 있습니다! 사용자(Account)가 평소 여러 주제의 태그(Tag) 중 관심 있었던 주제의 태그를 프로필에 등록하는 기능을 구현 중에 있으며, Account 라는 엔티티와 Tag라는 엔티티가 AccountTag 라는 엔티티로 각각 1:N 매핑된 형태로 N:M 관계를 표현했습니다. 태그 생성 기능은 Gist과 같이 작성했는데, 사용자에서 특정 관심 태그를 삭제하는 remove 동작을 어떻게 구현해야 할 지 감이 잘 오지 않습니다.. 정리하자면 Tag는 그대로 보존하되, 연관된 AccountTag만을 삭제하고 싶습니다. 마음 같아선 영속성 전이를 통해 delete 동작 없이 List에서 remove만 해서 처리하고 싶은데 AccountTag 엔티티와 연관된 객체가 2개 이상이니 Cascade.ALL을 사용하기도 좀 그래서 이런 경우엔 보통 어떻게 처리를 하는지 궁금합니다!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Entity 객체에 대한 영속화를 시킨다는 의미에 대한 질문입니다.
안녕하세요. JPA - 영속성 컨텍스트1 강의를 듣고 난 뒤 궁금한 사항이 생겨 질문을 남깁니다. 위 학습 내용의 큰 개념 중 하나인 "영속성 컨텍스트"에 대해 비영속 상태의 Entity 객체(도메인 클래스)를 영속 상태로 변경하기 위해서는 JPA에서 제공하는 EntityManager#persist(entity) 메소드를 사용하면 된다. 라고 이해를 했습니다. 이외 Member member = EntityManager.find(Member.class, 100L); 같은 코드에서 조회되는 "member" 객체도 자동으로 영속 상태로 설정이 되어 EntityManager#find(class, primaryKey) 메소드가 반환하는 객체라고 이해를 하면 될까요? 이제 본격적으로 JPA에 대해 학습을 시작했습니다. 새로 접하는 기술에 대해 좋은 강의 만들어주셔서 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
계층구조 카테고리 하위 속한 모든 아이템 조회
안녕하세요.항상 모든 질문에 정성스럽게 답변하시느라 고생이 많으십니다. 그래서 질문하는게 조심스럽지만 제가 못보는 부분이 있을가 걱정되 또 질문을 하게 되네요 ㅎㅎ 혹시 만약 이 강의에서 처럼 Category 가 계층 구조로 되어있으나 Item과 일대다 구조되어있을때 특정 category 하위에 카테고리에 속한 모든 item 을 찾을때 어떤방식으로 많이 구현하시나요? 제가 생각한 방법은 서비스 레이어에서 카테고리 리파지토리를 통해 특정 category엔티티를 찾아온다.loop를 돌면서 child를 모두 로딩시키 면서 child id 를 리스트로 만든다 -> 아이템 리파지토리의findByCategoryIds와같은 메서드로 해당 id에 속한 모든 item를 찾는다. 조금더 깔끔한 방법은 없을까요 ? 양방향 관계를 줄이는게 좋지만 이상황에서는 양방향 관계를 걸어서 Category에서 one to Many로 item을 가지고 있다가 그 리스트를 로딩후 반환하는게 나을까요? 항상 정말 좋은 강의와 꼼꼼한 답변 감사하게 생각하고 있습니다.
-
미해결실전! 스프링 데이터 JPA
테스트 공부를 위한 방법을 알 수 있을까요
늘 빛영한 님의 명강의 즐겁게 보고있습니다. 이동욱님의 도서와 영한님의 강의를 보며 테스트코드를 접하면서 대략적인 느낌으로 어떤역할을 하는지 왜 작성하는지를 미약하게나마 느끼고있지만 테스트코드에 대해 모르는 부분이 너무나 많은데요 테스트코드는 거의 필수처럼 여겨지는것으로 보이던데 테스트코드를 학습하기위해 혹시 추천해주고 싶은 책이나 그 외 자료 같은게 있으실지 궁금합니다!
-
해결됨실전! 스프링 데이터 JPA
JPA auditing 및 SOFT DELETE
안녕하세요 선생님 오랫만에 질문 올려보니다. JPA 사용할때마다 기억안나는 부분을 다시 항상 찾아보며 공부하고 있습니다. 그런던 중 궁금한게 생겨 질문 드립니다. 1.혹시 선생님은 soft delete 는 어떻게 구현하시는 지 궁금합니다.보통 (State 변수추가,deleteAt 컬럼으로 삭제 날짜 추가,deleted flag 변수 추가) 이 세가지인데 어느 방식을 선호하시는지요? 2 해당 구현은 repository 단에서 deleteById 이렇게 호출되면 엔티티를 조회한되 해당 값들을 업데이트 해주시나요?(@PreRemove 애노테이션을 사용해서나, createdAt 이나 lastModifiedAt처럼 Jpa Auditing을 활용해서 가능한가요?그리고 이렇게 하는게 더 깔끔할까요? 3.현재 Table A 의 생성,변경,삭제내역을 담은 Table History가 있다고 하고 일대다 관계로 아래처럼 되어있다고 하면 class Table A { @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) List<History> history; } 생성시 history.add(new History("생성")) 변경시 history.add(new History("변경")) 삭제시 history.add(new History("삭제")) 이러한 로직들은 생성은 생성자 안에, 변경은 변경을 하는 메서드 안에, 삭제는 soft delete시 수행되는 로직과 함께 두는게 나을까요 아님 @PrePersist @preUpdate 이러한 에노테이션을 붙혀서 Table A 안에 메서드를 만드는게 나을까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
클래스 설계가 먼저일까요? 아니면 데이터 베이스 설계가 먼저일까요?
안녕하세요. 6개월차 신입 개발자입니다. 실무에서 php(코드 이그나이터)로 개발을 하다가 스프링부트를 알게되어서 따로 공부하고 연습하고 있는 상황입니다. 매번 서비스를 개발할때에 요구사항을 먼저 받고 데이터베이스 설계를 마친뒤에 코드를 개발하곤 했었습니다. 6개월간 그렇게 개발을 하다보니까 데이터베이스 관점으로 생각하고 개발을 하고있게 되었습니다. 영한님이 준비해주신 요구사항들과 엔티티설계 데이터베이스 관계 설계를 보고 클래스를 만들고 코드를 짜는데 무리는 없지만. 정작 요구하는 사람들은 백지에서 원하는 기능만 설명하고 구현해달라! 이런식으로 나오니까 제 머리가 백지가 되어서 결국 PHP짜던식으로 디비설계 -> 비즈니스로직짜기 -> 비즈니스 로직에 필요한 디비컬럼이 없으면 넣고 -> 비즈니스 로직 짜기 -> 무한반복 -> 리팩토링 이런식으로 갑니다. 너무 비 효율적이라고 생각하게 됩니다. 이번에 jpa기본부터 spring data jpa 4강의를 수강하고 실무환경에서 바로 쓸수있도록 하나의 서비스를 개발해보자! 라는 마음으로 개발을 하고있었습니다만.. 요구사항을 만들고 그에대한 엔티티 설계에서 부터 막히게 되었습니다. 1. 클래스 엔티티 = 데이터 베이스 엔티티 라고 생각하는게 맞을까요? 2. 데이터베이스를 짜고 그에 맞는 클래스 엔티티를 짜는게 맞을까요? 3. 서비스를 만드실려고 요구사항을 받은 시점에서 데이터 베이스 관점에서 설계를 하고 그 위에 엔티티클래스들을 맞게 설계하고 그뒤에 클래스들을 잘게잘게 쪼개는 형식으로 개발을 해야할까요? 4. 아니면 데이터 베이스 정규화를 먼저하고 그뒤에 엔티티클래스를 만들고 개발하는게 맞을까요? 5. 디비설계 -> 비즈니스로직 -> 없는 컬럼 넣기 -> 비즈니스로직 이런 패턴이 잘못되었을까요? 처음부터 요구한 설계에 맞게 완벽한 설계후 개발을 해야할까요? 6. 데이터베이스 , 엔티티클래스 설계에 참고할만한 서적이나 강의영상이 있으시면 추천 부탁드립니다 . 좋은 강의 감사합니다!
-
미해결실전! 스프링 데이터 JPA
@Query를 활용한 DTO 매핑
안녕하세요 김영한 강사님! "@Query값, DTO조회하기" 편에서 @Query 애노테이션을 활용해서 엔티티를 DTO와 매핑하는 것과 ModelMapper를 통해서 엔티티와 DTO를 매핑하는것과 실질적인 차이가 있는지 궁금해서 질문 드려봅니다 혹시 성능면이나 상황상 이번에 소개해주신 방법이 ModelMapper와 비교했을 때 유리한 점이 있나요? ModelMapper를 다루는 강의는 아니지만 기능이 유사한 것 같아 성능면의 차이가 있을까 해서 여쭤봅니다
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
요구사항 분석에서 ERD 질문드립니다 !!
영상본후 저도 요구사항 분석을 조금 더 체계적으로 해보려고 합니다. 혹시 ERD 그리실때 사용한 어플리케이션이나 툴 알려주실수 있으신가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
혹시 이런 에러가 뜨시는 분들이 계시다면은
Failed to load ApplicationContext java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:121) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) ... 49 more Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:179) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:119) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1215) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1246) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1830) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1767) ... 64 more Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ... 81 more 강의 내용과 그대로 타이핑 했는데도 불구하고 이런 에러가 떳다면, H2 데이터베이스를 실행 해 보시고 다시 테스트를 진행 해 보세요 저의 경우 H2 데이터베이스를 실행 하고 테스트를 해보니 에러 없이 성공 했습니다.
-
해결됨실전! 스프링 데이터 JPA
커맨드와 쿼리를 분리하라는 말이 잘 이해가 가질 않습니다.
현재 강의를 단계적으로 쭉듣고 있는데 커맨드와 쿼리를 분리하라는게 잘 이해가 가질 않습니다. 커맨드는 무엇을 얘기하는것인가요? 쿼리는 sql말씀하시는거 맞으신가요? 답변 부탁드립니다!
-
미해결실전! 스프링 데이터 JPA
마지막 부분 이해가 ㅠ,ㅠ
쿼리 메소드 - 벌크성 수정 쿼리 에서 질문이 있습니다!! 글로 적는거 보다 코드 밑에 TODO 통해 적는것이 이해하는게 편할꺼 같아서 이렇게 질문 드립니다! TODO로 남겨드렸습니다! 혹시 글자가 작은가요? ㅠ,ㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
findOne() -> findById()
안녕하세요. findById().get() 으로 처리하셨는데 실무에서도 이렇게 처리하면 되나요? getors를 쓴다고 하셨는데 이건 무엇인가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
fetch 조인 일 대 다 관게
안녕하세요 갓영환님 강의 정말 잘듣고있습니다. 정말 좋은 강의 감사합니다! 제 궁금한 부분은 저는 fetch조인이 일 대 다 일때 데이터 뻥튀기가 일어나서 데이터 값이 중복되는 부분입니다. fetch조인의 특성인 연관관계 매핑된 객체를 함께 조회하는 기능 때문이라 생각하고 있는데.. 영한님 자료인 위 표를 예를 들면 Team 컬럼 팀A와 Members 컬렉션이 fetch조인될때 팀A와 연관되는 Member 테이블 로우가2개라서 한번 조인될때마다 fetch조인의 특성으로 Member 테이블에 FK외래키 연결 컬럼 모두 가져와서 팀A관련 정보가 2번 반복되는게 맞나요? 질문에 답변 기다리겠습니다 !
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cascade와 mappedby의 관계에 대해 여쭤보고 싶습니다.
안녕하세요 제 이해가 짧아 어딘가 맥락을 놓친 것 같습니다만 그 부분을 스스로 찾기가 힘들어서 여쭤봅니다. @OneToMany(mappedBy = "order", cascade = cascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); 예시에 나온 위 소스를 보면 mappedBy가 걸린 곳에 (즉 연관관계의 주인이 아닌 쪽에) cascade가 걸려있습니다. 제가 이해하기론 mappedby는 읽기만 가능한데, cascade를 붙임으로써 arraylist에 들어있던 마치 업데이트도 가능해지는 것 같이 들려서 제가 헷갈리는 부분을 확인차 여쭤보고 싶습니다. mappedby가 쓰기도 가능해지는 건가요? 아니면 제가 어딘가 내용을 오해했나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
fetch join 할 때 쿼리에 대한 질문드립니다!
n+1 문제가 발생하는걸 위해 페치조인을 사용했는데 select o from Order o join fetch o.member join fetch o.delivery d 이렇게 사용할때 의문이 드는부분이 o.member는 그냥 적어주었는데 o.delivery 에서는 왜 d라고 별칭을 준것인지 궁금합니다 별칭이 있거나 없거나 유무에 따라 차이가 존재하나요?? 혹은 페치조인을 사용할 때 첫번째로 join하는 테이블은 별칭을 사용하지 않고 두번째 테이블부터 별칭 사용이 가능하다거나 하는 제약사항이 있는지 궁금합니다! 결론 : o.member는 별칭이 없고 o.delivery는 왜 별칭이 있는가
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO 질문
안녕하세요 질문이 2가지가 있습니다. 해당 클래스에서만 DTO가 쓰인다면 controller 클래스안에 DTO를 선언해도 되나요? DTO클래스 이름은 DTO를 붙일필요없이 ~request 또는 ~reponse라고 붙여도 될까요?
-
미해결실전! Querydsl
질문 있습니다.
안녕하세요 영한님. private BooleanExpression usernameEq(String userCond); 이 함수를만드셧는데, 이런 함수들은 어느 클래스에서 관리하는게 깔끔할까요??
-
미해결실전! 스프링 데이터 JPA
mappedBy를 사용한 경우
예제 도메인모델과 동작확인 강의에서 보다 질문드립니다. 13분08초쯤에 member 엔티티에 changeTeam부분을 보면, team.getMembers().add(this) 부분이 필요없는 거 아닌가요? 기초강좌에서 mappedBy를 사용하면 엔티티의 주인이 아니라고 배운것 같은데, 굳이 저렇게 추가를 해줘야 하는 이유가 있을까요?