묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
애플리케이션 재시작시 테이블 정보 사라짐
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]애플리케이션 재시작시 db정보가 모두 사라지는데 이유가 뭘까요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
team.members.size 쿼리 사용 시 디비 데이터가 삭제되는 현상
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의에 나온 대로 t.members.size를 가져오는 쿼리를 작성 후 실행해봤습니다. 하지만 결과가 나오지 않고, h2디비에 들어가서 값을 확인해보니 값이 모두 지워져있습니다. jpql쿼리를 작성하고 결과를 가져오는 코드를 주석으로 처리하고 돌려보면, 값이 제대로 들어가있는 것을 확인할 수 있었습니다.단순히 쿼리를 날리면서 디비에 있는 값이 모두 삭제되는 현상은 아닌 것 같은 게, team.teamname처럼 team의 상태필드를 셀렉트해오는 쿼리문을 날리면, 정상작동되며 디비의 값도 사라지지 않습니다. 대체 어떤 이유 때문에 컬렉션 값 연관 필드를 타고 들어가면 디비의 값이 사라지는 건가요?select team.teamName from Team t 하는 경우package jpql; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; import jakarta.persistence.Persistence; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Team team = new Team(); team.setTeamName("team1"); em.persist(team); Member member = new Member(); member.setUserName("raewoo"); member.setAge(10); member.changeTeam(team); em.persist(member); em.flush(); em.clear(); System.out.println("============="); String sql = "select t.teamName from Team t"; String result = em.createQuery(sql, String.class) .getSingleResult(); System.out.println(result); tx.commit(); }catch (Exception e) { tx.rollback(); }finally { em.close(); } emf.close(); } } select t.members.size from Team t하는 경우package jpql; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; import jakarta.persistence.Persistence; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Team team = new Team(); team.setTeamName("team1"); em.persist(team); Member member = new Member(); member.setUserName("raewoo"); member.setAge(10); member.changeTeam(team); em.persist(member); em.flush(); em.clear(); System.out.println("============="); String sql = "select t.members.size from Team t"; Integer result = em.createQuery(sql, Integer.class) .getSingleResult(); System.out.println(result); tx.commit(); }catch (Exception e) { tx.rollback(); }finally { em.close(); } emf.close(); } }
-
해결됨실전! Querydsl
querydsl orderspecifier 조건 분기
private List<OrderSpecifier> getOrderSpecifier() { List<OrderSpecifier> orderSpecifiers = new ArrayList<>(); //승인 안된 관리자 우선 조회 orderSpecifiers.add(new OrderSpecifier<>(Order.ASC, admin.isAuthorized)); orderSpecifiers.add(new OrderSpecifier( new CaseBuilder() .when(admin.isAuthorized.eq("FALSE")).then(admin.createdAt.asc()) .when(admin.isAuthorized.eq("TRUE")).then(admin.createdAt.desc()) )); return orderSpecifiers; }아래와 같은 order 순서로 정렬하려 하는데 2,3 조건을 나누는 부분이 잘 되지 않아 질문 남깁니다. CaseBuilder 대신 다른 방법이 있나요?승인 받지 못한 관리자(isAuthorized = 'FALSE') 먼저 조회isAuthorized = 'FALSE' 인 경우에는 createdAt ascisAuthorized = 'TRUE' 인 경우에는 createdAt desc
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
컬렉션 페치 조인 관련해서 질문 드립니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]컬렉션 페치 조인을 하면 페이징시 위험하기 때문에 지양해야 한다고 하셨는데 그러면 페이징을 하지 않을 때는 컬렉션도 페치 조인을 해서 성능을 올려도 괜찮을까요? 아니면 컬렉션은 항상 지연 로딩 하는 것이 안전한가요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
객체 생성 시 검증 로직에 대해 질문드립니다.
객체를 생성할 때 입력 받는 데이터를 전부 검증하고 객체 필드를 업데이트할 때도 그 데이터가 유효한지 검증하는 방식을 사용한다면, 다른 레이어에서 검증된 데이터를 넣어 객체를 생성할 때도 해당 데이터를 객체 내부에서도 검증하게 되어서 중복으로 체크하는데, 이런 방식이 괜찮을지 아니면 객체에서 데이터 검증을 적당히 처리하고 레이어 별로 검증 책임을 중복되지 않게 처리하는 방식이 괜찮을지 질문드립니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티에는 validatin을 안하는 게 좋나요?
@Column(nullable = false) 이런 것들을 엔티티 클래스에 하는 것 대신에 dto나 도메인 레이어에서 검증을 하는 게 좋다는 말을 들었는데 엔티티내부에서 검증을 하는 것을 안해도 되는 건가요?
-
해결됨실전! Querydsl
Bulk 저장 질문
[질문 내용]em.perist()는 bulk를 사용하는 방법이 있나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
Order 단위 테스트
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 박우빈님, 좋은 강의 잘 듣고 있습니다.강의 영상 속에서 Order 단위 테스트 중 orderProducts에 관한 단위 테스트는 실시하지 않아 혼자 직접 진행했습니다.가장 먼저 다음과 같이 단위 테스트를 작성해보았습니다.@DisplayName("주문 생성 시 주문에 해당 상품이 포함된다.") @Test void orderProduct() { // given LocalDateTime registeredDateTime = LocalDateTime.now(); List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); // when Order order = Order.create(products, registeredDateTime); // then assertThat(order.getOrderProducts()).hasSize(2) .extracting("Product") .containsExactlyInAnyOrder( createProduct("001", 1000), createProduct("002", 2000) ); }하지만 위 사진처럼 Product 객체가 다르다고 판단되어 단위 테스트가 실패합니다.(createProdcut()를 이용한 새 객체 생성이 원인이라고 생각합니다.)그래서 다음과 같이 createProduct()를 빼서 테스트를 진행하니 성공했습니다.@DisplayName("주문 생성 시 주문에 해당 상품이 포함된다.") @Test void orderProduct() { // given LocalDateTime registeredDateTime = LocalDateTime.now(); Product product1 = createProduct("001", 1000); Product product2 = createProduct("002", 2000); List<Product> products = List.of( product1, product2 ); // when Order order = Order.create(products, registeredDateTime); // then assertThat(order.getOrderProducts()).hasSize(2) .extracting("Product") .containsExactlyInAnyOrder( product1, product2 ); }결론적으로 단위 테스트는 성공했지만 몇 가지 궁금증이 있습니다.orderProducts의 대한 단위 테스트(위 코드)가 적합한지orderProducts는 Order(this), Product를 갖고 있는데 Order(this)도 함께 검증하는게 맞는지긴 글 읽어주셔서 감사합니다.
-
미해결실전! Querydsl
QHello 빌드관련 질문드립니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]3.X 버전 설명처럼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' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // QueryDSL 추가 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' } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') }위와 같이 코드를 넣어 빌드를 하면저는 build 안에만 QHello가 생성되고다른 분들과 같이 src/main에 generated는 전혀 생성되지않습니다.강의에서는 QHello를 임포트 할 때, src/main 쪽의 QHello를 사용하는것 같은데, 저는 build 경로에서 직접 사용해야 되는 문제가 있습니다.실제 사용하려면 src/main를 이용해야 될 것 같은데어떻게 해야 src/main에 generated의 QHello를 생성할 수 있을지 문의드립니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
소스가 전혀 실행이 안됨
강의 1편때의 소스로도 실행이 안되서,다시 2편 소스로 수행하면 에러메시지가 잔뜩 나오는데너무 시작부터 불성실하게 시작하는거 아님?지금 소스 받아서 환경을 맞춰주고 강의를 시작해야지 대뜸시작하면 실행도 안되는 소스로 뭐 어떡하라고.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional 했는데 롤백 문구가 안 떠요
다음과 같이 코드를 실행하면 강의 화면처럼 "Rolled back transaction for test"가 나와야 하는데 그렇지 않고 H2에서도 컬럼만 있는 빈 테이블입니다. 뭐가 문제일까요? package jpabook.jpashop; import com.fasterxml.jackson.databind.deser.std.StdKeyDeserializer; import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("memeberA"); //when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
쓰기 지연 저장소?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의를 듣다보니 flush 과정에서 쓰기 저장 지연소에 SQL이 저장된다고 설명하셨는데 이것이 뭔지 알 수 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
BookForm 객체에 toServiceDto() 메서드 사용 질문드립니다.
안녕하세요!ItemServiceDTOItemFormItemController위와 같이 ItemForm(BookForm) 클래스에 toServiceDTO()라는 빌더 메서드를 작성하였습니다. Controller에서 ItemForm의 빌더 메서드를 통해 ItemServiceDTO로 바로 변환해 Service단에 넘겨주었는데 위와 같이 구현해도 괜찮을까요? 만약 상관이 없다면 ItemForm에서 ItemServiceDTO를 의존하고 있는데 DTO끼리의 의존은 크게 신경 안써도 될까요? 좋은 강의 감사드립니다!!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
jpa jakarta가 오류나네요
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]javax로 여태 하다가 이번에 jpa하면서 막히길래 뭔가 했는데패키지를 jakarta로 바꿔달라해서 바꿔주었는데import부분에서 모든 클래스들이 jakarta로 설정을 하면에러가 뜨게 되네요 모든 클래스에 대해 java부분을 jakarta로바꾸기에는 jakarta가 없고 java가 있으며 그럼 이걸 어떻게 해야 하는걸까요?
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
jdk 설정 질문
혹시 원래 jdk17이 깔려있었는데sdk 버전 이걸로 하면안되고 선생님이 올려주신 자료 jdk를 설치해서 zulu-17로 설정을 해야할까요?
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
window
window 사용자는 Dbeaver, Doker 설치를 그냥 구글에 쳐서 다운만 받아두면 되는건가요?자료에 있는 window 개발 환경 구성하기는 다 다운 했습니다.(인텔리제이, h2데이타베이스, jdk17)
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
강의 자료가 안보이고 압출풀기가 안됩니다.
커뮤니티에 글올라온거 보고 압축 풀려고하는데 압축풀기가 안된다고 합니다폴더 이름을 바꿔도 계속 안됩니다.wer05003@naver.com으로 보내주실수있나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 업데이트
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.영속성 컨텍스트 내에서 엔티티와 스냅샷을 비교한다고 했는데 엔티티는 member.setName("zzzzz")로 변경한 값인가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
섹션 4 회원 기능 테스트에서 yml 파일을 test에 추가하면
23:18 에서 run을 하면 connection url 이 jdbc:h2:mem:testdb로 나타나는 것이 아니라 jdbc:h2:mem:4ea5215f-2678-4770-ad7b-4696fcde71b2 이렇게 특정 숫자로 나타나는데... 뭐가 문젠가요?그리고 test 파일에 붙여넣은 application.yml 파일도 main 폴더에 있는 yml파일처럼 초록색 잎사귀 모양으로 나타나는게 아니라 빨간색 y아이콘으로 나타나는데 이게 yml파일이 제대로 적용되지 않았다는건가요? 그래서 gpt를 참고해보니 src/test/resources 폴더가 Test Resources로 설정되어 있는지 확인합니다. 그렇지 않으면 폴더를 선택하고 Mark as: Test Resources로 설정합니다. 라고 해서 해보려 했더니 Source root 'C:\Users\jar05\OneDrive\바탕 화면\Github\JPA_study\jpashop\jpashop\src\test\resources' cannot be defined in module 'jpabook.jpashop' because it belongs to content of nested module 'jpabook.jpashop.test'이런 에러가 발생합니다..
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트하기 어려운 영역을 분리하는 과정
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 박우빈님, 강의 잘 듣고 있습니다다름이 아니라 '테스트하기 어려운 영역을 분리하기' 세션 중 아래 코드와 같이 createOrder() 메서드를 오버로딩하여 테스트가 어려운 영역을 분리하여 테스트를 진행해주셨습니다.여기서 실제로도 어려운 영역을 분리하여 테스트 하기 위해 실제 비즈니스 로직에 테스트를 위한 메서드를 오버로딩하여 테스트 하는지가 궁금증이 생겼습니다.실무에선 해당 Test 클래스 내에서 메서드를 오버로딩 하여 사용하는 방식인가 싶은 생각도 들었습니다.실무에선 어떤 식으로 오버로딩하여 사용하나요?public Order createOrder() { LocalDateTime currentDateTime = LocalDateTime.now(); LocalTime currentTime = currentDateTime.toLocalTime(); if(currentTime.isBefore(SHOP_OPEN_TIME) || currentTime.isAfter(SHOP_CLOSE_TIME)){ throw new IllegalArgumentException("주문 시간이 아닙니다. 관리자에 문의하세요"); } return new Order(currentDateTime, beverages); } public Order createOrder(LocalDateTime currentDateTime) { LocalTime currentTime = currentDateTime.toLocalTime(); if(currentTime.isBefore(SHOP_OPEN_TIME) || currentTime.isAfter(SHOP_CLOSE_TIME)){ throw new IllegalArgumentException("주문 시간이 아닙니다. 관리자에 문의하세요"); } return new Order(currentDateTime, beverages); }