안녕하세요,, 김영한님 강의를 열혈 수강하고 있는 김주영이라고합니다.. 다름아니라, 제가 개인 프로젝트 중 아래 쿼리문을 작성을 했는데 DB조회 개수가 7개 일때, 아래의 쿼리를 실행시키면 select User문에서 쿼리가 7번 나가더라구요,, 도통 이유를 모르겠어서 질문 드립니다.. @Query("select distinct new ..패키지명...user.UserScrapUserQueryDto(us, coalesce(scrap.status, false), us.selectedFirstAt) " + "from User us " + "left join fetch Work work on work.user.id = us.id " + "left join fetch UserScrap scrap on scrap.targetId = us.id and scrap.user.id = :userId " + "where us.userStatus = 'PERMITTED' and " + " us.id not in (select block.targetId from Block block where block.user.id = :userId and block.status = true) " + "and us.id != :userId and us.role = 'USER' " + "order by us.selectedFirstAt desc") 내 userid에 해당하는 user는 제외, block한 유저는 제외, UserScarp과 Work는 fetch join으로 갖고오는 쿼리인데, 혹시 왜 select절이 DB 반환 개수만큼 나오는지 알려주실 수 있을까요? ㅠㅠ 아래처럼 쿼리가 한번 나간 후에 Hibernate: select distinct user0_.user_id as col_0_0_, coalesce(userscrap2_.status, false) as col_1_0_, user0_.selected_first_at as col_2_0_ from "user" user0_ left outer join "work" work1_ on ( work1_.user_id=user0_.user_id ) left outer join "user_scrap" userscrap2_ on ( userscrap2_.target_id=user0_.user_id and userscrap2_.user_id=? ) where user0_.user_status='PERMITTED' and ( user0_.user_id not in ( select block3_.target_id from "block" block3_ where block3_.user_id=? and block3_.status=true ) ) and user0_.user_id<>? and user0_.role='USER' order by user0_.selected_first_at desc select 쿼리로 db에서 갖고온 개수만큼 반환합니다.. Hibernate: select user0_.user_id as user_id1_7_0_, user0_.created_at as created_2_7_0_, user0_.modified_at as modified3_7_0_, user0_.behance as behance4_7_0_, user0_.detail as detail5_7_0_, user0_.device_token as device_t6_7_0_, user0_.email as email7_7_0_, user0_.first_work_id as first_wo8_7_0_, user0_.info as info9_7_0_, user0_.instagram as instagr10_7_0_, user0_.magazine_view_count as magazin11_7_0_, user0_.notion as notion12_7_0_, user0_.role as role13_7_0_, user0_.scrap_count as scrap_c14_7_0_, user0_.selected_first_at as selecte15_7_0_, user0_.tag as tag16_7_0_, user0_.user_name as user_na17_7_0_, user0_.user_status as user_st18_7_0_, user0_.view_count as view_co19_7_0_, user0_.work_thumb_nail as work_th20_7_0_ from "user" user0_ where user0_.user_id=? 답변 주시면 정말 감사하겠습니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의 중 정리가 잘 되지 않아서 확인차 질문을 남깁니다. 설명에 MEMBER 테이블에 id, name이 TEAM 테이블에 id, name, members가 존재하는데 이건 객체 관점에서는 존재하지만 DB관점에서 FK가 MEMBER 테이블에 존재할 수 밖에 없어 다른 형태로 즉, MEMBER 테이블에 TEAM_ID 속성이 생성되는걸로 확인이 됩니다. 여기서 FK가 MEMBER 테이블에 존재할 수 밖에 없는 이유는 TEAM테이블에 FK 존재 시 FK가 다수의 값을 가지게 되어서 존재가 불가능한 것인지, 맞다면 그렇기 때문에 @JoinColumn(name = "TEAM_ID") 어노테이션을 사용하면 JPA에서 자동적으로 MEMBER테이블에 TEAM_ID 컬럼을 생성하는 건지 확인하고자 질문을 남깁니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 섹션 1. 프로젝트 환경설정 H2 데이터 베이스설치 관련 질문사항 제가 원래 H2는 제대로 동작 됐고 다음 JPA와 DB 설정을 진행하다 오류가 생겨 고민하다 아예 전부 지우고 다시 시행하는 과정에서 이번에는 H2데이터 베이스를 설치하면서 해결이 되지 않아서 질문합니다. (아마 제 생각에는 여러 번 깔았다가 지웠다하면서 뭔가 오류가 생긴 것 같습니다.) 1.cmd 창에 입력하면 창이 새롭게 뜨지 않습니다. 2.cmd (관리자 권한)이어도 마찬가지로 h2창이 뜨지 않습니다. 3.h2 console 을 누르면 아무런 반응이 없습니다. 어떻게 해야할까요? 아니면 흔적이 남지 않게 완전히 지우는 방법이라도 알려주세요... 버전을 다르게 깔아봤는데도 마찬가지입니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] https://www.inflearn.com/questions/72824 질문을 읽어보았습니다. 서버사이드 렌더링과 클라이언트 사이드 렌더링이 있고, 강의 예제에서 썼던 thymeleaf 같은 방법은 서버사이드 렌더링이라고 이해했습니다. 그리고 실무에서는 서버사이드와 클라이언트 사이드를 둘 다 사용한다고 하셨는데, 둘 다 사용한다는 말의 의미가 1. 동일한 화면에 대해 서버사이드와 클라이언트 사이드가 공존한다는 건가요? 만약 맞다면, 2. 실제 사용자가 보는 화면은 둘 중 어떤 걸로 선택되나요? 그리고 3. 서버사이드 렌더링을 사용하는 이유와 용도가 궁금합니다. 저 혼자서 데이터를 대강 화면에 뿌려보면서 백엔드 개발이 잘 되었는지를 확인하는 용도로 쓰는건가? 라는 생각을 했어서... 정확히 실무에서 어떤 용도로 쓰는건지 궁금합니다. 질문이 너무 많아서 죄송합니다ㅠㅠ 상세한 답변이 어려우시다면 참고할만한 레퍼런스나 검색 키워드를 추천해주셔도 좋습니다.
1월 22, 2024 11:47:46 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Processing PersistenceUnitInfo [name: hello] 1월 22, 2024 11:47:46 오후 org.hibernate.Version logVersion INFO: HHH000412: Hibernate ORM core version 6.4.2.Final 1월 22, 2024 11:47:46 오후 org.hibernate.cache.internal.RegionFactoryInitiator initiateService INFO: HHH000026: Second-level cache disabled 1월 22, 2024 11:47:47 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using built-in connection pool (not intended for production use) 1월 22, 2024 11:47:47 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: Loaded JDBC driver class: org.h2.Driver 1월 22, 2024 11:47:47 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001012: Connecting with JDBC URL [jdbc:h2:tcp:// localhost/~/test ] 1월 22, 2024 11:47:47 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {password=****, user=sa} 1월 22, 2024 11:47:47 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false 1월 22, 2024 11:47:47 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init> INFO: HHH10001115: Connection pool size: 20 (min=1) 1월 22, 2024 11:47:47 오후 org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl constructDialect WARN: HHH90000025: H2Dialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) 1월 22, 2024 11:47:47 오후 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService INFO: HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) 1월 22, 2024 11:47:47 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp:// localhost/~/test ] 코드는 프로젝트 초기 설정 소스 코드 그대로 실행했는데 안됩니다...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 2:48분쯤에 버그가 일어났을 때 실무에서는 데이터베이스의 데이터를 복구할 때 다시 버그가 일어난 시점으로 데이터베이스를 다시 되돌릴 수 있나요? 롤백기능같은걸 실무에서 쓰는지 강의를 듣다가 궁금해서 질문해봅니다!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 해당 영상에서는 member를 두번 persist 하고 나면 DB에 JPA 어플리케이션을 다시 실행 시키더라도 해당 member 데이터가 2개 남아있는데, 저는 실행시킬 때 마다 해당 데이터들이 모두 사라지네요 package hellojpa; import jakarta.persistence.*; 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 { /* Member member = new Member(); member.setId(1L); member.setName("HelloA"); em.persist(member); */ Member findMember = em.find(Member.class, 1L); System. out .println("findMember.getId() = " + findMember.getId()); System. out .println("findMember.getName() = " + findMember.getName()); findMember.setName("HelloJPA"); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } } 주석 처리한 부분을 먼저 실행 시키고, 이후에 저 부분을 주석처리하고 findMember를 하면 해당 멤버를 가져와야 하는데 그게 안되고 매번 DB가 초기화가 됩니다. 왜 그럴까요?
해당 예제를 통해 주키퍼를 먼저 실행을 해볼려하지만 계속해서 해당 classpath를 찾지 못하고 있습니다. 비슷한 상황을 겪은 사람들의 경우 바이너리 파일이 아닌 소스 파일을 다운 받아 해당 문제를 겪었다고 했지만 저의 경우 알맞은 파일을 설치하여 압축을 해제하였는데 어떤게 원인일까요
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 이 과정에서 jdbc:h2:~/jpashop까지 입력을 완료하고 데이터베이스가 잘 생성이 되었는데 ~ /jpashop.m v.db이 어디에 생성된건지 모르겠습니다. ~ /jpashop.m v.db
mock 테스트 중에 환경변수(@Value)를 가져와야하는데, @SpringBootTest가 아니라서 환경변수를 못가져오고 있습니다. 그래서 환경변수를 담은 변수가 null이 나오기 때문에 테스트를 못하고 있는데, 이럴 경우 어떻게 하시나요?? 일단 환경변수 대신, 생성자를 통해 해당 변수들을 받는 형태로 리펙토링했는데, 프로덕션 코드들을 테스트에 맞추는 거 같아서 약간 딜레마가 오고있어요. 선생님께서는 이런 경우 어떻게 하시나요? 1. 환경변수 이슈 2. 프로덕션 코드를 테스트코드에 맞추는 리펙토링 (2번은 수업에 있네요 ㅎㅎ)
안녕하세요 스프링부트 3.0 이상 버전을 사용하고 있는 사람입니다. 원래는 gradle로 잘 빌드하다가 오늘 갑자기 gradle빌드가 실패하네요 그래서 혹시나 해서 build를 intelij로 바꿔보니깐 실행이 잘됩니다. 3.0이상버전부터는 gradle빌드로 해야한다고 하시는데 이렇게 하면 문제가 생길까요? 왜그런걸까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요?예 [질문 내용] 여기에 질문 내용을 남겨주세요. 강의 12분에서 Member 객체를 만들고 setter를 사용하셨는데 엔티티의 setter는 지양해야되는 것으로 알고있습니다. createMember 와같은 정적팩토리 메서드 로 객체생성하는게 더 낫지않나요?
엔티티 컬럼의 값을 수정할 때 save()를 안써도 JPA의 더티체킹 때문에 트랜잭션 커밋 시점에 업데이트 쿼리가 나간다고 알고 있습니다. @Transactional public void updateDeleteFlag(Long fileId) { File file = fileRepository.findById(fileId) .orElseThrow(() -> new EntityNotFoundException("해당 파일을 찾을 수 없습니다.")); file.changeDeleted(true); } 위 코드에서 @Transactional 어노테이션을 제거하면 update 쿼리가 나가지 않아서 수정이 안되더라고요. 이건 트랜잭션 커밋 시점 에 업데이트 쿼리가 나가는데 @Transcational 어노테이션을 달지 않으면 트랜잭션을 시작하지 않아 커밋도 없기 때문에 그런건가요? 1번의 내용이 맞을 때, @Transactional 어노테이션이 업데이트 메서드에 없다면, update 쿼리가 언제 나가는지 궁금합니다. update 쿼리가 나가지 않고 있다가 (JPA SQL저장소에 계속 머물다가) 다른 트랜잭션 (가령, 게시물 조회) 이 실행되고 커밋되는 시점. 이때 update 쿼리가 나가게 되는건가요?
테스트에서 사용하는 빌더 매서드를 한 곳에 모아놓으면 오히려 유지보수가 어렵고 매번 새롭게 만들게 된다고 하셨습니다. 그리고 매서드를 만들때 테스트 검증이나 테스트에 필요한 인수만 외부로 들어내서 테스트의 목적을 명확하게 들어내는게 좋다고 하셨는데 만약 테스트 케이스마다 외부로 들어내는게 제각각 다른 경우에 하나의 테스트 클래스에 다양한 빌더 매서드들이 생기게 된다면 그것도 관리하는데 어려움이 발생할 거라 생각합니다. 이런 경우에는 하나의 빌더 매서드만 생성해서 사용하시나요 ? 아니면 그렇게 많이 발생할 일이 없기 때문에 매번 테스트에 필요한 빌더 매서드들을 만드시나요?