묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
쿼리를 보내는 부분은 따로 스레드를 만들어서 처리하는건지 궁금합니다.
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.setName("TeamA"); em.persist(team); Member member = new Member(); member.setName("member1"); member.setTeam(team); em.persist(member); // team.getMembers().add(member); em.flush(); em.clear(); Team findTeam = em.find(Team.class, team.getTeamId()); List<Member> members = findTeam.getMembers(); System.out.println("==============="); for (Member m : members) { System.out.println("==========="); System.out.println("m = " + m.getName()); System.out.println("==========="); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } }위 코드를 실행했을때 출력 결과는 아래와 같습니다.Hibernate: select t1_0.TEAM_ID, t1_0.name from Team t1_0 where t1_0.TEAM_ID=? =============== Hibernate: select m1_0.TEAM_ID, m1_0.MEMBER_ID, m1_0.USERNAME from Member m1_0 where m1_0.TEAM_ID=? =========== m = member1 =========== 제가 예상한 실행 결과는 findTeam.getMembers(); 로 인해 두 번째 select 쿼리문이 나오고 그 다음에 =============== 가 출력 될거라고 예상을 했습니다.근데 실행 결과는 =============== 가 먼저 출력 되고 두 번째 select 쿼리문이 출력 됐습니다.그래서 이걸 보고 든 생각이 main 스레드가 코드를 한줄 씩 실행하다가 findTeam.getMembers(); 부분에서 SQL문을 디비로 보낼 스레드를 만들어서 해당 스레드에게 그러한 역할을 넘기고 바로 다음줄을 실행하여 =============== 가 두번째 select 쿼리문 보다 먼저 출력되는건지 궁금합니다. 감사합니다.
-
미해결김영한의 실전 자바 - 중급 2편
Hashset 자료구조에 대해서 질문 있습니다!
김영한 멘토님 안녕하세요 강의를 듣다가 질문이 있어서 질문 남깁니다!HashSet 자료구조를 사용해 객체를 저장할때, HashCode와 equals를 재정의 해야한다고 말씀해 주셨는데요. 정말 멘토님 말대로 재정의 하지 않으면 값이 중복되어서 저장되었습니다. 근데 궁금한것은 HashSet 자료구조이기에 HashCode를 사용하는것은 아는데, 그 이전에 자료구조가 Set의 기반의 자료구조인데 Set은 원래도 중복된 값을 허용하지 않는걸로 알고있습니다. 근데 왜 HashCode를 재정의해야 그때서야 값이 중복되어서 저장되지 않는것인가요? 애초에도 Set 기반의 자료구조인데 말입니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
벌크연산후 createQuery 작동방식 질문
강의 처럼 벌크 연산 후int resultCount = em.createQuery("update Member m set m.age=20") .executeUpdate();clear없이 바로 createQuery를 날리면,Member result = em.createQuery("select m from Member m where m.id = :id", Member.class) .setParameter("id", member1.getId()) .getSingleResult(); System.out.println("member.getAge() = " + result.getAge());아래와 같은 select 쿼리가 날라가고 age가 원래값으로 나옵니다.Hibernate:/* selectmfromMember mwherem.id = :id */ selectm1_0.id,m1_0.age,m1_0.memberType,m1_0.TEAM_ID,m1_0.usernamefromMember m1_0wherem1_0.id=?member.getAge() = 10//////////////////////////////find처럼 selcet문이 안날라갈줄 알았는데, 날라가서 createQuery 작동방식이 궁금합니다.1.이 쿼리가 실제로 db에 날라갔는데,age=20값을 가지고오면서 영속성 컨텍스트에 들렸는데,이미 캐시가 존재해서, 쿼리 값을 업데이트 안해주고 원래값 age=10을 가지고 온건가요?2. 아니면 로그에 보이는 쿼리가 실제 db 에 날라가지 않고 생성만된채로, 영속성 컨텍스트를 찾는건가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepository querydsl 적용 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]querydsl 강의를 듣고 복습하면서 적용해보고 있는데, memberRepository 부분에서 @RequiredArgsConstructor을 사용했더니 compileJava부분에서 em의 초기값이 없다는 예외가 발생했습니다. 생성자를 활용해서 해결되긴 했는데 그 전의 코드에서 왜 작동이 안되었는지 궁금해서 질문드립니다.@RequiredArgsConstructor을 사용한다던가 하는 더 간단한 방법도 있는지 궁급합니다.코드파일입니다https://drive.google.com/file/d/1ezwW4PrReG_BX-lmAC1uiOL8Syk3GbFW/view?usp=sharing
-
미해결실전! Querydsl
querydsl fetchjoin + Projections.bean을 활용한 특정필드 dto 매핑(feat. query specified join fetching, but the owner of the fetched association was not present )
queryFactory.select(Projections.bean(GetMyCommentResponse.MyCommentInfo.class, commentEntity.id.as("commentId"), commentEntity.content.as("content"), commentEntity.likeCount.as("likeCount"), commentEntity.createDateTime.as("createDateTime"), Projections.bean( GetMyCommentResponse.MyCommentedPopUpInfo.class, postEntity.id.as("postId"), postEntity.name.as("postName"), postEntity.mainImageUrl.as("mainImageUrl"), ).as("postInfo"), // commentEntity // 엔티티도 같이 조회하면 에러가 나지 않음 )) .from(commentEntity) .join(commentEntity.post, postEntity).fetchJoin() 안녕하세요 영한님!강의 잘 듣고 있습니다.공부 중에 코드를 작성하다query specified join fetching, but the owner of the fetched association was not present in the select list이런 에러가 발생했는데, fetchjoin시 실제 질의하는 대상 Entity를 select절에 쓰지않아서 에러가 나더라구요. select절에 commentEntity를 추가하면 에러가 발생하지 않지만 이미 commentEntity의 필드들은 모두 가져왔는데, 또 조회하는게 불필요한 작업이라고 생각되어서요. 그렇다고, fetchjoin이 아닌 일반 조인을 써버리면 코멘트마다 포스트에 대해서 n+1 문제가 발생할 것이라고 생각되구요이러한 상황에서 좋은 해결방법이 있을까요? 감사합니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
left join이 안돼요
강의하신 코드랑 같고try { Team team = new Team(); team.setName("teamA"); em.persist(team); Member member = new Member(); member.setUsername("member"); member.setAge(10); member.setTeam(team); em.persist(member); em.flush(); em.clear(); String query = "select m from Member m left join m.team t"; List<Member> result = em.createQuery(query, Member.class) .getResultList(); tx.commit(); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { em.close(); } 결과Hibernate: /* select m from Member m left join m.team t */ select m1_0.id, m1_0.age, m1_0.TEAM_ID, m1_0.username from Member m1_0 left join이 안나가네요, jpql로 join까지 썻는데 왜 안나가는걸까요
-
해결됨김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
똑같은 변수의 이름을 바꿀때 한번에 바꾸는 단축키가 먼가요? 강의에서는 shift + f6 이라고 나오는데 맥북은 단축키가 먼지 궁긍하네요 ㅠ
똑같은 변수의 이름을 바꿀때 한번에 바꾸는 단축키가 먼가요? 강의에서는 shift + f6 이라고 나오는데 맥북은 단축키가 먼지 궁긍하네요 ㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
url을 못찾겠답니다...
이거 컨트롤러안에있는 파일에서 import가 자동으로 되지도 않고 html에서는 url이 등록되지도 않았다하네요 실행시키면 Null만 받아오네요
-
미해결실전 JSP (renew ver.) - 신입 프로그래머를 위한 강좌
The server does not support version 5.0 of the J2EE Web module specification.
The server does not support version 5.0 of the J2EE Web module specification. 라는 오류가 발생하면서 서버가 실행되질 않습니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Thread.sleep() 으로 identity 전략의 insert 쿼리 전송 시점을 테스트 해봤는데 궁금한 점이 있습니다.
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.setUsername("A"); System.out.println("======================"); em.persist(member); Thread.sleep(9000); System.out.println("======================="); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } }@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name", nullable = false) private String username; public Member() { } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } 우선 생각 했던 결과는 현재 identity 전략이므로 em.persist() 할 경우 insert 쿼리가 DB에 바로 보내지고 DB의 Member 테이블에 값이 저장되는거를 예상했습니다.실제 실행해 보면======================Hibernate:/* insert forjpa_basic.ex1_hello_jpa.hellojpa.Member */insertintoMember (name, id)values(?, default) Thread.sleep(9000) 전까지는 insert 쿼리가 콘솔에 잘 찍힙니다. 그래서 H2 콘솔에 데이터가 잘 저장이 됐는지 확인 해봤습니다.결과는 저장이 되지 않았습니다.Thread.sleep(9000)가 끝나고 나서야 데이터가 저장이 됩니다. 그래서 생각했던 결과인 identity 전략에서 em.persist() 할 경우 왜 DB에 바로 저장이 안되는건지 궁금합니다.참고로 http://hibernate.hbm2ddl.auto 옵션은 create입니다. 감사합니다.
-
해결됨실전! 스프링 데이터 JPA
3계층 질문
강의에선 서비스 계층 코드가 없는 관계로 컨트롤러에서 리포지토리를 바로 가져와 사용하셨는데요실제로 서비스 계층을 구현하지 않은 상태에서 컨트롤러에서 리포지토리를 바로 사용하는 경우도 있는지 궁금합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MEMBER -ORDER 테이블 에서 JoinColumn 에 관련
Member.java@OneToMany @JoinColumn(name="member") private List<Order> orders = new ArrayList<>();Order.java@ManyToOne @JoinColumn(name="member_id") //맵핑할 컬럼 private Member member;Member 의 joinColumn 은 member 객체 자체이고 Order의 joinColumn은 db의 컬럼 명인데 member 의 joinColumn 을 member_id, 즉 db의 컬럼명으로 또는 그냥 id 라고 하면 안되나요? 안된다면 이유도 알려주시면 감사하겠습니다!!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
PDF DB 다이어그램
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]PDF에 나와 있는 DB 다이어그램 어떤 사이트나 프로그램 사용하셔서 만든 건가요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링부트 실행이 안됩니다.
[질문 내용]강의 보면 이상한게 떠서 그거 누르면 실행이 되던데 저는 그런게 뜨지않아요 도와주세요
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
em.detach(entity) 에 대해 질문 있습니다.
em.detach(entity) 을 할 경우 영속성 컨텍스트의 1차 캐시에서 entity도 날라가고 쓰기 지연 저장소에 저장되어 있던 entity에 의해 발생한 변경 관련 쿼리문도 삭제 되는건가요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa에서 쿼리 보내는 시점에 대해 질문 있습니다.
수정, 삭제, 삽입 같은 경우에는 데이터 변경이라 영속성 컨텍스트의 쓰기 저장소에 보관되어 있다가 커밋 직전에 한번에 보내지는 반면 em.find()를 통해 발생하는 조회 쿼리는 find() 사용시 바로 디비에 전송이 되는건지 궁금합니다.em.find()를 통해 발생한 조회 쿼리는 트랜잭션 커밋 종료에 상관없이 디비에 바로바로 전송이 되는건지 궁금합니다.
-
미해결실전! 스프링 데이터 JPA
테스트 코드 문의
DTO 쿼리 작성 시 join fetch로 작성하는 경우는 에러가 발생하고 join으로 작성하는 경우에는 에러가 발생하지 않았는데요. join fetch의 개념은 결국 지연로딩을 작동시키지 않고 한 번에 연관된 것들 다 가져온다는 것인데 왜 여기선 안 되는 것인지 궁금합니다.엔티티 @Query문하고 DTO @Query 테스트 코드를 돌렸는데 서로 영향을 미쳐 테스트가 실패라고 뜹니다. @Transactional을 붙여 롤백이 되게끔 하여 해결은 했지만 궁금한 점이 있습니다. 스프링 데이터 JPA 테스트를 돌릴 때 @SpringBootTest 어노테이션 붙이면 자동으로 롤백이 되는 것이 아닌가요?package study.springdatajpa.repository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import study.springdatajpa.domain.Member; import study.springdatajpa.domain.Team; import study.springdatajpa.dto.MemberDto; import java.util.List; @SpringBootTest class MemberRepositoryTest { @Autowired private MemberRepository memberRepository; @Autowired private TeamRepository teamRepository; @Test @Transactional void testQuery() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); List<Member> result = memberRepository.findUser("AAA", 10); Assertions.assertThat(result.get(0)).isEqualTo(m1); } @Test @Transactional void testDtoQuery() { Team team = new Team("teamA"); teamRepository.save(team); Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); m1.setTeam(team); m2.setTeam(team); memberRepository.save(m1); memberRepository.save(m2); List<MemberDto> dtoList = memberRepository.findUserDto(); Assertions.assertThat(dtoList.size()).isEqualTo(2); } }
-
미해결실전! 스프링 데이터 JPA
양방향 매핑 제거시 - fetch join/enityGraph
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니요2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 모르겠습니다..ㅜㅜ 안보이더라고요3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/[질문 내용]강사님 fetch join과 entityGraph에 대해서 공부를 해서, 연관된 객체에 대해서 가져올때, fetch join을 통해서 한방에 가져오는 법을 배웠는데, 만약 양방향 매핑을 풀고, 단방향 매핑으로 코드를 작성하려고 하는데, @Data @NoArgsConstructor @Entity(name ="team") public class TeamJpaEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name ="team_id") private Long id; private String name; @OneToMany(mappedBy = "myTeamId") private List<MemberJpaEntity> memberJpaEntityList = new ArrayList<>(); } ---------- @Data @NoArgsConstructor @Entity(name = "user") public class MemberJpaEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name ="user_id") private Long id; private String name; @Column(name = "team_id") private Long myTeamId; }일때, 양방향 매핑을 끊어서, 단반향 매핑만 되게끔 수정을 했는데, 이렇게 되면 패치조인을 못 하지않나여? 궁금해서 질문을 올립니다...ㅜ 순환참조를 삭제하려고 없애고, TeamJpaRepository.findById(teamId)로 팀이 필요할때 조회할 수 있게 만들었는데, 한방으로는 못 가져오나여?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Run JpashopApplication 시간 초과
안녕하세요, 마지막 커리큘럼 웹계층 강의를 따라하면서 JpashopApplication.main()을 실행시켰는데 5분이 지나도 계속 실행중이고 콘솔도 어느 지점에서 멈춰서 해결방법 질문드립니다.https://drive.google.com/file/d/1vK3NAMKt6E7nTU69Rb0F6qELZEF3pCwU/view?usp=drive_link -실행 중지시키면 아래와 같이 뜨는데 제가 빨간색 강조해놓은 부분이 원인일까요? Execution failed for task ':JpashopApplication.main()'.> Build cancelled while executing task ':JpashopApplication.main()'* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.> Get more help at https://help.gradle.org.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.8/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 5m 56s3 actionable tasks: 2 executed, 1 up-to-date
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL(Querydsl) orderby 에 집계함수
영한님 안녕하세요강의 잘 듣고 있는데, 서브쿼리를 사용하려다.. where, having절에만 사용가능하기에 이 문제를 어떻게 해결할까 고민하다가 질문드립니다.. <문제>현재 엔티티는Post(게시글) 엔티티 필드 : postId, content, createdAt , 조회수,댓글 수, 좋아요 수Post view(게시글 조회) 엔티티 필드 : postViewId, user,post, 조회수,댓글수,좋아요수이렇게 있습니다. ( post view 엔티티는 특정 유저그룹이 어떤 게시글을 본 히스토리를 관리하고 그 히스토리를 통해 게시글의 인기도를 측정하기 위함입니다.)이러한 상황에서 ,게시글의 조회수, 댓글 수, 좋아요 수, 특정 유저그룹이 해당 게시글을 조회한 수, 특정 유저그룹이 해당 게시글에 댓글 단 수, 특정 유저그룹이 해당 게시글에 좋아요한 수 로 정렬하고, (where 조건 절은 다 구현됐다는 가정)groupby는 게시글의 pk 로만 하지만, 실제로 dto에 projections.bean()활용해서 매핑할 필드들은 content, createdAt 등 여러가지 컬럼이 추가로 있습니다. 이러한 경우라면, 우선 특정 유저그룹이 해당 게시글에 댓글 단 수, 특정 유저그룹이 해당 게시글에 좋아요한 수로 정렬하려면, 집계함수 sum을 활용해야하기 때문에 orderby절에 집계함수가 써야하고, 그러면 당연히 groupby를 써야하는데 이 때, post의 모든 필드들로 groupby 하는 것보다 pk로만 group by하는게 의미 있다고 생각해서 select 절에는 select postId 만 올 수 있을텐데그렇다면 이 postId의 리스트를 받아서 다시 이 postId로 다시 post entity를 조회해서 나머지 content, createdAt 값을 받는것이 최선일까요?(이 방법도 그런데 정렬이 유지되지않아서 결국 다시 집계함수로 정렬해야만할까요?) 이렇게 하면 두 번 쿼리를 날리기 때문에 별로 좋지 않은 방법이지 않을까라는 생각이 들지만 jpa는 from 절 서브쿼리를 지원하지않고, 다른 방법이 떠오르지 않아 여쭤봅니다. 조금 중구난방으로 질문한 감이 없지 않아 있지만..영한님 답변 부탁드립니다..ㅠㅠ