30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA 책의 LAZY + JPQL 질문입니다.
좋은 강의 감사합니다.연관관계 fetch Type을 LAZY로 설정하고, JPQL을 이용해 하나의 엔티티만 조회하도록 하면, 실제로 연관 대상 엔티티를 사용하기 전까지는, query가 발생하지 않는 것으로 이해를 했는데, 다음과 같은 현상이 발생하는데 잘 이해가 가질 않습니다 도와주세요.. ㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
스트림관련식
ordersV6의 스트림식에서 orderQuerydto를 키로 하고 orderitemquerydto의 list를 밸류로 한것 같은데 multivaluemap이 아닌 그냥 map은 키가 같을때 밸류를 덥어씌우는것으로 알고 있는데 어떻게 밸류가 list<orderquerydto>형태로 저장될수 있는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
MemberApiController에 static으로 만들어져 있는 Result<T> 메소드를 OrderApiController에서 써도 상관없나요?
@GetMapping("/api/v2/orders")public MemberApiController.Result orderV2() { List<Order> orders = orderRepository.findAllByString(new OrderSearch()); List<OrderDto> collect = orders.stream() .map(o -> new OrderDto(o)).collect(Collectors.toList()); return new MemberApiController.Result(collect);} 이렇게 만들어지는데, 아무런 상관이없는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
pagination query dsl
안녕하세요 강사님, 페이지네이션 query dsl로 페치조인 적용시에 아래와 같은 pageable 쿼리는 사용이 힘든건가요!?``` public PageImpl<StoreVo> findStoresByNamePaging(String name, Pageable pageable) { JPQLQuery<StoreVo> query = jpaQueryFactory // 1) .select(Projections.fields(StoreVo.class, store.id , store.name , store.address )) .from(store) .where(store.name.eq(name)); long totalCount = query.fetchCount(); // 2) List<StoreVo> results = getQuerydsl().applyPagination(pageable, query).fetch(); // 3) return new PageImpl<>(results, pageable, totalCount); // 4) } ```
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
연관관계 편의 메서드/추가쿼리 관련 질문이 있습니다.
삭제된 글입니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
post를 통해서 넘어오는 데이터 처리 관련 부분 질문 드립니다
안녕하세요 강의 잘 듣고 있습니다 post를 통해서 json 객체가 넘어져 올때 만약 memeber 관련 데이터가 넘어올경우 @RequestBody를 사용해서 Member 클래스 매개변수에 주입이 되는 것으로 알고 있습니다. 이때 @PutMapping("/api/v2/members/{id}")public UpdateMemberResponse updateMemberResponse(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request){ memberService.update(id, request.getName()); Member member = memberService.findOne(id); return new UpdateMemberResponse(id, member.getName());} 부분에서 request 객체가 @Datastatic private class UpdateMemberRequest { private String name;} 에서 어떤 생성자를 통해서 주입이 되는지 잘 모르겠습니다. 해당 updateMemberRequest클래스에는 기본 생성자 와 @Data에 있는 RequiredArgsConstructor 정도만 있는 것으로 알고 있는데 name에 어느 방식으로 주입이 되는지 궁금합니다 추가로 RequiredArgsConstructor는 NotNull이나 final 로만 지정된 변수들에 대해서만 초기화가 진행되는 것으로 알고있는데 이게 notnull이 아니라 notnull에도 적용 되는지 궁금합니다 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional(readOnly = true)에 대해 궁금한 점 있습니다!
안녕하세요. 강의를 듣던 중 궁금한 것이 생겨서 질문 드립니다! @Service@Transactional(readOnly = true) 이 옵션을 Service 계층에만 붙이던데 사실 진짜 DB에 쿼리를 날리는 계층은 repository 계층인데 왜 Service 계층에 붙이는지 궁금합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원 수정 API에서 질문 있습니다!
memberService에서 어떤 메서드는 @Transactional 어노테이션을 붙이고 어떤 메서드는 안붙이던데 기준이 무엇인지 궁금합니다! @Transactional //데이터를 변경하는 메서드에서 readOnly = true 옵션을 붙이면 변경이 되지 않는다!public Long join(Member member) { validateDuplicateMember(member); //중복 회원 검증 memberRepository.save(member); return member.getId();}private void validateDuplicateMember(Member member) { List<Member> findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()) { throw new IllegalStateException("이미 존재하는 회원입니다."); }}/**전체 회원 조회 **/public List<Member> findMembers() { return memberRepository.findAll();}public Member findOne(Long memberId) { return memberRepository.findOne(memberId);}@Transactionalpublic void update(Long id, String name) { Member member = memberRepository.findOne(id); member.setName(name);} 또한 MemberApiController에서 어떤 메서드는 static을 붙이고 어떤 메서드를 안붙였던데 기준이 궁금합니다! 마지막으로 이건 기초 자바 문법인거 같은데 왜 외부에서 MemberApiController 객체를 생성한 뒤 memberApiController.createMemberResponse or .CreateMemberRequest 와 같이 @Data가 붙은 메서드는 접근이 불가능한지 궁금합니다! @Datastatic class CreateMemberRequest { private String name;}@Dataclass CreateMemberResponse { private Long id; public CreateMemberResponse(Long id) { this.id = id; }}
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
커맨드와 쿼리의 구분 후 쿼리문 한번 더 실행에서의 궁금증...
강의에서 영한님께서는 커맨드와 쿼리를 구분하는 것을 선호하신다고 하셨습니다. 그래서 알아보니 이런걸 CQRS라고 하던데 회원 정보를 update시 update command 메소드 실행 후 보통같으면 update메소드 자체의 반환값으로 member객체나 member id를 받는데, 이것을 명령과 질의를 구분해 memberService.update() 후 memberService.findOne을 실행하면 결과적으로 쿼리문을 한번 더 실행을 하게 되잖아요? update 메소드 내에서도 findOne이라는 메소드를 호출하니깐요. 이렇게 명령과 질의를 분리하였지만 그 대가로 쿼리문을 한번 더 호출하게 된 셈인데 쿼리문을 한번 더 호출해서 명령과 질의를 구분하는 것이 많이 효율적인 패턴인가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto 관련 질문있습니다.
SimpleOrderDto같은 Dto일 경우 내부 클래스 말고 그냥 외 부에 따로 클래스 만들어 놓고 사용해도 되나요?? 안된다면 굳이 내부 클래스로 만들면 좋은 점은 뭐가 있는지 궁 금합니다!!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
소스코드 제공여부
안녕하세요, 1편에서는 소스코드를 파일로 제공받았는데요. 2편은 소스코드를 제공하지 않는것인가요? 원래 저같은 경우는 개발하기전에 레거시 코드를 먼저 분석하고 뜯고 즐기며 개발하는 성격이라.. 소스코드가 파일로 주어지지 않아서 좀 불편하네요ㅠㅠ 회사를 다니면서 강의를 처음부터 다 따라듣기 시간적으로 힘들어서 코드를 쭉 혼자 분석하다가 막히는 파트에 대해서 강의를 들으려 신청했습니다.. 파일로 소스코드 제공해주시는거 검토 한번 부탁드려도 될까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트랜잭션과 영속성 컨텍스트
안녕하세요 선생님! 선생님의 강의를 듣고 프로젝트를 하다가 의문점이 생겨서 질문을 드립니다. 예를들어 하나의 컨트롤러에서 여러개의 서비스 계층의 트랜잭션을 사용할 경우 컨트롤러에서 사용되는 트랜잭션은 하나의 영속성 컨텍스트에서 관리 되나요? 즉, 컨트롤러 계층에서 생성되는 트랜잭션은 view에 넘어가기 전까지 같은 영속성 컨텍스트에 존재하는가요? 아니면 컨트롤러에서 영속성 컨텍스트는 트랜잭션과 1:1 인가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
데이터 JPA 를 듣다가 다시 와서 질문남깁니다~
아래에 질문 두개 있습니다! order , orderItem , item 엔티티를 자연쿼리 + projection 을이용해서 페이징을 해봤는데요! projectionDto JPARespository controller 일대 다대 일 관계를 자연쿼리 프로젝션 으로 페이징을 size=2 로하여 2건만 가져오려 합니다. 결과는 같은 아이디인 order_id : 4인 2개의 값이 나왔는데요, order를 기준으로 조회하여 페이징 하려면 데이터가 누락이 될텐데 질문 1) 자연쿼리 + 프로젝션으로는 컬렉션 조인 페이징을 할 수 없지만 그냥 조회용으로만은 사용가능한건가요~? (아니면 이것또한(자연+프로젝션 이용) 다대일은 다대일 끼리 조인, Lazy로딩을 이용해서 일대다를 조인시키는 방식 여기 강의에 V5 방식처럼 만들면 할수 있나요?(해봤는데 포스트맨 출력형태는 아래 사진과 같더군요 ㅠㅠ) 자연쿼리+ 프로젝션도 한계가있다고 하신거같았는데 이것도그중하나 일까요? 아니면 다른방식이있는지 궁금합니다! -------------------------------------------------------- 제가원하는 형태는 지금 v5강의처럼 이런형태였거든요! 질문 2) 다대일 ,일대일 부분끼리 조인을 하고 Lazy로딩을 이용해서 나머지 일대 다 관계를 조인하는 방식 이잖아요 ! 혹시 이렇게 컬렉션 조인을 페이징 하는방법이 쿼리DSL 부분에도 나오나요~?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
repository은 트랜젝션이 기본인가요?
예전에는 service단에서 trasaction을 걸어서 했었는데 repository에 기본적으로 @trasantional이 적용되어있나요?? 그렇기 때문에 db에서 쿼리를 해올수잇는건지 궁금합니다 ㅎㅎ 추가적으로 repository에 transation이 걸려있다면 왜 service 클래스에 이중으로 @trasational 어노테이션을 거는건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티를 조회하는 방식과 dto를 직접조회하는 방식의 차이
강의를 보다 궁금한 점이 있어 질문 드립니다. v1,v2,v3 같은 경우에 엔티티를 조회한 뒤, dto로 변경하는 방식을 사용하였다면, v4부터는 dto를 직접 조회하는 방식을 사용하고 있는데 dto를 직접 조회하는 방식이 코드가 복잡한데 엔티티를 조회후 dto로 변환하는 방식에 비해 가지는 장점이 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
05:08초 쯤 orderItem부분에 대해 질문드립니다 !
해당부분이 NULL이 나오는건 Dto 생성자에서 orderItems = order.getOrderItems(); 했을때 OrderItems가 lazy로딩이고 프록시객체를 통해 OrderItems에 더이상 탐색을 안했기때문에 안나온게 맞나요 ??(DB쿼리가 안나갔기에) 강사님께서 엔티티 이기 때문에 안나온다 하셨는데 그게 결국 제가 말한부분에 의한건지 궁금해서 질문드립니다 !
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Hibernate5Module가 기본상태일때
하이버네이트 모듈이 기본상태일때 orderItem을 DB에서 자꾸 쿼리하는게 로그상에 보여서 질문드리는데요 이 상태에서 Order엔티티에 "orderItems" 는 1대다 관계로 묶여있어서 당연히 기본이 lazy로딩이라서 orderItems에 접근하지 않는한 DB에서 쿼리하지 않을줄 알았는데 쿼리가 나가더라구요 ..? 왜 그런걸까요 ..?? 제가 배운 내용으로는 이해가 가지 않아서 ㅠㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
pk가 아닌 컬럼과 join으로 인한 문제
해당 질문에 대한 답변에 대한 상세 질문 드립니다. 이전질문 https://www.inflearn.com/questions/255380 이전질문 답변 안녕하세요. Mincheol Ji님 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요. 추가로 다음 내용도 코멘트 부탁드립니다. 1. 실행 방법을 알려주세요. 2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요. 감사합니다. ------------------------------------------------------------------------------------------------ https://drive.google.com/file/d/1UzfBJvvymO-zxou_Ue3SKcLka_i933aZ/view?usp=sharing 샘플 프로젝트를 작성하여 만들었습니다. 1. 해당 스프링 부트를 싱행하여 localhost:8080/save rest api를 통해 데이터가 입력됩니다. 2. localhost:8080/select rest api를 통해 동록된 팀 & 멤버 정보를 조회합니다. 해당 문제점 List<Team> teams = teamRepository.findAll(); 위의 코드를 통해 team을 쿼리하여 팀 객체에 있는 맴버 객체를 가져올때 batch fetch size 옵션을 통하여 in쿼리를 통해 member쿼리로 member 정보를 가지고 옵니다. 여기까지는 문제가 없으나 member에 대한 in쿼리가 실행되고 member의 team에 대한 쿼리가 각각 실행되는 문제가 있습니다. @ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL) @JoinColumn(name = "TEAM_ID", referencedColumnName = "TEAM_ID", insertable = false, updatable = false) private Team team; member 엔티티에서 조인 컬럼이 pk가 아닌 컬럼과 조인을 하여 양방향을 해주었을때 이러한 문제가 나타나고 있습니다. pk가 아닌 컬럼과 조인을 해야하는 상황이 있는데 어떻게 해야할까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
[API개발 기본 -> 회원수정API] 강의에 대한 질문입니다.
안녕하세요, 유익한 강의 잘듣고있습니다. 다름이 아니라 이해가 안되는 부분이 있어서 글을 올립니다. public UpdateMemberResponse updateMemberV2( @PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { memberService.update(id, request.getName()); //--> ①번 //--> 디버그 브레이크 포인트를 걸어놓은 상태에서 name 필드 강제로 변경 //-->②번 Member findMember = memberService.findOne(id);//-->③번 return new UpdateMemberResponse(findMember.getId(), findMember.getName()); } ①번 소스가 실행 ( member테이블의 name필드를 '홍길동1' 값으로 변경 ) 1) begin tran 실행 확인 2) select * frm member where id=17 --//실행확인 3) update member set name='홍길동1' where id=17 --//실행확인 4) commit tran 실행확인 ②번 소스에서 브레이크 포인트 설정 1) member 테이블 강제로 업데이트 실행 update member set name='초기화' where id=17 ③번 소스실행 1) 데이터베이스에서 select 문장이 실행되지 않음 확인 : name 값은 '홍길동1' 으로 조회가 됩니다. # 위의 확인 내용에 대한 질문사항입니다. 1) ①번과 ③번은 별도의 트렌젝션에서 실행되었는데, ③번소스 에서는 왜? 데이터베이스에 쿼리가 실행되지 않는 것인가요? 2) ③번소스 에서 강제로 데이터베이스에서 Select가 실행하여 최신데이터를 받아오고싶은경우 어떻게 해야하나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
영속성 컨텍스트 관련 질문 드립니다!
선생님 안녕하세요^^ 강의 너무 잘 듣고 있는 수강생 입니다. API 개발 부분 수강하던 중 궁금증이 생겨 문의 드립니다. 기존 JPA 활용1 강의에서는 @Transactional이 적용되어있는 Service를 통해 Repository에 접근하여 해당 메서드의 트랜잭션 관리를 해주었었는데요. 이번 강의 같은 경우 Controller로 직접 관리를 하다보니 어느 시점에 트랜잭션 커밋이 되는지 좀 헷갈려 질문 드립니다. 추가로, Controller -> Service -> Repository 순으로 접근한다고 가정하여 프로젝트를 만든다고 할 때, Controller : api 요청/반환 관리, requestForm. responseForm 변형 관리 Service : 비즈니스 로직 관리, Repository 접근 관리 Repository : DB 접근 관리 라고 컨셉을 잡은 후 강의와 같이 구현한다고 생각해보았는데요. 이 때, Controller에서 Form 변형 관리를 한다고 하면 Service에서 Repository에 접근해 Lazy loading으로 데이터를 부른 후 Controller에 전달 했을 때, 불러온 데이터가 준영속 상태가 되어 V2 형식에서의 Form 변형은 사용하지 못하는게 아닌가 하는 생각이 들었습니다. 이럴 때를 대비하여 V3 같은 방식을 사용한다 라고 이해하였는데 잘 이해한 것일까요??