묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
gradlew dependencies
안녕하세요. 저는 windows10 사용자입니다.아래와 같이 인텔리제이 터미널 로컬에 입력하면 실패한다고 뜹니다.C:\study\jpashop>gradlew dependencies FAILURE: Build failed with an exception. * Where: Build file 'C:\study\jpashop\build.gradle' line: 39 * What went wrong: A problem occurred evaluating root project 'jpashop'. > Could not find method testImplementation() for arguments [org.junit.vintage:junit-vintage-engine, build_c5fjxfeq8g2hpdi6kd0zeexhk$_run_closure5@1757541f] on root project 'jpashop' o f type org.gradle.api.Project. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 1s =========================================다음은 환경정보입니다. C:\study\jpashop>gradlew -version ------------------------------------------------------------ Gradle 6.8.3 ------------------------------------------------------------ Build time: 2021-02-22 16:13:28 UTC Revision: 9e26b4a9ebb910eaa1b8da8ff8575e514bc61c78 Kotlin: 1.4.20 Groovy: 2.5.12 Ant: Apache Ant(TM) version 1.10.9 compiled on September 27 2020 JVM: 11.0.11 (Oracle Corporation 11.0.11+9-LTS-194) OS: Windows 10 10.0 amd64
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
로그 글씨 색깔
빌드해서 실행해봤을 때 아래 로그 색깔이 저는 전부 검은색인데 강사님 화면은 색깔이 다 들어가있어서 질문 드립니다. 따로 설정이나 설치해야 하는 플러그인이 더 있는건가요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
기본값타입 컬렉션은 왜 전체지움과 insert 가 발생하지 않는것인가요?
임베디드 타입 컬렉션이 추적이 불가능하기 때문에 다 지웠다 생성한다면, 값 타입컬렉션또한 그렇게 발생해야 하는것 아닌가해서 질문드립니다! 치킨 -> 한식 String 변경시에도 같은 이유로 추적이 불가능하기 때문에 변경되어야하는거 아닌가요!? 기본 값 타입 객체는 뭔가 보장이 되기 때문에 그런건가요? 항상 좋은강의 감사드립니다
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 질문 드립니다. org.gradle.api.GradleScriptException: A problem occurred evaluating root project 에러가 발생합니다..
마지막 강의에서 queryDsl 설정을 적용했을때 .. 이런 에러가 발생합니다.. 제가 git에서 프로젝트를 올려놓고 프로젝트를 여러환경에서 받아서 그런게 아닐까 생각은 하는데 .. 어떻게 해결을 하면 좋을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
insert 쿼리가 log에 안찍혀요!
test를 실행할 때 insert 로그가 안찍혀요... @Rollback(false)를 설정 했을때는 찍힙니다. @Rollback(false)를 설정하지 않아도 찍히게 하고싶은데 어떻게 해야하나요!?? yml 복붙해서 넣어드립니다... spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: format_sql: truelogging.level: org.hibernate.SQL: debug org.hibernate.type: trace
-
미해결실전! 스프링 데이터 JPA
DTO조회와 PROJECTION의 차이가 궁금합니다 !
안녕하세요 강사님! 활용편 1,2편에 이어서 이번 실전편도 듣고 있습니다. 활용편 2편에서 DTO로 조회하시는 걸 알려주셨는데요. 언듯 보기에는 DTO로 조회하는 것과 프로젝션으로 조회하는것이 비슷해 보이는데, 제가 지금 이해하기로는 - DTO의 경우 엔티티의 모든 필드를 조회해서 DTO에 넣어준다음에 반환 -프로젝션의 경우 프로젝션에 선언한 필드만 조회해서 반환 하는 차이만 있는 걸까요? 아니면 제가 잘못알고있거나 이해하지 못한 부분이 있는지 궁금합니다 ! 만약 단순하게 하나의 엔티티를 조회한다 할 경우, DTO와 프로젝션 어느 쪽을 더 선호하시는 지 궁금합니다 ! 감사합니다 !
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
[SQL Error: 23503] Cascade 설정 후 Parent remove할 때 질문입니다.
안녕하세요! 이전 질문에서 영한님 답변을 받고 원인을 해결하여 다른 경우 또한 테스트해보고 있는데 SQL Error: 23503 에러가 발생했고, 구글링 결과 참조 키 제약조건 위배될 때 발생하는 에러라 하는데 아래 상황에서 왜 이 에러가 뜨는지 모르겠어서 질문을 남깁니다. Parent, child 끼리 연관관계 매핑 후, cascadetype.ALL, orphanRemoval=false로 설정한 후, parent를 삭제할 때 발생한 에러입니다. 먼저 Parent, Child, Main 클래스 코드를 보여드리겠습니다! @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List<Child> children=new ArrayList<>(); public void addChild(Child child){ children.add(child); child.setParent(this); } // getter, setter 생략했습니다 } @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) private Parent parent; // getter, setter 메소드 생략했습니다 } Parent 클래스, Child 클래스는 위와 같이 작성했으며, cascadetype.ALL로 설정해놓았고, 고아 객체 제거는 설정하지 않았습니다. 메인 코드는 아래와 같습니다. public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em=emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Parent parent=new Parent(); parent.setName("kth990303"); Child child1=new Child(); child1.setName("kthbaby1"); Child child2=new Child(); child2.setName("kthbaby2"); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.flush(); em.clear(); Parent findParent = em.find(Parent.class, parent.getId()); System.out.println("===================1"); findParent.getChildren().remove(0); em.remove(findParent); System.out.println("===================3"); tx.commit(); } catch(Exception e){ e.printStackTrace(); tx.rollback(); } finally{ em.close(); } emf.close(); } } 역시 orphanRemoval=true가 아니었기 때문에 findParent.getChildren().remove(0);코드에서, 아무 일이 일어나지 않고 지연로딩으로 인한 child select 쿼리만 날라가는건 예상대로였는데, 문제는 그 아래 em.remove(findParent); 였습니다. 이미 em.find로 영속성 컨텍스트에 정보가 있어 parent를 지울 때 에러가 발생하지 않은 상태로 parent와 children 모두 지워질 줄 알았는데 아래 사진과 같은 에러가 발생했습니다. 사실 parent를 지울 때 그냥 findParent.getChildren().remove(0); 을 작성하지 않고 em.remove(findParent);만 하면 parent가 지워짐과 동시에 children도 모두 잘 지워지는 성공적인 결과가 보이긴 합니다만,,, 위와 같이 코드를 짠 후 실행했더니 SQL ERROR 23503이 뜨는 이유가 궁금하여 질문드립니다. 금쪽같은 주말에 질문을 좀 많이 하는 듯하네요 ㅠㅠ 죄송합니다. 그리고 감사합니다 :) ===================1 Hibernate: select children0_.parent_id as parent_i3_2_0_, children0_.id as id1_2_0_, children0_.id as id1_2_1_, children0_.name as name2_2_1_, children0_.parent_id as parent_i3_2_1_ from Child children0_ where children0_.parent_id=? ===================3 Hibernate: /* delete hellojpa.Child */ delete from Child where id=? Hibernate: /* delete hellojpa.Parent */ delete from Parent where id=? 5월 15, 2021 8:20:45 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 23503, SQLState: 23503 5월 15, 2021 8:20:45 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: Referential integrity constraint violation: "FKLH67J1N7X7GT59U0PBKWQH6O6: PUBLIC.CHILD FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.PARENT(ID) (1)"; SQL statement: /* delete hellojpa.Parent */ delete from Parent where id=? [23503-199] 5월 15, 2021 8:20:45 오후 org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release INFO: HHH000010: On release of batch it still contained JDBC statements javax.persistence.RollbackException: Error while committing the transaction at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:81) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104) at hellojpa.JpaMain.main(JpaMain.java:43) Caused by: 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.convertCommitException(ExceptionConverterImpl.java:65) ... 2 more 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:42) 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.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3551) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3810) at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:124) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1352) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:443) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3202) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2370) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) ... 1 more Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKLH67J1N7X7GT59U0PBKWQH6O6: PUBLIC.CHILD FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.PARENT(ID) (1)"; SQL statement: /* delete hellojpa.Parent */ delete from Parent where id=? [23503-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:459) at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.get(DbException.java:181) at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:373) at org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:390) at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:265) at org.h2.table.Table.fireConstraints(Table.java:1057) at org.h2.table.Table.fireAfterRow(Table.java:1075) at org.h2.command.dml.Delete.update(Delete.java:153) at org.h2.command.CommandContainer.update(CommandContainer.java:198) at org.h2.command.Command.executeUpdate(Command.java:251) at org.h2.server.TcpServerThread.process(TcpServerThread.java:406) at org.h2.server.TcpServerThread.run(TcpServerThread.java:183) at java.lang.Thread.run(Unknown Source) at org.h2.message.DbException.getJdbcSQLException(DbException.java:457) at org.h2.engine.SessionRemote.done(SessionRemote.java:607) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:200) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:154) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ... 21 more 5월 15, 2021 8:20:45 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test] Process finished with exit code 0
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA DTO 직접조회 질문 드립니다.
안녕하세요 강사님. 강의 복습 중에 질문이 생겨서 문의 드립니다 JPA 에서 DTO 직접조회를 하는데 (일대다 조회) 일반적으로 엔티티를 DTO 로 변환해서 조회하는 방법보다 더 불편하고 유지보수할때 복잡해 보이는데, 실제 운영에서도 DTO를 직접조회해서 사용을 많이 할까요 ??
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA Update에 관한 질문입니다.
안녕하세요 김영한님! 제가 드리고싶은 질문은 두가지입니다. 예를 들어 게시글에는 이미지를 넣을 수 있으며 게시글과 이미지는 OneToMany관계로 이루어져있습니다. 그리고 Board(게시글) 엔티티에는 @OneToMany(mappedBy = "board", Cascade.ALL, orphonRemoval = true, fetch = LAZY) List<BoardImage> images = new ArrayList<>(); 로 설정했습니다. 질문1. 예를 들어 이미지가 [image1, image2, image3](타입은 이미지객체타입) 에서 [image2, image3, image4] 로 update 할 경우에는 1. delete all & insert all 2. 코드로 기존과 하나하나 비교하면서 delete1 & insert 4 인가? 주로 현업에서는 어떻게 사용하는지 궁금합니다. 질문2. List<BoardImage> images = [image1, image2, image3] 을 갖고 있습니다. 여기서 update 메소드를 사용하여 this.images = List.of(image1, image3, image4)로 덮을경우에는 JPA에서 전부 delete하는지 궁금합니다. 감사합니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Category의 parent_id 생성 관련
안녕하세요, 영한쌤. Category에서 private Category parent에 있지도 않은 parent_id를 @JoinColumn 기준으로 잡아주는 것이 너무 이상했는데 create table할 때 parent_id 필드가 만들어지더라구요. 명시적으로 만든 적이 없는 parent_id를 가지고 @JoinColumn에 이걸로 연결하라고 사용해도 오류가 나지 않을 뿐더러 심지어 parent_id가 생성되는 이유가 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepository 와 ItemRepository에서의 em 차이점
김영한 강사님 안녕하세요. 좋은 강의 항상 잘 보고있습니다! ㅎㅎ 다름이 아니라 강의를 쭉 듣던 중 궁금증이 생겼습니다. MemberRepository에서 em은 @PersistenceContext를 붙였는데 ItemRepository에서는 @PersistenceContext를 붙이지 않고 그냥 final 처리만 되어있습니다. 제가 보기엔 둘다 같은 역할을 하는 em인것 같은데 소스코드에서는 왜 다르게 구현하신건지 궁금합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Eureka 실행하게 되면 상태값이 왜 저는 데스크탑이라고 나오나요?
첫번째가 정상인데 두번째 사진이 제가 한겁니다.. 왜 이렇게 나오는건가요? 그리고 게이트 웨이 서버에서 설정파일에 가시면 routes: - id: first-service# uri: http://localhost:8081/ uri: lb://MY-FIRST-SERVICE 이렇게 설정시 에러가 발생되면서 첫번째 서버쪽으로 안가지네요... java.net.UnknownHostException: failed to resolve 'DESKTOP-KD56ARJ' after 4 queries at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) ~[netty-resolver-dns-4.1.63.Final.jar:4.1.63.Final] Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): |_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain] |_ checkpoint ⇢ HTTP GET "/first-service/welcome" [ExceptionHandlingWebHandler] Stack trace: ㅇ무엇이 문제일까요? ㅠ,ㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
한 애플리케이션에서 OSIV를 어떻게 나누어 관리하나요?!?!
마지막 참고에서는 트래픽이 많은 API는 OSIV를 끄고, 많은 트래픽이 없어 커넥션을 유지해도 되는 상태인 ADMIN같은 경우는 OSIV를 켜두는 것이 좋다고 하셨습니다!!! 여기서 궁금한 점이 spring.jpa.open-in-view는 글로벌 설정인데 한 애플리케이션에서는 화면 의존적인 서비스가 있을 수도 있고 아닐 수도 있다고 생각합니다. (여러 서비스가 있을 수도 있다고 생각합니다.) 그렇다면 개별적으로 osiv를 설정하는 방법이 있는건가요? (항상 좋은 강의 감사합니다.)
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 서비스 테스트코드
안녕하세요 선생님! 혼자 복습하다가 문득 호기심이 생겨, 상품 서비스의 테스트를 진행해보다 . @SpringBootTestclass ItemServiceTest { @Autowired private ItemService itemService; @Test void 상품_등록() { Book book = new Book(); book.setName("jpa"); book.setPrice(10000); Long itemId = itemService.saveItem(book); Assertions.assertThat(book).isEqualTo(itemService.findOne(itemId)); }} 이렇게 되면 테스트가 실패하는데 그 이유가 객체 타입이 달라서 그런건가요? 테스트 코드의 객체는 Book이고 service 계층에서의 반환형은 Item이라 생각하여 Repository 계층과 Service 계층의 반환형을 모두 Book으로 해도 테스트가 실패합니다. 혹시 이유를 알 수 있을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
MySQL Dialect 커스텀 관련해서 문의드립니다. (group_concat)
안녕하세요. 영한님 오랜만에 인사드립니다. MySQL Dialect 중 하나인 group_concat을 추가하여 사용해야 하는 상황이라.. 다음과 같이 Custom을 만들고 프로퍼티로 해당 CustomDialect까지 등록되어 정상 동작하는 상황입니다. public class CustomMySQL57Dialect extends MySQL57Dialect { public CustomMySQL57Dialect() { registerFunction("GROUP_CONCAT", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING)); } } 문제는, Native Query로는 `GROUP_CONCAT(DISTINCT xxx)` 처럼 사용이 가능하나, QueryDSL을 이용한 상황에서 해당 DISTINCT가 동작하지 않습니다.. 위와 같은 상황을 겪어보셨을 지 않을까 싶어 여쭤봅니다! QueryDSL 코드 중 일부는 다음과 같습니다. select(Projections.constructor(PaymentFilterConditionDTO.class, transaction.merchantMemberNo, Expressions.stringTemplate("group_concat(DISTINCT {0})", new CaseBuilder().when(transaction.userType.eq(UserType.LINE_PAY)) .then(transaction.transactionType.stringValue() .concat(transaction.paymentMethod.stringValue())) .otherwise(transaction.transactionType.stringValue().concat(transaction.paymentMethod.stringValue()) .concat(SUFFIX_AFFILIATE))))) from(...) where(...) 위의 QueryDSL 코드에서 DISTINCT가 제외되면 예외없이 동작하구요. DISTINCT가 있을 때는 다음과 같이 예외가 발생합니다. - unexpected token : group_concat - unexpected token : DISTINCT 항상 도움주셔서 다시 한 번 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
TDD 관련 질문
안녕하세요 영한님 드디어 야생형 코스가 끝났습니다! 스프링 MVC도 이제 곧 구매 대기 중입니다ㅎㅎ 다름이 아니라 TDD 관련 질문입니다. 질문을 어디다 해야될지 모르겠어서 여기 다 질문합니다.. 1. 보통 Spring에서 각 계층별로 TDD를 진행하나요? 예를 들어, entity -> repository -> service -> controller 순으로 수업을 진행하셨는데 실무에서는 entity 개발 후에 entity 로직에 대한 tdd, respository tdd, service tdd, controller tdd 이런 식으로 다하나요? 2. 각 계층별로 단위 테스트와 통합 테스트를 전부 다 하는 건가요? 현재 프로젝트를 진행하는 데 계층별로 단위 테스트와 통합 테스트를 다 해야되는 건지 궁금했는데 구글링해도 자료가 잘 없네요ㅠㅠ
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
질문
안녕하세요! 간단한 질문이 있습니다. 7:48 초에 defaultZone에서 서비스를 등록할 서버의 주소로 8761 포트에 등록한다는 것까지는 이해가 되었는데 뒤에 /eureka를 붙여주는 이유는 뭔가요?
-
미해결실전! 스프링 데이터 JPA
벌크성 수정 쿼리 질문
안녕하세요 영한님 벌크성 수정 쿼리 강의해주실 때 em.flush() em.clear() 를해야한다(영속성 컨텍스트에 있는 캐시정보들을 DB에 반영하기 위해)고 말씀해주셨는데 만약 어떤 user들의 age가 20이 넘는 사람의 인원수가 5명이라고 가정하고 이들의 나이를 1씩 올렸다고 가정했을때 캐시에는 반영이 안되고 바로 DB에만 반영이 되는데 이때 제가 궁금했던것은 em.flush를 하면 1치캐시에 있는것을 db에 반영시키는것(더티체킹을 포함하여) 이라고 생각해서 이 경우에는 1차캐시가 반영되면 안되는것 아닌가요? 캐시 DB -> 벌크성수정쿼리-> 캐시 DB -> em.flush() -> 캐시 DB 40 40 40 41 40 40
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
join fetch 와 그냥 join 이 동일한 결과를 가지고 오나요?
안녕하세요. 강의 재밌게 잘 보고 있습니다. jpql 예제에서 V3 에는 join fetch 를 사용하고, V4 에서는 join 만 사용하셨는데 동일한 inner join 쿼리가 생성된 것 같습니다. 두 개의 사용 유형이 같은 방식으로 동작하는 것인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO를 만드는 레이어에 관한 질문
안녕하세요! - 서비스에서 DTO를 만들어서 컨트롤러에게 리턴하는 방식 - 서비스에서는 엔티티를 리턴하고 컨트롤러에서 최종적으로 응답을 내보낼 때 DTO로 감싸서 내보내는 방식 두가지의 방법중에서 어떠한것이 더 좋은 선택일까 고민하고 있습니다. 인터넷을 찾아봐도 많은 논쟁들이 있었지만 무엇이 더 나은 방법이라고 확실하게 답변해주는 건 없는 것 같아요. 개인적으로 서비스에서 DTO를 반환하는게 핵심 비즈니스 로직을 감출 수 있고 의존성을 낮출 수 있다고 생각합니다. 그런데 여기서 문제점이 생기는데, 예를 들어 UserService에 아래와 같은 메소드 2개가 있다고 가정할게요. - findByUserId(Long id) - 내부에서 repo호출하여 유저 엔티티를 가져온 후 DTO로 반환 - updateUser(Long id, ...) `updateUser()`에서는 `findByUserId()`를 호출하여 유저를 가져오고 특정 로직에 따라 업데이트하는 구문을 수행하는 목적입니다. 그런데 `findByUserId()`에서 엔티티를 반환했기때문에 엔티티를 가져오기 위해 다시 한번 repo를 호출하여 실제 엔티티를 가져온 후 정보를 변경하는 로직을 수행해야합니다. 따라서 추가적인 쿼리가 발생하는 문제가 생깁니다. 사실 위 예제는 조금 극단적인 예제이긴 합니다만, 실무에서 개발하다보니 서비스에서 서비스를 호출하는 경우가 빈번하게 발생하더라구요. 하지만 엔티티 자체를 컨트롤러까지 노출하는건 뭔가 꺼려집니다. 질문을 요약하자면, DTO를 서비스에서 리턴하는 방식과 서비스는 엔티티를 리턴하고 컨트롤러에서 DTO로 조합하여 최종 응답을 내보내는 방식 중 어떠한 것이 더 좋다고 생각하시는지 알고 싶습니다. (또는 실무에서 자주 사용하는 방식) 감사합니다 :)