묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
java.lang.NoSuchMethodError 에러가 해결이 안됩니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 간단한 예제 작성이고, 기존에 잘 진행하던 H2 DB인데, 어느날 부터 갑자기 이런 오류 메세지가 뜨면서 테이블생성은 되나 입력 값이 전혀 들어가지 않는 오류가 발생하기 시작하였습니다. 이유를 도저히 찾을수가 없어서 질문 올립니다. 답 해주시면 감사하겠습니다. Hibernate: drop table if exists Item CASCADE 5월 07, 2022 2:09:36 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@2102a4d5] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. Hibernate: drop table if exists Member CASCADE Hibernate: drop table if exists OrderItem CASCADE Hibernate: drop table if exists ORDERS CASCADE Hibernate: drop sequence if exists hibernate_sequence Hibernate: create sequence hibernate_sequence start with 1 increment by 1 5월 07, 2022 2:09:36 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@1e886a5b] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. Hibernate: create table Item ( ITEM_ID bigint not null, name varchar(255), price integer not null, stockQuantity integer not null, primary key (ITEM_ID) ) Hibernate: create table Member ( MEMBER_ID bigint not null, city varchar(255), name varchar(255), street varchar(255), zipcode varchar(255), primary key (MEMBER_ID) ) Hibernate: create table OrderItem ( ORDER_ITEM_ID bigint not null, count integer not null, ITEM_ID bigint, ORDER_ID bigint, orderPrice integer not null, primary key (ORDER_ITEM_ID) ) Hibernate: create table ORDERS ( ORDER_ID bigint not null, MEMBER_ID bigint, orderDate timestamp, status varchar(255), primary key (ORDER_ID) ) 5월 07, 2022 2:09:36 오후 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 5월 07, 2022 2:09:36 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/jpashop] Exception in thread "main" java.lang.NoSuchMethodError: org.hibernate.annotations.common.reflection.ReflectionManager.reset()V at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:414) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498) 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 jpabook.jpashop.JpaMain.main(JpaMain.java:14)
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OneToMany 페치 조인 문제
현재 그룹 조회 API를 구현하고 있습니다. 메신저 앱 처럼 그룹 조회시 그룹 아이디, 그룹 이름, 그룹 이미지, 그룹에 속해있는 멤버들 (컬렉션)을 조회해 와야합니다. 여기서 강의의 V3 내용처럼 1 + N 문제를 해결하기 위해서 다음과 같이 페치 조인을 사용하여 쿼리문을 작성하였습니다. TeamRepository.java @Transactional(readOnly = true) public interface TeamRepository extends JpaRepository<Team, Long> { @Query("select distinct t from Team t" + " join fetch t.id id" + " join fetch t.groupName gn" + " join fetch t.imageUrl iu" + " join fetch t.teamMembers tm" + " join fetch tm.member m" + " where tm.id = :id") List<SearchGroupResponse> findGroupInfoWithMembers(@Param("id") Long id); } `Team.java` @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Team extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @Column(length = 30) private String groupName; @Lob private String imageUrl; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "place_id") private Place place; @OneToMany(mappedBy = "team", cascade = CascadeType.ALL) private final List<TeamMember> teamMembers = new ArrayList<>(); private LocalDateTime date; } TeamMember.java @Entity @Getter @Table(name = "GroupMember") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class TeamMember extends BaseEntity { @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @ManyToOne(fetch = LAZY) @JoinColumn(name = "team_id") private Team team; @Column(length = 100) private String curLocate; private char arrived; public TeamMember(Member member, Team team) { this.member = member; this.team = team; } } 강의 V3-1 과 같이 컬랙션 데이터는 지연 로딩과 BatchSize를 적용하여 성능 최적화를 해줘야 된다고 배웠지만 일단은 V3를 적용해 보고 개선해 보고자 이렇게 코드를 작성해 보았습니다. 하지만 다음과 같은 에러가 발생하였고 이를 해결하고자 여러 구글링을 해보았지만 해답을 찾지 못하여 질문 남겨봅니다. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'promiseController' defined in file [/Users/sanha/SpringStudy/promisor/out/production/classes/promisor/promisor/domain/promise/api/PromiseController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'promiseService' defined in file [/Users/sanha/SpringStudy/promisor/out/production/classes/promisor/promisor/domain/promise/service/PromiseService.class]: Unsatisfied dependency expressed through constructor parameter 2; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'teamRepository' defined in promisor.promisor.domain.team.dao.TeamRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! Reason: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)!; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.15.jar:5.3.15] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.15.jar:5.3.15] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.6.3.jar:2.6.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.6.3.jar:2.6.3] at promisor.promisor.PromisorApplication.main(PromisorApplication.java:12) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[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:564) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.6.3.jar:2.6.3] Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'promiseService' defined in file [/Users/sanha/SpringStudy/promisor/out/production/classes/promisor/promisor/domain/promise/service/PromiseService.class]: Unsatisfied dependency expressed through constructor parameter 2; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'teamRepository' defined in promisor.promisor.domain.team.dao.TeamRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! Reason: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)!; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.15.jar:5.3.15] ... 24 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'teamRepository' defined in promisor.promisor.domain.team.dao.TeamRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! Reason: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)!; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.15.jar:5.3.15] ... 38 common frames omitted Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! Reason: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)!; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! at org.springframework.data.repository.query.QueryCreationException.create(QueryCreationException.java:101) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:106) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$mapMethodsToQuery$1(QueryExecutorMethodInterceptor.java:94) ~[spring-data-commons-2.6.1.jar:2.6.1] at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na] at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) ~[na:na] at java.base/java.util.Collections$UnmodifiableCollection$1.forEachRemaining(Collections.java:1056) ~[na:na] at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:na] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na] at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.mapMethodsToQuery(QueryExecutorMethodInterceptor.java:96) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$new$0(QueryExecutorMethodInterceptor.java:86) ~[spring-data-commons-2.6.1.jar:2.6.1] at java.base/java.util.Optional.map(Optional.java:258) ~[na:na] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.<init>(QueryExecutorMethodInterceptor.java:86) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:364) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:322) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.util.Lazy.getNullable(Lazy.java:230) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.util.Lazy.get(Lazy.java:114) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:328) ~[spring-data-commons-2.6.1.jar:2.6.1] at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:144) ~[spring-data-jpa-2.6.1.jar:2.6.1] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.15.jar:5.3.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.15.jar:5.3.15] ... 49 common frames omitted Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List promisor.promisor.domain.team.dao.TeamRepository.findGroupInfoWithMembers(java.lang.Long)! at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:96) ~[spring-data-jpa-2.6.1.jar:2.6.1] at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:66) ~[spring-data-jpa-2.6.1.jar:2.6.1] at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:51) ~[spring-data-jpa-2.6.1.jar:2.6.1] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:163) ~[spring-data-jpa-2.6.1.jar:2.6.1] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:252) ~[spring-data-jpa-2.6.1.jar:2.6.1] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:87) ~[spring-data-jpa-2.6.1.jar:2.6.1] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:102) ~[spring-data-commons-2.6.1.jar:2.6.1] ... 71 common frames omitted Caused by: java.lang.NullPointerException: Cannot invoke "org.hibernate.hql.internal.ast.tree.FromElement.setAllPropertyFetch(boolean)" because "fromElement" is null at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:431) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3990) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3776) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3654) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:737) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:593) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:330) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:278) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:276) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:636) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:748) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:114) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[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:564) ~[na:na] at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:362) ~[spring-orm-5.3.15.jar:5.3.15] at com.sun.proxy.$Proxy139.createQuery(Unknown Source) ~[na:na] at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:90) ~[spring-data-jpa-2.6.1.jar:2.6.1] ... 77 common frames omitted
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Attributeconverter @Converter와 nativeQuery와 함께 사용했을때 @Converter가 작동하지 않습니다. 답변해주시면 큰절올리겠습니다,,,,,
1. 강의 내용과 관련된 질문인가요? 아닙니다. 그래도 답변 해주시면 너무 너무 감사드리겠습니다. 2. 네!! 어디에서도 찾지 못했습니다. 3. 넵! 지금 현제 하고 있는 프로젝트에서 Entity에 enum 필드를 @Enumerated를 사용하지 않고 컨버팅해서 사용하려고 했습니다. 예를 들자면 남자(1) 여자(2) 과같은 enum이 있을때 db에 저장할때는 1과 2 (코드값)을 넣고 select로 값을 가져올때는 남자,여자 이렇게 문자열로가지고 오고싶었고 그 방법으로 @Converter 를 사용하는것이였습니다. @Converter는 jpa에서 제공하는 findbyId() 와같은 함수에서는 잘 작동했지만 jpql을 사용해서 db에 직접 쿼리를 날릴때는 전혀 작동하지 않는 문제가 있었습니다. 디버깅 해봤을때는 jpql을 호출할때 내부적으로 @Converter의 프록시가 호출이 안돼서 아에 Attributeconverter의 구현클래스(컨버터)조차 호출이 되지 않았습니다. 저 혼자 해결해 보려했으나 도저히 해결이 안되고 물어볼 곳이 없어서 이렇게 글을 올리게 됐습니다. 답변부탁드립니다.
-
해결됨실전! Querydsl
QMemberTeamDto의 NoClassDefFound
안녕하세요 강의 잘 듣고 있습니다. 중간에 조회 API 개발의 내용 중 QMemberTeamDto를 조회하는 메소드로 컨트롤러를 통해 응답을 주는 컨트롤러를 작성하는 내용이 있는데요 같은 내용의 Test는 통과하였으나 포스트맨에서 요청을 할 때는 NoClassDefFound 에러가 발생합니다 build가 되지 않았나? 해서 gradle로 clean compileJava compileQuerydsl 모두 실행하고 해봐도 같은 결과입니다 빌드된 결과 에러 내용
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA Repository에서 save메서드 호출 이후 바로 user id를 가지고 올 수 있는 이유
안녕하세요 선생님 JPA Repository에서 save메서드 호출 이후 바로 user id를 가지고 올 수 있는 이유가 너무 궁금하여 질문글을 올렸습니다. User entity를 생성한 후 아래와 같이 테스트를 진행해 보았습니다. 아래는 저의 테스트코드입니다. user 객체를 생성, user 객체에서 id 확인 db에 들어가기 전이기 때문에 id가 당연히 없을 것으로 예상 user 객체를 저장 user 객체에서 id 확인, db에서 다시 조회를 하지 않았기 때문에 id가 없을 것으로 예상하였지만 id가 존재 아래와 같은 결과를 얻을 수 있었습니다. JPARepository의 save method는 아래와 같았습니다. 1. save를 했을 때 바로 insert query 발생하는 이유 -> save 메서드를 살펴보면 @Transactional annotation이 존재하고, save 메서드 종료시 em.flush 발생으로 인해 바로 query가 발생하는 것으로 생각함. 2. user.getId를 받아올 수 있는 이유는 뭘까 user.getId를 받아올 수 있는 경우는 db에 저장을 완료하고, db에 있는 user 정보를 다시 조회했을 때 받아올 것이라고 생각한 것과 달리, save 메서드를 실행하자마자 db 저장 내용이 바로 반영이 된 것을 확인할 수 있었습니다. 따로 select query문이 발생하지 않은 것으로 보아, db 조회는 없었다는 것을 알 수 있습니다. persistcontext와 dirty check에 의해서 이러한 현상이 발생한 것이라고 추측은 하고 있습니다만 이게 어떻게 가능한 일인지 궁금합니다. 제 User entity는 아래와 같습니다. id의 생성시점은 user entity를 db에 저장하는 시점에 생성되는 것이라고 생각하는데, (쓰기 지연 SQL 저장소에서 flush 이후에 id값이 생성될 것이라고 생각함) 생성 이후에는 db에서 user를 다시 가져오고 있지 않습니다. 변경감지로 user id가 생성된 것인지, JPA repositoy에서 save 메서드 이후에 entity를 return 해 주기 때문인지 궁금합니다. 3. EntityManager의 생명주기는 Transactional의 생명주기와 동일하며, PersistContext의 생명주기는 EntityManagerFactory의 생명주기와 동일하게 Application loading 시점과 WAS가 종료되는 시점에 생성과 사멸을 한다고 볼 수 있는 것일까요? 4. 위와 동일한 맥락으로 저의 테스트 코드에서의 영속성 컨텍스트와 JPA Repository의 save 메서드 내의 영속성 컨텍스트는 동일한 영속성 컨텍스트라고 보면 될까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
web api 설계 (Post)
안녕하세요 영한님. 올려주신 spring 강의부터 jpa까지 거의 다 듣고 배운것을 활용해서 토이 프로젝트 만들고 있습니다. web api 설계시에 궁금한것이 있어 문의드립니다. 만약 parents 있고 children이 존재합니다. parent와 children은 1대N 관계입니다. 제가 처음 백엔드 api 설계했을때 아래처럼 설계했습니다. POST /parents : parents 리소스가 생성됩니다. POST /parents/{id}/children : parent와 연관된 children 이 생성됩니다. 설계를 마치고 프론트엔드에서 해당 api를 이용해서 등록하려했습니다. 여기서 궁금한것이 생겼습니다. 아래 두 방식중 어떤것이 좋은것인지 잘모르겠습니다. 1. 프론트에서 한번의 Post 요청으로 parents와 childrens list를 모두 생성합니다. request body 예시: { parent: "..." children:[ "...", "..." ] } 백엔드에서 parent정보로 parent 리소스를 만들고 만들어진 parent의 id와 body에 있는 children 리스트로 children 리소스를 생성합니다. 2. 프론트에서 POST /parent와 POST /parent/{id}/children을 각각 요청합니다. 먼저 POST /parents 요청을 보내고 응답값에서 parents id를 받아 children 갯수만큼 POST /parents/{id}/childrens 요청을 합니다.(이럴경우 요청수는 1+N이 겠네요). 1번과 2번 방식중에 어떤 방법이 나은지 잘 모르겠습니다. 제가 생각한 각각의 장단점입니다. 1번의 장점 : 하나의 요청에 모든 정보가 들어있어 요청 처리중 에러 발생시 기존에 저장된 정보도 롤백이 가능하다는 장점이 있을것같습니다. 또한 request도 한번이면 됩니다. 1번의 단점 : api가 직관적이지 않은것같습니다. 클라이언트는 POST /parents를 사용하면 parents 리소스가 생길것으로 예상합니다. 하지만 해당 요청으로 children이 생길것이라는것은 문서를 봐야합니다. 또한 유연하지 않다고 생각합니다(클라이언트마다 구현방식이 다를것이므로) 2번의 장점 : api가 직관적입니다. 유연합니다. 클라이언트가 구현방식을 바꾸더라도 백엔드의 api를 바꾸지 않아도 될것같습니다. 2번의 단점 : 클라이언트쪽에서 여러번 api를 호출해야합니다. 요청 도중에 에러가 발생할 경우 parents는 등록되고 children은 등록이 안될수도 있습니다. 둘중에 어떤것 방식을 실무에서 사용하나요? 2번으로 마음이 좀 기울긴하는데, 위에 적히 단점들이 걸리네요.. 그리고 클라이언트쪽에서 N개의 children를 모두 등록하고 싶을때 body에 list를 담아서 post /children 전부를 한번에 보내서 처리할수있게 api를 만드는게 좋은것인가요? (하나의 요청으로 여러개의 리소스 생성, 백엔드에서 리스트를 순회하면서 저장) 아니면 클라이언트쪽에서 list를 순회하면서 N번 post 요청 하게 만드는것이 좋은가요?( 하나의 요청으로 하나의 리소스생성, 대신 여러번 호출) 긴글 읽어주셔서 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA 엔티티 단건 조회 시 하위 테이블 값이 null 들어가는 문제 해결 방법 문의 건
JPA 엔티티 단건 조회 시 하위 테이블 값이 null 들어가는 문제 해결 방법 문의 건 안녕하세요~ 강사님 수업 잘 듣고 있습니다 회사에서 JPA 를 도입해서 사용중인데요 연관관계 테이블이가 많은 오더단건 정보(헤더와 연관된 하위테이블 모두) 를 가져와 엔티티를 조회후에 맵스트럭처를 통해 JSON으로 외부로 데이터 전송하는 부분을 구현중입니다 리파지토리 extends JpaRepository 를 사용해서 리파지토리.getOne 을 통해서 엔티를 꺼내왔는데 이상하게도 브레이크포인트 디버깅을 걸어서 확인해보면 맵스트럭쳐를 통해 JSON 을 변경하기전 엔티티에 담겨있는 오더단건 정보(헤더와 연관된 하위테이블 모두)가 잘 담겨있을줄 알았지만, 헤더테이블 엔티티 Header Table A 만 데이터가 담겨있고, 연관된하위테이블 엔티티는 모두 null 로 들로가있습니다 이부분을 어떻게 해결해야 하는지 도움 부탁드립니다 (관련 블로그나, 참고 URL 블로그등을 알려주시면 참고하겠습니다) █ Header Table A ██ Detail Table A_1 @ManyToOne(fetch = FetchType.LAZY) private List<> ███ Detail Table A_1_1 @ManyToOne(fetch = FetchType.LAZY) private List<> ███ Detail Table A_1_2 @ManyToOne(fetch = FetchType.LAZY) private List<> ████ Detail Table A_1_2_1 ██ Detail Table B_1 @ManyToOne(fetch = FetchType.LAZY) private List<> ██ Detail Table C_1 @ManyToOne(fetch = FetchType.LAZY) private List<> ██ Detail Table D_1 @ManyToOne(fetch = FetchType.LAZY) private List<> ██ Detail Table E_1 @ManyToOne(fetch = FetchType.LAZY) private List<> 김동희 드림
-
미해결실전! 스프링 데이터 JPA
실무(OLTP 환경)에서는 강의에서 알려주신 오프셋 페이징을 쓰면 안되는거 맞을까요?
실무에서 DB 를 사용한다고 하면 배치나 데이터 파이프라인 등이 아닌 OLTP 환경에서는 절대 오프셋 기반의 페이징을 쓰면 안되지 않나요? 우선 페이징 도중에 다른 클라이언트에 의해 실시간으로 데이터가 삽입/삭제가 일어나 중복된 데이터가 보여지거나 중간 데이터 누락이 발생할 수도 있기 때문에 문제가 될 것이고, 성능의 관점에서도 SQL 쿼리에서 OFFSET 문의 경우 index seek 과정에서 바로 페이지의 첫 데이터를 찾아가는것이 아니라 불필요하게 맨 처음 인덱스부터 offset 사이즈만큼 스캔한 뒤에 limit 만큼 가져오는 것이기 때문에 scalable 않지만, 커서 기반의 페이징의 경우 데이터의 양이 많아지더라도 where 절을 통해 index seek 과정에서 바로 커서에 해당하는 인덱스를 찾아가서 page size 만큼의 데이터만 스캔하면 되기 때문에 실무에서 굳이 오프셋 기반의 페이징을 쓸 이유가 없다. 라고 이해하면 맞을까요? 물론 페이징 대상이 되는 데이터의 수 자체가 매우 적거나 유저가 많은 페이지를 탐색하지 않는다면 큰 문제가 되지 않을 수도 있지만, 커서 기반의 페이징을 구현하는것이 특별이 어려운 것도 아니고 굳이 오프셋 기반의 페이징을 사용할 필요가 있나 궁금했습니다!
-
해결됨실전! Querydsl
DTO 클래스의 위치? 관련해서 질문 드립니다!
안녕하세요. 강의 너무나 잘 듣고 있어 언제나 감사드립니다. (_ _) DTO 관련해서 궁금점이 있어 질문드립니다. 제가 많이 본, 그리고 제가 지금도 쓰고있는 폴더 트리(패키지 구조)가 아래와 같이 사용하고 있습니다. - Model - | Repository - | Service - | Controller ▼ Service단의 경우에는 다른 서비스단에서 연계해서 사용될 수도 있다고 들은적이 있어서, 최대한 Model 클래스를 반환되도록 사용하고 있구요. 위와 연계해서 Controller단에서 Model 클래스를 DTO로 변환해서 반환을 했습니다. 그래서 DTO의 위치가 Controller 패키지에 위치시키고 있었습니다. 그런데 join 쿼리로 인해서 DTO를 Repository에서 반환하게 된다면, 해당 DTO의 위치가 맨 끝인 Controller 패키지에 있어도 되는 걸까요?
-
미해결
JPA 영속성 전이 질문드립니다.
안녕하세요. JPA 영속성 전이와 관련하여 질문드립니다! 목적은 유저가 탈퇴한다고 가정했을때, User 데이터를 delete할때 그와 관련된(외래키로 엮어져있는) 다른 테이블의 모든 데이터를 같이 삭제하고 싶습니다. 우선 ERD는 아래와 같습니다. users : apps = 1:N users: resources = 1:N app_resources = apps와 resources의 중간테이블(apps:resources = N:M 해결) resources 슈퍼타입 scenes, avartar 서브타입 scenes: hubs = 1: N 관계입니다. 위와같은 ERD에서 users테이블에 데이터를 삭제할경우 연관된 모든 데이터를 지우기 위해 아래의 사진과 같이 모두 양방향 연관관계를 추가하였습니다. 아래 사진처럼 작성했을경우 정상적으로 user에 관련된 데이터들이 모두 잘 삭제가 됩니다. 그런데 아래와 같이 모든 엔티티에서 @OneToMany 연관관계에 cascade = cascadeType.ALL, orphanRemoval = true 를 사용해도 괜찮은지 질문드립니다! (화면에 다 넣으려니 잘 안보이네요 ㅠㅠ 확대해서 봐주시면 감사하겠습니다)
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
페치조인의 한계 중, 여러개의 Entity를 함께 가져오는 페치 조인
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용]여기에 질문 내용을 남겨주세요. 페치조인의 한계로, 일대다 관계에서 컬렉션을 함께 조회하는 페치조인의 경우 데이터 뻥튀기 문제가 일어나기 떄문에, 둘 이상의 컬렉션을 페치조인으로 함께 가져오려고 하면 더더욱 안된다고 설명해주셨습니다. 그렇다면 Order - (1:N) - Order_Item - (N:1) -Item 의 경우 Order_Item을 조회할 때 Order와 Item을 모두 함께 가져오는 페치조인은 해도 되는것인지 궁금합니다. (즉 둘 이상의 컬렉션을 가져오는게 아닌, 둘 이상의 Entity를 가져오는 페치조인의 경우는 써도 되는지) ( select o from OrderItem o join fetch o.orders join fetch o.item 과 같은 JPQL을 사용하여 )
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
ec2에서 docker pull 해서 백그라운드로 개인 프로젝트 진행중에 문제발생하여 질문드립니다.
안보일 까봐 복사했습니다. 2022-05-02 07:18:24.438 INFO 1 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888 2022-05-02 07:18:24.772 INFO 1 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://localhost:8888. Will be trying the next url if available 2022-05-02 07:18:24.773 WARN 1 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:8888/capstone-cell-service/default": Connection refused; nested exception is java.net.ConnectException: Connection refused 2022-05-02 07:18:24.781 INFO 1 --- [ main] c.e.c.CapstoneCellServiceApplication : No active profile set, falling back to 1 default profile: "default" * 그래서 라고생각하는데 회원가입은 제대로 진행되는 반면, 로그인 시도 시 , 2022-05-02 10:10:21.244 ERROR 1 --- [o-auto-1-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.lang.NumberFormatException: Cannot parse null string at java.base/java.lang.Long.parseLong(Long.java:685) ~[na:na] at java.base/java.lang.Long.parseLong(Long.java:847) ~[na:na] at com.example.capstoneuserservice.security.AuthenticationFilter.successfulAuthentication(AuthenticationFilter.java:71) ~[classes!/:1.0] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:232) ~[spring-security-web-5.5.5.jar!/:5.5.5] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.5.5.jar!/:5.5.5] 오류가 발생하면서 못읽어오는 듯한 모습을 보여주는것 같습니다.. 안녕하세요 강사님. 강사님 강의듣고 프로젝트 진행중에 있는 학생입니다. 수업을 듣고 로컬에서 진행하는 것이 아닌 ec2에서 진행하고있습니다. docker hub에 push한 image를 ec2 서버로 접속 후 pull 하여 백그라운드로 run하여 구성하였습니다. 그런데 회원가입은 진행이 잘 됩니다만 로그인 실행시 long에 들어가는 token.expiration.time 이었나 null로 들어와서, 왠지 봤더니 아예 github에 public으로 존재하는 application.yml 파일을 읽어 오지 못하고있는것 같습니다. 저의 application.yml이 존재하는 깃허브 주소는 https://github.com/KimTaeKang57/capstone-cloud-config.git 입니다만. WARN 오류를 잘 보면 연결을 하지못하는 것같은데요, user-service의 bootstratp.yml 파일 내용은 spring: cloud: config: uri: http://127.0.0.1:8888 name: application 다음과같고, config-server의 application.yml은 spring: application: name: capstone-configure-service cloud: config: server: git: uri: https://github.com/KimTaeKang57/capstone-cloud-config.git default-label: master enabled: true 다음과 같이 되어있습니다. 그런데 ec2 서버에서 해서 그런가요. http://localhost:8888/../default에 접근을 하지못하는 오류가 발생하여 탐색과 고민끝에 질문드립니다. - configure-server run: docker run -d -p 8888:8888 —network ecommerce-network -e "spring.profiles.active-default" —name config-service zizoen123/capstone-configure-server:1.0 - user-service run : docker run -d --network ecommerce-network --name user-service -e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/" -e "spring.datasource.url=jdbc:mariadb://mariadb:3306/capstone" zizoen123/capstone-user-service:1.0 run 명령어들은 다음과같습니다.. 뭔가 빠뜨린게 있을까요? 따로 kafka나 zipkin 등등은 모두 사용하지 않고 mariadb만 사용했습니다.
-
미해결더 자바, 코드를 조작하는 다양한 방법
GC 설명부분 질문드립니다.
GC 는 크게 쓰로우 풋 위주의 GC 와 stop the world 를 줄이는 GC 두가지가 있다 말씀주셨는데요 여기서 쓰로우 풋 위주의 GC 는 어떤 키워드로 검색을 해봐야 조금 더 자세히 공부를 해볼 수 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
12분6초 : 쿼리 수 계산 질문입니다.
List<Order> orders = orderRepository.findAllWithMemberDelivery();List<OrderDto> result = orders.stream() .map(o-> new OrderDto(o)) .collect(Collectors.toList()); 처음 orders 생성하는데 쿼리 한번 제외하고,result 생성하는데 쿼리 OrderItem 2개 ,그중 OrderItem 당 Item 2개라서 총 6번이라고 설명해주셨습니다. 근데 저는 OrderItem 엔티티에서 @ManyToOne(fetch = LAZY)@JoinColumn(name = "item_id")private Item item; 으로 Item필드가 다대일로 되어있는데 OrderItem 하나 불러올때 Item도 하나 불러오는게 당연하다고 생각하는데 왜 Item을 두개나 불러오는지 모르겠습니다. 그래서 6번 쿼리가 아니라 4번이라고 생각하됩니다 ㅠㅠ 어디에서 잘못이해한걸까요
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
querydsl 의존관계 없는 left join 문의
안녕하세요! 실무에서 jpa를 쓰게 되서 강사님의 책과 강의를 번갈아 보면서 열심히 개발하던 중에 궁금한 점이 있어 문의드립니다. 쓰다보니 query dsl이 참 편하더라구요! 그런데 연관관계 없는 두 개 entity를 조인해서 데이터를 조회해오고 싶은데, 아래와 같이 쿼리를 작성하니 실행 중에 QuerySyntaxException이 발생합니다. List<HistoryDto> historyList = queryFactory .select(Projections.fields(HistoryDto.class, pmntHistoryEntity.approvalNo, pmntHistoryEntity.approvalDate, pmntHistoryEntity.cancelType, pmntHistoryEntity.trxId, pmntHistoryEntity.trxReqDate, creditCardEntity.cardName, creditCardEntity.cardNumber )) .from(pmntHistoryEntity) .leftJoin(creditCardEntity).on(pmntHistoryEntity.cardToken.eq(creditCardEntity.cardToken)) .where( eqUserId(dto.getUserId()), eqOrderId(dto.getOrderId()) ) .fetch(); exception = QuerySyntaxException: begin 0, end -1, length 19 queryDsl에서 연관 관계 없어도 on 절을 통해 join이 가능한 것으로 알고 있는데 projection과 호환이 안되는 걸까요? 하루종일 구글링을 해도 나오질 않네요.. 혹시 알고 계시다면 답변 부탁드립니다 ㅠ_ㅠ
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
GET /api/v2/orders 조회 관련 질문
@GetMapping("/api/v2/orders") public List<OrderDto> ordersV2() { List<Order> orders = orderRepository.findAllByString(new OrderSearch()); List<OrderDto> result = orders.stream() .map( o -> new OrderDto(o) ) .collect(Collectors.toList()); return result; } @Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private List<OrderItem> orderItems; public OrderDto(Order order) { orderId = order.getId(); name = order.getMember().getName(); orderDate = order.getOrderDate(); orderStatus = order.getStatus(); address = order.getDelivery().getAddress(); order.getOrderItems().stream().forEach(o -> o.getItem().getId()); orderItems = order.getOrderItems(); } } 위 코드에서 OrderDto 생성자 함수 내에 getOrderItem 요소들을 순회시, 각 아이템을 get후에 getId를 호출 할 때 각 item 프록시들이 초기화 돼야 하는 것 아닌가요..? 강의에서는 getName을 통해 초기화 하길래, 위 코드처럼 getId로 하면 될까 궁금증이 생겨 실행해보니 orderItems 내에 item 이 null 값으로 나옵니다. getName 으로 초기화 할 때는 전부 다 들어있구요. 코드 구글 드라이브 링크: https://drive.google.com/drive/folders/17gdIodVzIPG8_XzTeYUVDbLdaScP6c2s
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]JPA강의 Hibernate부분에서 Hibernate: insert into member (id, name) values (null, ?)이라고 나와야 하는데 저는 Hibernate: insert into member (id, name) values (default, ?) 이라고 뜨는데 차이가 뭐고 어떻게 하면 null로 나오게 할 수 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
distinct중복 제거에 대한질문입니다!!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]친근하면서 알짜 베기 강의 너무 잘보고있습니다 다름이아니라 저도 항상 생각했던 문제인데 user team onetomany manytoone 일때 team10개를 가져올때 user 는 1개만 가져오고 싶을때 jpa에서는 distinct를 붙히면 해결된다고 강의에서 봤는데요 썡 쿼리랑 다르게 jpa distinct는 중복을 엔티티로 제거해준다고 봤습니다 다만 이방법이 querydsl에서도 가능한 방법인지 궁금합니다 물론 곧 영한 님의 querydsl도 수강예정입니다 ex) jpaQueryFactory.select(qatable,qbtable).distinct().from(qatable).on(뭐시기)~~~ 이런 상황에서도 distinct가 jpa방식으로 작동하는지 질문드립니다 감사합니다
-
해결됨실전! Querydsl
querydsl and(,) or 처리 질문있습니다.
a,b,c.or(d)제가 원하는 쿼리는 (a) and (b) and (c ) or (d)인데 실제 쿼리는(a) and (b) and (c or d)이렇게 쿼리문이 나갑니다. 어떻게 해야할까요? 개별 괄호는 쳐도 다 생략이 되고 (a,b,c).or(d)이렇게도 불가한데 BooleanExpression으로는 제가 원하는 방식을 사용할 수 없을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블 생성은 되지만, 데이터 삽입이 되지 않습니다!!ㅜㅜ!!
package jpabook.jpashop;import org.assertj.core.api.Assertions;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.annotation.Rollback;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.transaction.annotation.Transactional;import static org.junit.Assert.*;@RunWith(SpringRunner.class) //스프링과 관련된 것을 테스트할 것임을 JUnit에게 알려줌@SpringBootTestpublic class MemberRepositoryTest { @Autowired MemberRepository memberRepository; //의존성 주입 @Test @Transactional @Rollback(value = false) public void MemberRepositoryTest() throws Exception { //given Member member = new Member(); member.setUsername("memberA"); //when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); }} spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: open-in-view: false hibernate: ddl-auto: create properties: hibernate:# show_sql: true format_sql: truelogging.level: org.hibernate.SQL: debug# org.hibernate.type: trace