묻고 답해요
163만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
jpa 내보내는 쿼리가 작동은 하나 이상함
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.상품목록 조회시 로그를 보면 아래와 같은 쿼리 로그가 나옵니다.Hibernate: select item0_.item_id as item_id2_3_, item0_.name as name3_3_, item0_.price as price4_3_, item0_.stock_quantity as stock_qu5_3_, item0_.artist as artist6_3_, item0_.etc as etc7_3_, item0_.author as author8_3_, item0_.isbn as isbn9_3_, item0_.actor as actor10_3_, item0_.director as directo11_3_, item0_.dtype as dtype1_3_ from item item0_ 정상적인 쿼리라면 아래와 같을것 같습니다.Hibernate: select item.item_id , item.name , item.price , item.stock_quantity , item.artist , item.etc , item.author , item.isbn , item.actor , item.director , item.dtype from item item 머 결과야 똑같이 나오지만 인서트 할때는 테이블 명이나 컬럼 명칭 변경없이 깔끔하게 아래와 같이 쿼리 로그가 나오는데Hibernate: insert into item (name, price, stock_quantity, author, isbn, dtype, item_id) values (?, ?, ?, ?, ?, 'B', ?) 왜 select에서 저렇게 하는지 궁금하고 혹시 이때문에 유의할점이 없는지도 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
User와 loanhistory 관계
User가 UserLoanHistory를 가지게 됨으로써 대출하는 로직이 간단해지지만 UserLoanHistory관련 CRUD를 전부 User에서 비즈니스 로직을 처리해야하는 건가요? User가 처리하는 로직이 너무 많아지는 것 같아 이게 객체지향적인 게 맞나 고민이 되네요 현재 경우는 C U 밖에 없지만 만약 예를 들어서 작가와 책 엔티티가 있을 때 연관관계의 주인은 책에 있지만 작가가 보유한 책을 조회하는 로직을 더 간편하게 처리하기 위해 작가는 책을 리스트로 가지면서 생명주기를 관리하면, 책을 수정하거나 삭제할 때도 무조건 작가의 도메인에서 로직을 처리하게 되는 건가요? 단일책임원칙을 위배하는 것이 아닌가 고민이 되어 질문드립니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영상이 한참전에 만든 영상같네요.
개인적으론 아쉽네요. JDK, JPA, H2 버전을 보니 최소 3년 이상 된듯.. javax가 jakarta로 넘어간게 2021년도 였나 그런데.. 1.8버전이면 한참된듯..일단 수업자료 받은걸로 참고하면서 진행하겠습니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jsonignore와 지연로딩?
[섹션3 - 간단한 주문조회 V1 엔티티를 직접 노출] 강의에서[6:09] 처음에 api를 호출했을때는 양방향 연관관계 때문에 무한루프가 발생하였는데요, 이때는 지연로딩에 의한 이슈가 없었는데[11:07] JsonIgnore를 추가하여 순환 참조가 되는 상황을 제거했을때는 왜 지연로딩에 의한 이슈가 생기는 건가요??잘 동작하던 프록시객체가 JsonIgnore가 생겼다고 에러가 나는 상황이 잘 이해가 안되어 질문을 올립니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
섹션 4 - 회원 기능 테스트 강의에서 중복_회원_예외()메서드를 실행할 때 INSERT 쿼리가 실행되는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]package jpabook.jpashop.service;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.annotation.Rollback;import org.springframework.transaction.annotation.Transactional;import jpabook.jpashop.domain.Member;@SpringBootTest@Transactionalpublic class MemberServiceTest { @Autowired private jpabook.jpashop.repository.MemberRepository memberRepository; @Autowired private MemberService memberService;// @Test//// @Rollback(false)// public void 회원가입() throws Exception {// // given// Member member = new Member();// member.setName("kim");// // // when// Long savedId = memberService.join(member);// // // then// Assertions.assertThat(member).isEqualTo(memberRepository.findOne(savedId));// } @Test// @Rollback(false) public void 중복_회원_예외() throws Exception { // given Member member1 = new Member(); member1.setName("kim"); Member member2 = new Member(); member2.setName("kim"); // when memberService.join(member1); try { memberService.join(member2); } catch (IllegalStateException e) { return; } // then Assertions.fail("예외가 발생해야 한다."); }}저는 JUnit5를 사용헀기 때문에 위와 같이 코드를 작성했는데요주석 처리한 회원가입() 메서드를 실행할 때는 강사님처럼 INSERT 쿼리가 실행되지 않는 것을 확인했지만, 중복_회원_예외() 메서드를 실행할 때는 INSERT 쿼리가 실행되는 것을 확인했습니다.2024-04-02T00:01:22.883+09:00 DEBUG 26044 --- [jpashop] [ main] org.hibernate.SQL :insertintomember(city, street, zipcode, name, member_id)values(?, ?, ?, ?, ?)2024-04-02T00:01:22.885+09:00 TRACE 26044 --- [jpashop] [ main] org.hibernate.orm.jdbc.bind : binding parameter (1:VARCHAR) <- [null]2024-04-02T00:01:22.885+09:00 TRACE 26044 --- [jpashop] [ main] org.hibernate.orm.jdbc.bind : binding parameter (2:VARCHAR) <- [null]2024-04-02T00:01:22.885+09:00 TRACE 26044 --- [jpashop] [ main] org.hibernate.orm.jdbc.bind : binding parameter (3:VARCHAR) <- [null]2024-04-02T00:01:22.885+09:00 TRACE 26044 --- [jpashop] [ main] org.hibernate.orm.jdbc.bind : binding parameter (4:VARCHAR) <- [kim]2024-04-02T00:01:22.885+09:00 TRACE 26044 --- [jpashop] [ main] org.hibernate.orm.jdbc.bind : binding parameter (5:BIGINT) <- [1]2024-04-02T00:01:22.886+09:00 INFO 26044 --- [jpashop] [ main] p6spy : #1711983682886 | took 0ms | statement | connection 4| url jdbc:h2:tcp://localhost/~/jpashopinsert into member (city,street,zipcode,name,member_id) values (?,?,?,?,?)insert into member (city,street,zipcode,name,member_id) values (NULL,NULL,NULL,'kim',1);위 로그는 해당 로그인데 혹시 이유를 알 수 있을까요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성컨테스트는 메모리에 저장되는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]영속성컨테스트는 메모리에 저장되는건가요?1차 캐시라고 하길래cpu에 있는 캐시에 저장하는건가요?캐시라는게 정확한 의미가 뭔가요?제가 아는 캐시는 cpu에 있는 캐시를 알고있습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
N+1 문제 관련 10:22초 부분 질문드립니다.
해당 부분에서 페치 조인을 하지 않는 이상 지연로딩을 하든, 즉시로딩을 하든 N+1 문제가 발생하게 된다고 하셨는데요. 즉시로딩을 하게되면 연관된 엔티티를 한번에 가져오기 때문에 N+1 문제를 피할 수 있지 않나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.2024-04-01T15:54:52.319+09:00 ERROR 11136 --- [ restartedMain] o.s.boot.SpringApplication : Application run failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initDb': Invocation of init method failed . . .Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.Delivery . . .Caused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.Delivery . . .Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.Delivery at org.hibernate.engine.spi.CascadingActions$8.noCascade(CascadingActions.java:372) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:173) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:161) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:144) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:79) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1403) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] ... 44 common frames omittedDeprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.6/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.DeliveryCaused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.DeliveryCaused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.Delivery 에러메시지가 위와 같이 떠서 구글에서 해결방법들을 찾아서 해봤는데 다 해결되지 않았습니다 ㅠㅠ 혹시 어떻게 해야할까요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
repository에 ProductSearch랑 Impl을 작성하셧는데
섹션2 영상에선 TodoSearch랑 TodoSearchImpl 작성한건 어떻게 해야하나요 Todo 삭제하고 이번 수업에 있는 ProductSearch, ProductSearchImpl로 다 바꿔야 하는건가요 ?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
soft delete 라는 것을 알고 있습니다. 이에 대해 cascade 하게 삭제가 가능할까요?
만약에 Review 가 있고, Review 에 대해 좋아요 기능이 있습니다.기존 Hard Delete 시 좋아요 엔티티에 @ManyToOne 에 @OnDelete(action = OnDeleteAction.CASCADE) 를 사용 리뷰 삭제시 리뷰에 대한 좋아요도 삭제할 수 있었습니다. 그런데 Review에 대해 Soft Delete 시, 리뷰에 대한 좋아요는 Hard Delete로 삭제한다면 이를 어떻게 구현하면 좋을까요?? 1) Review가 delete 될 때마다 그냥 서비스 코드에 리뷰 좋아요 를 Hard delete 로 삭제하는 부분을 작성한다: @OnDelete 쓰다가 이거 쓰면 서러울 것 같아요.2) DB trigger 를 사용한다. : 애플리케이션에서 코드에서 명시해서 적용할 방법은 없나???3) EventLister 를 사용한다. : 이러면 Review 가 Update 될 때마다 @PostUpdate 해서 칼럼이 Deleted가 true인지 확인해야 되는데 .. Review 의 delete 칼럼이 업데이트 될때만 적용되는게 아니라 다른 칼럼이 업데이트 될때 이 부분을 항상 체크해주어야 해서 비효율적일것 같구! 4) 양방향 연관관계를 쓰기 싫은데 어거지로 써서 @OneToMany(cascade=remove) 를 사용한다. 1,2,3,4 다 마음에 안드는데 영한 님은 어떻게 사용하실까요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
npm start 하면 발생되는 에러 메시지
(node:8952) [DEP_WEBPACK_DEV_SERVER_ON_AFTER_SETUP_MIDDLEWARE] DeprecationWarning: 'onAfterSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option. (Use `node --trace-deprecation ...` to show where the warning was created) (node:8952) [DEP_WEBPACK_DEV_SERVER_ON_BEFORE_SETUP_MIDDLEWARE] DeprecationWarning: 'onBeforeSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option. 리액트 실행이랑 강의 내용대로 정상적으로 동작 되는데, npm start 를 수행하면 위와 같은 문구가 출력됩니다. 구글에 검색해봤는데 해결 방법과 원인이 다양해서 적합한 해결책을 못찾았습니다. 무시해도 되는 에러일까요? 어떻게 처리하는지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
31강 오류요ㅠㅠ
오류요ㅜㅜㅜ 어노테이션이나 다른 코드같은 거 잘 넣었는데..계속 문제떠요ㅜㅜhttps://github.com/alicelee1231/Spring Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2024-04-01 00:42:10.261 ERROR 6648 --- [ main] o.s.boot.SpringApplication : Application run failedorg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookController' defined in file [/Users/isaemmi/Desktop/library-app/out/production/classes/com/group/libraryapp/controller/book/BookController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookService' defined in file [/Users/isaemmi/Desktop/library-app/out/production/classes/com/group/libraryapp/service/book/BookService.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userLoanHistoryRepository' defined in com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository 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 boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean); Reason: Failed to create query for method public abstract boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean)! No property 'existByBookName' found for type 'UserLoanHistory'; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean)! No property 'existByBookName' found for type 'UserLoanHistory'at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.24.jar:5.3.24]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.24.jar:5.3.24]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.6.jar:2.7.6]at com.group.libraryapp.LibraryAppApplication.main(LibraryAppApplication.java:10) ~[classes/:na]Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating be
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
[실습]Thymeleaf- 부트스트랩 템플릿 - 자료가 달라요 ...
안녕하세요 틈틈히 공부 하고 있는데 여기까지 왔네요..이해를 못하는 부분이 좀있어서 첨 부터 다시 보고 여기 까지 왔는데 모르는부분은 인터넷에서 확인하고 알아갔는데 강의 내용에서 알려주신 자료와 강의 하신 자료가 다른거 같아서 이렇게 글 남기네요 Personal - Free Bootstrap Template - Start Bootstrap에서 받은 자료을 받아서 압축 풀면 ======================================== 위처럼 나타납니다. 강의 내용에서 자료를 받은 내용은 이렇더라구요=============================제자료는 강사님의 자료 처럼 Vendor이 없어요...강의 노트를 확인하면 [링크에서 템플릿 파일 다운로드 후 압축을 해제하고, 파일과 폴더를 각각 아래 경로에 추가합니다. 디렉토리가 없다면 만듭니다]라고 적혀 있어서 위 처럼 폴더를 만들긴 했지만 vendor폴더가 없어요 강사님의 git에 있는 벤드를 가져와서 붙여도 되나요?? 그러면 강의 내용을 앞서 가는거 같아서 하다가 말았어요...Vendor 폴더 그냥 폴더만 만들고 계속 강의 들어도 되나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
test 코드에 static을 사용하는 이유와 new 생성자가 나오는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]너무 늦게 눈치챈 일이긴 합니다만, 테스트 코드를 짤 때, 강의 전반적으로 static 클래스를 사용하는 것을 발견했습니다. 평소 Config를 구성할 땐 static을 사용하지 않았었는데 말이죠.몇 가지 실험을 통해 발견한 것은@Slf4j 애너테이션이 non-static nested classes엔 지원하지 않는다 였습니다.그렇다면 RollbackTestConfig 클래스에선 스태틱 클래스를 new 키워드로 생성하는 부분은 왜 그런 것인지@TestConfigurationstatic class RollbackTestConfig { @Bean RollbackService rollbackService() { return new RollbackService(); } } , @Slf4j 이외에 static을 쓰는 이유가 무엇인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberService의 join관련 질문
MemberService.java @Transactional public Long join(Member member) { validationDuplicateMember(member); memberRepository.save(member); return member.getId(); }join이 호출되었을 때 insert into member (city, street, zipcode, name, member_id) values (?, ?, ?, ?, ?) 이렇게 로그가 남는데 h2는 IDENTITY를 사용하기 때문에 member_id는 null로 가는게 맞지 않나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
AddreesEntity 업데이트 쿼리 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 내용에서 설명하신 부분과는 조금 거리가 있는 내용인 것 같습니다만... 의문점이 풀리지 않아서 질문을 남겨 봅니다. 1:N 단방향 연관관계에 대한 질문이 더 맞을 것 같습니다.강의에서 addressEntity 엔티티와의 연관관계를 OneToMany , 연관관계의 주인을 1쪽에 두셨는데, 쿼리를 보면 addressEntity 에 대한 insert 쿼리가 cascade 때문에 같이 날아가는데 이 시점에서 이미 member_id 즉 addressEntity 입장에서 fk 값이 되는 이 값을 이미 알고 있는걸까요 ? 만약 그렇다면 update 코드는 왜 또한번 jpa 에서 날리는 건지 궁금합니다. 연관관계 주인쪽의 값 변동에 따른 jpa의 추적 메커니즘상 쿼리가 한번 더 날아가는 것일까요 ?
-
미해결Practical Testing: 실용적인 테스트 가이드
이 강의 주제를 듣다가.. 외부 시스템
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 제가 테스트 코드를 수행 도중에 맞닥뜨린 고민이 있었습니다.보통 메일과 같은 외부시스템(AWS)를 사용하게 되면, 그 해당 외부시스템의 key값과, secret값이 필요해서 application.yml 에 해당 key값과 secret값을 환경 변수로 설정해서, @Value 애노테이션을 통해서 설정 클래스를 만드는데, 이때테스트 코드를 만들게 되면 application-test.yml과 같은 테스트 전용 yml 파일을 만들어서 테스트 환경을 실행시키도록 하게 되는데, 강사님은 이럴때 어떻게 처리하시는지 궁금합니다. application-test 파일에 설정을 안하게 되면 런타임시 에러가 발생하게 되어, 실행시 에러가 나는데. 외부 시스템은 Mocking 처리하도록 하니. 테스트용 임시로 임의값을 key, secret 값으로 설정하면 되는건지 궁금하네요 진짜 좋은 강의 감사합니다 ^^ ㅎㅎ
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
내부 호출에 대한 재질문
제가 좀 헷갈려서 다시 질문을 좀 드립니다.@Transactional이 있으면 프록시 생성이 된다그런데 내부 호출을 하면 대상 객체(this)의 메소드를 호출하니까 트랜잭션이 발생하지 않는다그래서 문제이다. 이를 해결하기 위한 방법 중에서 제일 권장하는 것이 클래스를 분리하는 것이다라고 이해를 했습니다. 그런데 실무에서는@Transactional (<= 클래스 전체에 트랜잭션을 걸었다는 표현입니다 어떻게 했는지는 잘 모르겠지만...클래스에 걸린 것은 확실합니다)class ServiceImpl implements Servcie {public void mainMethod() { // 메인 메서드deleteMethod(); // 내부 메서드 호출insertMethod(); // 내부 메서드 호출} public void deleteMethod() {} // 내부 메서드public void insertMethod() {} // 내부 메서드}보통 위와 같이 코딩을 자주 하는데 이때는 클래스에 @Transactioanl 어노테이션이 있어전체 메서드에 @Transactional 이 적용된다는 것은 이해를 합니다. "그런데 mainMethod()에서 deleteMethod()를 호출하면 내부 호출이라 대상 객체의 즉, ServiceImpl 클래스에서 deleteMethod()를 호출하므로 트랜잭션이 적용되지 않는다"가 맞지 않나요? 아니면 굳이 클래스를 분리하지 않고 클래스 단위에 @Transactional 애노테이션을 적용시키면내부 호출에 문제가 없다는 뜻인지? 글로 질문을 하기가 어렵습니다. 답변을 글로써 하시기는 더욱 더 어려우실 것 같은데너무 궁금해서 다시 질문을 드리니 양해 바랍니다.
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
페이징 기능은 어떻게 테스트 하시나요?
안녕하세요. 강사님 강의듣고나서 새로운 시각이 열리게 된 것 같아서 요새 개발을 재밌게 배우고 있습니다. 감사합니다.배경public interface PostJpaRepository extends JpaRepository<PostEntity, Long> { @Query(value = "select new store.ppingpong.board.post.dto.PostWithWriter(p.id, p.title, p.postType, u.userInfo.nickname, p.createdAt) " + "from PostEntity p " + "join UserEntity u on p.userId = u.id " + "where p.forumId = :forumId", countQuery = "select count(p) from PostEntity p where p.forumId = :forumId") Page<PostWithWriter> findPostAndUsernameByForumId(@Param("forumId") String forumId, Pageable pageable); }(Post는 User의 id를 필드로 가지고 있고 Forum을 조회 시, forumId와 같은 Post리스트를 페이징처리하면서, User의 name필드 정보가 필요해서 다음과 같은 쿼리를 작성한 상황입니다.)페이징 기능이 필요해서, 제일 먼저 생각난게 spring data jpa에서 제공하는 페이징기능이었습니다.그런데, 테스트코드를 작성하려보니 뭔가 잘못된 것 같다고 느꼈습니다.문제상황@Override public Page<PostWithWriter> findByForumId(String forumId, Integer listNum, Pageable pageable) { List<Post> list = data.stream() .filter(post -> post.getForumId().equals(forumId)) .toList(); FakePage<Post> posts = new FakePage<>(list, pageable.getPageNumber(), pageable.getPageSize(), list.size()); posts.stream() .map() // ??? return null; }FakePostRepository를 작성하던 중 Page를 상속받은 FakePage를 구현 후, "스트림으로 PostWithWriter dto에 넣어줘야겠다" 라고 생각할 때였습니다.위 상황에서는 Post를 받는 정적 팩토리 메서드를 만들면 될 것 같긴했습니다. 그러나, 테스트코드를 위해서 메인코드를 수정해야하는 상황이 좀 이상하다고 생각했습니다.질문일단 제가 이 상황에서 드는 다양한 생각은dto는 단순히 전달목적이니 코드수정이 들어가도 상관없다.jpa의 페이징기능을 포기하고 Comparator를 구현해서 직접 정렬한다.페이징 기능에 한해서 Mock 프레임워크 기능을 이용한다. 물론 지금은 서비스가 단순히 repository를 호출하는거라 테스트 할 의미가 적은 것 같지만, 나중에 위 같은 상황에서의 대처가 궁금해서 질문올립니다.강사님의 답변을 듣고 싶습니다. 감사합니다!
-
미해결JPA & Spring Data JPA 기초
git 링크 안들어가져요 404에러
https://github.com/madvirus/jpa-basic/jpa-01git링크가 들어가면 404가 뜹니다