묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! Querydsl
8:13 질문
안녕하세요 영한님 감사합니다 ^_^ 08:13 보시면 em.flush를 해주시는데 필수인건가요 ?? flush을 쓰지 않아도 자동으로 나가는걸로 알고있습니다. clear만 해도 될까요?? 실험결과 clear만 써주면 되긴합니다만 flush를 별도로 또 호출해줘야 더 안전한 코드인가요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 submit 시에 save the transient instance before flushing 에러가 발생합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 에러 메시지 내용은 org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member; 입니다. Member와 Order 클래스의 영속성 전이 문제인 것 같아서 각각 cascade = CascadeType.ALL 을 추가해주면 에러메시지는 사라지지만 주문내역에서 회원명이 나오지 않습니다ㅠㅠ 또 회원목록에서 등록하지 않은 회원이 생성됩니다. 그래서 일단 cascade 추가 전 Order 클래스와 Member 클래스의 코드 첨부합니다. 구글 드라이브 주소입니다. https://drive.google.com/file/d/1j0oevd3vhsXt8e1LwuuVgS7fu6RLY8yN/view?usp=sharing
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 영한님 스프링 부트 관련 질문 드립니다.
이번 강의를 들으면서 H2데이터베이스가 아닌 MySQL에 적용을 해보고 싶어서 시도를 해봤는데요, 도커에 MySQL을 띄우고 실행을 하였는데 궁금증이 생겨 질문 드립니다. 스프링 부트의 application.properties에 적는 MySQL환경 설정과 docker-compose.yml에 적는 MySQL환경 설정을 둘다 입력해 줘야 하나요?? 한곳만 입력해줘도 괜찮은가요? 좋은 강의 감사합니다 ㅎㅎ
-
미해결실전! Querydsl
changeTeam의문점
안녕하세요 영한(god)님 질문이 하나있습니다. 지금 changeTeam 을 이용하여 Member의 Team을 바꿔주시는데 이게 em.flush ,clear 하고 조회를 해오면 더티체킹으로 Member의 Team이 잘 바뀌어서(update) 조회됩니다. 근데 문제는 자바 컬렉션에서의 문제입니다 team.getMembers().add(this); 이 결과로 (팀)양쪽에 같은 맴버가 생기는거 같습니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
jpa 테스트시 계속 오류가 나네요;...
IDENTIFY 설정시 insert 시 키값을 자동으로 설정해서 받아오는 걸로 이해했는데 null 에러인지 발생하는거 같아요. 데이터 넣어놓고 읽어오는건 괜찮은거 같은데 insert가 잘 안되네요;.. javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:780) at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:760) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) at com.sun.proxy.$Proxy87.persist(Unknown Source) at com.example.demospring.repository.JpaMemberRepository.save(JpaMemberRepository.java:17) at com.example.demospring.service.MemberService.join(MemberService.java:26) at com.example.demospring.service.MemberService$$FastClassBySpringCGLIB$$25787b35.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) at com.example.demospring.service.MemberService$$EnhancerBySpringCGLIB$$972d7024.join(<generated>) at com.example.demospring.service.MemberServiceIntegrationTest.회원가입(MemberServiceIntegrationTest.java:27) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$165/0x0000000000000000.apply(Unknown Source) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall$$Lambda$166/0x0000000000000000.apply(Unknown Source) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.ExecutableInvoker$$Lambda$369/0x0000000000000000.apply(Unknown Source) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$927/0x0000000000000000.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$813/0x0000000000000000.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$255/0x0000000000000000.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$254/0x0000000000000000.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$240/0x0000000000000000.accept(Unknown Source) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$813/0x0000000000000000.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$255/0x0000000000000000.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$254/0x0000000000000000.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$240/0x0000000000000000.accept(Unknown Source) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$813/0x0000000000000000.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$255/0x0000000000000000.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$254/0x0000000000000000.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator$$Lambda$216/0x0000000000000000.accept(Unknown Source) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3279) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3885) at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:84) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645) at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:330) at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:123) at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) at org.hibernate.internal.SessionImpl$$Lambda$1709/0x0000000000000000.accept(Unknown Source) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:774) ... 105 more Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement: insert into member (id, name) values (null, ?) [23502-202] at org.h2.message.DbException.getJdbcSQLException(DbException.java:508) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.table.Column.validateConvertUpdateSequence(Column.java:365) at org.h2.table.Table.convertInsertRow(Table.java:931) at org.h2.command.dml.Insert.insertRows(Insert.java:167) at org.h2.command.dml.Insert.update(Insert.java:135) at org.h2.command.CommandContainer.executeUpdateWithGeneratedKeys(CommandContainer.java:246) at org.h2.command.CommandContainer.update(CommandContainer.java:167) at org.h2.command.Command.executeUpdate(Command.java:247) at org.h2.server.TcpServerThread.process(TcpServerThread.java:413) at org.h2.server.TcpServerThread.run(TcpServerThread.java:190) at java.base/java.lang.Thread.run(Thread.java:836) at org.h2.message.DbException.getJdbcSQLException(DbException.java:459) at org.h2.engine.SessionRemote.done(SessionRemote.java:611) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:191) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:152) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ... 124 more
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
10:40에 id값이 어떻게 1이 나오는건가요?
안녕하세요! 다른 분들도 이 부분에 대해서 질문을 하셨고 답변을 봤지만, 여전히 이해가 안돼서 다시 한번 질문을 드립니다. ㅠㅠ 1 em.persist(member) ; 2 3 em.flush(); 4 em.clear(); 5 6 em.getReference(Member.class, member.getId()); 7 8 System.out.println("findMember.id = " + findMember.getId()); em.clear()를 하면 1차 캐시가 전부 비워지고, GeneratedValue로 생성된 id값은 DB에 저장되어 있습니다. em.getReference(id)를 하는 시점에 가짜 프록시 객체가 영속성 컨텍스트에서 관리가 된다고 하셨는데, 여기서 가짜 프록시 객체는 id값을 어떻게 1로 가지고 있는 건가요?? 결국 1이라는 값을 알기 위해서는 DB에서 가져와야 하는게 아닌가요?? 아니라면 혹시 자동으로 SEQUENCE 전략으로 변경되어 메모리에 디폴트로 50까지 가지고 있기 때문에 1을 출력해주는 것일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
NotEnoughStockException에 대해서 조금만 더 자세한 설명 부탁드려도 될까요?
NotEnoughStockException에서 오버라이드를 해서 그냥 놔두는 이유를 조금만 더 명확하게 설명 부탁드려도 될까요? 그리고 5개를 오버라이드를 했는데 오버라이드를 할 수 있는 메소드들은 많이 있는데 그중에 어떤 메소드들을 오버라이드를 하는지, 그리고 그 메서드들을 오버라이드를 하는 이유와 마지막 한개는 필요가 없는 이유를 조금만 더 명확하게 알고 싶습니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
API를 사용하는 이유?
API가 뭔지는 알겠습니다. "객체(DTO)에 있는 값들을 JSON으로 반환하는 컨트롤러" 근데 이것을 왜 쓰는지는 감이 안옵니다.만약 조회의 결과를 JSON으로 클라이언트에 반환한다 치면,조회값이 엄청 많으니까 JSON으로 "축약"해서 보낸다는 느낌으로 이해 했는데 맞나요..? 클라이언트에서 서버로 왜 JSON으로 보내는지, 반대의 경우는 왜 그러는지 감이 안잡힙니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cascade관련해서 문의드립니다.
cascade를 사용하는곳이 FK 가 없는곳이라고 생각하면 맞을까요? FK가 없는곳이면 부모Entity라고 생각을 하면 될 것 같은데.여기서 부모라고하면 변경되는 주체(?)를 표현한 것인데.예를들어 게시판과 첨부파일 테이블이 있다고 한다면게시판이 부모Entity이고, 첨부파일이 자식Entity라고 생각했을때(게시글을 지우면 첨부파일도 같이 지워지는 구조이기 때문에.. 첨부파일을 지운다고 해서 게시글이 같이 지워진다는 보장은 없으니까요)이럴 경우에는 게시판Entity에 cascade를 설정하는게 맞는 것 같은데 제가 이해하고 있는게 맞는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문있습니다
강의 잘보고있습니다. 강의 잘 따라하다가 갑자기 떠오른건데 이거 h2 데이터베이스로 연동해서 사용하는건데 톰캣내장서버 껏다가 키면 왜 제가 저장했던 데이터가 날아가는거죠?? db사용하면 메모리저장이랑 다르게 서버껏다켜도 db에 저장했던 값이 있어야되는거아닌가요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블 생성할 때 문의드립니다.
테이블을 생성할 때 설명중 객체는 타입이 있어서 명확하게 member.id를 구분할 수 있는데 테이블에서는 구분하기가 어렵고 조인등의 쿼리를 짤 때도 불편하다고 해서 member_id로 잡아주신다고 하셨는데.. 이런 내용이 PK나 FK 에만 해당이 되는건지 궁금합니다. 예를들어 member라는 테이블에member_id, name이라는 필드가 있고, item이라는 테이블에도 item_id, name이라는 필드가 있을경우 name이라는 필드명이 겹치는데 이럴 경우에는 테이블 구조를 짤 때 그냥 name으로만 하시는지 아니면 member_name, item_name으로 하시는지 궁금합니다.강의를 쭉~~ 들으면서 드는 생각은 PK, FK와 관계되는것들(다른 테이블과 직접적인 연관관계를 맺고있기 때문에)만 구분을 하기 위해서 member_id, item_id로 만드는 것 같은데 제가 이해한대로 실무에 적용을 해도 문제가 없는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Entity 저장에 관해 문의드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 영항님! 좋은 강의 잘 듣고 있습니다. 강의를 듣고 토이 프로젝트를 진행하는 와중에 궁금한 점이 생겨 질문글을 올리게 되었습니다. 저는 Board라는 Entity를 다음과 같이 선언하였습니다. @Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "board_id")private Long id;private String title;private String topic;private String content;@Enumerated(EnumType.STRING)private StudyState studyState;@Enumerated(EnumType.STRING)private RecruitState recruitState;private Long headCount;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "member_id")private Member member; 그리고 저는 프론트에서부터 전달받은 Dto로 실제 Board Entity를 저장하려고 했습니다. 그래서 저는 Dto로 부터 Entity를 만들 수 있는 메소드 toEntity를 다음과 같이 구성하였습니다. @Data@NoArgsConstructor@AllArgsConstructorpublic class BoardCreateRequestDto { private Long memberId; private String title; private String topic; private String content; private Long headCount; private StudyState studyState; private RecruitState recruitState; public Board toEntity() { return Board.builder() .title(this.title) .topic(this.topic) .content(this.content) .studyState(this.studyState) .recruitState(this.recruitState) .headCount(this.headCount) .member(new Member(this.memberId)) .build(); }} Board board = boardRepository.save(requestDto.toEntity()); 실제로 저장을 할 시에 Board Entity에는 Member를 넣어 저장하나, 실제 DB에서는 Board 객체에서의 Id만을 외래키로 저장하기에 다음과 같이 저장해도 무방하다는 것을 알게 되었습니다. 저는 이 방법이 MemberId를 통해 Member 객체를 찾지 않고 저장할 수 있기에 쿼리 1번을 덜 날릴 수 있어 비용적인 측면에서 조금의 이득이 생긴다고 생각하여 다음과 같이 구성해보았습니다. 이러한 방법이 문제가 있는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 이러한 에러가 발생하여 질문 드리게 되었습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 현재 계속되는 상품주문 클릭시 발생되는 에러를 해결하던도중 이러한 에러가 뜨게 되어서 해결하다 도저히 안되서 질문드리게 되었습니다. 관련 파일을 계속 PDF랑 비교해봤는데 틀린것이 없어 막혀버렸습니다. Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sun Dec 05 15:37:26 KST 2021 There was an unexpected error (type=Internal Server Error, status=500). An error happened during template parsing (template: "class path resource [templates/order/orderList.html]") org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/order/orderList.html]") at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:366) at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:190) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1400) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1145) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1084) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:831) Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "T(jpabook.jpashop.domain.OrderStatus).values()" (template: "order/orderList" - line 18, col 16) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) at org.attoparser.MarkupParser.parse(MarkupParser.java:257) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ... 48 more Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "T(jpabook.jpashop.domain.OrderStatus).values()" (template: "order/orderList" - line 18, col 16) at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:292) at org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166) at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:125) at org.thymeleaf.standard.processor.StandardEachTagProcessor.doProcess(StandardEachTagProcessor.java:73) at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314) at org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleOpenElementEnd(TemplateHandlerAdapterMarkupHandler.java:304) at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleOpenElementEnd(InlinedOutputExpressionMarkupHandler.java:278) at org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleOpenElementEnd(OutputExpressionInlinePreProcessorHandler.java:186) at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleOpenElementEnd(InlinedOutputExpressionMarkupHandler.java:124) at org.attoparser.HtmlElement.handleOpenElementEnd(HtmlElement.java:109) at org.attoparser.HtmlMarkupHandler.handleOpenElementEnd(HtmlMarkupHandler.java:297) at org.attoparser.MarkupEventProcessorHandler.handleOpenElementEnd(MarkupEventProcessorHandler.java:402) at org.attoparser.ParsingElementMarkupUtil.parseOpenElement(ParsingElementMarkupUtil.java:159) at org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:710) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301) ... 50 more Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1005E: Type cannot be found 'jpabook.jpashop.domain.OrderStatus' at org.springframework.expression.spel.support.StandardTypeLocator.findType(StandardTypeLocator.java:117) at org.springframework.expression.spel.ExpressionState.findType(ExpressionState.java:155) at org.springframework.expression.spel.ast.TypeReference.getValueInternal(TypeReference.java:69) at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.java:55) at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:91) at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:112) at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:337) at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:265) ... 70 more
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 데이터 jpa 강의에서 에러 질문이요
안녕하세요 스프링 데이터 jpa 부분을 수강하던중에 에러가 발생해서 질문합니다.. 구글링해봐도 해결책이 안나와서 질문합니다.. 기존 JPA 강의까지는 에러없이 잘 실행 되던 코드가 SpringDataJpaMemberRepository 인터페이스를 추가하고 SpringConfig를 추가했더니 에러가 발생하네요.. 우선 SpringConfig.java코드는 아래와 같습니다. package com.example.hellospring;import com.example.hellospring.repository.JdbcTemplateMemberRepository;import com.example.hellospring.repository.JpaMemberRepository;import com.example.hellospring.repository.MemberRepository;import com.example.hellospring.service.MemberService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.sql.DataSource;@Configurationpublic class SpringConfig { // 스프링 데이터 jpa가 구현체를 만들어 놓은게 등록이됨 private final MemberRepository memberRepository; @Autowired // 생성자가 하나인경우는 생략해도됨, 그러나 명시하는게 좋을듯 public SpringConfig(MemberRepository memberRepository) { // 스프링 컨네이너에서 MemberRepository를 찾는다 근데 등록해 놓은게 ..SpringDataJpaMemberRepository this.memberRepository = memberRepository; } @Bean public MemberService memberService() { // memberService에다 의존관계 셋팅을 해줘야함 return new MemberService(memberRepository); }} 또한 SpringDataJpaMemberRepository 부분은 다음과 같습니다. package com.example.hellospring.repository;import com.example.hellospring.domain.Member;import org.springframework.data.jpa.repository.JpaRepository;import java.util.Optional;public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository { // 스프링 데이터 JPA가 JpaRepository 를 상속받고 있으면 // SpringDataJpaMemberRepository 를 스프링 빈으로 자동 등록해준다 (구현체로 만들어서 등록을 해준다.) // 이것을 SpringConfig에서 가져다 쓰면 된다. @Override Optional<Member> findByName(String name);} 기존 jpa강의 까지 회원가입과 중복_회원_예외 부분이 에러없이 성공적으로 실행 됐습니다. 그런데 아래와 같은 에러가 발생합니다. 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] Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set 참고로 application.properties 부분과 build.gradle 부분은 직전강의까지 잘 실행되던 부분에서 수정한게 없습니다.. 혹시 몰라서 application.properties 부분과 build.gradle부분도 올리겠습니다. application.properties 부분입니다. spring.datasource.url=jdbc:h2:tcp://localhost/~/testspring.datasource.driver-class-name=org.h2.Driverspring.datasource.username=saspring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=none build.gradle 부분입니다. plugins { id 'org.springframework.boot' version '2.4.12' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java'}group = 'com.example'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web'// implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2'// testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' }}test { useJUnitPlatform()} 감사합니다.
-
미해결실전! 스프링 데이터 JPA
Pageable 파라미터
안녕하세요 @GetMapping("/members") public Page<Member> list(Pageable pageable){ return memberRepository.findAll(pageable); } 저 Pageable pageable 를 구현체인 PageRequest 라는 객체를 생성 해주신다고 했습니다. 이런 과정은 argumentResolver 랑은 관계가 없는건가요 ?? (궁금해서 앞에 @ModelAttribute 를 붙여보았는데 오류발생)
-
미해결실전! Querydsl
현재 2:30 부분에 ...
현재 강의의 2:30부분에 fetchResults를 사용하려고 보니 decprecated 되어있는데 fetchResult대신에 쓸수있는 것이 혹시 있나요?? 설명에는 fetch()를 대신 사용하라는데 그런건가요?
-
미해결실전! Querydsl
Entity Manager 의존관계 주입
안녕하세요! 강의 마지막 부분에 나온 EntityManager, JPaQueryFactory 생성자 주입 관련하여 궁금한 게 생겨서 질의드립니다. Lombok 의 @RequiredArgsConstructor 를 사용해서 EntityManager 와 JPAQueryFactory 를 생성자 주입하면 좋다. 라고 이야기하셨던 부분과 관련된 질의입니다. 이떄 JPAQueryFactory 객체를 빈으로 등록해놓은 뒤에 @RequiredArgsConstructor 를 사용하셨고 이는, EntityManager 는 빈으로 등록되어 있단 뜻인데 애플리케이션 로딩 시점에 EntityManager 도 자동 등록되나요?그렇다면 자동 등록되게 해둔 이유는 무엇인지도 궁금합니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA 사용시 Invalid bean definition 에러 질문입니다.
안녕하세요 스프링DB접근기술 - JPA 강의 부분에서 스프링부트 JPA 연동해서 실행하는데 아래와 같은 에러가 나서 질문드립니다. Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'memberService' defined in class path resource [com/example/hellospring/SpringConfig.class]: Cannot register bean definition [Root bean: class [null]; 제가 이해한 바로는 memberService에서 bean이 잘못 정의 되어 있고, SpringConfig 클래스에서 bean을 등록할수 없다고하는데 루트 bean 클래스가 null 이라는데 (이건 어디가 루트고 어디가 null 인지 잘 모르겠습니다.) 아래 코드들로 확인할 수 있는 방법이 있을까요? 대체 어디가 bean이 잘못 정의 되어 있고 null 인지를 모르겠네요.. 아래는 memberService 코드입니다. import문은 전부 제거했습니다. package com.example.hellospring.service; @Transactional @Service public class MemberService { private final MemberRepository memberRepository; @Autowired public MemberService(MemberRepository memberRepository){ this.memberRepository = memberRepository; } /** * 회원가입 */ public Long join(Member member){ validateDuplicateMember(member); // 중복회원 검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMember(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원입니다."); }); } /** * 전체 회원 조회 */ public List<Member> findMembers(){ return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId){ return memberRepository.findById(memberId); } } 다음은 SpringConfig.java 코드입니다. 역시나 import문은 제거했습니다. package com.example.hellospring; @Configuration public class SpringConfig { private EntityManager em; @Autowired public SpringConfig(EntityManager em) { this.em = em; } @Bean public MemberService memberService() { return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository() { return new JpaMemberRepository(em); } } 참고로 회원가입에서 Run으로 실행하기 전까지는 db도 잘 연결되고 아주 잘 따라하고 있었습니다 감사합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA시 테이블 자동생성 및 마이바티스와의 혼용
JPA에서 엔티티를 설정해주면 자동으로 디비에 테이블을 생성해줍니다. 강의내용중에 생성되는 테이블 ddl을 그대로 안쓰고 정제해서 쓰신다고 하셨는데,그말은 jpa로 Auto로 생성되는걸 막아놓고, 디비에서 직접 create를 하신다는 말씀이신가요?? 그리고 혹시 jpa와 mybatis를 같이 사용 할 수 있나요? 서칭해보면 가능하다고 하는데, jpa사용법은 나름 숙지된 상태인데팀플젝으로 마이바티스를 사용하고 싶은 상황입니다.같이사용하기 어려울까요? spring: jpa: hibernate: ddl-auto: update
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO 와 Form_2
안녕하세요! 영한님! 영한님께서 올려주신 여러가지 강의를 보고 코드를 작성하다가,제가 예전에 질문하고 피드백 주셨던 부분이 생각나서 질문드리려고 합니다. https://www.inflearn.com/questions/125911 예전 질문의 내용은 이렇습니다! 이때는 의문이 들었던점이 정확히 정리가 안되어 더 질문드리지 못하고 넘어갔었습니다.이제 좀 정리가 되어서 재질문 드리려고합니다. Book 과 같은 Entity는 하나의 도메인에서 사용되는게 아니라 광범위하게 사용되고,현재 패키지를 어떻게 나눌지 감이 잘 안잡힙니다. 따라서 현재(Book) Entity => example.xxx.model에 두었고 dto => example.xxx.model.dto 이렇게 두었습니다. 이런경우 위에서 말씀하신 Entity가 dto를 참조하는데 다른 패키지에 있는 상황입니다. 이럴 때는 BookService에서 메소드로 Dto를 받고, Entity를 조작하는 형태로 변경해야 할까요?아니면 설계가 잘못된것인지, 패키지를 어떻게든 같이 놓는 방법이 맞을지 궁금합니다.개념에 구멍이 뚫려있는 느낌입니다 ㅜㅜ