학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네 [질문 내용] 여기에 질문 내용을 남겨주세요. 연관관계 메서드에서 addOrderItem메서드의 orderItem.add(orderItem)부분을 보면 연관관계 주인이 아닌곳에 값을 설정해 주는데 이렇게 하면 값이 들어가지 않는다고 알고 있는데 왜 주인이 아닌곳에 값을 넣어주는 건가요?? 바로 밑에 orderItem.setOrder(this) 이런식으로 오더를 넣어주는 상황이면 주인이 아닌쪽에서도 값을 넣을 수 있는건가요?
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
UserController.java UserUpdateRequest.java 지난 강의에서 사용한 @PostMapping @GetMapping, 이번강의에서 PutMapping과 같이 사용한 @DeleteMapping은 정상적으로 작동이 되지만 @PutMapping만 문제가 발생하여 질문드립니다. Import가 안됐나 싶어 Import를 시도해보았지만 Import와 관련된 문제는 아니었던것 같습니다. @PutMapping과 updateUser의 @RequestBody 공통적으로 Annotations are not allowed here가 발생합니다.
강사님 안녕하세요 수업 잘 듣고 있습니다. 덕분에 도전하기 힘들었던 인증인가를 조금이나마 이해하게 되고 있는 것 같습니다. 수업을 듣던 중 한가지 궁금한 점이 생겨서 질문 남기게 되었습니다. LoginController에서 String accessToken = authorizationHeader.split(" ")[1]; 이라는 변수를 선언하는데 저는 authorizationHeader.split(" ")[1]이 accessToken인지 accessToken을 포함한 jwt인지가 헷갈립니다. 혹시 이 부분과 관련하여 제가 어떻게 이해하면 좋을지 조언 해주실 수 있으실까요? 감사합니다.
트랜잭션안에 쓸수있는 EntityManager 없다고 에러가 뜹니다. 설정 문제인걸까요? org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initDb': Invocation of init method failed; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921) ~[spring-context-5.3.29.jar:5.3.29] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.29.jar:5.3.29] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.14.jar:2.7.14] at jpabook.jpashop.JpashopApplication.main(JpashopApplication.java:10) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-2.7.14.jar:2.7.14] Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:299) ~[spring-orm-5.3.29.jar:5.3.29] at jdk.proxy3/jdk.proxy3.$Proxy119.persist(Unknown Source) ~[na:na] at jpabook.jpashop.InitDb$InitService.dbInit1(InitDb.java:34) ~[main/:na] at jpabook.jpashop.InitDb.init(InitDb.java:20) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.3.29.jar:5.3.29] ... 23 common frames omitted 제코드입니다. package jpabook.jpashop; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.item.Book; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; @Component @RequiredArgsConstructor public class InitDb { private final InitService initService; @PostConstruct public void init() { initService.dbInit1(); } @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; private void dbInit1() { Member member = new Member(); member.setName("UserA"); member.setAddress(new Address("서울", "1", "1111")); em.persist(member); Book book1 = new Book(); book1.setName("JPA1 BOOK"); book1.setPrice(10000); book1.setStockQuantity(100); em.persist(book1); Book book2 = new Book(); book2.setName("JPA2 BOOK"); book2.setPrice(20000); book2.setStockQuantity(100); em.persist(book2); OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1); OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 1); Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); Order order = Order.createOrder(member, delivery, orderItem1, orderItem2); em.persist(order); } } }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. EntityA 1:N EntityB EntityB 1:N EntityC 이런식으로 있을 때 , EntityA 가 EntityB를 @oneToMany로 가지고있고, EntityB 가 EntityC를 @oneToMany로 가지고 있습니다. 배치사이즈 옵션을 넣고 select a from EntityA a 했을때 , EntityA의 갯수만큼 EntityB에 in절로 EntityA의 키값을 넣어서 @oneToMany를 한번에 끌고왔다고 했을 때 , EntityB안에있는 EntityC를 또 EntityB의 갯수만큼 EntityC에 in절로 EntityB의 키값을 넣어서 한번에 끌고 올 수 있는 방법이 있는지 궁금했습니다. 다중 페치조인 안되는걸 알지만 예를 들어서 이런걸 원한다고 생각하시면 될 것 같습니다 select a from EntityA a join fetch EnitityB(List) b join fetch b.EntityC(List) 이런식으로 컬럼 갯수가 일대다 일대다로 기하급수적으로 증가하는 경우인데 배치사이즈를 사용하여 select a from EntityA a 를 했을 땐 a.EntityB 에 접근할때 당연히 in 절로 가져와주지만 EntityB의 일대다인 EntityC 를 조회 할 땐 N+1이 다시 터집니다 엮여있는 모든 연관관계들을 IN절로 태우고 싶은데 방법이 없을까요?
depth가 2단계의 상속관계를 셋팅하는 경우 id는 최상위 엔티티의 id를 모두 공유하는 방식으로 설계를 해야 할까요? 예를 들어 A가 최상위 A를 상속하는 AA, BB 그리고 다시 AA를 상속하는 AAA, BBB. CCC가 있다면 AAA를 만드는 경우 A의 id를 AA, AAA모두가 공유하는 방식이어야 하는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 일단 페치조인으로 둘이상의 컬렉션은 페치 조인 할 수 없다는 걸 알았습니다, 이럴땐 배치사이즈로 컬렉션들을 in 절로 끌고오면 되는것도 이해했습니다. 궁금한것은 in절로 끌고온 컬렉션들안에 또 @oneToMany로 선언된 엔티티가 존재한다면 그 컬렉션들은 @Batchsize옵션으로 in절로 끌고 올 수 가 없나요? 배치 사이즈를 줘도 컬조회할 기준 엔티티에 직접적으로 존재하지 않는 컬렉션 엔티티들은 in절로 끌고오지않고 n+1이 터지는것같습니다
Dockerfile에서 FROM은 base 이미지를 지정할 수 있는데요, 보통 ubuntu와 같은 OS를 지정하는 것으로 알고 있습니다. 만약 FROM ubuntu로 지정했을 경우 ubuntu OS로 해당 컨테이너가 동작하며 그 안에서 jdk를 설치하고 앱을 실행하고 하는 작업이 가능할 것 같은데요 FROM에 그냥 jdk를 지정하면 java는 jvm을 통해 OS에 종속되지 않고 앱이 실행 가능하니 정상 실행될 것이라는 것은 알지만 컨테이너의 OS는 어떻게 되는것인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 헷갈려서 질문 남깁니다. JpaConfig 를 통해 @Bean 등록 한다 JpaConfig Class 에 있는 EntityManager 는 스트링부트가 자동적으로 Bean 등록을 해주기 때문에 의존관계 주입을 통해 사용이 가능하다. new JpaRepository(em) 을 통해 의존관계 주입 JpaRepository에서의 EntityManager em 은 JpaConfig에서 ItemRepository 를 @Bean 등록할 때 매개변수로 받은 것을 사용 제가 이해하고 있는 흐름이 맞나요?
안녕하세요 해당 프로젝트를 이클립스가 아닌 인텔리제이로 만들고 싶어 글을 올리게 되었습니다. SpringMVC12 프로젝트(이게 7강에서 11강까지 다 모여있는 거겠죠...?)의 pom.xml에 사용한 것들을 스프링 이니셜라이저의 gradle(build.gradle)로 하고 싶은데 dependencies에 각각 어떠한 것들이 들어가 있는지 알 수 있을까요?
안녕하세요. 먼저, 강의 잘 듣고 있습니다. 강의 따라하던 중 아래 이슈가 발생해서 문의 드립니다. Q1. @NotNull 지정 시, Not-null fields must be initialized 라고 경고창이 뜨며.. Q2. 테스트를 진행하면 아래와 같이 메세지 부분에 기대했던 값 외에.. 추가 적인 스트링이 들어가서 테스트 성공이 되지 않는 것 같습니다. Body = {"code":400,"status":"BAD_REQUEST","message":"Field error in object 'productCreateRequest' on field 'type': rejected value [null]; codes [NotNull.productCreateRequest.type,NotNull.type,NotNull.sample.cafekiosk.spring.domain.product.ProductType,NotNull]; arguments [ org.springframework.context.support .DefaultMessageSourceResolvable: codes [productCreateRequest.type,type]; arguments []; default message [type]]; default message [상품 타입은 필수입니다.]","data":null} 그 외에 @NotBlank, @Postivie 도 유사한 에러가 발생하고 있습니다. Expected :상품 가격은 양수여야 합니다. Actual :Field error in object 'productCreateRequest' on field 'price': rejected value [0]; codes [Positive.productCreateRequest.price,Positive.price, Positive.int ,Positive]; arguments [ org.springframework.context.support .DefaultMessageSourceResolvable: codes ... Q2 의 경우 하여.. 우선은 아래와 같이 문자열을 포함하는지로 수정해서 테스트는 넘어갔습니다. .andExpect(jsonPath("$.message", "상품 가격은 양수여야 합니다.").exists()) Q1 내용은 어떻게 수정하면 된느지 궁금합니다. 확인 부탁드립니다~
// querydsl 추가 implementation 'com.querydsl:querydsl-core' implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor 'jakarta.persistence:jakarta.persistence-api' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' 위처럼 build.gradle 설정을 조금 다르게 했습니다. 그런데 Build and run using을 Intellij IDEA로 설정하면 Q클래스 파일이 생성되긴하는데 사용하려고 하면 import가 되지 않고, Build and run using을 Gradle로 설정하면 정상적으로 import가 되는데 설정 문제로 그러는걸까요? 이유가 궁금합니다.
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 연관관계 매핑 수업을 듣다가 읽기 전용 필드,매핑이란 게 정확히 뭔지 잘 모르겠습니다. 예를 들어 섹션6.다양한 연관관계 매핑 수업에서 일대다 양방향 설명해 주실때 Member클래스에 team 이라는 읽기 전용필드를 사용했는데 읽기 전용 필드가 값을 변경할 순 없고 읽기만 가능하다고 하셨는데 Q1. 읽기 전용 필드가 정확히 어떤걸 변경할 수 없고 읽기만 가능하다는 건가요?? team.setXX()처럼 객체에서 값을 변경할 수 없다는 건가요?? Q2. Team클래스의 members 가 연관관계 주인이라서 members.add(member)이런식으로 해야 MEMBER 테이블의 TEAM_ID(FK)에 대해 update문이 나가고 team.setTeam(team) 이런식으로 하면은 MEMBER 테이블의 TEAM_ID(FK)에 대해 update문이 안나간다는 건가요??
난독증이 있는건지 내용은 그대론데 읽을 때마다 내용이 달라지는 것 같아 질문을 남깁니다... 다른 분들이 작성하고, 호돌맨님께서 남기신 답글들을 보고 나서 제가 이해한 것이 맞는지 확인 부탁드립니다... 1. 자판기 비유에 대한 내용 1.1. request(edit), domain(editor)를 작성하셨는데, 말씀하시는 부분이 (결국 같은 내용이겠지만...) request(edit)에는 edit.title, edit.content(100원, 500원)(동전)뿐만 아니라 추후에 예를 들어 edit.name , edit.gender(1000원, 10000원)(지폐)가 넘어 올 수도 있는 상황이 발생할 수도 있는데, 지폐(name, gender)는 받고 싶지 않은 상황에서 domain(editor)(금액 투입구)를 사용하지 않으면, 지폐가 들어오는 것을 막을 수 없고, 추후에 불필요한 지폐를 걸러내는 작업이 발생하기 때문에 애초에 입구 자체를 동전만 넣을 수 있는 domain(editor) 금액 투입구를 만들게 되면, 들어온 모든 동전은 사용에 필요한 값이기 때문에 불필요하게 걸러내는 작업이 없어진다고 생각하는 것이 맞을까요...? (같은 말인 것 같은데... 예를 더 어렵게 만든 것 같아 죄송합니다...) 호돌맨님이 if를 통해 기존 값을 사용하는 방식 2.1 이 말은 즉, 위 예를 연속해서 사용하자면 [사람 1]이 edit.title(100원)을 넣은 상태에서 [사람 2]가 edit.content(500원)짜리를 넣어도 [사람 2] 때문에 [사람 1]이 넣은 edit.title(100원)이 사라지면 안되기 때문에 사용한다는 말씀이 맞으실까요? (물론 위의 예는 [사람 2]가 edit.title(100원)을 넣게되면 금액이 추가되는 것이 아니라 동전이 변경되야 한다는 오류가 있긴 하지만... 그냥 사용하겠습니다...) 뭔가 작성하면서 또 이해가 된 것 같긴하지만... 틀린 부분이 있다면 지적 부탁드립니다... 또 예를 추가하고 글을 복잡하게 만들어 죄송합니다...
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요~ 강사님! 강의보고 다 만들고 배포까지 완료한 홈페이지에서 수정할게 있어서 수정해서 git에 업로드까지 했습니다. 그런데 Ec2 서버에 적용시킬때 기존 library-app폴더를 완전히 삭제 후 다시 git에서 전체 업로드 해서 빌드해야하나요?? 아니면 부분 수정이 가능 한걸까요?? 어떤 방법으로 수정처리 해야하는지 궁금합니다!!!