안녕하세요. 강사님 먼저 항상 좋은 강의를 해주셔서 감사합니다. 제가 실무에서는 Mybatis만 사용하다, 강사님 강의를 통해서 처음 JPA를 접하고, 개인 프로젝트에서 처음 JPA를 사용하고 있습니다. 강의에서 Entity를 직접 반환을 하면 안된다고 하신걸로 기억을 하는데, API 개발 시 리턴을 할 때만 직접 Entity로만 반환을 하면 안되지는 일반 MVC 형태의 개발을 할 때는 직접 Entity를 반환하는 방식을 실무에서 사용을 하시는지 궁금합니다. 저는 평소 Controller에서 파라미터를 받을 때 @ModelAttribute를 이용해 DTO를 통해 파라미터를 받는 방식을 주로 이용하는데, JPA 사용 시 @ModelAttribute를 이용하여 직접 Entity를 받는 방식은 좋은 방식인지 궁금하여 질문 드립니다. 감사합니다.
VScode 실행 후 터미널로 가상환경 설정이 안되는 이유를 모르겠어서 질문드립니다...! VS code로 바탕화면에 빈 폴더를 지정해놓고 터미널에 python -m venv myvenv 이렇게 입력했는데 가상환경은 생성되지 않고 "python"이라는 메세지말고는 아무일도 안 일어납니다.... 터미널을 git bash랑 명령 프롬프트로 바꿔서 해보았는데 결과는 똑같았고 Anaconda를 삭제하고 python 을 재설치 해보았는데도 결과는 똑같습니다ㅠㅠ 혹시 어떤게 문제인지 알려주실 수 있으실까요...?
안녕하세요! 영한 선생님 스프링 클라우드와 JPA를 사용하여 간단한 마이크로서비스 구축을 하는 연습을 하는 도중 궁금증이 생겨서 질문을 올리게 되었습니다. 예를 들면 대출 (Rental)이라는 애그리거트는 반납도서와 대출도서라는 엔티티를 연관관계로 맺고 있습니다. 대출 (1) ---- (N) 반납 도서 대출 (1) ---- (N) 대출 도서 영속성 전이(cascade) + 고아 객체(orphanRemoval)를 통해서 대출 애그리거트 를 통해서 반납 도서와 대출 도서를 생명주기를 관리하고 있습니다. 제가 궁금한 점은 지연로딩 전략을 사용해서 컬렉션 패치 조인을 사용할 때 너비로든 깊이로든 2개 이상의 컬렉션 페치조인을 사용하면 안된다고 알고 있습니다. 그럼 지연로딩 전략을 통해서 대출과 반납도서 대출도서를 조회해오는 방법은 어떻게 하면 좋을지 고민입니다. 대출과 반납도서를 먼저 페치조인으로 조회해오고 다음 대출에 속한 대출 도서를 조회해오면 된다고 생각하고 있습니다. -> 대출에 속한 대출 도서를 조회할 때는 리포지토리를 통해 조회하는게 좋을까요 아니면 대출 애그리거트에서 대출 도서를 사용하는 시점에 초기화해서 사용하는게 좋을까요?? 또 궁금한 점이 애그리거트 루트 패턴을 사용할 때는 애그리거트에 대한 리포지토리만 생성하고 하위 엔티티에 대한 리포지토리를 생성할 필요가 있는지 궁금합니다. 질문을 두서 없이 작성한 거 같아서 정리하자면 1. 애그리거트 루트 패턴을 사용할 때 애그리거트에서 2개의 컬렉션 (지연 로딩) 조회 전략 2. 애그리거트 루트 패턴을 사용할 때의 리포지토리 생성전략 3. 영속성 전이와 고아 객체를 통해 자식의 생명주기를 관리하고 있는데 자식리포지토리를 조회용으로 생성해도 되는지?? 입니다.! ---------- 추가 상품 서비스와 주문 서비스에서 주문 가능한 상품이 여러개라고 할 때 주문 (1) - 주문_상품 (N) || (서비스 분리) 상품 으로 만들어지고 주문_상품이라는 엔티티에서 상품의 ID를 가지고 있으면 된다고 생각합니다. 만약 어떠한 주문의 주문 상품목록을 조회한다고하면 주문 서비스에서 주문_상품의 ID 리스트를 Feign-Client 같은 동기 API 호출을 통해서 상품 서비스에서 IN 쿼리로 상품들의 정보를 조회한 뒤에 응답을 받고 응답 받은 데이터를 클라이언트에게 보내주는 방법이 맞는지 궁굼합니다. 정리하자면 주문서비스에서 주문한 상품의 목록에 대한 정보를 클라이언트에게 보내줄 때 상품 서비스에서 상품 Id List를 IN쿼리로 조회를 해서 응답하는 것이 맞는지 입니다!
욜로나 레티나넷 등을 이용하여 사진이나 영상 분석을 하고 싶습니다. 최종적인 목표는 사진 혹은 영상의 특정 부분을 구분하는 것입니다. (ex. 여러 개의 사진 혹은 영상 중 사람이 있는 것과 없는 것을 판단하여 사람이 있는 영상(사진)과 사람이 없는 영상(사진) 구분하기) 제가 머신러닝을 한번도 공부한 적이 없어서 어떤 방식으로 공부를 해야 좋을지 갈피가 잡히지 않습니다. 컴퓨터공학 전공이고 웹 프로그램을 업으로 삼고 있기는 하지만 통계학은 한번도 접해본 적이 없고, 수학은 20여년 전 고교 졸업 후 해본적 없습니다. 파이썬 역시 아주 가벼운 프로그램을 작성해 본 경험만 있습니다. [파이썬 머신러닝 완벽 가이드] -> [딥러닝 컴퓨터 비전 완벽 가이드] 순서로 강의를 볼 계획이고 현재 [파이썬 머신러닝 완벽 가이드]의 5장의 회귀를 공부하고 있습니다. 처음에 영상만 보다가 이해하기가 힘이 들어 교재를 구매해 함께 보면서 스터디 중입니다. [파이썬 머신러닝 완벽 가이드]를 완강한 후 [딥러닝 컴퓨터 비전 완벽 가이드]를 시작해야 하나요? 또한, 강의와 질문-답변들을 보면서 100% 이해한다기 보다는 어렴풋하게 개념을 잡고 간다는 생각으로 공부를 하고 있는데 이게 맞는지도 궁금합니다. 소소 코드는 최대한 이해하려고 노력하고 있습니다. 마지막으로 추천해 주시고 싶은 다른 강의나 책, 사이트가 있으시면 같이 보겠습니다. 감사합니다. 참고로, 두 달 전 머신러닝 스터디를 시작할 때 1. [파이썬 머신러닝 완벽 가이드] 의 3장 평가까지 완강 2. [딥러닝 컴퓨터 비전 완벽 가이드] 의 욜로 부분을 보면서 강의에 나온 소스로 테스트 성공 3. 리눅스 서버에 욜로5 설치 후 테스트 실패 - (https://datacook.tistory.com/60 사이트를 참조하여 학습을 시키고 학습이 잘 되었는지 테스트를 하는데 원하는 결과를 얻지 못했습니다.) 의욕만 많아서 급하게 테스트를 하니 디버깅 하기도 어렵고 어디서 어떻게 손을 봐야할지 잘 모르겠어서 다시 천천히 [파이썬 머신러닝 완벽 가이드] 를 공부하고 있는 중입니다.
안녕하세요 영한님! 간단한 주문 조회v2 질문이 있습니다. @GetMapping ( "/api/v2/simple-orders" ) public Result ordersV2 () { List<Order> orders = orderService .findAll( new OrderSearch()) ; // 프록시가 들어있는 orde 객체 List<SimpleOrderDto> collect = orders.stream().map(o -> new SimpleOrderDto(o.getId() , o.getMember().getName() , o.getOrderDate() , o.getStatus() , o.getDelivery().getAddress())). collect(Collectors. toList ()) ; return new Result(collect) ; } 위의 v2 api를 실행하면 문제없이 5개의 쿼리문이 나가는 것을 확인했습니다. name을 조회하는 쿼리는 예상했던데로 단순 조회 쿼리인 select member0_.member_id as member_i1_5_0_, member0_.city as city2_5_0_, member0_.street as street3_5_0_, member0_.zipcode as zipcode4_5_0_, member0_.name as name5_5_0_ from member member0_ where member0_.member_id=? 와 같이 나가지만. delivery 엔티티에 접근할때 select delivery0_.delivery_id as delivery1_2_0_, delivery0_.city as city2_2_0_, delivery0_.street as street3_2_0_, delivery0_.zipcode as zipcode4_2_0_, delivery0_.status as status5_2_0_, order1_.orders_id as orders_i1_6_1_, order1_.delivery_id as delivery4_6_1_, order1_.member_id as member_i5_6_1_, order1_.order_date as order_da2_6_1_, order1_.status as status3_6_1_ from delivery delivery0_ left outer join orders order1_ on delivery0_.delivery_id=order1_.delivery_id where delivery0_.delivery_id=? 위와 같이 외부 조인문이 나가는 것을 확인했습니다. 마치 패치조인을 한거 같은 전혀 예상치 못한 쿼리문이여서 질문을 드립니다. 또한 모두 lazy로 설정을 했습니다. 혹시 데이터베이스의 방언차이 때문일까요? mysql 사용중입니다.
안녕하세요 김영한 팀장님! 검색 엔진 등에서 변경을 인지한다는 의미가 와닿지 않아서 문의드립니다. 예시처럼 영구 변경된 URL이 있을 경우 사용자가 이전 URL로 요청하게 되면, 최초 1회 영구 리다이렉션으로 새로운 Location 응답 -> 브라우저에서 자동으로 리다이렉트해서 변경된 URL로 요청을 진행한다고 이해했습니다. 1) 이후에도 사용자는 URL 변경됨을 인지하지 못하므로 (자동 리다이렉트로 인해) 기존 URL로 계속 요청을 하게 될 텐데 이를 브라우저에서 새로운 경로를 쿠키등의 형태로 가지고 있어, 서버의 리다이렉션 없이 새로운 경로로 Request를 보낸다는 의미인가요? 2) 1)이 맞다면, 정확히는 '검색 엔진'이 아닌, 브라우저에서 변경을 인지하는게 아닐까요? 검색 엔진은 네이버 / 구글같은 검색 웹사이트를 의미하는 것으로만 알고 있는데, 웹사이트 자체가 이러한 기능을 가진다는 것과, 강의 내용과 연관성에 대해 조금 의문이 들어서 문의드렸습니다. 얕은 지식을 가지고 있어 너무 기본적인 질문을 드리는 거 같네요 ㅠㅠ 양해 부탁 드립니다.
안녕하세요 문득 궁금한점이 생겨서 질문해봅니다. 항상 사용하고 버려야 한다면 AutoCloseable 지원하여 try-with-resource 문을 사용할 수 있도록 도움을 주면 좋을 것 같다고 생각이 들었지만 시용해볼려고 하니 지원하지 않고있습니다. 이에 따른 이유가 혹시 있는지 궁금해서 질문해봅니당.!
totalPrice라는 변수를 만들어서 처음 주문 들어왔을떄 계산해서 넣어두고, 주문 취소라던지 하는 변경이 일어나면 그때 상황에 맞게 업데이트 해주는게 맞는거 아닌가요?? 일반적으로 변경보다는 조회가 빈번하니까 변경되었을때 미리 계산해두고 조회할떄는 가져다 쓰기만 하는게 더 맞지않나 싶어서요=_=
선생님께서 양방향으로 처리하는 것보다 단방향으로 처리하는 것이 더 좋다고 말씀하셨는데 그렇다면 한가지 예시로 Member와 order의 관계에서 회원으로 로그인해서 주문내역을 확인하고 싶을 경우 양방향의 경우 다이렉트로 Member.getOrders로 처리가 가능하지만 단방향의 경우 em.find(Order.class, member.getId())를 통해 한번더 쿼리문을 날려야 되는데 이게 더 맞는 사용방법이라는 말씀이신가요??? 아직 실무 JPA경험이 없어서 왜 그 부분이 더 좋은지 이해가 가질 않습니다.. 강의에서 말씀하시는 끊어줘야 된다는 부분이 어떠한 이유로 끊어줘야되는지 여쭤봐도될까요??
안녕하세요 선생님, JPA 책이 와서 복습을 하던 도중 remove() 동작 방식과 관련해 의문점이 생겨 질문드립니다. 엔티티를 삭제하기 위해 remove() 시에 삭제 쿼리가 지연 SQL 저장소로 가는 것으로 이해를 했습니다. 이를 아래와 같은 예시를 통해 확인했습니다. 예시1 Member member = new Member() ; member.setName( "Kim" ) ; em.persist(member) ; em.remove(member) ; System. out .println( "======commit=======" ) ; tx.commit() ; <실행결과> 그런데 다음과 같은 코드를 실행할 경우에는 insert 쿼리 하나만 발생하는 것을 확인했습니다. 예시2 try { Member member = new Member() ; member.setName( "Kim" ) ; em.persist(member) ; em.remove(member) ; em.persist(member) ; // 추가 코드 System. out .println( "======commit=======" ) ; tx.commit() ; <실행결과> remove()시에 지연 SQL 저장소에 delete 쿼리가 저장되어 delete 쿼리가 발생해야한다고 생각하는데 그렇지 않았습니다. remove() 후에 나온 persist()로 인해 지연 SQL 저장소에 있는 delete 쿼리를 지워주는 것인가요? 물론, 위 실행결과 처럼 동작하는 것이 성능상 옳다고 생각하나 어떻게 이렇게 동작하게 되는 것인지 궁금합니다. ================================================================ 추가적으로 영속성 컨텍스트 자체는 언제 생성되고 소멸하는지도 궁금합니다. Member member = new Member() ; member.setName( "Kim" ) ; em.persist(member) ; System. out .println( "======commit=======" ) ; tx.commit() ; Member foundMember = em.find(Member. class, 1L ) ; System. out .println( "member1.getName() = " + foundMember.getName()) ; 위와 같은 코드를 실행했을 때, 커밋 후에도 영속성 컨텍스트를 이용할 수 있는 것 같습니다.
안녕하세요, 김영한 강사님. 양방향 매핑 관계에서 '주인이 아닌쪽은 읽기만 가능하다' 라고 설명해 주셨는데요, 이 의미가 잘 이해가 가지 않습니다. 저는 이를 이해하기로, Member(하인) - Order(주인) 관계에서 List<Order> orders = member.getOrders(); 로 가져온 order 객체들에 대해 수정이 불가능하다라고 이해를 했는데요, 간단한 실험을 해보니 orders.forEach(order -> { order.setOrderStatus(OrderStatus.CANCEL); entityManager.persist(order); }); 의 방법으로 order들이 update 되는 것을 확인할 수가 있었습니다. 반대로 order.getMember(); 로 가져온 member들에도 수정이 가능했고요. 혹시 제가 잘못 이해하고 있는것일까요? 감사합니다.
안녕하세요. 강의를 듣고 사이드 프로젝트를 하면서 `p6spy` 를 잘 활용하고 있는데요. 강의 내용 중에 prod 에서는 성능 관련을 확인 후 사용해야 된다는 내용을 보고 궁금해졌습니다. 처음에는 그냥 `build.gradle` 에서 prod 설정에만 안뜨게 하면 되겠지 (dev, test 에서는 되는 것을 의도) 라고 생각했는데, profile 에 따라 `build.gradle` 이 동적으로 움직이는 건 application.xml 이랑은 다르게 좀 어렵더라구요; 그래서 질문은 2개 입니다. 1. profile 에 따라 `build.gradle` 의 설정 (특히 dependency) 이 동적으로 움직이게 하는 것을 어떻게 하면 좋을까요? 2. `p6spy` 와 같은 외부 라이브러리의 성능 검증은 어떻게 하는 것이 좋을까요?
안녕하세요. 영한님. size 함수의 결과값을 확인하고 싶어서 똑같이 입력했는데 for(Integer s : result) 부분에서 s = 0 이 출력되지 않습니다. 아래 코드에서 어느 부분이 잘못됐는지 알려주시면 감사하겠습니다. try { Member member1 = new Member() ; member1.setUsername( " 관리자 1" ) ; em.persist(member1) ; Member member2 = new Member() ; member2.setUsername( " 관리자 2" ) ; em.persist(member2) ; em.flush() ; em.clear() ; String query= "select size(t. members ) from Team t" ; List<Integer> result = em.createQuery(query , Integer. class ) .getResultList() ; for (Integer s : result){ System. out .println( "s = " + s) ; } ; tx.commit() ; }
안녕하세요!! 컨트롤러를 보다가 단순 호기심이 생겨서요 MemberController와 ItemController에서는 회원가입을 하거나 상품을 등록할때, MemberForm클래스나 ItemForm클래스를 만들어서 파라미터값으로 넘겨주셨습니다. 그런데 OrderController에서는 주문을 할 때 OrderForm을 만들지 않고, 하나하나 @RequestParam으로 넘겨준 특별한 이유가 궁금해서 질문드렸어요 별다른 이유가 없으면 OrderForm을 만들어서 넘겨도 되는거죠??
풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, 배포까지) [풀스택 Part3]
안녕하세요 도커강의 듣고 있는 학생입니다. 현재 웹서버 이해와 도커로 웹서버 구축하기의 nginx 웹서버 설정 이해 1 을 듣고있는데요, 3분 38초쯤 나오는 nginx 설치하는 부분에 있어서 질문이 있습니다. apt-get install nginx=1.18.0-0ubuntu1 명령어로 nginx를 install 하는데, 다음과 같은 에러가 나옵니다. E: Version '1.18.0-0ubuntu1' for 'nginx' was not found 다음과 같은 에러가 나옵니다. 위 버전 말고 다른 버전을 설치해야할까요? 추가: 방금 명령어를 버전 빼고 입력했는데, 해당 버전의 nginx가 설치되었습니다. apt-get install nginx로 1.18.0 버전 설치된걸 확인했는데, 뒤에 버전명 입력하면 위 에러가 뜨는 이유가 궁금합니다.