묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
gropingBy 에 관하여입니다.
Set<Map.Entry<OrderQueryDto, List<OrderItemQueryDto>>> entries = flats.stream() .collect(groupingBy(o -> new OrderQueryDto(o.getOrderId(), o.getName(), o.getOrderDate(), o.getOrderStatus(), o.getAddress()), mapping(o -> new OrderItemQueryDto(o.getOrderId(), o.getItemName(), o.getOrderPrice(), o.getCount()), toList()))) .entrySet(); 여기서 OrderQueryDto 와 Map 의 키(groupingby 의 classifier)가 되는 것 같은데 아무리 구글링해봐도 객체인경우에는 @EqualsAndHashCode를 통해 여러 필드중 특정 필드를 지정해줘야한다? 이런말을 못 찾겠습니다... 질문도 좀 이상한것 같은데 제가 궁금한것은 어떤 키워드나 사이트를 참조해서 공부해야하는지 입니다... 찾아본 예시들도 다 그냥 일반적인 경우라 어떻게 equalshashcode를 알려줘야하는지 원천? 을 알고싶습니다.
-
미해결스프링 데이터 JPA
JPA를 이용하여 DB 데이터 이용하기
안녕하세요. 좋은 강의 감사 드립니다. 예를들어 DB에 Table A, B, C가 있고, Table A, B, C의 구조는 모두 다릅니다. 이때 아래와 같은 쿼리를 JPA를 이용하여 구현하고 싶습니다. SELECT * FROM A; SELECT * FROM B; SELECT * FROM C; (물론 select 외에도 많은 쿼리를 날릴 예정입니다^^) 이런경우 Table A, B, C에 대하여 각각 Controller A, Repository A, Entity A Controller B, Repository B, Entity B Controller C, Repository C, Entity C 를 따로 만들어 줘야 하는 건가요?! 3개의 테이블에서 모두 select *를 하려고 하기 때문에 REST API에서 "/api/{TABLE_NAME}"으로 변수를 받아 {TABLE_NAME}에 맞춰 해당하는 테이블의 값을 갖고오도록 할 수 있는건가요?! 그런식으로 구현할 경우 어떤 방식으로 해야 하나요?! 테이블이 너무 많은데 해당 테이블마다 Contoroller, Repository, Entity Class를 각각 생성하는것이 정말 효율적인 방법인지 문의드립니다. 감사합니다.
-
미해결실전! Querydsl
페치 조인과 on 절
안녕하세요! 4:39초 코드에서 질문 있습니다. 코드를 left조인으로 수정, where절 대신 on절 추가로 코드를 바꿔봤습니다. on절로 걸러진 것들을 left join하고 Lazy인 것을 페치 조인으로 땡겨올 것이라 예상했는데 오류가 나더라구요 혹시나 해서 활용편을 다시 봤는데 fetch join 예시에서는 on을 사용하지 않으셨더라구요 fetchjoin은 on절과 사용하지 못하는 건가요? List<Member> findMembers = queryFactory .selectFrom(member) .leftJoin(member.team, team).fetchJoin().on(team.name.eq("teamA")) .fetch();
-
미해결실전! 스프링 데이터 JPA
insert에 대해서 문의드립니다.
안녕하세요 김영한님:) 실무 적용 중에 궁금한게 있어서 문의 드리는데요. 보통 entity내에 joinColumn이든 mappedBy든 연관관계를 성립 시켜주는데요 그냥 단순히(?) 주문생성(주문관련된 테이블들에 insert이 이루어짐)만 이루어진다면 굳이 연관관계 맵핑을 하지 않고 각 주문관련 테이블들에 하나씩 컨트롤 하면서 insert 하는게 편리할 것 같다는 생각이 들어서.. 이런 접근 방법이 맞을까요? 물론 테이블 간 FK로 묶여 있는 테이블들도 있긴 한데 이런 경우는 위 처럼 하면 JPA의 객제관점으로 테이블에 접근 하는 관점에서는 어긋나는것 같기도 하고...영한님의 의견은 어떠실까요? 참고로 이 서비스는 사실상 주문관련 테이블은 insert만 이루어지고 select는 상태값 정도 조회하는 신규 api 입니다. 쿼리가 아닌 JPA 관점에서 접근하는 게 생각보다 딱 이거다 이런게 명확하지 않으닌까 생각이 진짜 많아지는것 같아요 ㅠㅠ 감사합나다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티가 아닌 DTO로 변환을 할 때 컬렉션 조회를 할 경우 @JsonIgnore가 필요로 하는상태가 생겼습니다.
API 개발 고급 - 컬렉션 조회 최적화에서 주문 조회 V2: 엔티티를 DTO를 변환 수업에서 4:30 에 No properties문제가 발생하여 저도 getter를 넣었으나 다음과 같은 에러가 발생했습니다. 구글링 한 결과 해당 컬렉션이 지연 로딩으로 인해 프록시 객체를 serialize하기 때문에 나는 에러라고 합니다. 그래서 제가 조치한 것은 해당 에러가 발생하는 @OneToMany필드를 @JsonIgnore를 했습니다. 다행히 정상 작동은 했으나 김영한님의 강의에서도 그렇고 제가 개인적으로 하는 프로젝트에서도 단 한번도 Entity에 @JsonIgnore를 사용하지 않았습니다. 단순히 DTO에 getter를 사용했는데 작동이 잘 되었습니다. 어떻게 하면 Entity에 @JsonIgnore를 사용하지 않고 문제를 해결할 수 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Entity 생성시 다른 애그리거트의 정보/로직이 필요한 경우 생성 방식의 선택 기준
안녕하세요. 이번 강의 내용에서 추가적인 요구사항을 적용해보는 중, 설계상 궁금증이 생겨 질문하게 되었습니다. jpashop에서는 환불제도 악용 회원의 주문을 일정 기간동안 금지할 수 있다는 요구사항을 추가했습니다. 이 변경된 요구사항을 위해, MemberStatus라는 VO를 Member 클래스에 추가했습니다. 결과적으로, Order 클래스를 생성함에 있어서 MemberStatus의 로직(다른 애그리거트의 Value Object)을 필요로 합니다. 이 때, 선택할 수 있는 생성 방식이 여러개가 떠올라서, 이들의 선택 기준에 대한 조언을 듣고 싶습니다. 첫번째 방식. 정적 팩토리 메서드의 매개변수로 추가 첫번째 방식은 생성시 필요한 정보를 가진 객체(MemberStatus)들을, 정적 팩토리 메서드의 매개변수로 전달합니다. 선택 기준은 객체(Order)를 생성함에 있어서, 특정 객체(MemberStatus)가 필요함을 명시적으로 알릴 수 있습니다. 생성로직을 해당 클래스가 전적으로 제어하는 것이 생성 로직을 한 곳에 더 응집시킬 수 있습니다. 이 두가지를 고려했습니다. 이 방식에서는 회원 차단에 따른동작 분기는 정적 팩토리 메서드 내에서 이루어집니다. 다만, Order를 생성하는데 있어서 MemberStatus 이외에도 협력해야 할 애그리거트들이 많이 존재하는 경우 Order 클래스가 너무 많은 의존성을 가지게 될 수 있다는 점이 우려됩니다. 두번째 방식. 생성을 위한 정보/로직을 가지고 있는 클래스가 생성을 담당 선택 기준은 Member가 Order를 생성하기 위한 로직(회원 차단 여부)을 제공합니다. 위 내용을 고려했습니다. 이 방식에서는 검증 통과 여부에 따른 동작 분기는 Member의 메서드 내에서 이루어집니다. 다만, 이 방식은 Member —> Order로의 불필요한 의존성을 만들어낼 수 있다고 우려했습니다 특히, 생성에 대한 책임을 맡는다는 것은 내부에 어떤 데이터를 가지고 있는지 전부 알아야 한다는 점에서 생각보다 과도한 의존성을 부여하고 있는 것 같습니다. 또한 협력해야 할 애그리거트가 많아질 수록, Member가 생성과 관련된 다른 클래스들에 대한 많은 의존성을 감당해야 한다는 점이 우려됩니다. 세번째 방식. 애그리거트를 생성하는 Domain Service를 만든다. 선택기준은 많은 의존성을 가져야 하는 생성 로직을 서비스에 담음으로서, 엔티티가 불필요한 의존성을 가지는 것을 방지합니다. 위 내용을 고려했습니다. 다만, 조금만 복잡해져도 도메인 서비스를 사용하고자 하는 유혹이 생겨서, 자칫하면 다른 로직들도 Domain Service로 구현해, Entity 자체의 응집성이 작아지는게 아닌가 우려스럽습니다. 질문 내용 정리 1. 각 생성 방식을 선택함에 있어서 미흡한 선택 기준에 대해서 조언 해주 실 수 있나요? 2. 또 첫번째, 두번째 방식이 우려하는 사항들은 현재의 사례에서는 잘 드러나지 않는 '잠정적인' 우려사항들인데, 실제로 이 우려사항들이 나타나기 전까지는 가장 간단한 구현(첫번째 혹은 두번째)을 그대로 사용해도 될까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA/Spring 동기화 문제와 관련하여 문의드립니다.
안녕하세요. 최근 JPA강의와 Spring boot강의를 연달아 들었는데요, 너무 좋은 강의 감사드립니다. 지금까지 영한님께 배운 내용을 토대로 Spring boot + jpa를 이용하여 사이드 프로젝트를 진행중인데, 동기화 문제와 관련해 문의드리고자 글남깁니다. 제가 문제를 겪은 시나리오는 아래 코드와 같습니다. 이 경우 여러 사용자가 동시에 요청하지 않는 경우에는 문제없이 잘 동작하지만, 동시에 많은 사용자가 접근하게 되는 경우에는 동기화 문제가 발생될 것으로 생각됩니다. ( 어떤 thread가 jpa context에 업데만 해놓고 commit하기전에 다른 스레드에서 쿼리를 통해 데이터를 가지고 온 경우.) 그렇다고 Controller layer에서 단순히 sync 키워드를 사용하게 되면 많은 사용자가 동시에 접근할때, 너무 느려지지 않을까 우려되기도 하는데, 어떤 방식으로 접근하는게 좋을지 조언 여쭙고자 질문드립니다. @Transactional boolean addInformation(Data data) { // 어떤 정보가 현재 DB에 쓰여져 있지 않은 경우에 한해 업데이트. List<Infomation> info infoRepository.findAllWith(data); if (info.size() > 1) return false; /// DB에 없으므로 db update ..... }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA에서의 올바른 엔티티 삭제 방법에 대해 질문 드립니다.
영한님 안녕하세요 :) 오래전에 공부 했던게 기억나지 않아서 예전에 봤던 강의를 돌고 돌다가 질문을 남기게 되었습니다. UPDATE는 더티체킹으로 변경하는 것에 대해서는 이해하고 적용을 하고 있는데, 효율적인 삭제 방법에 대해서는 감이 잡히지 않아서 이렇게 질문을 드립니다. 아래와 같은 간단한 상황을 예를 들면서 질문을 드리겠습니다. 위와 같은 도메인들이 있고, 각각은 모두 양방향 참조를 하고 있는 상황이라 가정 하겠습니다. 이 때 비즈니스 요구사항은 아래와 같습니다. 1. MEMBER 탈퇴 시에 해당 MEMBER에 연관된 POST도 모두 함께 삭제 되어야 한다. 2. 특정 CATEGORY 삭제 시 해당되는 POST는 남겨두고 CATEGORY만 삭제가 되어야 한다. 1번, 2번이 서로 조건이 상반 되는데요. 여기서 질문을 드리고 싶습니다. 질문 1) 1번 요구사항의 경우 orphanRemoval 혹은 Cascade를 통해 손쉽게 할 수 있을거 같습니다. Cascade를 적용 해놓았기 때문에 JpaRepository의 delete 메서드로 MEMBER를 지우면 해당되는 POST도 모두 지워질 듯 한데요. 이런 요구사항에서는 이렇게 지우는게 best practice가 맞는지 알고 싶습니다. 질문 2) Cascade All, orphanRemoval을 함께 사용하면 부모 엔티티와 자식 엔티티가 생명 주기를 함께 하면서 부모 엔티티가 자식 엔티티에 대한 모든 제어권을 가지는 것과 마찬가지라고 알고 있습니다. 그런데 앞선 질문1 처럼 삭제 할 때만 Cascade를 적용하고 싶다면 Cascade DELETE가 더 적합할 듯 한데요. 강의에서 DELETE는 많이 안쓴다고 언급 하셨습니다. DELETE를 잘 사용하지 않는 어떤 이유가 있는지 궁금 합니다! 질문 3) 위 요구사항에 의하면 MEMBER와는 다르게 CATEGORY는 부모 엔티티가 삭제 되어도 자식 엔티티인 POST를 그대로 남겨두어야 합니다. 이 때, CATEGORY의 POST List를 순회하면서 해당 POST에서 CATEGORY 와의 관계를 끊어주어야 할 듯 한데요. 반복문 또는 stream을 사용하면서 모든 관계를 끊어주어야 한다고 할 때, 성능상에 문제가 생기지는 않는지 궁금합니다. 예를 들어 CATEGORY가 10만개, 100만개의 POST와 연관관계를 가지고 있었다면, 이때는 어떤 방법으로 처리 하는지 알고 싶습니다. (JPQL로 직접 쿼리를 날리는 방법이 가장 먼저 떠오르는데, 무언가 JPA스러운(?) 우아한 방법이 있을거 같네요ㅎㅎ) 질문 4) 자식 엔티티를 가지지 않는 POST 엔티티를 삭제 할 때는 1. PostRepository의 delete를 직접 사용해서 지운다. 2. CATEGORY, MEMBER와의 관계를 null 처리 하고, 두 부모 엔티티 리스트에서 해당 POST를 지운다. 두 방법 모두 가능 가능할 듯 한데요. 어떻게 삭제를 하는 것이 best practice인지 알고 싶습니다. (+) 내용이 읽기 불편하실거 같아 개행을 많이 했는데도 게시판에 적용이 안되는 듯 하네요. 양해 부탁 드립니다ㅠㅠ 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO의 필요성이 와닿지 않습니다.
안녕하세요 강사님, 질문 드리겠습니다. DTO의 필요성에 대한 부분으로 "엔티티가 변경됐을 때 변경된 사항이 API 스펙에 적용되지 않아 API가 제대로 동작하지 않을 수 있다."라고 말씀해주셨는데요. 이러한 문제가 발생하는 V1에서는 받을 때는 Member, 돌려줄때는 CreateMemberResponse를 사용하고 있습니다. 그런데, 여기서 요청을 때, 응답을 줄 때 모두 Member를 사용해버린다면.. Member가 변경된다 하더라도 Response에서도 변경사항이 적용되기 때문에 문제가 없는 것 아닌가?? 하는 생각이 듭니다. 이 부분에 대한 추가설명을 부탁드리고 싶습니다. 감사합니다! ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 이어지는 강의들을 듣다보니 자연스럽게 이해되었습니다. 이해한 바를 바탕으로 질문에 대한 자답을 해보자면.. ************************************************** DTO를 반드시 사용해야 하는 이유는 다음과 같다. 1. DTO를 사용하지 않을 경우 엔티티의 변경에 의해 API 스펙이 변경될 수 있다. -> 엔티티와 API가 일대일 대응의 관계를 가진다면 엔티티에 수정이 일어날 때마다 API 스펙을 일일히 변경해줘야한다. 이는 매우 번거로운 작업이며 컴파일 에러로 이를 감지할 수 없기 때문에 에러 원인을 찾기가 어렵다. (DTO를 사용하면 DTO -> 엔티티 과정에서 컴파일 에러가 발생되므로 엔티티의 변경사항을 반드시 파악할 수 있다) 2. 하나의 엔티티에 대해서 API는 여러 개가 존재할 수 있다. -> 각각의 API가 요구하는 엔티티에 대한 데이터는 모두 다를 확률이 높다. 이때, 그냥 엔티티의 모든 정보를 넘겨줘버린다면 필요없는 데이터까지 받긴 하지만 필요한 건 전부 받은 셈이니 기능 동작에는 문제가 없을 것이다. 하지만 PW처럼 보안상 감추어야 할 정보까지 모두 JSON으로 함께 넘어가기 때문에 보안 문제가 발생할 수 있다. 엔티티 측에서 컬럼에 @JsonIgnore를 사용해 JSON 전달을 막을 수는 있지만 이는 엔티티가 API 스펙에 의존성을 갖게 되므로 좋지 않다. 유지보수가 복잡해질 뿐 아니라 다른 API에 대해서는 그때그때 또 변경을 해줘야 하는 쓸 데 없는 번거로움이 발생한다. 3. 엔티티를 그대로 넘겨줄 경우, 엔티티가 가진 정보 외의 것들은 넘겨주지 못한다. -> DTO를 사용하면 엔티티의 정보 외에 추가적으로 필요한 정보도 함께 넘겨줄 수 있다. ************************************************** 이 정도가 될 것 같습니다만.. 제가 놓친 내용이 있을까요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA 관계 설정
안녕하세요! HTTP강의듣고 이번에 JPA강의도 듣네요 명강의 감사합니다. 계속 고민하다 궁금한게 생겨서 여쭤봅니다. Post Reply 관계에서 N : 1 그래프 객체가 Reply에있는 상태에서 강의에서 공부한대로, 혼자공부한대로 최대한 단방향으로 설정하려합니다. 근데 항상 고민이 됬던 것은 Reply를 save할 때, 해당 Post를 갖고와서. 즉, url : post/1/reply - @PostMapping 으로 Reply를 만들고자할때 Service단에서 ( 여기서 코딩하는거라 오타가있을수도...) @Transactional public void saveReply(ReplyServiceDto serviceDto){ // 우선적으로 post : 1 을 불러와서 Post post = postRepository.find(serviceDto.getPostId); Reply reply = Reply.builder() .postId(post) .content(serviceDto.getContent) build(); replyRepository(reply); } 이런식으로 하면 항상 reply를 save할때 post를 갖고와야한다는 불편함이있습니다. 그리고 url또한 post/1/reply 가아닌 reply 로 할때는 어떻게해야하는지... 그래서 찾아본 결과 1. Reply 쪽에 private Long postId; 딱 이것만 설정해놓고 따로 Post는 설정안하는 방법이 있더라구요. 물론 이게 무결성에 안좋다는건 알고있습니다. 2. 반대로 그냥 Post post 부분을 referencedColumn , DynamicInsert를 통해 null 로 넣을수도있다는... ( 이부분을 계속 시도는해보지만 FK로 안되는중 ) 너무 길었습니다. 결론은 그겁니다. 어떻게 해야 DB에 가는 성능상의 이슈를 풀수있는가. reply를 저장할때마다 post를 꼭 불러와야하는가. 이것에 대한 문제입니다. 그리고 한 post에 여러 reply가 달린 프로젝트에선 양방향은 또 어떨지... 궁금합니다 항상 좋은강의 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA 매핑에 대해 궁금한게 있습니다.
보통 클래스 1개당 Entity 도 1개가 일반적인 상황인데 Mongo DB 같은경우 한 개의 Collection에 모든 Data 를 담으면 오히려 DB 역할이 퇴색되기 때문에 여러 Collection(Table)으로 나누곤 하는데요. 그러면 같은 Class 형태에 이름이 다른 경우는 어떻게 할 수 있을 까요? @Entity(name = "A")public class TestA { @Id private Long id; private String data;} @Entity(name = "B")public class TestA { @Id private Long id; private String data;} ... @Entity(name = "Z")public class TestA { @Id private Long id; private String data;} 위와 같이 A~Z 까지 테이블이 모두 동일한데 한개의 class 로 관리하고 싶습니다. only read 로만 사용할 건데 방법이 없을까요?
-
미해결실전! 스프링 데이터 JPA
update 관련해서 질문 드립니다.
안녕하세요. 김영한님:) 영한님의 JPA강의를 들으면서 실무에 바로바로 적용하는 중에 있는데요. 1. 엔티티에 setter를 사용 하지 않고 수정 및 데이터 저장시 entity내에 메소드를 만들어서 사용하는걸 권장해주셨는데, 큰 덩어리(?)에 entity에서 하나의 컬럼만 수정이 될 때도 말씀주신 메소드를 만들어서 사용 하는게 좋을까요? 2. prodQty = prodQty + 1 이렇게 바로 DB 컬럼만으로 update가 가능한것도 select한 것을 param으로 넘겨서 메소드로 만들어서 하는게 좋은걸까요? 개인적으로 repository내에 @Modifying을 이용해서 만드는게 더 가식적인고, 한개의 업데이트를 사용하기에도 더 편리해보인다는 라는 생각도 들어서요(물론 @Modifying은 벌크성 update에 주로 이용한다고 하셨지만...) JPA에 익숙하지 않는 습성(?)때문에 그렇게 느껴지는 부분일까요? 더티체킹이라는 JPA는 장점을 살리지 못한 생각일까요? 강의 들을때 이해가 퐉퐉! 되었는데 막상 실무에선 작은것도 많은 고민을 하게 되네요 ㅠㅠ 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문
1. id 값이getmapping으로 넘어오는 것도 관계가 궁급합니다. itemList.html에도 특정하게 id값을 넘겨달라 라고 보이는 문구도 없어보이는데 id값만 인자로 지정해서 넘어오는 것도 궁금합니다. 이어지는 부분이 없다고생각하는데 이런건 requestparam으로 받는게 맞지 않을까요? public String updateItemForm(@PathVariable("itemId") Long id, Model model){ Book one = (Book) itemService.findOne(id); 선생님 이부분에서 items/createItemForm 에서 정보를 입력받으면 submit버튼을 누르는 순간 postmapping 으로 값들이 담겨져서 밑의 코드처럼 bookform 형식의 값이담긴 form이 넘어와지게 된다고 하셨는데 booform의 클래스의 필드이름들이 html(createItemForm )태그에 타임리프 문법에 있는 name, id, isbn 등등 필드 이름과 매칭이 돼서 넘어오는줄 알았는데 bookform클래스의 필드 이름이 다르게 바껴도 값이 넘어오더라고요.... 어떻게 매칭이 되고 어떤 관계가 있어서 bookform에 잘 맞춰서 넘어오게되는지 궁금합니다. @PostMapping("/items/new")public String create(BookForm form){ Book book = new Book(); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); itemService.saveItem(book); return "redirect:/";}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
쓰레드 단위에서 업데이트
안녕하세요 늘 좋은 강의 감사합니다. 한 쓰레드에서 업데이트와 셀렉트를 하는데 업데이트가 되지 않습니다. 1. A테이블에서 find A엔티티에서 User테이블과 연관된 상태 @Column(name = "user_id", insertable = false, updatable = false)private Long userId;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "user_id", nullable = false, referencedColumnName = "id")@JsonIgnoreprivate User user; 2. User테이블의 컬럼 업데이트 user.setPhone1("010");userRepository.save(user); 를 하면 User테이블의 컬럼이 업데이트 되지 않습니다. 왜 그런걸까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 질문있습니다.
안녕하세요! 복습하다가 혼동되는 부분이 있어서 질문합니다! 15:57초 그림에서 질문입니다. Member member = em.getReference(Member.class, id); 이 시점에서 프록시 객체는 영속성 컨텍스트에 있는 건가요? 저 시점에 일단 프록시 객체가 영속성 컨텍스트에 있다가 getName이 호출되면 영속성 컨텍스트에 초기화 요청을 하게 되는 것으로 이해가 되는데 잘 이해한게 맞나요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
LOB를 위한 @OneToOne 혹은 @Basic
안녕하세요. 기본적으로 게시판을 만들 경우 LOB를 사용하게 됩니다. 그럼 Lazy를 사용하게 되는데 경험상 어떤 구조가 좋은지 알고 싶습니다. 지금까지는 @ElementCollection을 만들어서 Unique를 주어서 one to one 처럼사용을 하였습니다. 자구 눈에 거슬려서 리팩토링을 하고 싶은데 하나의 테이블에서 @Basic를 사용하는 것이 좋은지 아니면 서브 테이블을 만들고 @OneToOne 관계를 사용하는것이 좋은지 노하우를 공유하고 싶습니다. @OneToOne에서는 단방향을 사용하고 싶고 서브 테이블의 PK 컬럼은 PK이면서 FK로 설정하고 싶습니다. (즉, 메인 테이블의 PK값을 사용) 그럼, 수고하세요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA 연관관계 질문드립니다.
안녕하세요. JPA 강의를 듣고 연관관계부분 실습해보다 질문드립니다. 다대다 관계는 실무에서 사용하지 않는게 좋다고 하셔서 직접 중간테이블을 만들고 카테고리테이블, 카테고리_아이템 테이블, 아이템 테이블을 만들어 아래와 같이 구현해보려 했습니다. 간단히 엔티티 코드를 요약해보았습니다. 카테고리를 눌렀을 때 해당 카테고리에 Item 리스트를 불러오고 각각의 Item들에서도 카테고리 정보를 노출하고싶은데 어떻게 해야 할지 감이 잡히질 않습니다. categoryItem의 Repository에서 쿼리문으로 조인하여 가져오는것은 매우 복잡할것같고 Item이나 Category의 엔티티 안에 메서드를 만들어서 가져와보려했는데 제 기본기가 부족해서 그런지 도저히 방법이 떠오르질 않네요. 어떤식으로 구현을 해야좋을지 대략적인 흐름을 간단히 조언해주시면 감사하겠습니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
HTTP PUT, PATCH
안녕하세요! 좋은 강의 정말 잘 듣고있습니다 감사합니다! 다름이 아니라, 며칠 전 영한님이 찍으신 HTTP 강의를 들었습니다 해당 강의에서 PUT 과 PATCH 사용의 차이점에 대해서도 설명해 주셨는데 결론적으로 Member 리소스의 이름만 변경하는 현재 로직상 PUT 요청보다 PATCH 요청이 HTTP 스팩을 잘 맞춘(?) 설계라고 생각되는데 맞을까요? 또 저는 이렇게 스팩을 정확하게 맞춘 경우에는 (엔티티 데이터 수정시 변경감지를 사용하는 것이 권장되지만) 수정을 할 때 PUT 요청으로 수정이 오는경우, detached 된 엔티티 데이터를 수정하고 merge를 사용하여 업데이트를 하는 방법도 고려할 수 있겠다고 생각했습니다. 그리고 동시에 또 스팩에 너무 발이 묶이는 것도 결국은 비효율적이라는 생각도 들면서 머리가 복잡해지네요 결론적으로, 실무에서는 PUT 과 PATCH 를 HTTP 스팩에 정확히 맞추어 사용하기 보다, PUT으로 통일하여 사용함으로써 개발의 효율을 높이는 경우가 많을까요? 구글링을 하다보니 그런 글들을 본 기억이 있는것 같은데 영한님의 생각도 궁금하네요! 다시 한번 좋은 강의 감사합니다! :)
-
해결됨실전! Querydsl
MemberRepositoryImpl
좋은강의 감사드립니다! 처음으로 DB 를 사용함에 있어서 흥미를 가지게 되었네요!! 다름이 아니라 궁금한 점이 생겼는데 스프링 컨테이너가 MemberRepositoryImpl 을 사용하게 되는 것 같은데 컨테이너에 어떻게 해당 클래스가 빈으로 등록되는지 감이 잘 오지 않습니다. ㅠㅠ ****RepositryImpl 이라는 규약을 두고 해당 클래스를 빈으로 등록시켜주는 매커니즘일까요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영한센세 members를 가져오는 과정에 대해서 질문이 있습니다!!!
제가 이해한 바로는 Team team = new Team(); team.setName("TeamA"); entityManager.persist(team); Member member = new Member(); member.setUsername("member1"); member.setTeam(team); entityManager.persist(member);// team.getMembers().add(member);// entityManager.flush();// entityManager.clear(); Team findTeam = entityManager.find(Team.class, team.getId()); List<Member> members = findTeam.getMembers(); for (Member m : members) { System.out.println("member = " + m.getUsername()); } (위의 코드는 강의에서 작성해주셨던 코드와 동일합니다) 제가 이해한 바로는 "flush, clear를 하지 않음으로써 그 상태의 영속성 컨텍스트에 등록된 Team과 Member 기준으로 members의 값을 가져오기 때문에 System.out.println("member = " + m.getUsername()); 위 코드에 대한 출력이 되지 않는것으로 이해했습니다 ㅠㅠ!" 제가 이해한 바가 맞을까요 센세...? 이게 만약 맞다면 "추가적으로 " flush 와 clear를 하는 과정에서 "원래 commit 시점에 쿼리가 발생하여 1차 캐시 혹은 DB에 값을 적재하는것이 정상이지만 flush 를 사용하는 시점에 해당과정을 즉시 실행하여 데이터를 적재시키고 다음으로 clear를 함으로써 비영속상태로 만들어 getMembers(); 시에 JOIN쿼리를 발생시켜 members와 관련된 데이터를 반영시킨다고 이해하였습니다." 마지막으로 "getMembers를 하는 과정에서 Member들을 가져오는 join 쿼리를 날리는 과정은 무조건 비영속 상태이어야만 하는지가 궁금합니다." 질문이 많았죠 센세... 항상 넘나 재밌게 잘 보고 있습니다~!!! JPA를 실무에서 사용한적이 없어서... 이런저런 궁금한점이 참 많습니당... 항상 감사합니다!!!!!