월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
generated 폴더와 Q class import에 관한...
[질문 내용]여기에 질문 내용을 남겨주세요.1. Tasks - other에 compileQuerydsl이 없어서 compileJava를 눌러서 했는데 괜찮은지 ??2.강사님과 다르게 build /generated 이렇게 생성되어도 문제가 없는지?저런식으로 Q파일들이 생성되었는데 import가 안되고 사용이 안되는 이유 알려주시면 감사하겠습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 패치 조인은 즉시 로딩을 하는데, 필요한 테이블만 즉시 로딩을 한다고 이해하면 될까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
PostConstructor 관련해서 질문있습니다!
안녕하세요 항상 강의 잘 보고 있습니다.영한님께서 알려주신 내용으로 공부와 토이프로젝트를 병행해나가다 이해가 가질 않는 부분이 있어서 질문드립니다.상황A클래스에 @PostConstructor 어노테이션을 붙여 객체 a를 미리 저장해 DB에 저장을 하고 B클래스에도 @PostConstructor를 붙여 객체 b를 저장하려 하였습니다.(A클래스와 B클래스의 연관관계는 일대다입니다.) a객체에 b객체를 리스트 형태로 저장할 수 있게끔 빈 리스트를 만들어 저장하는 것까지 A클래스에서 확인을 하였고 B클래스에서 b객체를 만들고 아까 저장한 a객체를 DB에서 가져오는것까지 확인하였습니다.이후 a객체와 b객체의 연관관계를 연관관계 편의 메서드로 만들어주려하였으나 a객체에서 b객체들을 담을수 있게끔 만들어둔 리스트 형식의 필드가 lazyinitializationexception 예외를 발생시키며 더미데이터 생성에 실패하였습니다.시도해 본 것들@OneToMany의 기본 로딩 전략이 지연로딩이기에 생긴 문제인가 싶어 em.flush, @GraphEntity, hibernate.initialize까지 해보았으나 똑같이 lazyinitializationexception를 발생시키며 더미데이터 생성에 실패하였습니다.(혹시나 해서 즉시로딩으로 변경하니 더미데이터 생성은 문제없이 잘 되었습니다.)궁금한 점혹시 어떤 이유로 다음과 같은 현상이 발생했는지 알 수 있을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@BatchSize와 SQL Parsing
안녕하세요. 강의 잘 듣고 있습니다.BatchSize라는 기능을 배워서 상당히 놀라웠는데요.해당 기능을 사용해 실행되는 쿼리를 보니IN (?, ?)와 같이 바인딩 변수를 이용하는 것으로 보이는데만약 말씀하신것처럼 BatchSize를 1000개로 잡았다 할 떄최악의 경우 IN절 내부의 ? 바인딩 변수가 계속 변하게 된다면 (1개 ~ 1000개 )소프트 파싱의 이점을 살리지 못하는 경우가 발생할 수도 있나요 ??항상 좋은 강의 만들어주셔서 감사합니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
GetMapping에서 Required request body is missing 에러
안녕하세요UI와 GetMapping API 테스트를 하는데 로컬에서 테스트 할 때는 잘 되는데API 테스트를 하면 아래와 같이 Required request body 에러가 뜹니다.Client에서 보낸 JSON데이터를 로컬에서 테스트 하면 잘 되는데 GetMapping 만 쓰는 API에서는 @RequestBody 가 안되는걸까요..? (비슷한 내용의 코드인데 GetMapping, PUTMapping, POSTMapping이 있는 API에서는 또 잘되고 있어서 이런의문점이 듭니다.)아래 코드와 에러 내용 드립니다. . 코드 (Parameter 명과 Class명 수정했습니다.)@Slf4j@RestController@RequestMapping(value = "/", method = RequestMethod.GET)public class SchoolController {@AutowiredClassService cs; @GetMapping("/School") public List<Event> School( @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestBody Class class ) throws Exception { List<Class> ClassList = new ArrayList<Class>(); ClassListt = cs.selectClassBySearchCriteria(class.getId(), class.getName(), class.getCreateTime(), class.getUpdateTime());} . 에러내용 Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.util.List<mes.sdc.mads.vo.Event> mes.sdc.mads.controller.DetectionController.anomalyEvent(mes.sdc.mads.vo.Event,org.springframework.ui.Model) throws java.lang.Exception]
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ORM 책 말인데요..
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]ORM 서적 혹시 개정판 안 나오나요...버전이 꽤나 바뀐 탓에 사고 싶은데 약간 망설여지네요.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션의 필요성에 대해 질문 좀 드리겠습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]먼저 다 대 다 관계라고 하겠습니다.A라는 엔티티와 B라는 엔티티가 다대다로 묶여져 있고 그 중간테이블을 C라고 하겠습니다.이럴 경우에 걍 컬렉션 배치size으로 하는게 아니라 중간 테이블 B로 하면 안되나요?요약하면 강의에서는 페이징이 필요하지 않으면 join fetch로 페이징이 필요하다면 batch size를 활용하라 라고 되어있는데 역으로 @ManyToOne이 있는 다대 일의 다 쪽에서 jon fetch로 모든 것을 해결하면 안되는 건가요?? 아 그리고 질문이 또 있는데 위에서 B에서 A와 C를 fetch join으로 모두 가져오게 설계해도 괜찮죠??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
default_batch_fetch_size 크기 질문
강의에서default_batch_fetch_size가 100이고,OrderItem의 크기는 2개,Item의 크기는 4개 입니다default_batch_fetch_size를 정할때 OrderItem의 크기와 Item의 크기를 더한 값인가요? 아니면 OrderItem의 크기만 인건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA> DDD 서로 다른 애그리거트 사이의 간접참조
안녕하세요 영한님! 프로젝트에 JPA 및 DDD를 적용하며 의문점이 생기는 부분이 있는데 물어볼 곳이 마땅치 않아서, 이렇게 질문글 올립니다. 구조(요약) - 모노리틱저희 프로젝트에서 다음과 같이 서로 다른 애그리거트 사이에는 간접참조를 통해 느슨하게 결합하여 사용하고 있습니다. 질문다음과 같이 설정하고 나니 몇 가지 의문점이 있습니다. 간접 참조를 통해 느슨한 결합을 하고 있는데, DB 에 따로 외래키 제약 조건을 걸어주어야하는가? 이 부분에 있어서 팀원과 의견이 달라서요. 저는 애그리거트를 나눈 목적이 결국 복잡도를 줄이기 위해서이고, 각각의 애그리거트 안에서 트랜잭션으로 관리가 되어야한다고 생각을 하는데.. 외래키를 설정하면 결국은 User 를 관리할 때 참조 무결성을 신경쓰면서 Trip 까지 고려를 해야돼서 좋지 않다고 생각합니다. 굳이 DB에서 외래키 제약을 걸지 않아도 이벤트를 통해 관리할 수 있다고 생각을 하기도 하구요. 팀원분은 어플리케이션보다는 변경점이 낮은 DB를 우선으로 하며 개발을 해야하고, 그렇기 때문에 반드시 외래키를 걸어주어야한다고 말씀하시는데, 무엇이 더 맞는 말인지 잘 모르겠습니다. 회원 탈퇴(User 삭제)가 이루어질 때 회원과 관련된 모든 Trip 삭제(벌크성 삭제 쿼리)가 이루어지도록 하기 위해서 이벤트를 활용하고 있는데, 이를 비동기적으로 처리해도 문제가 되지 않는가?@Async, @TransactionalEventListener 를 활용해서 회원탈퇴 요청시 회원 삭제가 커밋이 완료 되면 회원이 작성한 여행 정보를 지우는 비동기 이벤트를 발행하도록 하고 있습니다. 회원 탈퇴시 중요한건 회원 정보를 삭제하는 것이라고 생각해서 이를 비동기적으로 처리하는게 옳다고 생각해서 이렇게 구현했는데, 이 방식이 옳은 방식인지 확신이 서질 않습니다. 현업에서는 어떻게 이런 문제를 해결하고 있는지 궁금합니다! 읽어주셔서 감사합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Querydsl 추가 질문입니다
//querydsl 추가 buildscript { dependencies { classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10") } } plugins { id 'org.springframework.boot' version '2.4.1' id 'io.spring.dependency-management' version '1.0.10.RELEASE' id 'java' } group = 'jpabook' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' //apply plugin: 'io.spring.dependency-management' apply plugin: "com.ewerk.gradle.plugins.querydsl" configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5' // implementation 'org.hibernate:hibernate-core:5.4.13.Final' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //추가 testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" } //querydsl 추가 implementation 'com.querydsl:querydsl-jpa' //querydsl 추가 implementation 'com.querydsl:querydsl-apt' } tasks.named('test') { useJUnitPlatform() } //querydsl 추가 //def querydslDir = 'src/main/generated' def querydslDir = "src/main/generated" querydsl { library = "com.querydsl:querydsl-apt" jpa = true querydslSourcesDir = querydslDir } sourceSets { main { java { srcDirs = ['src/main/java', querydslDir] } } } compileQuerydsl{ options.annotationProcessorPath = configurations.querydsl } configurations { querydsl.extendsFrom compileClasspath } //Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거 clean { delete file('src/main/generated') } 이런식으로 build.gradle을 구성했는데요. 어플리케이션을 실행하려고만 하면이런 에러가 발생하면서 실행이 되지 않습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
처음에 무한루프 부분에서 궁금한게 있어요!
처음에 무한루프 돌때 갑자기 궁금한게 생겨서요.Order -> MemberOrder -> address 위 엔티티들은 둘다 지연로딩인데실제 모든 Order를 조회 했을 때,'지연로딩'이니깐 실질적으로 Member 엔티티를 건드리지 않는 이상은 Member에는 프록시로 담기는 걸로 이해했습니다.그래서 Jackson이 프록시를 건드리지 못해 에러를 발생하는 걸로 이해했구요.근데 동영상에서 6분9초 때에, 포스트맨에서 결과값들이order, member 등등 엔티티들의 값들이 채워져서 보이는데, 지연로딩인데도 값들이 막 보이는게 이해가 안됩니다.정리하자면...모든 Order만 조회했는데, 지연로딩인데도 Member 등 연관된 엔티티들이 다 조회되는 게 이해가 안됩니다혹시 제가 놓친 부분이 있을까요? 지연로딩이 조금 헷갈리고 있는거 같습니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA 트랜잭션과 batch_fetch_size 질문이 있습니다.
@Transactional public List<Order> findAllWithMemberDelivery(int offset,int limit) { List<Order> resultList = em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); return resultList; } 1. @Transaction이 있을 때 조회쿼리select o1_0.order_id, d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id offset ? rows fetch first ? rows only 2023-07-15T01:15:30.105+09:00 TRACE 20476 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [1] as [INTEGER] - [0] 2023-07-15T01:15:30.105+09:00 TRACE 20476 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [2] as [INTEGER] - [100] select o1_0.order_id, o1_0.oder_item_id, o1_0.count, o1_0.item_id, o1_0.order_price from order_item o1_0 where array_contains(?,o1_0.order_id) 2023-07-15T01:15:30.122+09:00 TRACE 20476 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [1] as [ARRAY] - [[1, null, null, null,...] select i1_0.item_id, i1_0.dtype, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.artist, i1_0.etc, i1_0.author, i1_0.isbn, i1_0.actor, i1_0.director from item i1_0 where array_contains(?,i1_0.item_id) 2023-07-15T01:15:30.139+09:00 TRACE 20476 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [1] as [ARRAY] - [[2, 1, null, null, null,...] select o1_0.order_id, o1_0.oder_item_id, o1_0.count, o1_0.item_id, o1_0.order_price from order_item o1_0 where array_contains(?,o1_0.order_id) 2023-07-15T01:15:30.142+09:00 TRACE 20476 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [1] as [ARRAY] - [[2, null, ...] select i1_0.item_id, i1_0.dtype, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.artist, i1_0.etc, i1_0.author, i1_0.isbn, i1_0.actor, i1_0.director from item i1_0 where array_contains(?,i1_0.item_id) 2023-07-15T01:15:30.144+09:00 TRACE 20476 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [1] as [ARRAY] - [[4, 3, null, null, null,...] public List<Order> findAllWithMemberDelivery(int offset,int limit) { List<Order> resultList = em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); return resultList; }트랜잭션 없이 실행된 쿼리 select o1_0.order_id, d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id offset ? rows fetch first ? rows only 2023-07-15T01:19:19.943+09:00 TRACE 14616 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [1] as [INTEGER] - [0] 2023-07-15T01:19:19.943+09:00 TRACE 14616 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [2] as [INTEGER] - [100] select o1_0.order_id, o1_0.oder_item_id, o1_0.count, o1_0.item_id, o1_0.order_price from order_item o1_0 where array_contains(?,o1_0.order_id) 2023-07-15T01:19:19.957+09:00 TRACE 14616 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [1] as [ARRAY] - [[1, 2, null, null,...] select i1_0.item_id, i1_0.dtype, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.artist, i1_0.etc, i1_0.author, i1_0.isbn, i1_0.actor, i1_0.director from item i1_0 where array_contains(?,i1_0.item_id) 2023-07-15T01:19:19.977+09:00 TRACE 14616 --- [nio-8080-exec-1] org.hibernate.orm.jdbc.bind : binding parameter [1] as [ARRAY] - [[2, 1, 4, 3, null, null, null, null, null, null]] @트랜잭션이 있을 때에는 쿼리가 5번 실행이 되고@트랜잭션이 없을 때에는 쿼리가 3번이 실행이 됩니다. 왜 이렇게 동작하는지 생각을 해도 이해가 잘 안되네요
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
orderItems 에 null이 들어가는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의를 듣다 의문점이 생겨 질문 드립니다.OrderDto는 JPA에서 생성된 객체가 아니고 직접 생성자로 만들어서 사용한 객체인데 왜 Hibernate5Module이 프록시 객체로 생각해서 null값을 반환하는지 모르겠습니다.제가 긴시간 찾아보면서 생각한 이유는 이렇습니다.강의 5분경 쯤에 api 호출시 Json에서 orderItems 가 null로 반환되는것을 보여주십니다.orderItems가 null로 반환되는것은 스프링이 string으로 응답을 보낼때 messageConverter가 json으로 변환해서 반환을합니다.이때 orderItems가 JPA(Hibernate)에서 만든 프록시 객체로 되어있어 전강의에서 설정한 Hibernate5Module이 프록시 객체를 null로 바꾸기 때문에 orderItems가 null로 나타낸것으로 생각됩니다.하지만 제가 디버깅 모드로 확인해본 결과 OrderDto안에 있는 orderItems는 프록시 객체가 아닌 실제로 생성된 객체였습니다.(OrderDto는 단순히 JPA가 관리 하지 않아서 당연하다고 생각합니다.)강의 기준으로 orderItems 안에 있는 orderItem객체가 2개 존재하는데 orderItem객체는 JPA를 통해 생성된 객체이고 자세히 살펴보면 orderItem 안에 Item은 LAZY로딩으로 프록시 객체가 생성되어있습니다. 혹시몰라 Hibernate5Module을 끄고 실행한 결과 Item이 @JsonIgnore가 있으면 orderItems가 제대로 결과 값이 나오고 @JsonIgnore이 없으면 프록시 객체를 Json으로 변환하지 못해서 오류가 발생합니다.그럼 Hibernate5Module는 엔티티 안에 객체의 값중 하나라도 프록시 객체가 있다면 다른 객체의 값이 있든 말든 그냥 null을 반환하는 걸까요??제가 이해한것이 맞는지 궁금해서 질문드립니다.긴글 읽어주셔서 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 좋은 강의와 커뮤니티의 서포터즈 분들의 댓글 덕분에 편하게 공부하고 있습니다. 진심으로 감사드립니다. 회원 수정 관련하여 질문이 있어 글 남깁니다. 회원 수정 시 patch 를 사용할 경우,name 또는 Address 를 수정하려는 요청 값이 들어왔는지 확인하고, 없다면 기존 값을 넣어줘야 하는 controller 로직이 궁금하여 질문 남깁니다. 직접 작성하려 하니,단순하게 String name 만 있다면 간단한데 Address 처럼 객체가 들어가버리니 복잡해지더라구요.검색해보니 json-patch-json 을 사용하면 된다 하여 구현은 해봤는데, 혹시 더 좋은 방법이 있는지 그리고 실무에서는 어떻게 로직 처리를 하시는지 너무 궁금합니다. 매번 감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
부모-자식 엔티티의 비동기 처리
안녕하세요. 공부를 하다가 궁금한 점이 생겨서 질문 남깁니다.@Async 어노테이션에 대한 질문입니다. 현재 부모(게시글) - 자식(댓글) 의 1대다 단방향 연관관계를 가지는 상황에서 cascade.REMOVE 같은 기능을 사용하면 부모가 삭제될 때 자식을 함께 삭제해 주지만, 부모 우선 삭제하여 응답을 내어주고 자식은 비동기적으로 삭제 처리를 하면 좋지 않을까 생각하여 구현을 해보았는데 에러가 발생하여 질문 드립니다.연관관계가 맺어져 있는 부모 자식 객체간에 삭제를 할 때는 자식객체가 무조건 먼저 삭제된 후에 부모 객체의 삭제를 진행하는 것이 올바른 서순일까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
save() 와 saveAndFlush() 차이
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오[질문 내용]안녕하세요. 정확히 강의 내용과 일치하는 내용은 아니지만 JPA 를 공부하다 궁금한 부분이 생겨 질문드립니다. save() 와 saveAndFlush() 의 차이점은 saveAndFlush() 시에는 즉시 DB 로 flush 가 일어나 DB 에 변경내역이 동기화되는 차이가 있는 것으로 알고 있습니다. 하지만 그렇다고 해서 commit 이 일어난 것은 아니기 때문에 다른 트랜잭션에서 변경된 내용을 확인할 수 있는 것도 아닐 것 같습니다. (READ UNCOMMIT 격리수준이 아니라면) 변경된 내역을 확인 가능한 곳은 같은 트랜잭션에 한정된 부분이라면 굳이 flush 를 하지 않아도 1차캐시와 쓰기지연저장소에서 확인이 가능한 부분일 것 같은데 saveAndFlush() 를 왜 사용해야 하는 것인지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
rest일때만 무한 루프 도는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]그냥 컨트롤러에서 model에 담아서 조회할떄는 무한루프가 안도는데 json으로 반환할떄는 왜 무한로프 도는지가 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
N+1문제
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]저번 챕터에서 나왔던 X to one 에서 n+1문제가 있어서 패치조인으로 최적화를 했었는데 이번에 X to many 문제에서 발생하는 데이터 뻥튀기 문제도 n+1문제라고 할 수 있나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1편 까지 완성된 소스코드를 받을 방법이 있을까요?
2편부터 강의를 보기 시작했는데, 코드를 쳐보면서 따라가고 싶어요. 혹시 2편 내용은 없고 1편 내용까지만 완성된 코드는 어디서 받을 수 있을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Order의 전체조회를 할때 조회타입 생략이 가능한가요?
실수로 생략하고 실행했는데 조회는 정상적으로 작동합니다.타입을 지정해야하는 상황과 지정하지 않아도 되는 상황을 예시로 명확히 설명해주실 수 있을까용?