안녕하세요! 강의영상에서는 가능한 많은 예제를 보여주려고 다양한 연관관계 매핑을 사용했다고 하셨는데 단방향을 지향하는 실무 관점에서 궁금한게 있습니다. Order N:1 Member => 다대일 단방향이 가능한지 OrderItem N:1 Order => 다대일 단방향이 가능한지 Order와 Delivery 관계에서 단방향이 안되는 이유 Item과 Category를 일대다, 다대일로 풀어내는게 맞는지 답변해주시면 감사하겠습니다!!
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의에서 이세계의 집 주소 별칭을 현실 세계의 도메인으로 빗대어 설명해 주신 부분에 대한 질문입니다. 1. 강의를 들을 때 ' 서울 에 있는 컴퓨터' == 강의를 듣고 있는 내 노트북 , ' 대전 에 있는 컴퓨터' == 인프런 사이트의 서버 쯤으로 이해하는 게 맞을까요? 처음에는 간단하게 친구 컴퓨터와 내 컴퓨터 사이의 카카오톡으로 데이터를 주고 받는 상황 으로 이해 헀는데, '대전에 있는 컴퓨터'의 주소에 도메인 이름이 붙는 걸 보니 이해가 안 가더라구요. 내 컴퓨터에 spring.com 이라는 주소 이름이 붙을리가 없으니까요.친구 컴퓨터와 내 컴퓨터 사이의 카카오톡 통신은 '친구 노트북와 카카오 서버와의 통신' + '카카오 서버와 내 노트북의 통신' 으로 나뉜다고 이해하는 게 맞을까요? 만약 위에서 카카오톡을 예시로 든 내용이 맞는 내용이라면 추가로 더 궁금한 게 있습니다. 채팅 어플에선 어떤 HTTP Method를 사용하나요? 내가 친구에게 카톡을 보낸다면 POST 같은 메소드를 쓸 수 있을 것 같긴한데, 그건 내가 '보내기' 버튼을 이용해서 카카오 서버에 요청하는 것으로 생각해봤습니다. 그런데 친구에게서 오는 카톡 은 어떻게 나에게 오는 건지는 도무지 생각이 나질 않습니다. 내 컴퓨터에서 카톡 서버에 실시간으로 계속해서 GET과 같은 메소드로 요청 을 하는 것은 아닌 것 같아서요. 카카오와 같은 서버가 내 컴퓨터로 요청하는 경우 가 있다면, 내 컴퓨터는 따로 도메인 주소를 갖고 있지 않으니 그냥 내 컴퓨터 IP를 사용 하나요?
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의를 따라 하면서 단계마다 깃에도 커밋을 하고 있는데요 코드가 변경될 때마다 workspace.xml 라는 파일은 건들지 않았는데도 계속 변경이 되어서 깃에 감지가 되더라구요. ChatGPT 한테 물어보니까 "이 파일에는 개발 환경 설정과 관련된 정보가 포함되어 있으며, 이 정보는 다른 개발자나 다른 컴퓨터에서는 필요하지 않을 수 있습니다." 라고 하고 깃에 안 올려도 된다고 하길래 .gitignore 에 .idea/workspace.xml 이렇게 추가를 해줬는데도 자꾸 깃에 감지가 됩니다. 혹시 .gitignore에 추가했다고 바로 적용이 안되는 건지, 적용하는 방법이 따로 있는지 궁금합니다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요 강사님. 15강. 유저 업데이트 API, 삭제 API 예외 처리 하기 유저 업데이트 API, 삭제 API 에 예외 처리해 주는 부분을 수강 중인데요 궁금한 점이 있어서 질문 남깁니다. 존재하지 않는 사용자에 대해서 수정하거나 삭제하려는 상황에 대해서 예외 처리를 해주고 있는데, '존재하지 않는 사용자에 대해서 수정하거나 삭제하려는 경우' 가 포스트맨을 이용하여 요청할 때는 일어날 수도 있는 경우겠지만, 사용자는 웹 UI를 이용해서 수정, 삭제하기 때문에 저런 경우가 아예 생기지가 않을 것 같은데, (화면에 보이는 유저 리스트에서 선택하여 수정하거나 삭제하기 때문에) 그런데도 예외 처리를 해줘야 하는 이유가 있는지 궁금합니다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요! Person 테이블 생성 시 adress_id bigint로 설정하였고, Person 클래스에는 private Address adress;를 사용하였습니다. DB에 Person을 저장할 때, 제 코드의 Unknown column 'address_id'라는 오류는 위의 차이에서 발생한 것 같습니다. 제가 놓치고 있는 부분이 궁금해서 문의드립니다!
비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
강의보는중에 workbench 에서 hostname을 작성하고 나머지 정보도 작성해서 test Connection을 해줘도 비밀번호가 틀리다고 하여 노션에 있는 방법대로 비밀번호를 초기화하는 중에 사진과 같이 신택스 오류가 났다고 하는데 도저희 어디가 잘못되었는지 몰라서 남겼습니다. 비밀번호는 강의 내용 그대로 따라 했습니다
Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
안녕하세요. Backpressure의 Drop 전략에서 버퍼가 비워질 때까지 Emit된 데이터가 Drop이 된다는 것은 이해했습니다. 그런데 1번 데이터가 subscriber에게 전달되어서 처리가 되면 버퍼에 자리가 한 자리 비게 되는데 왜 데이터가 계속 Drop이 되는건가요? (코드 실습에서 onNext()함수가 호출이 되어도 255,256,257 ~ 1024까지 모두 드랍됨) | 1, 2 | <-------- 3 듣랍 | 2, |. <-------- 4 드랍 (여기서 왜 4번 데이터는 안들어가나요?) | 5, 6 | Buffer DROP-LATEST를 보면 | 1, 2 | <---- 3들어오는 중 버퍼 가득 차서 drop | 2, 4 | <------ 1번이 버퍼에서 나가고 한 자리가 비어서 4번이 들어와짐 이런식으로 동작을 하는데 Drop은 이렇게 동작하지 않는 것 같아 버퍼가 어떻게 동작하는지 궁금하여 질문드립니다.
안녕하세요. 보통 RDS나 DB와 ELB로 연결하기 보다 active - standby로 구성하는 것을 봤습니다. 그런데 위와 같이 ALB는 퍼블릭에 두고 웹 서버를 로드 밸런싱 하고 DB는 NLB는 프라이빗에 두고 로드 밸런싱 하는 것이 구성에 맞지 않는지 궁금합니다. 감사합니다.
실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
강사 님께서는 객체를 인스턴스화 하실 때, 생성자를 사용하거나, 정적 팩토리 메서드를 사용하는 방식 2가지를 이용하셨는데 혹시 코틀린에서 builder 패턴을 사용하는건 어떻게 생각하시나요?? defalut 파라미터를 이용하고 naming을 통해 builder패턴 처럼 사용할 수 는 있겠지만 java에서 builder패턴을 통해 객체를 만들었던 것에 비하면 불편하다는 생각이듭니다. 조언 해주시면 감사하겠습니다.
안녕하세요, 강의를 보고 공부를하다 궁금한 점이 생겨 질문드립니다. 제가 예측한 강의 내용으로는, "경쟁 상태 예시(재고 수량)에 대하여 레디스 를 활용한다." 라고 예측 했습니다. 이에 대하여, "레디스는 싱글 스레드 기반이니깐, 락킹 없이 해당 작업이 가능할 것" 이라고 추측하였는데요, 그러나 제가 생각지 못한 레디스 lock 과 관련된 내용을 접하게 되어 신기하면서도 또 궁금한 부분이 생겨 질문드립니다. 레디스 락 전략이 사용되는 이유와 예시를 조금더 들어볼 수 있을까요? 혹은 이와 관련하여 추가적으로 공부해볼 수 있는 자료를추천해주시면 감사하겠습니다.
비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
안녕하세요. 강의를 모두 수강하고 웹사이트를 배포한 상태입니다. 지도에 마커도 잘 찍히고 인포윈도우 정보도 잘 뜨고 있는 상태입니다. 원래 강의에서는 인포윈도우에 유튜브 섬네일과 영상 링크가 올라가도록 코드를 짜주셨는데 혹시 저 섬네일과 주소를 네이버 지도 상에 있는 주소와 섬네일로 고칠 수 있는지 궁금해서 질문을 남깁니다. 제가 다니고 있는 학교 주변의 식당 정보들이 마커에 찍히고 그 마커를 찍었을 때 네이버 지도에 나와있는 섬네일과 주소 링크를 달고 싶습니다. 위 코드는 선생님께서 최종 배포하신 코드 자료에 올려주신 코드중에 인포윈도우 창에 올라가는 정보들을 설정하는 부분입니다(map.js 파일) 이 부분을 어떻게 잘 수정하면 될 거 같은데 어떻게 하면 좋을까요? 네이버 지도에서 제 학교 주변의 중국집을 검색해서 식당중 하나를 클릭하면 https://map.naver.com/p/search/%ED%95%9C%EA%B2%BD%EB%8C%80%20%EC%A4%91%EA%B5%AD%EC%A7%91/place/37921639?c=15.00,0,0,0,dh&placePath=%3Fentry%253Dbmp 이러한 웹주소가 뜨고 그 식당옆에 있는 섬네일을 클릭하면 https://map.naver.com/p/search/%ED%95%9C%EA%B2%BD%EB%8C%80%20%EC%A4%91%EA%B5%AD%EC%A7%91/place/37921639?c=15.00,0,0,0,dh&placePath=%2Fphoto%3Fentry%253Dbmp 이런식의 주소가 주소창에 표시가 됩니다. 이 주소 형식을 어떻게 잘 이용해서 위에 올린 인포윈도우 코드에 적용을 하면 강의 자료처럼 유튜브의 섬네일과 주소가 아닌 네이버 지도의 섬네일과 주소를 불러올 수 있을거 같은데 코드를 어떤식으로 수정해야 할지 조언을 얻을 수 있을까요?
갱신된 강의자료에도 나와 있듯이, fetchResult, fetchCount 등의 메소드는 deprecated 예정입니다. 또한 해당 메소드는 Page 타입을 반환하기 때문에 Page 타입을 직접적으로 조작해야 한다는 제약이 있습니다. 이걸 잘 쓰면 되는데, Page 의 시작번호 등 제약도 있어서 저는 회사에서 Page 를 따로 만들어서 사용하거든요. 그래서 search 메소드와 count 메소드는 항상 분리하고 있습니다. 2. 그런 점에서 count 만 최적화하는 로직만 베껴서 만든 최적화 메소드입니다. 실제로 count 구문을 실행하기 위한 메소드입니다. 필요에 따라서 public 으로 만들어도 될 것 같네요. // count 실행 메소드 private Long countByCond(MemberSearchCond cond) { return query .select(member.countDistinct()) .from(member) .where( usernameEq(cond.getUsername()), teamNameEq(cond.getTeamName()), ageGoe(cond.getAgeGoe()), ageLoe(cond.getAgeLoe()) ) .fetchOne(); } 최적화 로직을 베낀 메소드입니다. 스프링 데이터 JPA 는 아래 코드와 같이 page, size 값이 null 이 아니고, 적절한 범위에 있는지를 판단하여 isPaged 라는 분기를 만듭니다. 참고로 코드를 분석하면서 내린 뇌피셜이니 혹시 틀리다면 말씀해주세요. page 가 0 이 아니라 1 부터 시작하는 건 제 취향입니다. 회사에서 그렇게 쓰고 있거든요. 필요에 따라 0 부터 시작하도록 바꾸는 건 어렵지 않을 것 같습니다. public Long countByCondOptimization(List<?> content, MemberSearchCond cond, Long page, Long size) { boolean isPaged = page != null && size != null && page > 0 && size > 0; long offset = isPaged ? (page - 1) * size : 0L; long contentSize = content.size(); if (!isPaged || offset == 0) { if (!isPaged || size > contentSize) { return contentSize; } return this.countByCond(cond); } if (contentSize != 0 && size > contentSize) { return offset + contentSize; } return this.countByCond(cond); } 이렇게 하여 count 쿼리를 리스트 조회 쿼리와 분리하여 재사용성을 높이면서, 성능도 최적화할 수 있습니다. 감사합니다.
강의에서는 Query DSL 4.x 버전이어서 제네릭 없는 예제 코드인 것 같은데, 제가 올리는 버전은 5.0 버전이어서 차이가 있음을 감안해주세요. 정렬 조건을 하나만 추가하는 코드입니다. 정렬 조건을 여러 개 추가하려면 반복문을 돌면서 JPAQuery 를 동적으로 확장해나가면 됩니다. // 페이징하는 메소드에서 사용 private Expression<? extends Comparable<?>> specifyMemberProperty(String prop) { prop = prop == null ? "" : prop.toLowerCase(); if (prop.equals("username")) { return member.username; } if (prop.equals("age")) { return member.age; } return member.id; } // 페이징하는 메소드 // ... .orderBy(new OrderSpecifier<>("desc".equalsIgnoreCase(dir) ? Order.DESC : Order.ASC, specifyMemberProperty(prop))) .fetch(); -- 저는 일단 이렇게 만들어봤는데, 다른 분께서 더 나은 코드, 더 빠른 코드가 있다면 저한테도 알려주세요. 감사합니다.