묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
상속관계 매핑 질문이 있습니다.
강의 제목 : 상속관계 매핑시작 시간: 31:36 외래키 참조 무결성 제약 조건을 활용 가능하다.ITEM.ITEM_ID(PK)와 ALBUM.ITEM_ID(PK,FK)를 쓸수있고,장점이 주문 테이블에서 외래키 참조로 아이템을 봐야한다면ITEM_ID만 보면 된다. 다 봐야할 경우 모델링이 이상해진다. 이렇게 말씀을 해주셨는데 외래키 참조 무결성 제약조건을 활용 가능하다고 말씀해주시는게데이터베이스 CASCADE 옵션으로 DELETE같은걸 활용할 수 있다는 의미인가요 ? ITEM_ID만 보면 된다는게, 테이블로 보면 ITEM_ID만 알면 다른 테이블을 확인할 필요 없이ITEM_ID로 찝어서 조회가 가능하기 때문에 장점이라고 말씀해주신 걸까요 ? 시작 시간부터 약 30초간 말씀해주시는게 이해가 안되서 질문을 남겨봅니다.
-
미해결실전! 스프링 데이터 JPA
더미 데이터 추가 후 pk 겹침
실제 구현을 하는 도중 더미 데이터가 있으면 좋겠다 싶어서 data.sql을 만들어서 다음과 같이 sql을 추가했습니다. 5개의 레코드를 추가했습니다.insert into BASKET_FOOD_ENTITY(bakset_food_id, bakset_id, food_id, food_quantity)values ( 1,1,1,3 ),(2,1,2,2),(3,1,3,5),( 4,2,1,2 ),(5,2,2,4); 그 후, 테스트에서 new로 basketFoodEntity를 만들어 add메소드를 통해 DB에 객체를 persist하도록 만들었습니다. BasketFoodEntity basketFood = new BasketFoodEntity(foodEntity,basketRepository.findBasketId(2L),5);basketRepository.addFood(basketFood,userId); addFood 메소드는 다음과 같습니다.public void addFood(BasketFoodEntity basketFood , Long userId){ Long inBasketId = isAlreadyInBasket(basketFood.getFood().getId(), userId); if(inBasketId > 0) updateFoodQuantityToBasket(inBasketId,getFoodQuantity(inBasketId)); else em.persist(basketFood); }추가된 BasketFoodEntity의 Id는 GeneratedValue로 인해 6이 되어야 하는 것으로 알고 있는데, 왜 1이 될까요? 계속 1로 잡혀서 pk가 겹칩니다. GeneratedValue를 빼고 직접 ID를 6으로 설정하면 테스트는 통과됩니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
my-order-sink-connect 변경 정보 문의
my-order-sink-connect로 DB 접속정보를 생성하고 connect를 생성한 후 orders 테이블의 정보(PK, unique 등)가 변경되면 my-order-sink-connect에서 변경된 DB 정보를 인지하고 있나요?아니면 connect가 바라보고 있는 테이블의 정보(PK, 컬럼, unique 등)가 변경되면 connect를 삭제 하고 다시 생성해 줘야 하나요? 감사합니다.
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka sink pk에러
안녕하세요 my-ordser-sink-connect를 만들고 연계 테스트도 잘 진행하였습니다.테스트 진행시 데이터 설정값오류로 pk Exception이 발생하였는데 이 이후 부터 데이터 입력도 되지 않고 재기동하여도 topic를 참조하여 pk 에러가 나타나고 신규 데이터를 받지 못하고 있습니다.my-order-sink_connect 장애 발생시 예외 처리나 장에 처리 가이드가 따로 있을까요감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
메모리에 올린다에서 메모리가 영속성 컨텍스트 인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]메모리에 올린다는 내용이 등장하는데, getter로 조회해서 영속성 컨텍스트에 올려놓는 다는 뜻인가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
@EnableKafka 인식안됨
다른 분들은 저와 같은 경우 없으신가요?ㅠㅠ아래와 같이 gradle 파일에 디펜던시 추가해줬습니다.그런데implementation 'org.springframework.kafka:spring-kafka'@EnableKafka 어노테이션을 인식하지 못하네요ㅠㅠ구글링해도 kafka 어노테이션 관련 글은 없어서 질문드립니다.ㅠㅠ <코드내용><오류 정보 >
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
rollbackOnly 값 변경에 대해 질문 있습니다!
내부 트랜잭션이 롤백되면 rollbackOnly 값을 true로 설정하고, 외부 트랜잭션 커밋시점에 트랜잭션 매니저가 이 값을 확인하여 롤백한다. 그리고 만약 내부 트랜잭션이 롤백 되어도 외부 트랜잭션은 커밋을 유지시키고 싶다면, REQUIRES_NEW를 사용하여 구현 가능하다는 것으로 이해하였습니다!그런데 이때 REQUIRES_NEW를 사용하는 대신 rollbackOnly 값을 다시 false로 변경하여 해결할 수는 없는건가요? (TransactionStatus 메서드에도 true로 변경하는 메서드만 있더라구요)스프링이 이렇게 값 변경을 막은(?) 이유가 궁금합니다..!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 데이터베이스 설정시 url관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 내용을 보면이렇게 url 자리에 mv.db 파일을 설치할 곳을 쓰라고 하셨는데 이 자리에 스프링 프로젝트 파일의 위치를 넣으면 되는 건가요 jpashop이 프로젝트 이름이어서 여쭤봅니다.저가 c드라이브에 인텔리제이 프로젝트들을 저장해서 jdbc url 자리에 "jdbc:h2:(c드라이브내 프로젝트 파일 경로)" 를 적고 url이 application.yaml에 있는 spring:data:source:rul과 동일해야 한다 해서 이 자리에도 같은 경로를 집어넣었습니다. 그런데 계속 오류가 납니다. 혹시 어디가 잘못된 것인지 알 수 있을까요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 설정 시에 ID값을 알고 있다면
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 간단한 내용이지만 조금 고민이 있어서 질문드립니다. 요청을 통해서 받은 데이터를 통해서나 로직상에서 연관관계에 필요한 Entity의 id값을 알고 있는 경우 필요한 Entity를 DB에서 조회하는 과정 없이 id값만 초기화된 Entity를 생성하여 주입하는 방식이 가능한 것으로 알고 있습니다. 이 때, 그렇게 주입된 Entity는 persist된 상태가 아니라는 점인데요. ( cascade 옵션이 적용 안 되었다는 가정 ) 이런 경우에 두 가지 경우의 수를 고려하였습니다.첫 번째는 연관관계 Entity가 연관관계 설정 외에는 사용될 일이 없는 로직의 경우이고두 번째는 연관관계에 필요한 Entity가 이후에도 여러 로직에서 사용되는 경우입니다. 두 번째의 경우에는 사실 고민할 것 없이 ID를 이용해 Entity를 생성하는 것이 아닌 SELECT를 통해서 Entity를 조회하여 사용하는 것이 좋은 방법이고 EntityGraph를 맞추는 면에서도 당연히 해주어야 하는 것으로 사료됩니다.하지만 첫 번째의 경우 굳이 Entity를 ID값을 통해 조회하는 과정이 필요한 지에 대한 의문입니다. 저런 단순한 로직의 경우 굳이 DB와의 정합성을 위해 조회 및 연관관계 편의메소드 등을 이용해서 EntityGraph를 맞춰줄 필요가 있나 싶었습니다.이런 경우에서 실제 현업에서는 어떤식으로 처리하는 지 궁금합니다. 저렇게 각 상황에 따라 효율을 따져서 다르게 처리하는 지 아니면 ID를 통해 데이터를 조회하는 것은 크게 성능상 문제가 되지 않으니 불필요하더라도 로직의 통일성이나 혹시 모를 사이드 이펙트를 대비해서 조회한 뒤 연관관계 편의 메소드를 통해 EntityGraph까지 맞춰 주는 지 궁금합니다..!저는 불필요하다고 생각하여 굳이 Entity그래프를 맞춰줄 필요가 없는 경우는 그런 과정을 생략하며 프로젝트를 하고 있었는데, 완성하고 보니 EntityGraph를 맞춰 주는 로직이 단 하나도 없는 걸 알게 되었습니다.아무래도 복잡한 비즈니스 로직이 없어서 그럴 수도 있겠다는 생각은 들었지만 너무 심한 것 같아 제가 JPA를 제대로 쓰고 있는 게 맞나 싶어 질문드립니다..ㅠㅠ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.persist 오류
저만 em에 빨간불이 들어오는데 왜 이러는걸까요,,
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
postgresql 연동 문의
Postgresql DB 사용시 auto_increment 옵션이 업어서아래와 같이 작성하여 order등록 테스트 진행시 id 값이 null 이어서 에러가 나타납니다.create table orders ( id int primary key, user_id varchar(50) not null, product_id varchar(20) not null, order_id varchar(50) not null, qty int default 0, unit_price int default 0, total_price int default 0, created_at datetime default now())테이블을 직접 생성하지 않고 소스의 jpa의 create 옵션을 사용하여 orders 테이블을 생성하고 상품을 등록하면 id 값이 자동으로 등록이 되는되 내부적으로 id값이 맵핑되는 로직이 따로 존재 하는 건가요? 테이블을 수동으로 생성 후 id 값을 맵핑시킬수 있는 로직이 따론 존재 하는 걸까요?@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;
-
미해결Practical Testing: 실용적인 테스트 가이드
BaseEntity 가 있음에도 불구하고 registeredDateTime 을 사용하는 이유가 무엇일까요?
안녕하세요.덕분에 좋은 강의 정말 잘 듣고 있습니다.강의를 수강하던 도중에 궁금한 부분이 생겨 이렇게 질문을 남깁니다.BaseEntity(@CreateDate) 로 인해서 객체가 생성되는 시점을 알 수 있음에도 불구하고 registeredDateTime 이라는 필드값을 정의한 이유가 궁금합니다.테스트코드를 통해 한층 더 검증하기 쉽게 하려는 용도로 사용하시는 걸까요?감사합니다
-
해결됨실전! 스프링 데이터 JPA
왜 쿼리 힌트에 value=true라고 명시해 줘야 하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이미 개발자가 @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly")) Member findReadOnlyByUsername(String usernane);이렇게 쿼리 힌트를 명시한다는 것 자체가 저 쿼리힌트를 사용하겠다는 건데, 저 value = true는 왜 명시해 줘야 하는 건가요?value=false라고 하는 것과 아예 쿼리 힌트를 명시하지 않은 것의 차이가 있는건가요?
-
해결됨실전! Querydsl
Querydsl Q클래스 생성 오류
plugins { id 'java' id 'org.springframework.boot' version '3.1.5' id 'io.spring.dependency-management' version '1.1.3' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"}group = 'study'version = '0.0.1-SNAPSHOT'java { sourceCompatibility = '17'}configurations { compileOnly { extendsFrom annotationProcessor}}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor"com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" testImplementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'}tasks.named('test') { useJUnitPlatform()}clean { delete file('src/main/generated')}tasks.named('bootBuildImage') { builder = 'paketobuildpacks/builder-jammy-base:latest'}tasks.named('test') { useJUnitPlatform()}//querydsl 세팅 시def querydslDir = "$buildDir/generated/querydsl"querydsl { jpa = true querydslSourcesDir = querydslDir}sourceSets { main.java.srcDir querydslDir}configurations { querydsl.extendsFrom compileClasspath}compileQuerydsl { options.annotationProcessorPath = configurations.querydsl}인프런에서 질문 & 답변을 보고 gradle 설정했는데도 오류가 계속 발생됩니다.Build and run using : Gradle 로 변경하면 발생 되는 오류 입니다.오류 : Attempt to recreate a file for type study.querydsl.entity.QHello
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
도서 관리 애플리케이션 화면 질문
안녕하세요! 강의 완강하고 복습을 하고있는 수강생입니다.복습을 하는 과정에서 궁금한 점이 있어서 질문이 있는데요 선생님께서 도서관리 애플리케이션 화면은 제공해주셨는데 사용자 등록란에 이름과 나이를 입력하고 저장을 누르면 POST 메소드가 연결되고 목록에 들어가면 GET, 수정을 누르면 UPDATE, 삭제를 누르면 DELETE 메소드가 연결되는 것은 프론트엔드 작업 과정에서 어떠한 설정을 해주셔서 자연스럽게 되는건가요? 그 과정도 공부하고싶은데 자바스크립트와 리액트까지 공부하면 될까요? 강의 공부를 끝내고 나면 제 프로젝트를 한번 만들어보고싶은데 어느정도 공부해야 할지 감이 잘오지 않아서요 화면 구성부터 서버 동작하는 처음부터 끝까지 해보고싶어서 질문드립니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 내용 관련 문의드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강의 내용 관련해서 질문드립니다.Spring boot아닌 Spring 기반으로 JPA 강의 진행인건가요?
-
미해결실전! 스프링 데이터 JPA
자식요소List Lazy loading으로 가져와서 삭제하는 방법 알려주시면 감사하겠습니다.
@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Enumeration { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private UUID id; @Column(nullable = false) private Integer sequence; @Column private String description; @ManyToOne @JoinColumn(name = "enumeration_group_id") private Enumeration parentEnumeration; @OneToMany(mappedBy = "enumerationGroup", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Enumeration> childEnumerationList; }이런식으로 짜여진 entity에서@Service @Transactional public class EnumerationCommandService { private final EnumerationQueryRepository enumerationQueryRepository; private final EnumerationCommandRepository enumerationCommandRepository; public void deleteChild(UUID id) { Enumeration enumeration = this.enumerationQueryRepository.findById(id).orElseThrow(EnumerationRollbackException::byNotFound); List<Enumeration> enumerationList = enumeration.getEnumerationList(); enumerationCommandRepository.deleteAll(enumerationList); } }LAZY 로딩으로 가져온 List<Enumeration> 을 가져와서 deleteAll을 사용해서 삭제하려는데 삭제가 되지 안더라고요ㅠㅠ부모요소는 삭제하지 않고 자식요소들만 삭제하는 좋을 방법 알려주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 데이터베이스에 엔터티를 만들지도 않았는데 왜 ORDERS_ORDER_ITEMS 테이블이 생성되었는지 잘 모르겠습니다.
<Order 클래스>package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") // PK private Long id; @ManyToOne // 주문의 입장에서는 다대일 관계 @JoinColumn(name = "member_id") // FK private Member member; @OneToMany private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne //todo 일대일관계에서는 FK를 아무대나 매핑해도 상관없는데, 주로 엑세스를 많이 하는 엔터티에 사용한다고 함 @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; // 주문시간(hibernate가 알아서 매핑해줌) @Enumerated(EnumType.STRING) private OrderStatus status; } <Item 클래스>package jpabook.jpashop.domain.item; import jpabook.jpashop.domain.Category; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 한 테이블에 다 떄려박음 @DiscriminatorColumn(name = "dtype") @Getter @Setter public abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List<Category> categories = new ArrayList<>(); } <OrderItem 클래스>package jpabook.jpashop.domain; import jpabook.jpashop.domain.item.Item; import lombok.Getter; import lombok.Setter; import javax.persistence.*; @Entity @Getter @Setter public class OrderItem { @Id @GeneratedValue @Column(name = "order_item_id") private Long id; @ManyToOne @JoinColumn(name = "item_id") private Item item; @ManyToOne @JoinColumn(name = "order_id") private Order order; private int orderPrice; // 주문 가격 private int count; // 주문 수량 }참고로, 다른 엔터티 테이블의 속성들은 설계에 있는 그대로 정상적으로 잘 만들어졌습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
동일성 보장에서 질문있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요?예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]동일성 보장에서 들어주신 예시에서 질문이 있습니다.findMember1과 findMember2의 pk값 즉 영속성 컨텍스트에서 객체의 id값이 동일한데, 이때 캐시에 어떻게 저장이되는지 궁금합니다. [ id / 객체 ]형식으로 캐시에 저장된다고 하셨는데,그럼 [101L/findMember1], [101L/findMember2] 이렇게 캐시에 저장이 되는건가요?캐시에 저장되는 Id값이 캐시 조회시 사용되는 주소값인가요?캐시에 저장되는 id 값은 중복을 허용하는건가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1:N 계층구조 테이블들 간에 Fetch 조인 사용 질문 드립니다.
안녕하세요. 열심히 강의를 듣고 있는 수강생입니다!궁금한게 있습니다.현재 실무에서 사용하고 있는 구조를 좀더 개선시키고 싶어서 열심히 노력중인데요.현재 상황을 말씀 드리겠습니다.A, B, C, D 테이블이 있습니다.각 entitiy 클래스 별로 OneToMany로 A-B, B-C, C-D 이런식으로 Relation이 걸려 있습니다.현재 기준으로는 각 OneToMany 별로 BatchSize=1000 & FetchType=Eager로 적용이 되어있는데요.이렇다 보니, A 테이블 조회시 조회된 ID 기준으로 하위 테이블들에 대해서 IN쿼리가 몇개씩 불려지게 됩니다. 그래서 Fetch 조인을 통해서 한번에 가져오는 방식으로 바꿔보려고 개선을 하려고 했는데요.예를 들면select a.* from A aleft fetch join a.B bleft fetch join b.C cleft fecth join c.D d이런식으로 하려고했더니 컴파일 단계에서 MultipleBagFetchException이 발생 하였습니다.그래서 찾아보니 fecth 조인 사용할 경우에는 oneToMany로 걸리는 대상이 2개 이상이면위와같은 Exception을 떨군다고 하더라구요..(카티션 곱 이슈로 인한 하이버네이트에서 사전에 미리 막는..) 그래서 결국에는 A-B까지만 Fetch로 빼고 나머지 B-C, C-D는 기존 그대로 Eager 전략으로기존과 동일하게 조회되도록 조금이나마 개선은 했는데요..B-C, C-D를 lazy로 바꾸니 N+1이 발생했구요.. N+1해소 하는 방법으로 Fecth조인을 쓰자니위와같은 Exception이 발생을 하구요..어떻게 하면 좋을까요.. 도와주세요!