묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
PagedModel or VIA_DTO WARN 문구
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. @GetMapping("/members") public Page<?> list(@PageableDefault(size = 5, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) { return repository.findAll(pageable).map(MemberResponse::new); }해당 코드에서 API를 호출했는데 Serializing PageImpl instances as-is is not supported, meaning that there is no guarantee about the stability of the resulting JSON structure! For a stable JSON structure, please use Spring Data's PagedModel (globally via @EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO)) or Spring HATEOAS and Spring Data's PagedResourcesAssembler as documented in https://docs.spring.io/spring-data/commons/reference/repositories/core-extensions.html#core. 이러한WARN 문구가 출력되었습니다. 이는 PageImpl의 객체가 그대로 JSON으로 직렬화되어 구조적인 문제가 발생할 수 있다는 경고 메세지 인데 이를 해결하기 위해서는 HATEOAS 의존성을 주입받아서 PagedModel을 반환하는 방법이 있고 spring.data.web.pageable.serialization-mode=via-dto해당 코드를 yml 파일에 추가해서 글로벌 설정으로 가져가는 방법이 있고 @EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO))방법이 있다고 합니다.강사님 영상에는 해당WARN 문구가 보이지 않는데 그 이유는 버전의 문제때문에 강사님 영상에는 해당 WARN 문구가 보이지 않는게 싶습니다.제가 가장 궁금한 것은 물론 프로젝트의 비즈니스에 따라 다르겠지만 위의 방법들중 어떤 방법이 가장 보편적으로 쓰이나 궁금합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
itemList에 moive, album 정보 나타내는 법
[질문 내용]Book 외에 Album, Moive도 구현하려고 합니다.예제의 itemList.html에는 추상 클래스 Item에 정의된 속성들만 표시되도록 되어있는데요. Item이 Book인 경우에는 author, isbn이 Album인 경우에는 artist, etc 등이 같이 표시되도록 하려면 어떻게 구현하는 것이 가장 좋은 방법일까요? 타임리프에서 Item의 클래스를 체크한 후(instance of 와 유사) 다운캐스팅해서 각각의 타입에만 해당하는 내용을 출력하는 방식으로 구현하고, href도 "items/{id}/edit"을 수정해서 "items/{id}/book-edit", "items/{id}/album-edit"과 같은 식으로 하는게 맞는 방법인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
errors.properties에 파라미터로 넘겨주는 매개변수 타입
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. errors.properties에 궁금한 점이 있어 문의드립니다. 파라미터가 존재하는 메시지에 new Object[]{1000, 1000000}로 매개변수를 전달하였을 때, 자동으로 1,000 / 1,000,000와 같이 쉼표가 포함되는 숫자로 표시되는데 숫자인 경우엔 쉼표를 자동으로 넣어주는건가요?
-
미해결실전! 스프링 데이터 JPA
repository 인터페이스에 vo전달 방법
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 실무를 하는데 궁금한게 있어 질문 남깁니다. repository 인터페이스에 생성된 메소드를 실행하는데 string으로 파라미터 값을 보내주는 예제를 보여주셨는데, 혹시 vo를 바로 보내줄수도 있을까요? 가능하다면 어떤 형식으로 가능할지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
버전으로 인한 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니요3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 스프링 입문 강의 수강 중 문의드리고 싶어 글을 남깁니다. 강사님 말씀대로 hellospringapplication을 실행하니 붉은 색 글씨로 아래 문구처럼 출력됩니다. Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3WARNING: A Java agent has been loaded dynamically (/Users/user/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.15.11/a38b16385e867f59a641330f0362ebe742788ed8/byte-buddy-agent-1.15.11.jar)WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warningWARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more informationWARNING: Dynamic loading of agents will be disallowed by default in a future releaseOpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 자바는 openjdk oracle 23.0.1을 사용 중이고, gradle jvm도 oracle openjdk 23 버전을 사용 중입니다. 제공해주신 다른 답변들을 확인하여 자바 버전을 17로 다운그레이드 하려 했는데 project structure에서 17 버전을 선택하니 amazon corretto가 선택되었습니다. 오라클 17 버전은 따로 뜨지가 않더라고요.. 오라클 버전 외 다른 17 버전을 선택하고 gradle jvm도 조정하면 해결될까요, 아니면 다른 방법이 있을까요 ?양질의 컨텐츠 제공해주셔서 항상 감사드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
재고수량초과 테스트 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의에서 나오는데로 orderCount를 11로 하면 need more stockjpabook.jpashop.exception.NotEnoughStockException: need more stock at jpabook.jpashop.domain.item.Item.removeStock(Item.java:43) at jpabook.jpashop.domain.OrderItem.createOrderItem(OrderItem.java:44) at jpabook.jpashop.service.OrderService.order(OrderService.java:38) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) at jpabook.jpashop.service.OrderService$$SpringCGLIB$$0.order(<generated>) at jpabook.jpashop.service.OrderServiceTest.상품주문_재고수량초과(OrderServiceTest.java:56) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:76) at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended2024-12-22T17:33:07.127+09:00 INFO 5250 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'2024-12-22T17:33:07.128+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop table if exists category cascade 2024-12-22T17:33:07.129+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387129 | took 1ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop table if exists category cascade drop table if exists category cascade ;2024-12-22T17:33:07.129+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop table if exists category_item cascade 2024-12-22T17:33:07.130+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387130 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop table if exists category_item cascade drop table if exists category_item cascade ;2024-12-22T17:33:07.130+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop table if exists delivery cascade 2024-12-22T17:33:07.130+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387130 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop table if exists delivery cascade drop table if exists delivery cascade ;2024-12-22T17:33:07.130+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop table if exists item cascade 2024-12-22T17:33:07.131+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387131 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop table if exists item cascade drop table if exists item cascade ;2024-12-22T17:33:07.131+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop table if exists member cascade 2024-12-22T17:33:07.131+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387131 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop table if exists member cascade drop table if exists member cascade ;2024-12-22T17:33:07.131+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop table if exists order_item cascade 2024-12-22T17:33:07.131+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387131 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop table if exists order_item cascade drop table if exists order_item cascade ;2024-12-22T17:33:07.131+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop table if exists orders cascade 2024-12-22T17:33:07.132+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387132 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop table if exists orders cascade drop table if exists orders cascade ;2024-12-22T17:33:07.132+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop sequence if exists category_seq2024-12-22T17:33:07.132+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387132 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop sequence if exists category_seqdrop sequence if exists category_seq;2024-12-22T17:33:07.132+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop sequence if exists delivery_seq2024-12-22T17:33:07.132+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387132 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop sequence if exists delivery_seqdrop sequence if exists delivery_seq;2024-12-22T17:33:07.132+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop sequence if exists item_seq2024-12-22T17:33:07.133+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387133 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop sequence if exists item_seqdrop sequence if exists item_seq;2024-12-22T17:33:07.133+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop sequence if exists member_seq2024-12-22T17:33:07.133+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387133 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop sequence if exists member_seqdrop sequence if exists member_seq;2024-12-22T17:33:07.133+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop sequence if exists order_item_seq2024-12-22T17:33:07.133+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387133 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop sequence if exists order_item_seqdrop sequence if exists order_item_seq;2024-12-22T17:33:07.133+09:00 DEBUG 5250 --- [ionShutdownHook] org.hibernate.SQL : drop sequence if exists orders_seq2024-12-22T17:33:07.133+09:00 INFO 5250 --- [ionShutdownHook] p6spy : #1734856387133 | took 0ms | statement | connection 14| url jdbc:h2:mem:3e9d99ac-3e6a-493e-ba08-cc03d272eaeddrop sequence if exists orders_seqdrop sequence if exists orders_seq;2024-12-22T17:33:07.135+09:00 INFO 5250 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...2024-12-22T17:33:07.137+09:00 INFO 5250 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.> Task :test FAILEDOrderServiceTest > 상품주문_재고수량초과 FAILED jpabook.jpashop.exception.NotEnoughStockException at OrderServiceTest.java:561 test completed, 1 failedFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///Users/iyeonseo/Downloads/jpashop/build/reports/tests/test/index.html* Try:> Run with --scan to get full insights.BUILD FAILED in 4s5 actionable tasks: 2 executed, 3 up-to-date이런 에러가 뜹니다. 강의에서는 성공이 뜨는데 왜 이렇게 뜨는건가요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
파라미터가 이상해요
createQuery의 파라미터가 qlString이 없어요.package jpabook.jpashop.domain.repository; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jpabook.jpashop.domain.Member; import org.springframework.stereotype.Repository;import도 jakarta인데 왜 안되는걸까요?
-
미해결스프링 핵심 원리 - 기본편
[섹션4.관심사의 분리] - 생성자를 통한 참조 주입 질문입니다.
package hallo.core; import hallo.core.discount.FixDiscountPolicy; import hallo.core.member.MemberRepository; import hallo.core.member.MemberService; import hallo.core.member.MemberServiceImpl; import hallo.core.member.MemoryMemberRepository; import hallo.core.order.OrderService; import hallo.core.order.OrderServiceImpl; public class AppConfig { //생성자 주입 // -> MemberServiceImpl 은 추상에만 신경쓴다. 따라서 // new MemoryMemberRepository() 객체가 AppConfig 외부에서 생성되어 들어간다 //MemberServiceImpl 를 생성하면서 MemoryMemberRepository 를 쓸거야! //AppConfig는 생성자 객체인스턴의 참조(레퍼런스)를 생성자를 통해서 주입(연결 한다) public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } //------생성자를 통한 참조 주입(1) ---------------------------------------- // MemberService() 메서드가 호출되면 new MemoryMemberRepository()가 실행되어 //MemoryMemberRepository() 객체가 생성 된다. 이 객체의 참조값(메모리 주소)이 //MemberServiceImpl의 생성자 매개변수로 전달된다 public OrderService orderService() { return new OrderServiceImpl( new MemoryMemberRepository(), new FixDiscountPolicy()); } } public class MemberServiceImpl implements MemberService { private MemberRepository memberRepository; // AppConfig 에서 관리 //AppConfig 는 생성자 객체인스턴의 참조(레퍼런스)를 생성자를 통해서 주입(연결 한다) public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } //------생성자를 통한 참조 주입(2) ---------------------------------------- //전달받은 참조값을 MemberServiceImpl 클래스의 필드인 memberRepository에 할당. //MemberServiceImpl 인스턴스의 memberRepository 필드는 AppConfig에서 생성된 MemoryMem berRepository //객체의 참조값을 가지게 된다. //AppConfig에서 생성된 MemoryMemberRepository 객체의 참조값은 매개변수 memberRepository -> 필드 memberRepository 순서로 //전달되어 최종적으로 클래스 필드에 저장된다. } 생성자를 통한 참조 주입을 제가 정리해 보았습니다. 실제로 메모리에 할당 될 때 [AppConfig] new MemoryMemberRepository() -----> 메모리 주소(예: x001) ↑ [MemberServiceImpl] | memberRepository -------------------| 이렇게 할당이 될 것이라고 생각하는데 제가 정리한 것과 흐름이 맞는지 궁금합니다. 그리고 MemoryMemberRepository()); 이 부분은 객체생성을 하면서 참조값을 만들지만 참조값을 받는 변수가 없는데 어떻게 참조값을 인식하는지 궁금합니다. 답변 주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Item에서 Category가 Import되지 않아요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
(공유) 이제는 securityMatcher 지정 안 한 FilterChain 의 순서가 맨 앞에 있으면 에러를 뱉어냅니다.
요청 기반 권한 부여 - HttpSecurity.securityMatch 강의 (14분 25초) 를 듣고 코드를 똑같이 따라 치고 실행해보니 에러가 뜨면서 동작을 안 하더군요. spring boot 버전은 3.4.1 + spring security 6.4.2 로 테스트를 해봤습니다. 조사를 해보니 에러를 뱉는 건 스프링 시큐리티의 WebSecurity 클래스였고, 아래 빨간 박스 친 부분에서 에러를 뱉습니다. 이 코드는 securityMatcher 를 설정 안 한 SecurityFilterChain, 즉 anyRequestFilterChain 이 모든 FilterChain 들 보다 항상 뒤편에 있어야 되는 것을 보장하기 위한 유효성 검사를 위한 것입니다. 선생님이 강의를 찍던 당시와 달라진 내용이 아닐까 싶습니다. 아무튼 이를 우회해서 테스트를 할 수 있는데, 선생님이 작성하신 코드에서 딱 한줄만 추가해주면 됩니다. @Bean @Order(1) public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // !!!!!!!!!!!!!!! 아래 한 줄 추가 !!!!!!!!!!!!!!! http.securityMatchers(matcher -> matcher.requestMatchers("/**")); http.authorizeHttpRequests(auth -> { auth.anyRequest().authenticated(); }) .formLogin(Customizer.withDefaults()); return http.build(); } @Bean public SecurityFilterChain securityFilterChain2(HttpSecurity http) throws Exception { http.securityMatchers(matchers -> matchers.requestMatchers("/api/**", "/oauth/**")); http.authorizeHttpRequests(auth -> { auth.anyRequest().permitAll(); }); return http.build(); } 이상으로 내용 공유를 마칩니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OneToMany속의 ManyToOne 조회시 질문
OneToMany 관계에서 페치조인을 하게되면 페이징이 불가하다고 하셨는데 OneToMany는 batchSize를 조절하여 해결한뒤OneToMany안의 ManyToOne 관계는 어떻게 페치조인 할수있을까요? 예를 들어서테이블 A, B, C가 있을경우A와 B는 OneToMany관계B와 C는 ManyToOne관계 class A { @OneToMany private List<B> b = new ArrayList<>(); }class B { @ManyToOne // Lazy private A a; @ManyToOne // Lazy private C c; } class C { } A를 조회하고 C까지 끌고와야하는경우A와 B는 OneToMany 관계이기 때문에 페치조인이 불가능하지만B와 C는 페치조인이 가능하다고 이해하였습니다BatchSize를 설정하여 A에서 B를 가져올시 IN 쿼리로 가져온뒤B에서 C를 페치 조인하는 방법은 없나요? 아니면 이런경우 특수하게 B에서 C를 Eager로 설정 해야할까요애초에 B를 통해서 A와 C를 가져와야할까요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
memberrepositorytest 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.could not prepare statement [Sequence "MEMBER_SEQ" not found; SQL statement:select next value for member_seq [90036-232]] [select next value for member_seq]; SQL [select next value for member_seq]org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement [Sequence "MEMBER_SEQ" not found; SQL statement:select next value for member_seq [90036-232]] [select next value for member_seq]; SQL [select next value for member_seq]at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:277)at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:241)at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:560)at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:343) 이런 에러가 납니다ㅠㅠ
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 내부 호출 질문 관련하여 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]트랜잭션 내부 호출관련하여 질문있습니다. 강의에서 언급해주신대로, 트랜잭션이 적용되지 않은 External()함수가 트랜잭션이 적용된 Internal() 함수를 내부 호출할 경우, Internal() 함수에 트랜잭션이 적용되지 않는 다는 것을 이해했습니다.만약, 이 경우처럼 트랜잭션이 적용된 Login() 함수가 똑같이 트랜잭션이 적용된 getSocialInfo() 메서드를 호출할 경우에는, 어떻게 동작하는지 궁금합니다. 똑같이 내부 호출이기 때문에 무시되는지, 아니면 트랜잭션이 따로 적용되지만 전파 기본 옵션인 REQUIRED에 따라 자동으로 같은 물리 트랜잭션으로 묶이는 방식으로 동작하는지 궁금합니다. 이 경우, getSocialInfo의 트랜잭션 전파 옵션을 NOT_SUPPORT 로 설정한다면 정상적으로 전파 옵션이 적용되는지도 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 생성 강의 관련 질문드립니다~
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 프로젝트 생성 강의 듣고나서 떠오르는 2가지 질문이 있어 글을 올려봅니다! 1) 먼저, 제가 start.spring.io에선 자바 17버전으로 프로젝트를 시작했는데, 막상 main 메서드를 실행시켜서 스프링부트 애플리케이션을 띄울 때 콘솔에는2024-12-19T20:15:54.366+09:00 INFO 38362 --- [hello-spring] [ main] h.hello_spring.HelloSpringApplication : Starting HelloSpringApplication using Java 21.0.5 with PID 38362 (/Users/.../Desktop/study/hello-spring/build/classes/java/main started by ... in /Users/.../Desktop/study/hello-spring)이렇게 왜 자바 21.0.5버전을 사용하고 있다고 나올까요? 이미 제 맥북에 21버전 자바가 설치되어서 그런걸까요??build.gradle에는java { toolchain { languageVersion = JavaLanguageVersion.of(17) } }이렇게 17버전으로 올바르게 되어있긴 합니다! 2) 선생님께서 인텔리제이 Preferences > Gradle에서 Build and run using을 Gradle로 되어있는 걸 인텔리제이로 바꾸면 더 빠르게 실행할 수 있다고 하셨는데,만약, Gradle (Default)로 설정된 경우 > 인텔리제이 화살표 버튼을 클릭했을 때 자바 소스 코드를 컴파일하고 빌드 과정을 포함해서 빌드를 진행하고 스프링부트 애플리케이션을 실행하고,IntelliJ IDEA로 설정된 경우 > 인텔리제이 화살표 버튼을 클릭했을 때 자바 소스 코드를 컴파일하고 빌드를 진행하지 않고 스프링부트 애플리케이션을 바로 실행하기 때문에 더 빠르게 실행된다고 하신걸까요??
-
미해결토비의 스프링 6 - 이해와 원리
도메인 오브젝트 메소드 주입에 대해 질문있습니다. (의존성 관련)
안녕하세요 토비님.질문드리기 전 먼저 오랜만에 너무 즐겁게 공부하고 있어 감사하다는 말씀을 드리고 싶습니다!질문은 다름이 아니라 '도메인 오브젝트 테스트' 편에서 마지막에 메소드로 ExProvider를 주입하는 방식을 언급해 주셨는데, 이렇게 되면 Payment가 ExProvider에 의존하게 되는 것 같아서 고민이 되었습니다.Payment는 도메인 오브젝트로서 순수하게 Payment에 관련된 응집만 추구해야 할 것 같은데, 그걸 넘어서는 건 아닐까라는 생각도 들었고, Payment 테스트 시 ExPriovider 주입이 필요하게 되는 점도 걸렸습니다.기존처럼 BigDecimal을 받도록 의존성을 끊어주는 게 더 낫지는 않을지 고민이 됩니다.비슷한 경험으로 이전에 SpringSecurity의 PasswordEncoder를 도메인 오브젝트에 메소드로 넘겨볼까 하다가 의존성을 생각해 포기하고 String으로 받았었는데, 이와 동일하지는 않겠지만 앞으로도 고민이 될 수 있는 부분인 것 같아 꼭 질문을 드리고 싶었습니다.도메인 개념적으로 Payment가 ExProvider와 묶여있는 게 자연스럽다 생각하셔서 그렇게 설계하신 걸까 싶은데, 이에 대해 어떻게 생각하시는지 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
TDD와 BDD
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요, 강의를 수강하다 궁금증이 생겨서 질문드립니다!기존에 TDD는 어렴풋이 알고 있었는데, BDD에 대해서는 자세히 몰랐어서 도움이 많이 되었습니다. 그런데 한가지 궁금증이 생겼습니다.BDD는 Behavior Driven Development로 '시나리오에 기반한 테스트케이스 자체에 집중하여 테스트한다.'라는 문장이 있습니다!이때 그렇다면 TDD와 BDD 방식에서 테스트하는 단위가 다른걸까 궁금합니다! 단순히 제가 이해하기에 'TDD에서는 메서드 단위로 테스트가 진행되고, BDD에서는 하나의 요구사항 시나리오 기반으로 테스트되는걸까?'라고 생각이 들었습니다.아니면 혹시 제가 TDD와 BDD에 대한 접근을 잘못 이해하고 있는걸까요?
-
미해결스프링 핵심 원리 - 기본편
Setter메서드에 @Autowired
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] setter메서드는 선택, 변경 가능성이 있는 의존계에 사용한다고 하셨는데setter메서드에 @Autowired를 사용하더라도 스프링 컨테이너에 등록된 bean이 있어야 의존성 주입이 될텐데 그러면 제가 변경하고 싶은 구체 클래스에 @Component를 붙여서 다시 스프링 컨테이너에 등록을 해줘야 변경된 구체 클래스로 의존성 주입을 해주게 될텐데 그러면 생성자 주입과 다른 점이 어떤 것일까요???선택, 변경 가능성이 있다는 의미가 순수 자바 코드로 테스트를 진행할 때 구체 클래스를 쉽게 변경할 수 있도록 하기 위함인 건가요???
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
HttpSecurity configurer
5강에서 11개의 configurer가 생성된다고 하셨는데제꺼에서는 CorsConfigurer를 제외한 10개만 생성이 됩니다.왜 이런지 알 수 있을까요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
Config 관련해서 질문잇습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] @Repository public class ItemQueryRepositoryV2 { private final JPAQueryFactory query; public ItemQueryRepositoryV2(EntityManager em) { this.query = new JPAQueryFactory(em); } ..... @Configuration @RequiredArgsConstructor public class V2Config { private final EntityManager em; private final ItemRepositoryV2 itemRepositoryV2; //SpringDataJPA @Bean public ItemService itemService() { return new ItemServiceV2(itemRepositoryV2, itemQueryRepository()); } @Bean public ItemQueryRepositoryV2 itemQueryRepository() { return new ItemQueryRepositoryV2(em); } @Bean public ItemRepository itemRepository() { return new JpaItemRepositoryV3(em); } } 여기서 ItemQueryRepositoryV2가 에노테이션으로 빈 등록이되어있는데 config에서 새롭게 빈을 등록한 이유가 EntityManager를 새롭게 생성해서 주입받는 것을 위해서인가요?이 방식 말고 다른 방식 ItemQueryRepositoryV2 자체적으로@RequiredArgsConstructor를 쓰면 오류가 나는 이유가 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
서비스테스트,리포지터리 테스트 따로 만드는 이유?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제목그대로요 어떤차이가 있고, 현업에서도 그러는지 궁금합니다.