묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
for(Member m : Members)에서 select 쿼리 발생하는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 양방향 연관관계와 연관관계 주인 1 - 기본 강의를 실습하다가 궁금한 내용이 생겨 질문드립니다.먼저, 아래와 같이 Member와 Team 객체 간의 양방향 연관 관계를 매핑하였습니다.DB에서 확인하기 위해 MemberA, MemberB를 같은 teamA에 소속되도록 저장한 후 Member findMember = entityManger.find(Member.class, memberA.getId()); 코드를 통해 DB에서 memberA를 가지고 왔습니다.위 코드를 실행시킨 결과는 아래 화면과 같습니다.제가 궁금한 내용은 아래 코드에서 select 쿼리가 왜 발생하는가? 입니다. 또 발생하는 select 쿼리의 해석이 어렵습니다.System.out.println("====for문에서 select 쿼리가 발생하는 이유가 뭘까?===="); for (Member m : members) { System.out.println("m name : " + m.getName()); } System.out.println("================");where 절에 해당하는 members0_.TEAM_ID=? 에 ? 값은 Member findMember = entityManger.find(Member.class, memberA.getId()); 코드를 통해 memberA가 가지고 있는 team_id 값을 가지고 있는 것일까요?또한, 그렇다면 어디서 team_id 를 가지고 있다가 비교를 하는 것인가요?마지막으로 결과값으로 MemberA, MemberB를 반환하는 것처럼 for문을 2번 반복하니깐 select 문도 2번 발생할 것으로 예상한 것과 달리 select문이 1번만 발생한 것도 이해가 가지 않습니다. 어떻게 select문 1번으로 memberA와 MemberB를 가지고 올 수 있나요? 궁금한 내용을 정리하면 아래와 같습니다.1. for(Member m : members)에서 select문이 발생하는 이유2. 해당 select문의 해석(특히 where절의 members0_.TEAM_ID=? 부분에 ? 값이 어떤 값인지, 어디서 team_id를 가지고 온 것인지)3. select문이 1번만 발생한 이유읽어주셔서 감사합니다. 답변 기다리고 있겠습니다!
-
해결됨Practical Testing: 실용적인 테스트 가이드
서비스 계층 통합테스트
안녕하세요강의 잘 보고 있습니다! 수업에서 서비스 계층을 테스트하실 때,@SpringBootTest를 이용해서 Repository 계층의 빈을 등록하고 주입받아서 사용하고 있습니다. 서비스 계층을 mock을 이용해 단위테스트로 하시지 않고 Repository 계층을 통합해서 사용하는게 많이 사용하는 방식인가요?실제 현업에서는 Service 계층을 어떻게 테스트 하는 지 궁금합니다. (단위테스트or 통합테스트)
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.find(), select문 질문
em.find(Member.class, 1L); System.out.println("========================"); tx.commit();위 코드를 수행한 결과 select문 이후에 '========================'가 출력되었습니다.em.find()를 하면 우선 1차 캐시에서 엔티티를 찾은 후, 없으면 바로 select문을 DB에 날리는 것이 맞을까요?tx.commit()하는 시점과 관계없이 1차 캐시에 엔티티가 없으면 바로 select 쿼리를 날리는 것이 맞을까요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
스냅샷 업데이트 관련 질문
'dirty checking에서 스냅샷은 엔티티의 최신 상태를 반영하고 있다. 스냅샷은 계속 업데이트된다'가 맞을까요?스냅샷이 처음에는, 엔티티가 1차 캐시에 들어온 상태에 대한 스냅샷이지만,엔티티를 변경하면 스냅샷도 변경되는 것이 맞을까요? 예를 들어, member 테이블에 (1L, "A")가 저장되어 있고, 스냅샷도 (1L, "A")인 상황에서, 다음 코드를 실행하였습니다.Member findMember = em.persist(new Member(1L, "A")); findMember.setName("AA"); tx.commit();tx.commit()이 호출되면 flush()가 호출되고, 엔티티와 스냅샷을 비교하여 update 쿼리가 DB에 전달됩니다. 그리고 비교한 시점 이후 어디에선가 스냅샷이 변경되는 것이 맞을까요? 스냅샷이 변경된다고 생각하게 된 상황은 다음과 같습니다. (엔티티를 (1L, "AA")로 변경한 이후) 엔티티를 (1L, "A")로 변경을 했을 때, update 쿼리가 DB에 전달되었기 때문인데요, 만약, 처음에 스냅샷이 (1L, "AA")로 변경되지 않았다면, 엔티티와 스냅샷은 (1L, "A")로 동일하였을 것이고, 따라서 update 쿼리가 DB에 전달되지 않을 것이기 때문입니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
쓰기 지연 관련 질문
상황: hibernate.jdbc.batch_size 옵션을 사용하지 않고, em.persist()를 4번 하였다.쓰기 지연 SQL 저장소에 insert 쿼리가 4개 존재하고, commit 시점에 DB에 insert 쿼리 4개가 전달된다는 것은 알겠습니다. 그런데, insert 쿼리가 DB에 전달될 때, 4번의 네트워크가 반복되는 것인가요? (https://www.inflearn.com/questions/41344/batch-size%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%A7%88%EB%AC%B8%EC%9D%B4-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4 이 질문을 보고 질문드립니다)그리고 4번의 네트워크가 반복된다는 것이 'DB와 커넥션 맺고 insert 쿼리 1개 전달하고 커넥션을 종료'하는 과정이 4번 반복된다는 뜻인가요? 그렇다면 em.persist()할 때마다 insert 쿼리를 보내는 것과 무슨 차이가 있는 것이죠...?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
수업 자료 다시 다운로드
수업자료 한번 다운 받았었는데 컴퓨터 포맷해서 다 날라갔습니다.ㅜㅜ다시 다운 받을 수 없나요??
-
미해결실전! Querydsl
fetch().size()
fetchResult() 가 5.0 부터 권장하지 않는다 해서 fetch().size()를 사용한다고 하는데 List<MemberTeamDto> content = queryFactory .select(new QMemberTeamDto( member.id.as("memberId"), member.username, member.age, team.id.as("teamId"), team.name.as("teamName") )) .from(member) .leftJoin(member.team, team) .where( usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe()) ) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); int total = queryFactory .selectFrom(member) .leftJoin(member.team, team) .where( usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe()) ).fetch().size(); int size = content.size(); return new PageImpl<>(content, pageable, total);아래처럼 count 쿼리를 날려서 구한 total 값과위에 content 쿼리문의 size()값이 다르게 나오던데이 size 값은 단지 PageRequet.of로 넣어준 size 값인가요?? 두 방식 중 total로 구하는 방식이 맞는건가요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
단위테스트의 개념에 대해서 질문 드립니다!
안녕하세요! 테스트 강의가 드문데 정말 친절하게 잘 알려주셔서 감사하게 듣고 있습니다 :)아직 강의를 다 들은 것은 아니지만 강의 내용 중 궁금한 것이 있어 질문 드립니다.제가 테스트를 제대로 공부해본 적이 없어 혼자서 독학을 하며 공부했던 단위테스트는 주로 Mock과 항상 연관지어 설명이 되어 있었습니다. 통합테스트(@SpringBootTest)는 스프링 컨테이너를 띄우고 bean으로 등록된 모든 빈을 가지고 테스트를 하는 것인데 반해, 단위테스트는 해당 계층(Layer)을 테스트할 때 꼭 필요한 bean만 가지고 와서 최소 단위(메서드나 클래스)로 테스트를 진행한다고 저는 알고 있었습니다.그래서 예를 들어 Service 계층 테스트를 진행할 때면 Repository에 관련된 bean들은 Mockito 등을 사용해서 Mock을 만들고 InjectMocks를 해준다는 식으로 저는 공부를 하고 테스트 코드를 작성한 경험이 있습니다.그런데 오늘 강의에서 강사님이 설명해주시는 내용을 듣다보니 @SpringBootTest 와 같은 어노테이션과 상관없이 단위테스트를 진행하시는 것 같다는 인상을 받았습니다. Order에 대한 테스트를 진행하실 때도 단위테스트라는 언급을 하셨고, OrderSerivice에 대한 테스트를 진행하실 때도 @SpringBootTest를 사용하고 있지만 단위테스트를 하신다고 표현을 하시더라구요.혹시 통합테스트와 단위테스트를 구분하는 강사님만의 방법이 있는 것인지 궁금합니다! 장문 글 읽어주셔서 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
p6spy, meta-inf 위치
현재 스프링 부트 3.0.6버전을 사용하고 있어서 p6spy를 사용하기 위해 pdf에 적힌 대로 파일을 추가하려고 했지만 META-INF 폴더를 찾을 수 없어서 질문 드립니다
-
미해결실전! 스프링 데이터 JPA
@Param의 존재 이유>?
@EntityGraph(attributePaths = "team") List<Member> findEntityGraphByUsername(@Param("username")String username);이번 강의를 복습하다 보니까 강사님께서 @Param을 사용하셨더라구요.(강의 20:59)findByAge(), findOptionalByUsername()과 같은 메소드는 @Param 애노테이션 없이도 잘 동작 했는데 따로 특별한 이유가 있는 것일까요?
-
미해결실전! Querydsl
fetchResult() deprecated
됐던데 앞으로는 강의의 searchPageComplex와 같은 방법 (content따로, total따로)으로만 구현하고 사용하면 되는 건가요 ?searchPageSimple 부분은 필요가 없는 건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
완성된 코드 자료를 그대로 실행했는데 오류가 발생합니다..
완성된 코드 그대로 서버를 실행했는데 이렇게 오류가 발생합니다.. 이유를 찾지 못해 질문드립니다
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
[수업질문] config-server 실행은 되는데, 동작을 안 함
windows 10, eclipse에서 수업을 따라하고 있습니다.서버 동작도 안 되었는데.m2파일 중 configu와 관련된 내용 지우고 이클립스 다시 시작하니 config서버가 동작은 합니다.그런데git 레파지토리에 있는 ecommerce.yml파일을 읽지 못 하는지, 아니면 자신이 일반 서버로 착각하는지 404 에러가 납니다.이미지를 첨부했습니다.어떻게 해야 이 고통에서 벗어날 수 있을까요?동영상 강의 보면, 쉽게 배울 수 있을 거라 생각했는데동영상 강의 촬영일과 2년 정도 차이가 나니 이런 저런 걸로 계속 에러가 나네요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
[에러] Database not found에 관해서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요메인어플리케이션을 실행시 에러가 발생하여 질문남깁니다.해당에러는 다음과 같습니다.하지만 해당경로에는 아래와 같이 파일이 존재하구요다른 글들을 참고해봤지만 에러가 해결되지 않아서 글을 남깁니다. 감사합니다.githubhttps://github.com/heechanCho/jpashop
-
미해결실전! Querydsl
tuple자료구조가 어떻게 되어 있는 건가요 ?
@Test public void tupleProjection() throws Exception { List<Tuple> result = queryFactory .select(member.username, member.age) .from(member) .fetch(); System.out.println("result = " + result); for (Tuple tuple : result) { String username = tuple.get(member.username); Integer age = tuple.get(member.age); System.out.println("username = " + username); System.out.println("age = " + age); } } result = [[member1, 10], [member2, 20], [member3, 30], [member4, 40]]username = member1age = 10username = member2age = 20username = member3age = 30username = member4age = 40 출력값이 위와 같은데 .get()메소드로 꺼내는 걸로 보면 Map과 같은 자료구조인건가 싶기도 하면서, 통째로 출력하면 List<List<>>와 같은 자료구조의 모습이더라구요tuple은 어떤 자료구조인가요?
-
해결됨실전! 스프링 데이터 JPA
@GeneratedValue 질문하고싶어요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@GeneratedValue에서 지금은 autoincrement로숫자로 단순히 pk값이 1/2/3/4이런식으로 사용되고있는데MEMBER00001/MEMBER00002/MEMBER00003같이 PK값에 특정한 문자열이 앞에 들어가는경우는 어떻게하나요?
-
미해결실전! Querydsl
join메서드 궁금증입니다 ..
List<Member> result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch();위의 QueryDSL문을 sql문으로 번역하면 select * from member as m join team as t on m.team_id = t.team_id where t.name='teamA' 가 맞나요? 관계형DB를 객체 다루듯이 사용하기 위해 Member안에는 Team 클래스가 있고, Team 클래스 안에는 Member 클래스가 있지만 실제로는 .join(member.team, team)와 같은 코드를 작성하면 내부적으론 DB의 테이블에 가서 외래키와 기본키를 비교해서 값을 가져오는 건가요 ?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 내용에서 스키마 자동 생성 부분이 안되는데 어떤 게 문제일까요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]자바 ORM 표준 JPA 프로그래밍 - 기본편 14강 내용 중에 기존에 ID와 NAME만 있던 것에 ppt 내용대로 새롭게 추가하였는데 스키마가 변경된 테이블에 따라 자동으로 생성이 되지 않는데 해당 테이블을 drop 하고 실행하면 될까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
treat 관련 질문이 있습니다.
JOINED 전략을 명시한 Item 클래스와그런 Item 클래스를 상속한 Album, Book, Movie 클래스를 생성 후 코드를 다음과 같이 작성했습니다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); //애플리케이션 전체 공유 (persistence.xml 참조) EntityManager em = emf.createEntityManager(); //한번 쓰고 버려야함, 쓰레드간 공유하지 않음 EntityTransaction tx = em.getTransaction(); //조회를 제외한 DML 작업시 필수로 사용 tx.begin(); try { Album album = new Album(); album.setName("album"); album.setPrice(10000); album.setArtist("artist"); em.persist(album); Book book = new Book(); book.setName("book"); book.setPrice(20000); book.setAuthor("author"); book.setIsbn("isbn"); em.persist(book); Movie movie = new Movie(); movie.setName("movie"); movie.setPrice(30000); movie.setDirector("director"); movie.setActor("actor"); em.persist(movie); em.flush(); em.clear(); //1번 String jpql = "select i from Item i where type(i) in (Book, Movie)"; List<Item> items = em.createQuery(jpql, Item.class).getResultList(); for (Item data : items) { System.out.println("data : " + data); } em.clear(); //2번 jpql = "select i from Item i where treat(i as Book).author = 'author'"; //SINGLE_TABLE에서는 되는데 JOINED에서는 안 먹힘 items = em.createQuery(jpql, Item.class).getResultList(); for (Item data : items) { System.out.println("data : " + data); } tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { em.close(); } emf.close();1번의 경우에는 다음과 같이 정상적으로 동작합니다.Hibernate: /* select i from Item i where type(i) in (Book, Movie) */ select i1_0.Id, i1_0.DTYPE, i1_0.name, i1_0.price, i1_1.artist, i1_2.author, i1_2.isbn, i1_3.actor, i1_3.director from Item i1_0 left join Album i1_1 on i1_0.Id=i1_1.Id left join Book i1_2 on i1_0.Id=i1_2.Id left join Movie i1_3 on i1_0.Id=i1_3.Id where i1_0.DTYPE in('B','M') data : Book(author=author, isbn=isbn) data : Movie(director=director, actor=actor)그런데 2번의 경우에는 다음과 같은 현상이 발생하고 있습니다.Hibernate: /* select i from Item i where treat(i as Book).author = 'author' */ select i1_0.Id, i1_0.DTYPE, i1_0.name, i1_0.price, i1_1.artist, i1_2.author, i1_2.isbn, i1_3.actor, i1_3.director from Item i1_0 join Book i1_2 on i1_0.Id=i1_2.Id where i1_2.author='author'존재하지 않는 i1_1과 i1_3을 참조있어서 오류가 나는데왜 이런 현상이 발생하는지 궁금합니다. 그와 별개로 SINGLE_TABLE 전략을 사용했을 때2번을 실행하면 저같은 경우에는 다음과 같은 쿼리가 실행됩니다.Hibernate: /* select i from Item i where treat(i as Book).author = 'author' */ select i1_0.Id, i1_0.DTYPE, i1_0.name, i1_0.price, i1_0.artist, i1_0.author, i1_0.isbn, i1_0.actor, i1_0.director from (select * from Item t where t.DTYPE='B') i1_0 where i1_0.author='author' 그런데 강사님께서 제공해주신 pdf 파일에 보면원래는 쿼리가 다음과 같이 실행된다고 말씀해주셨는데select i.* from Item i where i.DTYPE = ‘B’ and i.author = ‘kim’제가 sql 실행했을 때와 강사님이 적어주신 sql이다른 이유가 제 생각에는 하이버네이트 버전차이때문일것 같긴한데 혹시 제 생각이 맞는지 질문드리고 싶습니다.※ 저는 하이버네이트 6버전을 쓰고 있습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka sink 생성 시 tasks state failed
안녕하세요 강사님!강의 잘보고 있습니다.강의시간 18:58에 sink 생성 후 status 확인 값에서 tasks.state 값이 failed라고 뜹니다.그래서 connect 로그를 보면 아래와 같이 뜹니다.[2023-05-02 00:04:12,636] ERROR [my-order-sink-connect|task-0] WorkerSinkTask{id=my-order-sink-connect-0} Task threw an uncaught and unrecoverable exception. Task is being killed and will not recover until manually restarted (org.apache.kafka.connect.runtime.WorkerTask:196) org.apache.kafka.connect.errors.ConnectException: Tolerance exceeded in error handler at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:223) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execute(RetryWithToleranceOperator.java:149) at org.apache.kafka.connect.runtime.WorkerSinkTask.convertAndTransformRecord(WorkerSinkTask.java:516) at org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:493) at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:332) at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:234) at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:203) at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:189) at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:244) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.kafka.connect.errors.DataException: JsonConverter with schemas.enable requires "schema" and "payload" fields and may not contain additional fields. If you are trying to deserialize plain JSON data, set schemas.enable=false in your converter configuration. at org.apache.kafka.connect.json.JsonConverter.toConnectData(JsonConverter.java:328) at org.apache.kafka.connect.storage.Converter.toConnectData(Converter.java:88) at org.apache.kafka.connect.runtime.WorkerSinkTask.lambda$convertAndTransformRecord$4(WorkerSinkTask.java:516) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndRetry(RetryWithToleranceOperator.java:173) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:207) ... 13 more 구글링 해봐도 원하는 답변들이 없어 남겨봅니다.