묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하십니까 강사님 주문하기에서 질문이 있습니다
주문하기 service입니다. 여기보시면 itemId로 하나의 아이템을 조회해서 ---> OrderItem에 파라미터로 item을 등록하지 않습니까? 궁금한 점이 있는데 만약 하나의 아이템이 아니라, 여러가지 아이템을 한번에 주문하고 싶다면 위 코드를 어떻게 바꿔야 할까요? Order의 createOrder은 파라미터를 (OrderItem... orderitem)으로 여러가지 아이템들이 올 수 있도록 만들어놨는데, 여러가지 아이템을 등록하기 위해서는 OrderItem의 createOrderItem을 어떻게 바꿔야 하는지 궁금합니다.
-
미해결실전! Querydsl
좋은강의감사합니다 ! 질문이있습니다.
querydsl의 벌크성쿼리는 스프링데이터에서의 @Modifying(clearAutomatically = true) 와 같은 기능은 없는것인가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
현업에서 PM, DM 을 나눠서 사용하는 경우가 있나요?
영한님 안녕하세요!혹시 현업에서 PM(persistence model), DM(domain model)을 나눠서 개발하신 경우가 있을까요? 관련 article: https://www.mehdi-khalili.com/orm-anti-patterns-part-4-persistence-domain-model
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블 설계에 대해서
항상 좋은 수업 감사합니다! JPA와는 관계가 먼 질문일 수도 있는데요..order_item 테이블의 역할이 무엇인지 이해가 잘안됩니다ㅜorder 테이블과 item 테이블 간 N:M 관계를 풀기위해 생성된 테이블인건 알겠는데요,order_item 테이블 안에 다른 속성들(orderPrice, count) 등을 추가해서 사용하는 이유나 이렇게 해야하는 기준을 알 수 있을까요?? order_item 테이블 내 orderPrice(주문가격), count(주문수량) 속성들을 order 테이블에 넣어줘도 되는거 아닌가요? 이 질문을 드린 이유가,개인 프로젝트를 위해 멘토님 수업을 바탕으로 삼아 테이블 설계를 하면서 장바구니 기능을 추가하려고 있습니다. (아직 개발 초기라 위의 설계도을 검증하지 못했지만,)추가할 속성을 '장바구니' 테이블 과 '장바구니_상품' 테이블 중 어디에 넣어줘야 괜찮은 설계가 될지 고민이 생기면서 경험많으신 멘토님의 의견을 감히 여쭤보게 되었습니다ㅜ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
내부 조인, 외부 조인에 대해 질문 드립니다.
선생님, 설명하기에 앞서 제가 생각하는 부분이 잘못 된 곳이 있다면, 정정 부탁드립니다... 제가 알기로는 테이블을 조인 할때 무슨 조건으로 조인할지를 정하는 on 절은 필수인 것으로 알고 있습니다. 예를 들어 아래와 같은 sql 은 join 에 대한 on 절이 없기 때문에에러가 발생한다고 생각합니다.(실제로도 테스트 해보니 에러가 발생하였습니다.) 그렇지만, 아래에 코드처럼 연관관계로 조인을 하면, 에러가 발생하지 않습니다. 실제 데이터 베이스 쿼리를 확인해 보니, on 절 자동으로 추가가 되더군요. jpa 에서는 연관관계로 조인을 하면 자동으로 외래키와 매칭되는 테이블의 pk 를 찾아서 on 절을 설정해주는 것 같은데 제 생각이 맞나요.?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO class 선언 및 update 시 id 조회 질문
안녕하세요. 두 가지 질문이 있어 이렇게 질문을 적어봅니다. 1. inner class를 왜 static으로 선언하나요? private으로 하면 물론 코드가 돌아가는 방식은 다르지만, 잘 돌아가더라구요. 혹시 실무에 적용한다면 어떤 문제점이 있나요? (다음 강의에서는 아무 것도 붙이지 않은 상태로 작성하신 것을 보니, 별로 임팩트 있는 부분은 아닌가보군요 ^^;) 2. 이건 간단한 질문인데, updateMemberV2 메서드에서 merberService.update 후, id로 update를 날렸음에도 id를 다시 찾아오시더라구요. id로 Member를 찾고 그로부터 getId를 다시 하는 이유가 있을까요? (수강자료에서 updateMemberV2 메서드 부분에 fineOne이라고 오타 있습니다.!) 항상 좋은 강의 감사드립니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 목록 검색 시, 랜더링 과정에서 LAZY 로딩 발생에 대한 질문
안녕하세요. 김영한 강사님! 기본편부터 이번 챕터까지 덕분에 잘 배우고 있습니다! 제가 배웠던 내용을 되짚어 보면 프록시 객체가 초기화 되는 시점이 영속성 컨텍스트가 관리하는 중에 해당 프록시의 id를 제외한 다른 속성들을 호출하면 되는 것으로 이해하고 있는데요. 아니면 초기화 메소드를 사용하던가. 여기서 의문이 orderService를 통해 조회해서 받아온 List<Order> orders는 프록시 객체를 담은채로 반환이 되는 걸로 추측이 되는데. model.addAttribute()로 orders를 담은 후 "orders/orderList" 페이지를 렌더링 하는 과정 중에 <table class="table table-striped"> <thead> <tr> <th>#</th> <th>회원명</th> <th>대표상품 이름</th> <th>대표상품 주문가격</th> <th>대표상품 주문수량</th> <th>상태</th> <th>일시</th> <th></th> </tr> </thead> <tbody> <tr th:each="item : ${orders}"> <td th:text="${item.id}"></td> <td th:text="${item.member.username}"></td> <td th:text="${item.orderItems[0].item.name}"></td> <td th:text="${item.orderItems[0].orderPrice}"></td> <td th:text="${item.orderItems[0].count}"></td> <td th:text="${item.status}"></td> <td th:text="${item.orderDate}"></td> <td><a th:if="${item.status.name() == 'ORDER'}" href="#" th:href="'javascript:cancel('+${item.id}+')'" class="btn btn-danger">CANCEL</a></td> </tr> </tbody> </table> item.member.username에서 member를 lazy 로딩하고 item.orderItems[0].item.name에서 orderItem과 item을 lazy 로딩을 하는 것을 확인할 수 있었습니다. 저는 이번 과정을 통해서 @Transactional 어노테이션이 붙은 Service 로직 내에서만 영속성 컨텍스트가 엔티티를 관리해준다고 나름대로 이해를 했었는데, Service 영역을 벗어난 곳에서도 영속성 컨텍스트가 지연 로딩을 하는 것을 보니 조금 당혹스럽더라구요! 그래서 핵심 질문은 프록시 객체들이 @Transactional이 붙은 Service 로직 내를 벗어났는데 왜 lazy 로딩이 신기하게도 잘 발생하는지?가 궁금합니다 ㅎㅎ! 추가) 같은 member, 같은 item을 가진 order를 2개 조회해봤는데요! 1차 캐시에 의해 lazy 로딩이 첫번째 table 목록을 구성하는데만 발생하고 두번째 목록을 구성할 때는 member와 item 엔티티를 받는데에 select 쿼리를 새로 DB에 안 날리고 영속성 컨텍스트의 1차 캐시에 등록된 엔티티를 반환 받는 것도 확인이 되네요.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
IDENTITY 와 SEQUENCE
좋은강의 감사드립니다 :) 만약 IDENTITY 와 SEQUENCE 둘 다 사용할 수 있는DB라면 성능적인 측면에서 SEQUENCE 전략을 사용하는게 네트워크를 덜 타니, 좋을 것 같은데 맞을까요? 그리고, IDENTITY를 사용하는 DB가 있는만큼(mysql - auto_increment 등 ) 분명히 장점도 존재할거 같은데 IDENTITY가 SEQUENCE 에 비해 가지는 장점은 무엇이 있을지 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
3:12초에 emf로 변수 고치고 실행을 눌렀는데 연결이 아예 안되구 에러가 떠요 ㅠㅠ
h2에 접속할때 에러가 나서 알려주신대로 수정하고 다시 jdbc:h2:tcp://localhost/~/test로 셋팅한다음 실행시켰는데두 에러가 나네요 .. 제일 먼저( WARNING: javax.persistence.spi::No valid providers found.) 요 문구가 뜨면서 선생님께서 빌드하신 내용대로 안나오구 막혀버리네요 ㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV OFF 에 대한 질문
영한님 강의 언제나 감사한 마음으로 들으며 공부하고있습니다! 질문이있습니다. OSIV OFF 를 하여 영속성컨텍스트 생존 범위를 Service까지로 제한하게되면, Lazy 초기화를 하는 코드들을 전부 Service로 밀어 넣으면 되는 것인가요? 저는 초보 프론트엔지니어라서 그런지,, 서버는 보통 템플릿을 사용하지않고, RestAPI 를 만드는 쪽에 익숙하여서 강의내용과 이부분이 조금 다른것같아 혼동이 옵니다. 다시한번 정리하면, 저같은 경우에는 (Restful api 를 만드는 경우) 모든 지연로딩 초기화 코드는 service 혹은 repository에 밀어넣고 여기서 끝내어, Controller에서는 service에서 넘어온 것을 반환하는 것 정도까지 하면 될까요? 언제나 영한님의 친절한 답변 감사합니다 !!+ 추가질문으로 이런 코드는 service, repository 둘중 어디에 넣는 것이 더 좋을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA와 Java 주의사항에 대한 여러 가지 질문
이번 강의에서는 평범한 도큐먼트만으로는 알 수 없는 정보를 알게 된 것 같아, 감사의 말씀드립니다.! 이 강의에서 몇 가지 JPA와 Java 사용에 대한 질문이 있습니다. 1. 전부 지연로딩으로 바꾸는 것이 좋다고 거듭 강조 주셨는데, 그렇다면 JPA는 왜 default로 EAGER를 사용하는 것인가요? EAGER를 default로 사용한다는 것은, 이렇게 사용하는 경우도 있고 장점도 있다는 것을 의미하는 것 같아 여쭤봅니다.! LAZY를 쓰지 않았을 때의 장점은 어떤 것들이 있나요? 2. Setter를 사용하지 않는 멤버변수에 한해 final을 사용하지 않는 이유는 무엇인가요? 아래 컬렉션 질문과 별개로 setter가 없는 모든 변수에 대해 궁금합니다. 3. 지금까지 필드 초기화는 생성자에서의 초기화와 다른 점이 우선순위만 다르다고 알고 있었습니다. 필드 초기화 -> 생성자 순으로 호출된다고 알고 있고, 단지 스타일 차이라고만 알고 있었습니다. 혹시 필드 초기화가 생성자 초기화보다 안전한 이유가 있을까요? 단순히 여러 생성자가 있을 때에 코드가 빠지는 실수를 막아준다는 이유 밖에 떠오르지 않는데, 다른 이유가 있는지 궁금합니다. 4. 양방향 연관관계 메서드에서 한 쪽만 연관관계 메서드를 적용시키면, 이를 모르고 호출하는 입장에서는 연관관계 메서드가 적용되지 않은 쪽을 호출하여 문제가 될 수도 있을 것 같다는 생각이 듭니다. Delivery <-> Order 관계를 예를 들면, 지금은 Order쪽에만 넣어서 Order에서 setDelivery할 때 자동으로 Delivery쪽도 해주었는데, “연관관계 메서드 해놨겠지”하며 Delivery에서 setOrder를 호출하면 문제가 될 것 같습니다. 물론 의미상 Order에서 Delivery와 OrderItem을 관리하는 것이 맞지만, 이렇게 직관적인 관계만 있지는 않을 것 같아서 그럴 때엔 어떻게 하는지 궁금합니다. 5. Address 부분 설명하실 때, 가볍게 "기본 생성자는 안 썼으면 좋겠지만 private으로 하면 안 되니 protected로 한다."라고 말씀주셨는데, 이러한 부분은 실제로 document를 읽지 않는 이상 알 수 없을 것 같아요. 강의를 듣는 사람 입장에서는 그렇구나 하고 넘길 수 있지만, 처음에 protected를 써야한다는 것은 그냥 단순히 private을 썼을 때 컴파일 오류를 통해 알게 되신건가요? (JPA에서 protected를 써야하는지 어떻게 알았냐가 메인 질문이라기보단, 이렇게 minor하지만 직관을 깨는 것들을 어떻게 보통 알게 되시는지가 궁금합니다.) 이 부분은 개인적으로 백엔드 팀장님으로의 김영한 선생님께 드리는 질문인데, 백엔드 쪽 공부를 하면서 느끼는 부분 중 하나가, 이렇게 tool을 사용하다보면 제 로직을 논리적으로 단단하게 짜는 시간도 있겠지만 그에 못지 않게 tool을 사용하기 위해 알아보는 시간도 적지 않게 쓰일 것 같은 느낌이 듭니다. 이러한 부분은 백엔드 개발이면 당연하게 받아들이는 부분인지 궁금합니다. 정말 길지만, 업무에 차질이 가지 않는 시간에 답변주시면 정말 감사하겠습니다. :)
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO 와 Form
Controller DTO SERVICE Book Entity 위와 같은 DTO를 만들어 넘겨주는 형태가 1.Controller->Service로 넘어가는 파라메터가 많을경우 최적화가 잘 되어있는 형태가 맞는지 궁금합니다! 2.BookForm 과 DTO의 분리 이 예제에서는 BookForm 과 ItemUpdateDTO 과 같지만, 실무에서는뷰에서 사용하는 객체와, DTO 객체는 필드가 다르거나 다른 로직이 들어가게 되므로 분리하는것으로 이해하였습니다. 만약 뷰와 서비스에서 필요로하는 필드가 같다면, 뷰에서 받는 파라메터를 BookForm이 아닌 UpdateItemDTO로 받아도 괜찮은지 궁금합니다
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
질문 드립니다!
안녕하세요. 강의 잘 듣고 있습니다. 페치조인 강의중, 일대다 상황에서의 페이징에서는 두가지 방법이 있는데, 일대다를 다대일 상황으로 바꾸어 쓰는것 과 배치사이즈를 선언해서 사용하는 방법이 있는데, 일대다 상황에서 다대일 상황으로 바꿀수 있다면 굳이 배치 사이즈를 이용해서 페이징을 하지않고, 다대일로 바꾸어 사용하는것이 성능 상 더 좋은걸까요 ? ?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강사님 용어가 헷갈려서 질문드려요~
안녕하세요 강사님 늘 잘 보고 있습니다*^^* 용어가 좀 헷갈려서 질문드려요.ㅠㅠ 세타조인 == 연관관계가 없는 조인 인건가요? 앞부분에 세타조인 설명하실 때 카르테시안곱 얘기하셔서 세타조인 == 크로스조인이고 연관관계가 없는 조인을 하려면 세타조인을 해야한다. 라고 이해를 했는데.. 구글링해보니 세타조인 == 크로스조인은 아닌 거 같아서요.. 세타조인에서 '=' 연산자를 쓴것이 동등 조인이라는데.. 동등 조인은 또 내부 조인에 속하는 종류 중 하나라고 하고..?? ㅜㅜ 제 의문을 계속 정리해보니 세타조인의 개념이 정확히 뭔지 모르겠는게 문제인거 같습니다. 세타조인이란 무엇이며 <세타조인>과 <연관관계가 없는 조인>의 관계를 어떻게 이해하면 좋을까요?? 장황한 질문 죄송합니다. 읽어주셔 감사합니다...
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
UUID 질문 드립니다.
안녕하세요 강사님 실무에서 RDBMS를 사용하면서 시퀀스는 많이 사용을 해보았는데요 UUID 관련해서 궁금해서 질문을 하게 되었습니다. (제가 시퀀스라고 말한 부분은 mysql auto_increment, 오라클 시퀀스, mssql identity를 의미한다고 생각하시면 될 것 같아요) JPA 책을 찾아보았는데 책에 UUID 관련 설명은 없는 듯 보여서요 1. 실무에서 혹시 UUID를 적용해 보신 적이 있으신지 궁금해서요 1.1. 적용하였다면 어떠한 장점이 있어서 적용하였는지 궁금합니다.(시퀀스로 해도 되는데 왜 UUID를 적용하였을까?) 2.JPA에 UUID를 적용해서 사용하면 시퀀스로 적용하였을 때 보다 장점이 있을까요? (게시판을 예로 들면 id 값을 내려 줘야 하는데 UUID로 값을 내려 주게 되면 다음 게시글에 대한 추측이 어려워서 비정상적인 접근 같은 게 많이 줄 것 같기도 하고요 그리고 mysql로 보면 big integer보다 더 많은 시퀀스를 생성할 수 있을 것 같긴 하지만 big integer도 다 못쓰는 게 현실이라서요) 3. JPA는 결국 RDBMS에서 생성해 준 시퀀스 값을 통해서 제어하는 부분이기 때문에 결국 RDBMS에 성능? 또는 지원전략에 따라서 UUID의 쓰임새가 달라진다고 생각하면 될까요? 활용2 편을 보다가 갑자기 궁금해서 질문을 남기게 되었습니다. 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
junit으로 회원등록 API 테스트 코드를 만들어 보았습니다.
junit으로 회원 등록 API 테스트 코드를 만들어 보았습니다. @ExtendWith(SpringExtension.class)@SpringBootTest@AutoConfigureMockMvcclass MemberApiControllerTest { @Autowired MockMvc mockMvc; @Autowired ObjectMapper objectMapper;// @BeforeEach// void setUp(@Autowired MemberApiController memberApiController){// mockMvc = MockMvcBuilders.standaloneSetup(memberApiController).build();// } @Test @DisplayName("회원_등록API_V1") void 회원_등록ApiV1() throws Exception { //given MemberDto memberDto = new MemberDto("회원1"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v1/members") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")); } @Data @AllArgsConstructor static class MemberDto { private String name; } @Test @DisplayName("회원_등록API_V2") void 회원_등록ApiV2() throws Exception { //given MemberDto memberDto = new MemberDto("회원2"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v2/members") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")); } @Test @DisplayName("회원정보_업데이트V2") void 회원정보_업데이트V2() throws Exception { //given MemberDto memberDto = new MemberDto("회원3"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v2/members/1") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")) .andExpect(jsonPath("$.name").value("회원3")); } } 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
질문이있습니다..
강의를 듣다가 관계형 db와 기본적인 sql 지식이 부족하다고느껴 책들을 찾아봤습니다 http://www.yes24.com/Product/Goods/69775589 http://www.yes24.com/Product/Goods/67882661 두가지중에 어떤것이 나을까요? 그리고 여기 나와있는 목차들말고도 추가로 알아야 할부분이있을까요?? 서점에 직접 가서 봤는데도 어떤것이 필요할지 그림이 안그려져서 구입못하고 나왔습니다 ㅠㅠ
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
시퀀스 전략에서의 allocationSize에 대해
많은 분들이 비슷한 질문을 해주셨지만 개인적으로 아직 정확하게 이해가 잡히지 않아 저도 다시 한번 질문올려봅니다. 네트워크 성능을 고려하기위해 allocationSize 설정을 이용하는 것이고,'allocationSize = 50'으로 설정하면, (처음 시점에) 애플리케이션 시점 JPA가 메모리에 미리 1~50개를 확보하여 next_val이 51이 되기 전까지는 DB 서버 통신을 하지 않는다.라고 이해하면 되는 것인가요? 그리고, 올려주신 PDF 내용 내 allocationSize에 대한 설명에 '데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값 을 반드시 1로 설정해야 한다'라는 말은 DB 서버 시점의 시퀀스의 next_val 값이 1씩 증가해야하는 상황이라면 'allocationSize = 1'로 설정해야 한다는 이야기인 것 같은데, 어떠한 상황에 이를 설정해야하는지 그 예시 상황을 알고 싶습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@Column 속성 insertable, updatable에 대해서
어떤 컬럼을 수정했을 때란 것이 컬럼 명, 타입 등을 수정할 때를 의미하는 것 같은데, insertable=false 같은 경우에는 컬럼을 수정한 이후 들어오는 데이터를 막는 것이고,updatable=false 경우는 컬럼을 수정한 이후 기존에 저장되어 있던 데이터를 수정할 수 없게끔 막는다. 라고 이해하면 되는거죠? 추가적으로 insertable=false, updatable=false 설정 각각 언제 사용할 수 있는지 대표적인 예시가 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
findByName의 result를 List로 받는 이유가 있나요?
service 코드를 개발 할 때 중복 되는 member_name이 있는지 validate를 해줘서 결국 member_name이 unique 값이 될텐데 , getSingleResult를 이용하여 아래와 같이 작성하지 않는 이유가 있나요? public Member findByName(String name){ return em.createQuery("select m from Member m where m.name = :name",Member.class) .setParameter("name",name) .getSingleResult();}