30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! 스프링 데이터 JPA
쿼리문 질문 있습니다~
안녕하세요~ 리포지토리 메소드에 쿼리 정의하기 보다가 궁금한게 생겨서 질문드립니다! @Testvoid testQuery() { Member member1 = new Member("aa", 15); Member member2 = new Member("aa", 20); memberRepository.save(member1); memberRepository.save(member2); List<Member> result = memberRepository.findMember("aa", 15); assertThat(result.get(0)).isEqualTo(member1);} 해당 테스트 실행결과 select쿼리를 날리던데 save(member);를 하면 엔티티를 영속성 컨텍스트에서 1차 캐시에 저장하고 findMember();를 실행하면 해당 캐시에 있는 엔티티를 가져오는 게 아닌가요? findMember();하기 전에 커밋이 되지 않았는데 어떻게 select문을 실행되는지 궁금합니다!
- 미해결실전! 스프링 데이터 JPA
Entity Optional 반환 값에 대한 질문(왜 optional로 하는게 좋을까요?)
강의와 관련있는 질문을 남겨주세요.• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)• 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등) 질문 전달에도 요령이 필요합니다.• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요! 구체적인 질문일수록 명확한 답을 받을 수 있어요.• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다. 기본적인 예의를 지켜주세요.• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 안녕하세요, 김영한님. 저 역시 실무에서 자바 개발자로 일하고 있고, 강의에서 많은 도움 받아오고 있는 수강생입니다. 항상 고맙게 생각하고 있습니다. 다름이 아니고, Repository interface에서 특정 entity 값을 반환하려는 메소드에서 왜 Optional로 반환을 해주는 이점이 있나요? 단순 코드 가독성이 좋아지는 부분 외에 이점이 또 어떤게 있을까요? 오히려 null로 뱉어주게 해서 if 조건으로 entity가 null임을 체크해서 예외를 던져주는 코드를 작성하는게 나은게 아닐까 싶어서요.. 왜냐하면, Optional<T> 역시 결국 기존 DataType을 Optional로 한번 Wrapping해주고, Optional<T> 인스턴스를 생성하기 때문에, 자원을 낭비하지 않나 싶어서요. (아래는 수업 중 MemberRepository에 구현된 부분입니다.)
- 미해결실전! 스프링 데이터 JPA
파라미터 바인딩, 벌크 연산, 쿼리힌트 질문드립니다!
안녕하세요 영한님! 강의 정말 잘 보고 있습니다. 몇 가지 궁금증이 생겨 질문드리게 되었습니다. 질문1. 파라미터 바인딩에 대해 Account findByUserId(String userId); 이 코드는 Account findByUserId(@Param("userId") String userId); 이 코드와 완전히 같고, 첫 번째 코드의 String userId의 userId를 @Param("userId")로 자동 변환해주어, 해당 부분이부분만 생략된건가요? 질문2. 벌크 연산에 대해 벌크 연산이랑 네이티브 쿼리랑 결국 같은건가요? 차이점을 모르겠습니다. 둘 다 한번에 업데이트하는것도, 영속성 컨텍스트에 반영 안되는 것도 같은 것 같아서요. 질문3. 쿼리 힌트에 대해 쿼리 힌트와 @Transactional(readOnly = true)는 같은건가요?
- 해결됨실전! 스프링 데이터 JPA
안녕하세요. 야생학습을 하다 궁금한 점이 있어서 질문을 남겨요!
Note라는 엔티티와 Tag라는 Entity가 있는데 서로 M:N 구조여서 매핑 테이블을 사이에 두고 쪼개주었습니다. 그런데 Note를 save할 때, Tag가 기존에 있던 태그라면 매핑 테이블에만 정보를 추가해주고, 아니라면 Tag 테이블에 추가되는 식으로 구현을 하고 싶습니다. for (String tagName : tags) { Optional<Tag> optionalTag = tagRepository.findTagByTagName(tagName); Tag tag = optionalTag.orElseGet(() -> Tag.builder() .tagName(tagName) .activated(true) .build() ); NoteTag noteTag = NoteTag.builder() .tag(tag) .note(note) .build(); note.getNoteTags().add(noteTag);}noteRepository.save(note); 이런식으로 구현을 했는데, 생각을 해보니까 태그의 개수가 많을 경우 조회를 많이하게 될 것 같더라고요. 어떻게 해결을 해야 한 번만 조회를 해오도록 할 수 있을까요? 강의를 다 보질 않아서 혹시 강의로 해설이 된 내용이 있다면 그 부분을 찾아서 보겠습니다. 흑흑...
- 미해결실전! 스프링 데이터 JPA
컬렉션 파라미터 바인딩에 대해서 질문드립니다.
컬렉션을 파라미터로 넣었는데요. 제가 넣은 컬렉션의 size보다 쿼리에서 생기는in 파라미터가 많아지는 현상이 있습니다. 2의 배수로 늘어나는것으로 보이고 제가 설정하지 않은 값은 마지막 값을 반복해서 설정하는데요. 혹시 이 현상이 왜 발생하는지 알 수 있을까요? 간략한 예입니다. < collection size 1> where medicine0_.id in (?) : 1 < collection size 2> where medicine0_.id in (?, ?) : 1,2 < collection size 3> where medicine0_.id in (?, ?, ?, ?) : 1,2,3,3 < collection size 4> where medicine0_.id in(?, ?, ?, ?) : 1,2,3,4 < collection size 5> where medicine0_.id in (?, ?, ?, ?, ?, ?, ?, ?) : 1,2,3,4,5,5,5,5 < collection size 6> where medicine0_.id in (?, ?, ?, ?, ?, ?, ?, ?) : 1,2,3,4,5,6,6,6 < collection size 7> where medicine0_.id in (?, ?, ?, ?, ?, ?, ?, ?) : 1,2,3,4,5,6,7,7 < collection size 8> where medicine0_.id in (?, ?, ?, ?, ?, ?, ?, ?) : 1,2,3,4,5,6,7,8 < collection size 9> where medicine0_.id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) : 1,2,3,4,5,6,7,8, 9,9,9,9,9,9,9,9
- 미해결실전! 스프링 데이터 JPA
안녕하세요 강사님
1편부터 스프링 data 까지 들은 학생입니다. 학습한 것을 응용하기 위해 혼자서 홈페이지를 만드는 도중 궁금한 것이 생겨서 질문 드립니다! validation 관련 질문인데요..! (spring mvc 질문 같지만 ㅜㅜ) spring boot로 private String password1 prvate String password2 이렇게해서 패스워드가 서로 다를 경우 오류가 나게 하는 validation을 작성하려 합니다. @Size나 @notEmpty 같이 기능이 있으면 편할텐데, 구글에 검색해보니 custom validator를 작성하라고 나옵니다 아예 어노테이션을 하나 새로 만드는 일인데.. 혹시 패스워드 오류를 쉽게 표현할 수 있는 방식이 있을까요?
- 미해결실전! 스프링 데이터 JPA
getOne 관련 에러 질문있습니다.
안녕하세요 수업 너무 재밌게 듣고 있습니다! 혼자 연습중에 난 에러인데 도무지 모르겠어서 질문드립니다. T getOne(ID id); for (){ list.add( ~~~service.getOne) } for문 통해 배열에 엔티티를 넣고 담긴 리스트들을 map 형태로 프론트에 보내면 아래같은 에러가 발생합니다 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["list"]->java.util.ArrayList[0]->zen.zen.entity.Dog$HibernateProxy$4tYFCZYD["hibernateLazyInitializer"]) 반면 OPTIONAL 엔티티 반환하는 findById 를 통해 얻어 리스트로 바꾸고 map으로 보내면 제대로 작동합니다. getOne은 어떤이유에서 에러가 나는지 궁금합니다.
- 미해결실전! 스프링 데이터 JPA
dto 조회시 nativeQuery=true 옵션
안녕하세요 영한님 재밌는 강의 감사합니다. 강의를 따라 진행하면서 dto로 값 조회 시 저의 경우 Validation failed for query for method public abstract ... 의 오류가 계속 발생을 해서요 구글링을 통해 @Query 의 옵션에 nativeQuery 를 true로 주니 오류 없이 실행이 됐으나 어떤 부분이 잘못 되어 저는 이렇게 옵션을 추가해줘야하는지 잘 모르겠습니다. 혹시제가 놓치는 부분에 대해서 의견을 들어 볼 수 있을까요? @Query(value = "select new me.study.datajpa.entity.MemberDto(m.username) " + "from Member m" + " join m.team t", nativeQuery = true)List<MemberDto> findDotsBy(); 스프링부트 2.1.17.RELEASE 입니다 감사합니다~
- 해결됨실전! 스프링 데이터 JPA
@Query에서 객체 파라미터
만약에 save 메소드처럼 객체를 통째로 저장하려고 한다면, @Query("select m from Member m where m=:m") void save(@Param("m") Member m); 이렇게 하면 되나요? 그리고 Member 내부 속성에서 만약 team 객체를 통해 조회하는게 가능할까요? 가령,, @Query("select m from Member m where m.team.teamName=:teamName") void findByTeamName(@Param("teamName") String teamName); 감사합니다.
- 미해결실전! 스프링 데이터 JPA
dto 클래스를 modelmapper 를 통해 변환후 저장시 id값 자동생성? 오류입니다.
아래와 같이 ID 값이 없는 dto를@Datapublic class EmployeeInsertDto { private String name; private String registrationNumber; private String nationality; private String phoneCell; private String phoneHome; private String zipcode; private String address; private String addressDetail; private String email; private String payDate; private String insurance; private String bankCode; private String bankNumber; private String bankAuth; private int familyCount; private String note; private Long companyId; private String departmentCode; private String positionCode; private String employmentType; private String status; private LocalDate joinDate; private LocalDate outDate; public void setJoinDate(String date) { if(!date.isEmpty()) { this.joinDate = LocalDate.parse(date.replace("-", ""), DateTimeFormatter.ofPattern("yyyyMMdd")); } }; public void setOutDate(String date) { if(!date.isEmpty()) this.outDate = LocalDate.parse(date.replace("-", ""), DateTimeFormatter.ofPattern("yyyyMMdd")); };}컬트롤러에서 Employee employee = modelMapper.map(employeeInsertDto, Employee.class); Employee emp = employeeRepository.save(employee);이렇게 처리 했습니다근데 employeeRepository.save(employee) 이부분을 확인해보면 아래와 같습니다.==========employeeInsertDto=============EmployeeInsertDto(name=eeee, registrationNumber=222222-1231321, nationality=082, phoneCell=33, phoneHome=5555, zipcode=07630, address=서울 강서구 마곡중앙로 11, addressDetail=fdfd, email=d@mail.com, payDate=3, insurance=Y, bankCode=081, bankNumber=191992, bankAuth=dfdf, familyCount=2, note=null, companyId=4, departmentCode=001, positionCode=001, employmentType=001, status=10, joinDate=2020-10-15, outDate=null)----------------------Employee(id=4, name=eeee, registrationNumber=222222-1231321, nationality=082, phoneCell=33, phoneHome=5555, zipcode=07630, address=서울 강서구 마곡중앙로 11, addressDetail=fdfd, email=d@mail.com, payDate=3, insurance=Y, bankCode=081, bankNumber=191992, bankAuth=dfdf, familyCount=2, note=null, companyId=4, departmentCode=001, positionCode=001, employmentType=001, status=10, joinDate=2020-10-15, outDate=null, createUpdateInfo=null)4---------------------- 그러면서 insert 전에 해당 테이블에 id를가지고 select 쿼리를 날린 후 insert를 날립니다. 마침 같은 id 값이 없다면이야 잘 저장이 되겠지만 그렇지 않은경우 오류가 날 소지가 많은듯한데요 modelmapper 에서 할당을 하면서 companyId 를 유사한 칼럼으로 해서 id 칼럼에 할당을 해주는 건가요?혹 그렇다면 해결책은 어떻게 될까요?바쁘신데 긴글 끝까지 읽어주셔서 감사합니다
- 미해결실전! 스프링 데이터 JPA
더티체킹을 통한 수정과 delete() 메서드를 통한 삭제에 대한 질문입니다.
안녕하세요 김영한 강사님. 기본편부터 Querydsl까지 강의를 듣고, 덕분에 예전부터 만들고 싶었던 사이드 프로젝트를 진행 중입니다. 진행 중에 기본적인 CURD를 하던 중, 기본편부터 말씀하신대로 수정은 더티체킹을 통해서 하고 있습니다. 여기서 궁금한게 더티체킹을 하기 위해 엔티티를 영속화시키려면 클라이언트에서 넘어온 id로 findById() 메서드를 통해 DB에 select를 꼭 한번 해주어야 하는건가요? 마찬가지로 삭제할 때도 클라이언트에서 넘어온 id로 엔티티를 조회 후 em.remove() 메서드에 인자로 넘겨주어야 하는건지 궁금합니다. (제가 알고 있는 영속화 시키는법: em.persist, em.find) 기존에 개발하던 방식은 update문, delete문을 통해 한 번만 통신을 하였는데, 뭔가 select를 한 번 더 하자니 손해보는? 느낌입니다 ㅋㅋㅋ 아니면 상황마다 다르게 해도 되는지요? 예를 들면 실무에서 관리자 사이트 같은 실시간 트래픽이 많지 않은 곳은 더티체킹을 하고, 실시간으로 수정이 빈번하게 일어나는 고객 서비스에서는 update문을 직접 날리는 방식으로 하는 것처럼요. 그리고 실무에선 엔티티에 Setter 메서드를 웬만하면 사용하지 않고 의미있는 메서드명을 만들어서 사용한다고 하셨는데, 그럼 예를 들어서 Member 엔티티를 더티체킹을 통해 수정하려면 changeMember(String username, int age) 같은 메서드를 만들어서 사용하시는 건가요? 강의를 들을 땐 뭔가 다 이해가 되는 기분이였는데, 막상 실제로 개발을 시작하니 기존과 다른 개발 방식이 낯서네요 ㅋㅋㅋㅋ 그래도 덕분에 개발에 대한 새로운 눈이 띄여지는 것 같습니다.
- 미해결실전! 스프링 데이터 JPA
repository service
김영한 개발자님 좋은 강의 감사드립니다. 유익한 강의를 따라 스프링 데이터 Jpa를 공부하니 호기심에 이것저것 궁금한게 생기네요. 초보 개발자인 저는 JpaRepository<T, ID>를 활용하면서 설계패턴에 대한 고민을 시작했습니다. 설계패턴을 이론으로 배울때는 별 생각없었는데, 코딩하면서 적용해보니깐 설계하기 애매한게 많더군요. 굉장히 흥미롭고, 그래서 선배 개발자님의 경험이 듣고 싶습니다. 1. JpaRepository는 T에 들어가는 하나의 테이블을 위해서 공통 인터페이스들을 제공해주고 있잖아요. 그렇다면 여러개의 테이블을 위해서는 일일이 JpaRepository를 따로 만들어줘야 할텐데요. 강의에서는 주로 하나의 테이블만을 이용해서 쿼리를 날렸기에, 하나의 JpaRepository로 충분했는데요. 테이블이 한두개면 모르겠는데 테이블 숫자가 많아지면 그에 맞춰 repository 숫자도 계속 늘려줘야 하는건가요? 가령 수백개의 테이블이 있을 경우에도 일일이 repository를 따로 만들어주는 건가요? 2. 테이블당 하나씩 repository를 만든다면, join 쿼리처럼 여러 테이블을 동시에 참조하는 쿼리는 어떤 테이블을 위한 repository에 작성해야할지 모르겠습니다. 예를들어 : '주문자'와 '상품'을 n:n 관계로 잇는 '주문' 테이블을 조회한다고 가정해볼경우. 제가 주문한 상품에 대한 상세정보를 가져오려고 쿼리를 짜면 다음과 같을 것입니다. select (상품명, 상품가격, 유통기한) from '주문' join '상품' on '주문'.상품id = '상품'.id where '주문'.사용자id = 'qwer1234' 그렇다면 이 쿼리를 '주문자repository'에서 작성해야할지, '상품repository'에서 작성해야할지, '주문repository'에서 작성해야할지 모르겠습니다. 테이블 단위로 repository를 만든다면, 여러 테이블을 넘나들며 query를 날리는 비즈니스 로직이 있을경우, 어떤 테이블을 위한 repository에서 그 쿼리를 작성해줘야 할까요? join 쿼리만을 위한 repository를 따로 만들어줄까도 생각해봤고, service 측에서 작성해줄까도 생각을 해봤는데요. service 측에서 작성해주는 것은 service랑 repository를 분리하는 것이 퇴색되는 것 같습니다. join을 위한 repository를 따로 만드는 것은 개발하다 구조적인 문제가 생길지 않생길지 몰라서 확신이 안섭니다. 물론 위에 대한 답변들은 프로젝트의 규모나 비즈니스 로직에 따라서 어떻게 분리할지, 통합할지 얘기가 달라지겠지만, 김영한 개발자님은 실무에서 어떻게 균형있게 분리하셨는지 경험을 듣고 싶습니다. 감사합니다.
- 미해결실전! 스프링 데이터 JPA
서로 다른 스키마(database) 에 있는 테이블의 연관관게 매핑 시 에러가 나는데 가능한 방법이 있나요?
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: xxx.a.model.User.preference, referenced property unknown: xxx.b.model.Preference.user 위와 같은 에러가 납니다. 같은 스키마에 있는 Entity 는 아무 문제 없이 연관관계 매핑이 잘 됩니다. 확인 부탁드립니다. @Entity @Table(name = "A.users") @Cacheable @JsonInclude(JsonInclude.Include.NON_NULL) class User( ::: @OneToOne(fetch = FetchType.LAZY, mappedBy = "user", cascade = [CascadeType.ALL]) var preference: Preference?, ::: ): BasePersistable() { } @Entity @Table(name = "B.preferences") @Cacheable @JsonInclude(JsonInclude.Include.NON_NULL) class Preference( ::: @JsonIgnore @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") var user: User?, ::: ): BasePersistable() { }
- 실전! 스프링 데이터 JPA
postman으로 테스트 시 접근권한 설정에 대해
삭제된 글입니다
- 해결됨실전! 스프링 데이터 JPA
분리된 일반 리포지토리 네이밍에 대한 질문입니다.
안녕하세요~ 김영한 강사님.기본편 부터 쭉 들으며 열정넘치신 강의 덕분에 많은 배움이 있었습니다.강의 중에 리포지토리 네이밍에 관해 궁금한것이 생겼는데요, 메인 리포지토리 분리할 경우 고려할 사항에 대해 말씀해주셨는데요,다음과 같이 정리해 보았습니다. * - Command(명령성) / Query(복잡한쿼리)* - CoreBusinessLogic(핵심비지니스로직) / ViewPrivateLogic(View계층쿼리로직)* - LifecycleStepedLogic(생성주기에 따른 절차적로직) 알려주신 QueryRepository 외에 분리되야 할 부분의 리포지토리의 이름들을 어떻게 구분하면될까요? Query : query.XxxQueryRepository Command : command.XxxCommandRepository CoreBussiness : ? LifecycleStepedLogic : ?? 추측해본 결과로는 이런방식인데요,1. 실무서 이런방식으로 구분하시는지,2. 강의 내용 외 분리시킬 리포지토리의 패키지와, 이름을 각각 어떤이름으로 사용하시는지3. 묶어서 사용할 경우, 어떤것들 끼리 묶어서 사용하시는지간략한 구체적인 사례들이 궁금합니다. 읽어주셔서 감사합니다!
- 미해결실전! 스프링 데이터 JPA
지연로딩 설정 예제에서 질문입니다.
[지연로딩] 설정 예제 관련 질문입니다. 기본편 강의에서는 지연로딩 설명시 member.getTeam()을 호출해도 팀에 있는 필드를 호출(member.getTeam().getName())하기 전까지는 SQL문이 호출되지 않았는데, 현재 예제에서는 member.getTeam()만 호출했는데도 SQL문이 실행되고 있는건 혹시 toString() 메서더를 호출때문인건가요?? toString()이 호출되면서 Team에 있는 뭔가가 호출했다고 인식해서 SQL문이 나간건가해서요. 감사합니다.
- 실전! 스프링 데이터 JPA
영속성컨텍스트 초기화 관련 질문
삭제된 글입니다
- 실전! 스프링 데이터 JPA
Dto 조회 관련 질문
삭제된 글입니다
- 미해결실전! 스프링 데이터 JPA
연관관계 매핑 클래스 조회 관련 질문입니다.
안녕하세요 명절은 잘 보내셨죠? 연휴에 그동안 손 놓고 있던 jpa 공부를 다시 해보고 있습니다 연관관계가 있는 클래스(예, 인사정보 + 급여정보)가 있다 했을때 처음 조회시 전체 인사 리스트만 조회를 하고 싶은데 repository 에서 조회를 해보면 각 개인별 급여까지 조인을 해서 쿼리가 나갑니다. 그냥 인사정보 테이블만 조회를 하고 싶은데 어떻게 하는지 감이 잘 안옴니다. class insa() { @Id private Long id; private String name; private String Phone; @OneToMany(mappedBy = "insa", fetch = FetchType.LAZY) private List<Payment> payments = new ArrayList<>(); } class Payment() { @Id private Long id; private LocalDate payment_date priavate Long amount; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "insa_id") priavate Insa insa; } 대략적인 클래스 구조는 이렇습니다.
- 미해결실전! 스프링 데이터 JPA
modelMapper에 대해 질문하고 싶습니다!
안녕하세요 영한님!!! 요즘 진행중인게 있어서 아직 새강의를 못들었어요 ㅜㅜ 요번 추석날때 외할머니집 가서 들으려고 하는데 기대가됩니다 ㅎㅎ! 이번 질문은 다름이 아니고 현재 modelMapper.map() 메서드를 이용해서 dto 에 있는 정보를 엔티티에 집어넣으려고 하는데, 해당 메서드가 엔티티에 setter 메서드 들이 존재할 때에만 작동을 하는 것 같더라구요 빌더패턴 또한 setter가 돌아가는데, setter사용을 지양해야하는데, 영한님의 경우에는 빌더패턴을 사용을 안하시나요? 그리고 modelMapper.map() 메서드도 지양하시는 편인가요?? 분명 해당 내용이 로드맵 강의 중 1개 강의에서 다뤘었고 현직자 분이 올린 질문글에도 빌더패턴과 관련해서 질문이 있었던걸로 기억해서 찾으려고하는데 안찾아지네요 ㅜ.ㅜ