안녕하세요! jpa 수업듣고 혼자 공부하다가 궁금한 점이 생겨서 질문 남깁니다. @Repository @Transactional @RequiredArgsConstructor public class ItemRepositoryImpl implements itemRepository{ private final EntityManager em ; @Override public void delete (Long itemId){ // Item item=findOne(itemId); // em.remove(item); em .createQuery( "delete from Item i where i.id = :id" ) .setParameter( "id" , itemId).executeUpdate() ; } @RunWith (SpringRunner. class ) @SpringBootTest @Transactional public class ItemRepositoryTest { @Autowired ItemRepository itemRepository ; @Autowired private EntityManager em ; private User user ; private Item item ; @Test public void delete (){ Long itemId= itemRepository .save( item ) ; System. out .println(itemId) ; itemRepository .delete(itemId) ; // 1) System. out .println( itemRepository .findOne(itemId).getId()) ; Assertions. assertEquals ( null, itemRepository .findOne(itemId)) ; } 테스트코드를 이렇게 작성하는 경우에는 delete가 다시 rollback되고 테스트 코드에서 1) 부분에서 rollback이 되고 itemRepository.findOne(itemId)가 itemId로 나오던데 @Transactional가 잘못 적용된 것인가요? jpql을 사용하는 경우 flush가 일어나서 flush 과정에서 commit이 일어나고 테스트 코드에서는 이 commit때문에 rollback이 일어나는 것 같은데 제가 생각한 것이 맞나요? 만약 제가 생각한 것이 맞다면 테스트 코드 부분에 1)에서 롤백이 일어나서 테스크코드 delete 메소드에서 save(item)부분도 롤백이 되서 itemRepository.delete(itemId)를 한 이후에는 find해도 null이 나와야하는데 그대로 itemId가 나오는 이유가 뭘까요? 주석처리한 것처럼 em.remove를 사용하면 테스트에 성공하는데 그 이유는 뭘까요ㅜㅜ
@CreatedBy나 @LastModifedBy 설정에서 문제가 생기는 것 같습니다. @Entity @Getter @NoArgsConstructor @ToString ( of = { "id" , "name" , "price" }) public class Item extends BaseEntity { @Id @GeneratedValue @Column ( name = "item_id" ) private Long id ; private String name ; private int price ; private String title ; private String filePath ; public Item ( String name , int price ) { this ( name , price , null, null ) ; } public Item ( String name , int price , String title , String filePath ) { this . name = name ; this . price = price ; this . title = title ; this . filePath = filePath ; } } @Profile ( "local" ) @Component @RequiredArgsConstructor public class InitItem { private final InitItemService initItemService ; @PostConstruct public void init () { initItemService .init () ; } @Component @RequiredArgsConstructor static class InitItemService { private final ItemRepository itemRepository ; @Transactional public void init () { for ( int i = 0 ; i < 10 ; i++ ) { itemRepository .save ( new Item ( "cat's tower" + i , ( i + 1 ) * 50 , "Cat's Tower v." + i , "img/catTower" + i + ".jpg" )) ; } } } @EntityListeners ( AuditingEntityListener. class ) @MappedSuperclass @Getter @ToString ( of = { "createdDate" , "lastModifiedDate" }) public class BaseTimeEntity { @CreatedDate @Column ( updatable = false ) private LocalDateTime createdDate ; @LastModifiedDate private LocalDateTime lastModifiedDate ; } @EntityListeners ( AuditingEntityListener. class ) @MappedSuperclass @Getter @ToString ( of = { "createdBy" , "lastModifiedBy" } , callSuper = true ) public class BaseEntity extends BaseTimeEntity { @CreatedBy @Column ( updatable = false ) private LocalDateTime createdBy ; @LastModifiedBy private LocalDateTime lastModifiedBy ; } @SpringBootApplication @EnableJpaAuditing public class ShoppingmallApplication { public static void main ( String [] args ) { SpringApplication. run ( ShoppingmallApplication. class, args ) ; } @Bean public AuditorAware < String > auditorAware () { return () -> Optional. of ( UUID. randomUUID () .toString ()) ; } } public class Item extends BaseTimeEntity를 하면 즉 @CreatedDate, @LastModifiedDate까지는 잘 작동하는데 @Bean을 설정 후 public class Item extends BaseEntity로 바꾸면 Cannot cast java.lang.String to java.time.LocalDateTime 오류가 터져서 검색으로 조금 알아봤더니 , mysql사용시 liquibase-core v.3.10.3에서 발생하는 문제이고 v.4.3.1로 변경하면 된다는 글을 찾았는데 프로젝트 내에서 liquibase는 없고 또, 다른 글에서는 number타입을 String타입으로 형변환 할 때 나타나는 오류라고 하는데 허접한 시도들을 해보았으나, 결국 저 코드에서 어떻게 손대야 될 지 모르겠어서 질문올립니다 :[ 아래는 오류코드 입니다. ㅡㅡㅡㅡㅡㅡㅡ오류코드 시작ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-01-02 18:31:31.498 ERROR 6928 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initItem': Invocation of init method failed; nested exception is java.lang.ClassCastException: Cannot cast java.lang.String to java.time.LocalDateTime at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.14.jar:5.3.14] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.14.jar:5.3.14] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290) ~[spring-boot-2.6.2.jar:2.6.2] at com.example.shoppingmall.ShoppingmallApplication.main(ShoppingmallApplication.java:17) ~[classes/:na] Caused by: java.lang.ClassCastException: Cannot cast java.lang.String to java.time.LocalDateTime at java.base/java.lang.Class.cast(Class.java:3605) ~[na:na] at com.example.shoppingmall.entity.Item_Accessor_12rl31.setProperty(Unknown Source) ~[classes/:na] at org.springframework.data.mapping.model.InstantiationAwarePropertyAccessor.setProperty(InstantiationAwarePropertyAccessor.java:104) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.mapping.model.SimplePersistentPropertyPathAccessor.setProperty(SimplePersistentPropertyPathAccessor.java:127) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.mapping.model.SimplePersistentPropertyPathAccessor.setProperty(SimplePersistentPropertyPathAccessor.java:171) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.lambda$setProperty$0(MappingAuditableBeanWrapperFactory.java:259) ~[spring-data-commons-2.6.0.jar:2.6.0] at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na] at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.setProperty(MappingAuditableBeanWrapperFactory.java:259) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.setCreatedBy(MappingAuditableBeanWrapperFactory.java:204) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.AuditingHandlerSupport.touchAuditor(AuditingHandlerSupport.java:169) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.AuditingHandlerSupport.lambda$touch$0(AuditingHandlerSupport.java:136) ~[spring-data-commons-2.6.0.jar:2.6.0] at java.base/java.util.Optional.map(Optional.java:265) ~[na:na] at org.springframework.data.auditing.AuditingHandlerSupport.touch(AuditingHandlerSupport.java:134) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.AuditingHandlerSupport.markCreated(AuditingHandlerSupport.java:114) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.auditing.AuditingHandler.markCreated(AuditingHandler.java:92) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.jpa.domain.support.AuditingEntityListener.touchForCreate(AuditingEntityListener.java:92) ~[spring-data-jpa-2.6.0.jar:2.6.0] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.hibernate.jpa.event.internal.ListenerCallback.performCallback(ListenerCallback.java:55) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.jpa.event.internal.CallbackRegistryImpl.callback(CallbackRegistryImpl.java:97) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.jpa.event.internal.CallbackRegistryImpl.preCreate(CallbackRegistryImpl.java:57) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:760) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:746) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[spring-orm-5.3.14.jar:5.3.14] at com.sun.proxy.$Proxy121.persist(Unknown Source) ~[na:na] at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:624) ~[spring-data-jpa-2.6.0.jar:2.6.0] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:529) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:638) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:163) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.6.0.jar:2.6.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) ~[spring-data-jpa-2.6.0.jar:2.6.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.14.jar:5.3.14] at com.sun.proxy.$Proxy124.save(Unknown Source) ~[na:na] at com.example.shoppingmall.controller.InitItem$InitItemService.init(InitItem.java:34) ~[classes/:na] at com.example.shoppingmall.controller.InitItem$InitItemService$$FastClassBySpringCGLIB$$681abf02.invoke(<generated>) ~[classes/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-5.3.14.jar:5.3.14] at com.example.shoppingmall.controller.InitItem$InitItemService$$EnhancerBySpringCGLIB$$a2f07708.init(<generated>) ~[classes/:na] at com.example.shoppingmall.controller.InitItem.init(InitItem.java:22) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.3.14.jar:5.3.14] ... 18 common frames omitted Process finished with exit code 1 ㅡㅡㅡㅡㅡㅡㅡ오류코드 끝ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
강의에서 영속성 컨텍스트에 있는 데이터를 데이터베이스에 보내기 위해 flush하고 그리고 영속성 컨텍스트를 비우기 위해 clear한 후 em.find하여 영속성 컨텍스트가 비워졌으니 데이터베이스에서 값을 가져오는 것은 이해했습니다. 제가 알기로는 em.find가 영속성 컨텍스트에서 찾아보고 없으면 데이터베이스에서 데이터를 가져오는데 그러면 clear하지 않고 영속성 컨텍스트에서 자료 찾아오는 것과 무슨 차이가 있는지 모르겠습니다... 영속성 컨텍스트에도 같은 자료가 있으니 굳이 clear할 필요가 있나 생각이 듭니다. 답변 부탁드립니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] https://www.inflearn.com/questions/379070 이전 질문을 통해 t.member as m 임을 이해하였습니다. 하지만 아직 1가지 의문이 듭니다. 질문 1) String query = "select t.members from Team t"; 위 코드는 묵시적 조인이 발생하고, 따라서 t.members.username 과 같은 호출은 불가능하게 됩니다. 왜냐하면 members는 collection이기 때문에 size와 같은 collection에 대한 정보는 얻어올수 있어도, collection 안에 있는 원소에 대한 정보를 얻어올수는 없기 때문이죠. 따라서 강의에서는 다음과 같이 명시적 조인으로 바꾸면 select m.username from Team t join t.members m 과 같이 m.username 와 같은 사용이 가능하다고 하셨습니다. 하지만 두 코드 모두 1. select t.members from Team t 2. select m from Team t join t.members m (member를 가져오기 위해 select m으로 변경) 동일한 SQL 생성됨을 알수있었습니다. 1. select t.members from Team t 2. select m from Team t join t.members m 두 코드 모두 같은 SQL문을 보여주더군요! 여기서 질문!! 둘다 같은 SQL을 생성하는데 SELECT 절에서 왜 묵시적 조인 쪽은 username에 접근이 안되고, 명시적 조인은 username에 접근이 가능한가요? select t.members from Team t 에 의해서 생성되는 SQL 문을 A select m from Team t join t.members m 에 의해서 생성되는 SQL 문을 B 라고 한다면 A 랑 B 랑 같은 SQL문을 보여주는데, B 에서 username을 얻어올 수 있듯, A 에서 username을 얻어올수 있지 않을까? 생각해서 질문 남겨봅니다. (참고로 t.members는 collection자체이기 때문에 원소 자체의 필드인 username에 접근 불가능하며 m은 Member 엔티티니까 m.username, m.age와 같이 접근 가능한것은 알겠는데, 이는 JPQL상의 코드에서 나타나는 차이지 SQL상에서는 동일하게 SELECT 쿼리를 보내는것 같아서요.) 저의 질문 의도가 좀 명확하지 않다면 죄송합니다 ㅠ.ㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/) [질문 내용] h2는 1.4.199를 사용합니다 User 테이블이 생성되어야 할 것 같은데 생성 실패하는 이유가 뭘까요? (User 테이블이 아니라 강의를 똑같이 따라한 Member에서 id를 @GeneratedValue해도 같은 오류가 나타납니다) persistence.xml <? xml version ="1.0" encoding ="UTF-8" ?> <!--jpa 설정 파일 --> <persistence version ="2.2" xmlns ="http://xmlns.jcp.org/xml/ns/persistence" xmlns: xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi :schemaLocation ="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd" > <persistence-unit name ="hello" > <properties> <!-- 필수 속성 --> <property name ="javax.persistence.jdbc.driver" value ="org.h2.Driver" /> <property name ="javax.persistence.jdbc.user" value ="sa" /> <property name ="javax.persistence.jdbc.password" value ="" /> <property name ="javax.persistence.jdbc.url" value ="jdbc:h2:tcp://localhost/~/test" /> <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> </persistence> User.java package hellojpa ; import javax.persistence.* ; @Entity public class Users { @Id @GeneratedValue (strategy = GenerationType. IDENTITY ) private String id ; @Column private String name ; public Users () { } public String getName () { return name ; } public void setName (String name) { this . name = name ; } public String getId () { return id ; } public void setId (String id) { this . id = id ; } } 오류내역 Hibernate: create table User ( id varchar(255) generated by default as identity, name varchar(255), primary key (id) ) 1월 01, 2022 6:05:00 오후 org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException WARN: GenerationTarget encountered exception accepting command : Error executing DDL " create table User ( id varchar(255) generated by default as identity, name varchar(255), primary key (id) )" via JDBC Statement org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " create table User ( id varchar(255) generated by default as identity, name varchar(255), primary key (id) )" via JDBC Statement at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:559) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:504) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:277) at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:71) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at hellojpa.MappingMain.<clinit>(MappingMain.java:9) Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a CREATE TABLE USER[*] (\000d\000a ID VARCHAR(255) GENERATED BY DEFAULT AS IDENTITY,\000d\000a NAME VARCHAR(255),\000d\000a PRIMARY KEY (ID)\000d\000a )"; expected "identifier"; SQL statement: create table User ( id varchar(255) generated by default as identity, name varchar(255), primary key (id) ) [42001-204] at org.h2.message.DbException.getJdbcSQLException(DbException.java:521) at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) at org.h2.message.DbException.getSyntaxError(DbException.java:265) at org.h2.command.Parser.readIdentifier(Parser.java:6080) at org.h2.command.Parser.readIdentifierWithSchema(Parser.java:6040) at org.h2.command.Parser.readIdentifierWithSchema(Parser.java:6069) at org.h2.command.Parser.parseCreateTable(Parser.java:10325) at org.h2.command.Parser.parseCreate(Parser.java:7811) at org.h2.command.Parser.parsePrepared(Parser.java:1140) at org.h2.command.Parser.parse(Parser.java:1068) at org.h2.command.Parser.parse(Parser.java:1037) at org.h2.command.Parser.prepareCommand(Parser.java:965) at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:624) at org.h2.server.TcpServerThread.process(TcpServerThread.java:288) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.lang.Thread.run(Unknown Source) at org.h2.message.DbException.getJdbcSQLException(DbException.java:451) at org.h2.engine.SessionRemote.done(SessionRemote.java:607) at org.h2.command.CommandRemote.prepare(CommandRemote.java:85) at org.h2.command.CommandRemote.<init>(CommandRemote.java:51) at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:477) at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1292) at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:217) at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:205) at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ... 15 more 1월 01, 2022 6:05:00 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test] Process finished with exit code 0
안녕하세요? page를 처음 렌더링하고 MsgItem의 수정을 클릭하여 startEdit을 실행하면 setEditingId(x.id)를 실행시키는데요. 바로 console.log(x.id)와 console.log(editingId)를 찍어보면 x.id는 잘 나오는데 editingId의 경우 처음 null 이 오고 계속 전값들이 찍혀서요(계속 클릭한 전 x값들이 editingID에 찍힘). setEditingId 함수로 editingID 값 변경까지 시간 딜레이가 있어서 일까요? 작동은 잘 합니다만, 공부하느라 console.log를 찍어보다 의문점이 들어서요!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. OrderItem의 생성 메소드 (createOrderItem)에서 setOrder를 하지 않은 이유가 OrderItem을 Order가 관리하는 형태여서 그런건가요? 이유가 무엇인가요?
1. java 버전으로 1.8을 설치한다고 하셨는데 1.8로 설치하는 이유를 알고 싶습니다. 2. 환경 변수에 이미 JAVA_HOME이 있으면 어떻게 해야하나요? 3. 이클립스 installer를 다운받고 실행했더니 다음과 같이 뜨는데 어떤 것을 설치해야하나요 4. vitualbox download 하는 부분에서 no longer supported라고 명시되어있음에도 다운받아서 사용하는 이유를 알고 싶습니다. 5. 파일질라를 사용하는 대신에 scp 나 rsync 명령어를 사용하여 진행할 수 있을까요
강의에서는 es6 방식을 사용하지만, common js도 알아두어야 할 것 같아서, 혼자 common js를 사용해보던 도중 문제가 발생하여 질문 드립니다! 문제 요약: common js 방식으로 내보내기 한 후, 같은 경로 상의 다른 파일에서 require를 했을 때, 빈객체가 required됩니다. 세부사항 1. 상황 TicTacToe.jsx에서 CLICK_CELL이라는 상수를 내보내어, Td.jsx라는 동일 경로의 다른 파일에서 그 상수를 받아 오려 하는데, 빈 객체가 required 되어 CLICK_CELL의 값이 undefined로 나타납니다. 해당 상수는 Td.jsx가 아닌 다른 경로에 있는 파일에서는 정상적으로 required됩니다! 2. 코드 # 파일 구조 # TicTacToe.jsx # Td.jsx console.log 결과 3. 추측 common js를 통해 같은 경로 상의 파일에서 모듈을 받아오는 경우에 문제가 생기는 것 같습니다. 다만 정확히 어떤 문제인지, 또 어떻게 해결할 수 있는지 해결 방법을 끝내 찾지 못해 질문 드립니다. *깃헙 주소: https://github.com/Parkhanyoung/React-zerocho-basic 항상 좋은 강의 감사드립니다! 덕분에 정말 즐겁게 공부하고 있습니다 ㅎㅎ
안녕하세요! 강의 너무 잘 듣고 있습니다. 듣다가 잘 모르겠는 점이 있어서 질문을 드립니다. 기존 서비스 테스트코드에서는 @BeforeEach로 의존주입을 했는데, 통합테스트에서는 아래와 같이 @Autowired로 끌어온다고 하셨습니다. 테스트코드인데도 SpringConfig코드에서 아래의 서비스와 레포지토리 객체를 실제로 끌어오는 건가요?
아래와 같은 질문 글을 세번째 다시 올리기를 반복하고 있는데 제 질문에만 답변이 없으시고 저보다 늦게 올라온 글에는 하루 이내로 답변을 달아주십니다. 제 질문이 잘못되었거나 특별한 이유가 있으신지 알고싶습니다. elasticbeanstalk로 리액트 배포하는 부분 따라하고 있는 중에 다음과 같은 에러가 발생합니다. During an aborted deployment, some instances may have deployed the new application version. To ensure all instances are running the same version, re-deploy the appropriate application version. 도커와 linux2 로 설정하였고, 그에 맞게 linux2 버전으로 따로 올려주신 코드 그대로 똑같아 작성하였습니다. travis ci는 정상적으로 성공하는데 그 뒤에 aws에서 배포될때만 이렇게 에러가 나오네요.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 명시적 조인 예시로 보여주신 다음 JPQL에 궁금한적이 있습니다. select m.username from Team t join t.members m 위 코드에서 alias m은 무엇에 대한 별칭인가요? 1. t.members as m 위 코드 처럼 team과 members를 묵시적으로 조인한 결과 릴레이션을 m이라 칭한다는 의미인가요?? 아니면... 2. (Team t join t.members) m 위 코드처럼 t와 t.members 를 조인한 릴레이션을 m이라 칭한다는 의미인가요?? PPT를 보면 "FROM 절에서 명시적 조인을 통해 별칭을 얻는다" 라고 하셨는데, 명시적 조인을 통해 => 즉 2번 을 통해 m을 얻는다는 의미 인가요? 이게 한줄로 써있다 보니까 햇갈리는것 같습니다 ㅠ.ㅠ