월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! 스프링 데이터 JPA
getTeam()만 했는데 team테이블을 조회하는 쿼리가 나갑니다
member객체에서 team객체를 lazy fetch로 설정하고getTeam().getClass()를 조회하면 가짜프록시로 조회됩니다.그런데 getTeam()을 하니 select Team문이 새로 나가는데 이는 team을 출력을 해야돼서 team을 불러오게 되는 건가요?
- 미해결실전! 스프링 데이터 JPA
업데이트가 아닌 delete쿼리를 날리면
영속성 컨텍스트가 반영 안되게 쿼리를 먼저 날려서 DB에만 반영되고 영속성 컨텍스트는 더티체킹을 못해서 반영이 안되었다고 이해했는데요 나이 업데이트 코드가 아니라 멤버를 저장 후에 바로 멤버 하나를 삭제하는 쿼리를 실하면 DB에는 멤버가 삭제되고 영속성 컨텍스트에는 반영안되어서 삭제한 멤버가 조회될 줄 알았는데 조회가 안되더라고요 deleteMemberByUsername메소드가 사용한 쿼리구요테스트 코드 입니다. 멤버를 테스트 코드 내에서 저장하고, member5를 삭제하고 조회를 해보았습니다.delete문을 실행하면 update와는 다르게 테이블의 구조가 변경되는 쿼리문이여서 영속성 컨텍스트에서 더티 체킹을 하는 걸까요?
- 해결됨실전! 스프링 데이터 JPA
단방향 연관관계 때 삭제시 연관된 테이블 모두 삭제 질문
[질문 내용]제가 유저를 삭제해줄 때 그 유저가 작성한 게시글, 댓글, 장바구니를 삭제해주려고 합니다.유저와 게시글, 댓글, 장바구니는 단방향연관관계를 가지고 있도록 구성했는데 그 이유는 양방향은 필요할 때 사용하고 그 외에는 단방향으로 구성하려고 했기 때문인데 유저에 양방향으로 각각의 데이터를 가지고 있을 필요가 없다고 생각해서 단방향으로 했습니다. 제가 알고있기로는 양방향으로 이어져 있으면 등록, 수정, 삭제 할 때 cascade로 처리하고 고아 객체 삭제하는 orphanRemoval = true 을 같이 사용하면 삭제되지만 이것들은 양방향 연관관계 때 사용하고 일대다` 인 부분에서 다쪽에 써야하는 것으로 알고 있습니다. 예를들어, @OneToMany 이렇게 양방향으로 이어져 있으면 이 객체가 다인쪽에 연결하니 이 객체가 다니까 이쪽에 cascade와 orphanRemoval = true를 사용하는걸로 이해하고 있습니다. 단방향에서는 각자의 레포가 별도로 되어 있으니 각각 삭제해주는 걸로 알고 있어서 다음과 같이 별도의 레포에 해당 하는 유저를 모두 삭제하는 방법을 선택했는데 제가 맞는 선택을 했는지 제가 제대로 이해한게 맞는지 궁금합니다. public String removeUser(Long memberId, String email) { // 회원 조회 MemberEntity findUser = memberRepository.findByEmail(email); log.info("email check : " + email); log.info("email check2 : " + findUser.getEmail()); // 회원이 비어있지 않고 넘어온 id가 DB에 등록된 id가 일치할 때 if (findUser.getMemberId().equals(memberId)) { boardRepository.deleteAllByMemberMemberId(memberId); commentRepository.deleteAllByMemberMemberId(memberId); cartRepository.deleteAllByMemberMemberId(memberId); memberRepository.deleteByMemberId(memberId); return "회원 탈퇴 완료"; } else { return "해당 유저가 아니라 삭제할 수 없습니다."; } }
- 미해결실전! 스프링 데이터 JPA
연관관계 설정에 대해서 질문이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예제 도메인 모델과 동작확인 강의에서 8:55분에 보면 연관 관계를 위해서 changeTeam이라는 메소드를 생성하시는데 해당 코드에서 team.getMembers().add(this)라는 코드가 있는데 해당 코드가 없어도 동작에 아무 이상이 없고 또한 Member에서 getMembers를 출력해보거나 DB를 보아도 달라진게 하나도 없는데 해당 라인의 코드를 적는 이유를 모르겠습니다. 만약 이유가 있다면 확인할만한 방법이 뭐가 있을까요?
- 해결됨실전! 스프링 데이터 JPA
@RepositoryDefinition 실무에서 사용하나요?
JpaRepository나 PageRepository 등불필요한 쿼리도 자동으로 만들어주더라구요 그래서 해당 레포지토리에서 직접 정의한 메소드 말고는 막고 생성하고 싶지 않다면 어떤 방법을 사용하시나요? 디버깅하다보니 Repository.class 인터페이스와 어노테이션인 RepositoryDefinition.class를 필터로 스캔하는 걸 확인했습니다. RepositoryDefinition를 사용하는 것보다 직접 정의해서 사용할 생각이면 Repository.class만 상속해서 사용하시나요 ?
- 해결됨실전! 스프링 데이터 JPA
Spring Data Jpa Optional
jpashop 프로젝트를 spring data jpa를 사용해 변경해보고 있는데Service 로직에서 spring data jpa에 기본으로 findOne이 있다고 들어 작성하였는데Optional 때문인지 저렇게 나오는데 어떻게 작성해야 해결이 되나요??
- 해결됨실전! 스프링 데이터 JPA
@Query문
jpashop 프로젝트에서 OrderRepository를 criteria 부분은 스프링데이터jpa로 바꿔보려하는데 @Query(“select o from Order o join o.member m)List<Order> findByMemberName(); 이렇게 작성한다면 Order를 멤버 이름으로 조회 할 수 있을까요??
- 해결됨실전! 스프링 데이터 JPA
Setter 대신 생성자 방식과 @Builder 방식의 선호도
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]강의를 듣다보면 편의를 위해 setter를 이용해 데이터를 수정하는데 저는 실제로 사용하지 않는 것이 좋다고 들어 생성자를 따로 생성해 강의를 진행하고 있습니다. 그러다보니 생성자 개수가 늘어나 관리? 하기 어려워져 다른 방법을 찾아보던 중 @Builder를 통해 처리하는 방법을 알게되었는데 실제 프로젝트에서는 어떤 방법을 이용하는 것이 좋은건지 궁금합니다
- 해결됨실전! 스프링 데이터 JPA
JPA를 사용할 때 SQL 생성 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 내용]JPA를 사용하면 JPA에서 SQL 테이블을 연결해 놓은 테이블을 생성해주는데 실무에서도 그냥 JPA로 테이블 생성하고 테이블에 상세한 설정이 필요하다면 엔티티에서 설정을 하나요?
- 해결됨실전! 스프링 데이터 JPA
JpaEventBaseEntity test
@Test public void JpaEventBaseEntity() throws InterruptedException { Member member = new Member("member1"); memberRepository.save(member); //@Prepersist Thread.sleep(100); member.setUsername("member2"); em.flush(); em.clear(); Member findMember = memberRepository.findById(member.getId()).get(); System.out.println("findMember.getCreateDate() = " + findMember.getCreateDate()); System.out.println("findMember.getUpdateDate() = " + findMember.getUpdateDate()); }Thread.sleep을 해준 이유가 무엇인가요??
- 미해결실전! 스프링 데이터 JPA
매핑 테이블 값 변경
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. EntityAId와 EntityBId를 받아서 EntityAEntityB 매핑테이블의 a라는 변수의 값을 변경시키려면 어떻게 해야 할까요? EntityA와 EntityB를 각각 조회하고 EntityA의 EntityAEntityBList를 돌면서 EntityB인걸 찾으면 DB에 쿼리가 너무 많이 날아갈거같은데 이런 문제는 어떻게 해결 해야 하나 의문이 들어 질문 드립니다.
- 미해결실전! 스프링 데이터 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으로 설정하면 테스트는 통과됩니다.
- 해결됨실전! 스프링 데이터 JPA
왜 쿼리 힌트에 value=true라고 명시해 줘야 하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이미 개발자가 @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly")) Member findReadOnlyByUsername(String usernane);이렇게 쿼리 힌트를 명시한다는 것 자체가 저 쿼리힌트를 사용하겠다는 건데, 저 value = true는 왜 명시해 줘야 하는 건가요?value=false라고 하는 것과 아예 쿼리 힌트를 명시하지 않은 것의 차이가 있는건가요?
- 미해결실전! 스프링 데이터 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
JPQL로 페이징을 제공하지 않는 이유.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]방언때문에 그런건가요? DB마다 메커니즘이나 사용 방법이 너무 상이해서 추상화 하기 어려운 건가요?근데 JPQL은 다 방언 참고해서 나가지 않나요?
- 해결됨실전! 스프링 데이터 JPA
[질문 X] @Setter에 일괄적으로 AccessLevel 설정
@Setter에 왠만하면 private로 해두고 필요할 때만 그 개개별만 열어두고 싶었는데,@Setter(AccessLevel.PRIVATE)이렇게 클래스레벨에 넣어두면 다 private로 생성되는 듯 해요.만약 따로 @Setter를 열어두고 싶은 필드가 있다면 @Setter(AccessLevel.PUBLIC) private String username;그 필드에 이렇게.. 자세할 수록 우선 반영이니..
- 해결됨실전! 스프링 데이터 JPA
flush() 와 clear()
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]1. 스프링 데이터 JPA 가 지원하는 save를 호출하면 flush()가 나가는건가요 아니면 save를 하고 bulkAgePlus()를 호출하면서 bulkAgePlus() 에 있는 JQPL이 실행되서 flush() 가 나가는건가요 ? bulkAgePlus()를 실행하면 JPQL 실행이되고, JPQL 이 실행이 되면 flush() 가 호출이 되는데 이때 SQL쿼리문이 DB에 전송이대서 DB에는 업데이트가 되어있지만 영속성 컨텍스트는 업데이트가 안되기 때문에 clear()를 해주는게 맞는건가요 ?
- 미해결실전! 스프링 데이터 JPA
QueryHint와 update 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 강의와 자료를 병행하며 공부하고있는 학생입니다. 음.. 개념에 대해 헷갈리는 부분이 있어서 질문드리는데,queryHint를 통해서 읽기전용이라고 하이버네이트에 인식 시키고 em.flush()에 update쿼리가 먹히지 않는다.라고 이해했는데 비슷한 질문글을 보니 db에는 "member2"로 들어가있다는 질문을 보고 의문이 들었습니다. 이름이 바뀌지 않아야 정상아닌가요?
- 미해결실전! 스프링 데이터 JPA
엔티티, DTO 유효성 검사 관련 질문드립니다!
https://www.inflearn.com/questions/548289/%EC%97%94%ED%8B%B0%ED%8B%B0-dto-%EC%9C%A0%ED%9A%A8%EC%84%B1-%EA%B2%80%EC%82%AC%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4안녕하세요 강사님!위 질문글을 보고 이유에 대해 궁금증이 생겨서 질문 드립니다!"엔티티, DTO를 둘 다 유효성 검사를 하나요?" 라는 질문에 대해서"저는 주로 파라미터로 넘어오는 DTO에 유효성 검사를 선호하는 편입니다."라고 답변 주셨는데 혹시 그 이유를 알 수 있을까요? 그러면 RequestDto에서만 유효성 검사를 해주고Entity에는 validation관련 어노테이션 같은 걸 따로 안해주시는 건가요? 이유가 궁금합니다!
- 미해결실전! 스프링 데이터 JPA
h2 데이터베이스 연결 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 비슷하지만 없는 것 같습니다.3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]강의 극 초반인데 h2 데이터베이스 문제로 시작도 못 하구 있습니다. ㅠㅜ영한쌤과 같은 버전으로 하려고 했는데 start.spring.io에서는 2.2.1이 안되더라구요ㅠㅜ 그래서 3.xx 버전을 사용하고 있습니다. 따라서 h2데이터베이스도 2.1xx 버전을 깔았습니다.근데 자꾸 h2연결이 안되어서 run도 안되고 데이터베이스 연결도 안 되더라구요ㅠㅜdb이름도 datajpa, data-jpa 등등 바꿔서도 해보고 이름도 바꿔서도 해보고 해도 안되네요.그리고 db파일은 생성이 원래 되었었는데, 지금 현재 안되서 프로젝트와 db파일을 지우고 첨부터 다시 해보고를 반복하면서 지웠었는데, 이제는 아예 생성이 안되더라구요...ㅎㅎ어떻게 해야할까요>?ㅠㅜ h2연결이 안되서 강의 진도를 못 나가고 있습니다.h2데이터베이스는 어떻게 생성을 하는건가요? 그냥 yml설정해주고 빌드를 하고 h2 console에 연결 하면 생기는 건가요? 아니면 생긴걸 확인하고 console로 들어가는건가요?감사합니다.