30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 데이터 JPA
Distinct
안녕하세요 영한님 강의 너무 잘보고있습니다. Distinct 쿼리를 한번 만들어 보았는데요 public interface MemberRepository extends JpaRepository<Member,Long> { List<Member> findDistinctByUsername(String userName); } ========================= //테스트 코드 @Test public void findDistinctByUsername(){ Member m1 = new Member("AAA", 10); Member m2 = new Member("AAA", 20); memberRepository.save(m1); memberRepository.save(m2); List<Member> findDistinctByUsername = memberRepository.findDistinctByUsername("AAA"); } ================================== 실행 결과 Hibernate: select distinct member0_.member_id as member_i1_0_, member0_.age as age2_0_, member0_.team_id as team_id4_0_, member0_.username as username3_0_ from member member0_ where member0_.username=? --------------------------------------------- 제가 궁금한건 결국 마지막엔 Member 의 필드를 모두 조회합니다. 그런데 Id 의 값은 중복이 될수 없으니 이 쿼리는 Member 엔티티를 모두 조회하는거랑 같습니다. Id를 요구하지않는 테이블에서만 이런 쿼리 메소드(distinct ) 를 사용하는건가요 ??
- 미해결실전! 스프링 데이터 JPA
transactional
안녕하세요 ㅎㅎ assertThat(findMember).isEqualTo(member); 여기서 같은 것 인스턴스로 보장이 되는데 이건 영속성 컨텍스트에 저장된 id 로 구별하는게 맞나요? 지금은 같은 id 값으로 저장되어있으니 true.
- 미해결실전! 스프링 데이터 JPA
MemberJapRespsitoryTest 에서 생긴 궁금증압니다.
MemberJpaRepositoryTest 부분에서 위처럼 memberJpaRepository.getClass()를 출력하면 바이트 조작된 MemberJpaRepository가 주입된 것을 볼수 있는데 , 이 부분에서 한가지 궁금한 점이 생겼습니다. 제가 지금까지 이해한 것은 , 스프링 컨테이너에만 바이트 조작코드가 붙어 싱글톤을 유지해 주는것으로 알고 있었는데, memberJpaRepository값 또한 바이트 조작된 구현객체가 주입된 것을 보니 왜 이렇게 되는것인지 궁금합니다.
- 미해결실전! 스프링 데이터 JPA
조회수 를 업데이트로 처리하게 되면 어떻게되나요?
개인으로 토이프로젝트를 진행중인데요 ! auditing 을 배운데로 적용을 잘 했으나 조회수 같은걸 처리할때도 동작을 해버려서 어떻게 해야할지 난감해졌습니다! Board(게시물) 엔티티에 조회수 필드가 들어있는 상태에서 detailPage접속시 findById를 실행시키고 나서 트랜잭션이 끝나기전에 조회수를 하나 증가시켜서 변경감지가 일어나게 설계하였습니다 ! 보통은 이런 설계방식은 잘못된건가요 강사님 ?
- 미해결실전! 스프링 데이터 JPA
pageable 궁금한거 있어요!
controller의 매개변수로 Pageable을 받는것은 get방식만 가능한가요?
- 미해결실전! 스프링 데이터 JPA
count 쿼리 나가는 이유
안녕하세요 선생님!ㅎㅎ 강의를 듣는 중에 궁금한 점이 생겼습니다. 질문) 페이징 기능 사용 시 count 쿼리가 나가는 이유가 궁금합니다. 그 이유가 혹시 다음 페이징 된 쿼리의 위치를 알기 위함 일까요?
- 해결됨실전! 스프링 데이터 JPA
역할과 구현
안녕하세요. 방학기간을 통해 스프링에 대해 공부하고 있는 대학생입니다. 다름이 아니라 스프링 핵심원리 강의에서 역할과 구현을 분리하라고 배웠습니다. 그래서 만약 '회원 저장소'를 만든다고 하면 pubic interface MemberRepository{ void save(Member member); Member findById(Long memberId); } 을 만들고 필요한 구현체를 따로 만들었습니다. 메모리를 이용한다면 public class MemoryMemberRepository implements MemberRepository { private static Map<Long, Member> store = new HashMap<>(); @Override public void save(Member member) { store.put(member.getId(), member); } @Override public Member findById(Long memberId) { return store.get(memberId); } } 이런 식으로 만들고, 만약 JPA를 이용한다면 public class MemberJpaRepository implements MemberRepository { @PersistenceContext private EntityManager em; public void save(Member member) { em.persist(member); } public Member findById(Long id) { Member member = em.find(Member.class, id); return member; } } 이런 식으로 만들어서 사용했습니다. 여기서 스프링데이터JPA를 사용하기 위해선 인터페이스에 JpaRepository를 상속받아야하는데 그러면 기존에 있던 MemberRepository에 상속받아서 사용하면 되나요? 그런데 MemberRepository에서 JpaRepository를 상속받게 되면 기존에 MemberRepository 구현체들이 JpaRepository까지 모두 구현해야하는 문제가 있고, MemberReposity에서 사용하는 메소드 이름과 JpaRepository에서 사용하는 메소드 이름이 같으면 MemberRepository를 주입받아 사용하는 다른 클래스에도 문제가 발생했습니다. 이래저래 글이 길었지만 그래서 어떻게 스프링데이터 JPA를 사용하면서 역할과 구현을 구분할 수 있을까요?
- 미해결실전! 스프링 데이터 JPA
RequestBody 내부에 List가 들어가는 경우
공부하다가 이해가 안되는게 있어서 남겨봅니다. 만약 post API가 다음과 같은 RequestBody를 받도록 설계하고 싶다고 가정해보겠습니다. // Item entity { "name": "string", "type": "string", "count": 999, "infoList": ["aaa", "bbb", "cc"], "remark": "string" } 질문 1. 강의를 통해 배운 방법으로 infoList를 만든다면 Info Entity를 별도로 만든 다음Item과 Info를 Join하는 방법이 있을 것입니다.그런데 info는 문자열만 있으면 되기 때문에 굳이 뎁스가 있게 구성하고 싶지 않았습니다.Info entity 없이 단순히 Item 엔티티에 배열만 넣는 방식은 무엇이 있을까요?@ElementCollection가 있다는 것은 아는데 이것만으로도 충분한지 궁금해서 질문을 남겨봅니다. 질문 2. 만약 Info entity를 만든다고 가정하고... 위 json처럼 리스트에는 문자열만 넣을 수 있을까요?@JsonUnwrapped라는 것이 있길래 이것으로 가능할까 궁금해서 질문을 남깁니다.
- 미해결실전! 스프링 데이터 JPA
안녕하세요 활용2 에있는 예제들을 projection + native query
안녕하세요 JPA 활용2 에있는 MEMBER, ORDERS, DELIVERY 엔티티를 프로젝션+ 네이티브 쿼리 로 조회해보려고하는데요 ㅎ 임베디드타입인 딜리버리에있는 주소를 출력하고싶은데요! 인터페이스(order의 아이디, member의 이름. delivery 의 임베디드타입 주소!) respotiory 테스트 코드입니다 결과적으로 궁금한점은 repository부분에서 주석풀린부분은 임베디드타입인 delivery 엔티티를 빼고 실행했을때는 잘조회가 됩니다! 그런데 위에 주석이달린 쿼리 (delivery의 @Embedded 타입인 Address를 포함해서 조회하려고하면 ) 에러가뜨면서 null로 처리가되더군요 ㅠ 임베디드타입은 프로젝션 인터페이스부분에 Address getAddress(); 이런식으로 하면 안되는걸까요?
- 미해결실전! 스프링 데이터 JPA
반환타입 Future, CompletableFuture 실무에서의 병렬처리 사용성
실무에서 어떤경우에 병렬처리를 자주 사용하는지 알고싶습니다. 또한 사용시 어떤 주의점이 있는지도 알려주시면 감사드리겠습니다. Jpa와 함께 자바 기본도 같이 공부중인데, 궁금증이 생겨 여쭤봅니다. 감사합니다.
- 미해결실전! 스프링 데이터 JPA
getOne vs findById
어떤 경우에 getOne을 많이 활용하나요?
- 미해결실전! 스프링 데이터 JPA
team 조회시 query 관련
영한님 log와 달리, 제가 조회를 했을때는 hibernate가 for문에서 해당 팀을 조회 하는 순서에 따라 select쿼리를 날려서 데이터를 db에서 가져온 후 print해주는데요 영한님 로그에서는 미리 team1,2 를 다 조회하고 그 다음에 출력해주는것으로 보입니다. (여기서 이미 조회해서 영속성 컨텐츠로 만든 것들은 다시 select 쿼리를 날리진 알고요 team 1, 2 의 경우 1번씩만 날림) em.clear해서 캐시를 초기화 했기 때문에, getTeam을 하였을 때, 아래의 결과 처럼 getTeam으로 조회 하려고 할때, hibernate가 select 쿼리를 날리는게 맞다고 보는데 영한님 로그에서는 어떻게 hibernate가 미리 2개를 다 조회할 것을 알고 select문을 먼저 2번 날린 것인지 궁금합니다. System.out.println("============");for(Member member:members){ System.out.println(member); System.out.println(member.getTeam());}System.out.println("============"); ============ Member(id=3, username=member1, age=10) 2021-07-30 05:38:40.449 DEBUG 1508 --- [ main] org.hibernate.SQL : select team0_.team_id as team_id1_1_0_, team0_.name as name2_1_0_ from team team0_ where team0_.team_id=? 2021-07-30 05:38:40.451 INFO 1508 --- [ main] p6spy : #1627591120451 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/lecture_datajpa select team0_.team_id as team_id1_1_0_, team0_.name as name2_1_0_ from team team0_ where team0_.team_id=? select team0_.team_id as team_id1_1_0_, team0_.name as name2_1_0_ from team team0_ where team0_.team_id=1; Team(id=1, name=teamA) Member(id=4, username=member2, age=10) Team(id=1, name=teamA) Member(id=5, username=member3, age=10) 2021-07-30 05:38:40.460 DEBUG 1508 --- [ main] org.hibernate.SQL : select team0_.team_id as team_id1_1_0_, team0_.name as name2_1_0_ from team team0_ where team0_.team_id=? 2021-07-30 05:38:40.461 INFO 1508 --- [ main] p6spy : #1627591120461 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/lecture_datajpa select team0_.team_id as team_id1_1_0_, team0_.name as name2_1_0_ from team team0_ where team0_.team_id=? select team0_.team_id as team_id1_1_0_, team0_.name as name2_1_0_ from team team0_ where team0_.team_id=2; Team(id=2, name=teamB) Member(id=6, username=member4, age=10) Team(id=2, name=teamB) ============
- 미해결실전! 스프링 데이터 JPA
Query관련으로 질문이 있습니다 !!
위와같이 Product, Restaurant 두개의 엔티티를 만들었는데 Product엔티티자체가 Restaurant엔티티에 포함된다고 생각해서 Product엔티티의 삭제 및 생성의 관해선 Restaurant이 관할해야한다고 생각해 cascade와 Repository도 Restaurant만 만들었는데요 이러한 방식이 괜찮을까요 ? 정리하면 1.Restaurant를 애그리거트 루트로 보고 Product에 접근하기위해선 항상 Restaurant을 거쳐야된다고 생각해 위와같은 구조로 만들었습니다 괜찮을까요 ? 2. (실제 테스트는 해보지않은 부분이라 틀릴 수 있습니다 ㅠㅠ 의미만 봐주세요 ) 1번에서 이어지는 부분인데 RestaurantRepository에서 Product의 Id를통해 Restaurant엔티티를 가져오는 부분입니다 이러한 코드는 어떻게 생각하시나요 ? - Restaurant엔티티를 통해 Product에 접근해야된다고 생각해서 ProductRepository를 만들지 않았습니다 - 그렇기때문에 1:N 중 1쪽에서 탐색하고있는데 괜찮을까요 ?
- 미해결실전! 스프링 데이터 JPA
질문있습니다.
안녕하세요 insert 벌크 쿼리에 관해 질문있습니다. 강의에서 말씀해주신 대로 해보니 delete와 update의 경우 한번에 처리되는 것을 확인할 수 있었습니다. 문제는 Insert 였습니다. 저는 MySQL 를 사용하면서 IDENTITY 전략을 사용해왔었는데 MySQL의 경우 벌크 INSERT 쿼리를 날리기 위해서는 찾아보니 Batch Insert를 사용하기 위해서는 IDENTITY 전략이 아니라 TABLE 전략을 사용해야 한다고 하더라구요. 제가 궁금한 점은 아래와 같습니다. 1. 다른 ENTITY들은 IDENTITY 전략을 사용하고 Batch Insert가 필요한 특정 ENTITY만 TABLE 전략으로 변경해도 괜찮을까요? 2. 실무에서는 INSERT 쿼리를 한 번에 날리기 위해서는 어떤 방식을 사용하나요?? 감사합니다 :) 2.
- 미해결실전! 스프링 데이터 JPA
질문있습니다.
안녕하세요! 오랜만에 다시 보다가 갑자기 궁금한 부분이 생겨서 질문드립니다! 1. JpaRepository를 이용하면 simpleJpaRepository를 사용하게 되는 것으로 기본적으로 @Transactioanal(readOnly=true)와 @Repository를 달고 있는 것으로 생각하면 될까요? 2. 저는 서비스 계층에서만 @Transactional을 붙여서 사용하고 있는데 구글링하다보니 Repository 계층에서도 @Transactional을 사용하는 경우가 존재하던데 Repository에서 @Transactional을 사용하는 경우는 어떨 때 사용하는 것인가요?
- 미해결실전! 스프링 데이터 JPA
totalCount는 어디서 쓰이나요?
페이징하면 제일 먼저 생각나는게 영한님이 말씀하신것 처럼 게시판의 페이징 기능이 생각이 납니다. Member가 m1~m5까지 있을때 이름, 나이 m1 AAA 10 m2 BBB 10 m3 CCC 10 m4 DDD 10 m5 EEE 10 이렇게 나이는 동일하고 이름만 다른 조건이 있다고 했을 경우 강의에서 offset과 limit을 활용하여 3개씩 잘라서 1 page = m1,m2,m3 2page = m4,m5 이렇게 나누는것 까지는 잘 이해가 됐습니다. 하지만 이때 totalCount는 강의내용을 참고하면 age가 같은 사람의 개수이니 5 라는 숫자가 나오게 되는데요 이 totalCount는 어디서 쓰이는건가요? 제가 생각하는 페이징에는 offset과 limit만 있어도 게시글 다음페이지 이런걸 할 수 있을거 같은데 어디서 쓰이는지 궁금합니다 ㅎㅎ
- 해결됨실전! 스프링 데이터 JPA
mybatis랑 jpa의 차이가 궁금합니다
안녕하세요 강사님. 3개월쯤 된 신입 개발자 입니다. 회사에서 myBatis를 사용한 프로젝트를 진행했고, 최근 한가해진 참에 JPA도 배워보고 싶어서 강의를 듣게되었는데 아무리 생각해도 JPA가 주는 CRUD의 장점을 myBatis가 커버할 수가 없을 것 같습니다. 1. 혹시 실무에서 JPA 대신 myBatis를 사용하는 특별한 이유가 있을까요? 2. 두 개를 섞어서 사용(JPA기반 동적쿼리만 myBatis 사용) 하면 좋을거같은데 실제 실무에서 이런 방식으로 사용하는 경우가 있을까요?
- 미해결실전! 스프링 데이터 JPA
@CreationTimestamp와 @CreatedDate의 선택
저는 평소에 실무에서 @CreationTimestamp를 썼는데요. 이게 하이버네이트에서 제공하는 건줄도 모르고 그냥 막 사용했는데, 이번에 영한님 강의에서 @CreatedDate를 알게되어 둘을 비교해보니 @CreationTimestamp 는 하이버네이트 제공 @CreatedDate 는 스프링 프레임워크 제공 인 것 같더라고요 @CreationTimestamp는 JPA의 표준이 아니라 하이버네이트에서 제공하는 거라 아무래도 나중에 그럴일은 없겠지만, JPA 구현체를 하이버네이트 말고 딴거로 바꾸면 못쓴다는 단점이 있을 것 같긴 한데, @CreationTimestamp를 쓰면 @EnableJpaAuditing 같은거 안 해줘도 돼서 편하더라고요. 실무에서는 어떤 방식이 더 선호되나요?
- 미해결실전! 스프링 데이터 JPA
JPA 테스트코드 작성시 DDL 관련 질문있습니다
안녕하세요? 현재 프로젝트에 테이블이 약 400여개가 있습니다. 엔티티 개수도 그에 비례하구요. 문제는 이렇습니다. 임베디드 디비로 테스트 코드를 돌리는데요, Member 엔티티에 대한 테스트 코드를 작성하고 테스트 코드를 실행시키면 400여개의 엔티티에 대한 DDL이 모두 실행된 후 Member 엔티티에 대한 테스트코드가 실행됩니다. 유닛 테스트시 Member 엔티티에 대한 DDL만 생성되어 관련된 테이블 몇개만 생성한 후 간단하게 돌려보고 싶은데 제가 찾아서 시도해본 것으로는 @EntityScan으로 엔티티 스캔범위를 좁히거나 scheme.sql을 매번 작성하는 것, @DataJpaTest의 필터를 사용하는 것 등입니다. @DataJpaTest(includeFilters = {@ComponentScan.Filter(classes = Member.class)}) @Import(TestQueryDslConfig.class) class MemberRepositoryTest {} 특정 엔티티 클래스 몇개만 딱 찝어서 할수있는 방법이 있을 것 같은데 생각보다 솔루션이 안찾아집니다. 혹시 도움을 받을 수 있을까요?
- 미해결실전! 스프링 데이터 JPA
SQLGrammarException 발생 ...
안녕하세요 ... 정말 재밌고 알차게 강의를 들었는데요.. ! 마지막 강의의 native Projection 을 구현할때 ... SQLGrammarException 이발생합니다 ㅜㅜ userName은 제가 entity를 만들때 userName으로 만들었어요..! 이유를 잘모르겠습니다 ..! 도와주세요 ! 감사합니다 :)