안녕하세요, 헤이밥님! 강의 잘 듣고 있습니다! 다름이 아니라 제가 다음 주 토요일에 코딩테스트 시험이 있는데요, 짧은 기간 내에 핵심만 공부를 하려고 할 때 강의 목차 기준으로 어떻게 학습하는 것이 효율적일지 여쭤봅니다! 당연히 모든 강의를 순차적으로 듣는 것이 가장 효율적인 방법이지만 현실적으로 시간이 부족하다고 생각해서요! 참고로 코딩테스트 기업은 네이버입니다! 감사합니다!
안녕하세요. 항상 좋은 강의 잘 듣고 있습니다. 다름이 아니라, 강의 및 강의 자료에 누락된 부분이 있는 것 같아 글 남깁니다. [물리적 모델링 - 실습] 파트에서 테이블 정의서 및 DDL 스크립트를 작성하는 부분에 order_item 테이블이 order_id와 product_id를 각각 외래키로 들고 있는데, 앞선 강의에서 설명해주신 바에 따르면, 주문 항목 데이터 저장 시, 특정 주문에 대한 특정 상품 하나가 여러 번 중복으로 저장되는 걸 방지하기 위해, (order_id, product_id)에 UNIQUE 제약조건을 만들어야 된다 라고 하셨는데, 그 부분이 빠진 것 같습니다. 감사합니다.
AI 시대에도 살아남는 엔지니어의 조건, 미국 빅테크 시스템 디자인, 알고리즘 사고, 오픈소스 실무 완성
현재 강의에서는 Inventory table을 따로 분리해두었습니다. 그런데 Inventory Table을 분리한 이유에 대해 말씀해 주실 때, 분리하는 게 좋다고만 말씀해주신 것 같아서 설명이 부족하다는 생각이 들었습니다. Inventory가 재고라는 의미를 가지는 것으로 알고 있어서 items table에 있는 수량을 Inventory로 옮기는 것이 더 옳은 설계가 아닌가라는 생각이 들었습니다. 물론 지금 강사님께서 설명해주신 구조도 맞다고 보지만, 그 구조를 유지한다면 현재 Inventory table에 유의미한 칼럼이 없기 때문에 Inventory table이 없어야 하지 않나라는 생각을 했습니다. 그리고 재고가 자주 바뀌는 상황이 발생한다고 한다면 오히려 Inventory table에 재고를 넘겨줘야한다고 생각을 하는데요. 왜냐하면 Items table에 재고 칼럼이 있다면 재고가 바뀌는 순간에는 Items table의 데이터를 수정할 수 없게 됩니다. 그러면 관리자가 Item을 수정하려고 할 때, 재고가 많이 바뀌는 상황에는 그만큼 수정 쿼리가 대기를 하게 될 것이라고 생각하는데요. (물론 이 정도까지의 문제는 생기지 않을 것이라고 생각합니다.) 또한 이 글 에서 강사님께서 말씀해주신 유형별 재고 관리 정책 부분은 Inventory가 재고라는 성격을 나타낸다는 점에서 Inventory table에서 관리할 것 같고, 트래픽 증가 시 성능 문제가 생긴다면 여기서 또 테이블 분리를 시도하거나 레디스 같은 memory DB를 생각해볼 수 있을 것 같습니다. 그래서 질문은 현재 재고 칼럼의 위치를 어디에 두는 게 맞는지, 트래픽 증가의 성능 문제가 있다면 오히려 Inventory 테이블로 넘겨주는 게 맞는게 아닌지 유형별 재고 관리 정책 이 필요한 경우에 강사님께서 생각하시는 확장성 있는 구조는 무엇인지가 궁금합니다. 혹시 제가 잘못 알고 있거나 잘못 이해한 부분이 있다면 같이 짚어주시면 감사하겠습니다!
안녕하세요 백엔드 개발자를 희망하고 있는 학생입니다. 유저별 포인트 같은 정합성이 중요한 데이터로 로그를 따로 관리 해야한다고 말씀 해 주셨는데 이런 경우(배치 도구를 스프링 배치를 사용할 경우에) 로그 테이블을 따로 만들어서 관리 해주는게 나중에 자소서 쓸 때도 도움이 되나요?
안녕하세요! 강의를 통해 많은 인사이트를 얻었습니다. 좋은 강의 제공해주셔서 감사합니다. 강의를 수강하는 과정에서 궁금한 점이 생겨 질문 남깁니다. 시스템 디자인 단계에서 응답 시간(P95/P99)이나 TPS 같은 성능 목표를 설정할 때, 인스턴스 스펙이나 인프라 제약도 함께 고려해야 하는지가 궁금합니다. 특히 학생이나 개인 프로젝트의 경우 프리티어처럼 제한된 리소스를 사용하는 일이 많은데, 이런 환경에서는 인프라 제약을 기준으로 현실적인 목표치를 설정하는 것이 맞는지, 아니면 인프라 스펙을 별도로 고려하지 않고 일반적인 목표값을 그대로 설정하는 것이 더 바람직한지 조언 부탁드립니다. 감사합니다!
영호님 안녕하세요! 이번에는 설계원칙편의 6-1장 강의를 듣던 중, 궁금한 부분이 생겨 질문 드립니다~!! 디미터 법칙을 만족시키기 위해 Game 클래스의 showRoom() 메서드 내부의 구현을 리팩토링 하는 과정에서 player.currentRoom()메서드를 통해 Room 객체에 접근하여 name과 description 정보를 반환받도록 하는 부분이 있었습니다. Q. 혹시 showRoom() 메서드 내부에서 player로부터 Room 객체를 반환 받아 Game객체가 사용하는 것이 아닌, Room에 대한 정보를 Room객체로부터 바로 반환 받도록 하는 것은 어떠신지 궁금합니다! 예를 들어서 Room에 대한 정보를 Room이 책임지도록 하였을 때 public class Player { private WorldMap worldMap; private Position position; ... public String currentRoom() { return worldMap.roomAt(position).getRoomInfo(); // 디미터 법칙 준수 } } public class Room { private Position position; private String name; private String description; ... public String getRoomInfo() { return String.format("현재 위치는 %s 입니다. %s\n", name, description); } } Room에 층수 정보와 같이 무언가 추가되는 상황이 발생하더라도 Game에서는 코드를 수정할 필요가 없이 Room 객체 내부에서만 변경하면 될 것 같아보였습니다! 🤔
통상의 Presentation - Business - Data Access에서 구현 계층이 추가됐고 구현 계층은 동일 레이어 간 상호 참조를 가능하게 한 부분이 있으니 비즈니스 계층은 상호 참조를 금지하는 것은 이해가 됐습니다. 기존에 제가 짜던 코드는 비즈니스 계층 + 구현 계층이었으니 비즈니스 계층을 나누는 기준이 기존 방식과 달라져야 그게 가능하겠다 까지는 생각이 들었고 기존에는 도메인으로 서비스를 만들었다면 비즈니스 흐름 별로 서비스를 만들어야 되겠다 라고 생각이 들었습니다. 어떻게 보면 서비스가 중복되고 세분화 된다고 볼 수도 있을거 같지만 단순 기능의 나열이 아니라 비즈니스와 일치하게 코드가 짜지겠다 생각이 드네요 여기까지 제가 말한 게 어떤지 하고 간단한 예시도 알려주시면 정리하는데 도움이 될 것 같습니다. 다른 강의도 잘 듣고 있습니다~ 감사합니다 아래 질문을 보고 추가한 내용입니다. https://inf.run/QjDgU 리뷰와 포인트 서비스에 대한 예시였고 제 생각에는 비즈니스는 리뷰 작성이고 리뷰 작성에 따른 포인트 관리는 구현 단계에서 연결하면 되겠다 라고 생각이 들었습니다. 뭔가 더 생각해야 할 것들이 있을지 궁금하네요
professor_bcnf, enrollment_bcnf로 테이블을 분리하는 과정에서 질문이 있습니다. 이전에 이름과 같은 자연키는 기본키로 두면 안된다고 들었는데 현재는 professor_bcnf에서 professor_name이 기본키로 있습니다. 이런 경우에는 문제가 딱히 생기지 않나요?
영호님 안녕하세요!! [6-5. 설계 평가하기] 강의를 듣던 중 궁금한 부분이 생겨 질문을 드리게 되었습니다! 컴파일 타임 결합에서 런타임 결합으로 변경하는 과정에서 Movie 클래스의 calculateFee메서드와 DiscountPolicy 추상클래스의 getDiscountAmount 메서드가 Screening 객체에 의존하게 되는데 - Movie 클래스의 경우에는 Screening 객체를 직접 사용하는 것이 아닌 DiscountPolicy에 전달 만 하고 있으며, - DiscountPolicy를 상속받은 AmountDiscountPolicy 클래스의 경우에는 아예 Screening 객체를 사용하지 않고 있는 상황 입니다! Q. 혹시 이렇게 직접적으로 사용하지 않더라도, 메서드 파라미터로 정의해도 괜찮은 것인가요??
위 구조에서 테스트를 작성 시 의존성을 주입하는 방법에 대해 고민해보았습니다. 테스트 코드 작성 시 Data Access Layer의 의존성에 대해서 구현 코드에서 사용하는 의존성을 그대로 사용하는지, 아니면 뒤에 나오는 모듈 개념을 활용하여 테스트 전용 모듈을 사용해서 의존성을 주입하면 괜찮을지 질문드립니다!
제미니 선생님, 안녕하세요. 이해가 잘 되도록 설명해주셔서 감사드립니다. 다름이 아니라 비즈니스 레이어에서도 동일 레이어 간 참조 금지 규칙이 적용되는 것으로 보입니다. 담당자들이 특정 업무 A, B, C를 진행할 때는 공통적으로 특정 업무 절차 D를 따라야 하는 상황을 생각해보았습니다. 가장 단순하게 구현하면 비즈니스 레이어에 A -> D, B -> D, C -> D의 의 존성이 생길 것 같은데, 이를 어떤 식으로 해결하면 좋을지와 그 이유가 궁금했습니다. 감사합니다!
영호님 안녕하세요 😊 이번에는 2-4강을 듣던 도중 강의 자료와 관련된 질문을 드려요 Q. DiscountCondition을 책임지는 로직을 DiscountPolicy로 이동할 때, DiscountPolicy 클래스에 있는 findDiscountCondition() 메서드의 접근 제어자가 private으로 되어있는 부분은 public으로 변경하고 ReservationService 클래스의 reserveScreening() 메서드에서 policy.findDiscountCondition(screening, conditions); 으로 생각하면 될까요?! 2-4 강의자료 page 10 (강의 02:29) 2-4 강의자료 page 11 (강의 02:42)
영호님 안녕하세요! 강의를 보다가 궁금한 부분이 생겨 질문 드려요~ Q1. 현재 구조에서 "영화 관람료"라는 객체를 추가하여 상영 객체가 의존하는 방식도 괜찮을까요? Q2. 추가적으로 위의 방식이 나쁘지 않은 방식이라면, 할인 정책을 영화가 아닌 상영과 협력하도록 해도 괜찮을까요? 질문들이 강의에서 가르쳐주시려는 포인트에서 벗어나는 질문이지만,,, 현실과 조금 더 밀접하게 연결지어 생각을 하다보니 이런 방식을 생각해보게 되었습니다
안녕하세요 강사님, 강의 잘 보고 있습니다. 이동 로직을 정리하다가 보호(가드) 로직 중복에 대해 질문드립니다. 현재 구조에서 Game.tryMove() 에서 player.canMove(dir) 로 먼저 확인하고, Player.move(dir) 내부에서도 canMove(dir) 를 다시 확인하여 막습니다. 즉, 이동 가능 여부 판정이 두 번 수행됩니다. // Game private void tryMove(Direction dir) { if (player.canMove(dir)) { // 1차 player.move(dir); // 내부의 2차 showRoom(); } else showBlocked(); } // Player public void move(Direction dir) { if (!canMove(dir)) throw new IllegalArgumentException(); this.position = this.position.shift(dir); } 두 번의 가드가 필요한 이유가 있을까요? SRP/TDA 관점에서는 Game 의 판정을 제거하고 player.tryMove(dir) 만 호출해 결과만 처리하는 패턴이 더 적절한지, 혹은 move() 만 두고 예외로 제어하는 방식을 권장하시는지 궁금합니다.
안녕하세요. 좋은 강의 감사합니다. 덕분에 객체지향에 대한 이해가 많이 정리되었습니다. 3-2 강의를 보다 메서드 크기 관련해서 궁금한 점이 있어 질문드립니다. 콘솔 입력 의존성(12:17) 부분에서 입력을 분리하는 예시로 아래와 같이 nextLine() 호출을 별도 메서드로 추출하신 것으로 이해했습니다. private String input(){ return Scanner.nextLine(); } 그런데 이 관점이라면, 입력 “수집(I/O)” 뿐 아니라 “입력 파싱(문법)”도 별도의 책임으로 분리해야 하는 것 아닌지 고민이 됩니다. 예를 들어: private String[] inputParsing(String input){ return input().toLowerCase().trim().split("\\s+"); } 강사님의 강의 및 "객체지향의 사실과 오해" 책을 읽고 난 뒤, SRP의 책임을 ‘하나의 변경 이유’로 보았습니다. 위의 콘솔 입력( nextLine )을 분리한 건 입력 장치 변경이라는 액터에 대한 책임 분리로 이해했습니다. 그렇다면 입력 파싱( toLowerCase/trim/split )은 명령 문법 변경이라는 또 다른 액터에 대한 책임이므로, 이 역시 별도로 분리해야 SRP를 완전히 지키는 게 아닐까요? 물론 이렇게까지 분리하면 가독성이 떨어질 수 있고, 실제로는 변경 가능성도 낮아 “가치가 작은 분리”로 느껴지기도 합니다. 강사님의 의견이 궁금합니다! + 외에도 추상화 수준을 맞추기 위한 메서드 추출(9:25) 강의 자료에 isRunning 함수의 반환이 void로 되어있으나 실제 내부에선 running == true를 반환합니다. github 코드 상에는 해당 함수가 없어보입니다.
"실전 개념적 모델링 - 시작" 파트를 들으면서 궁금한 점이 있어 질문드립니다. 주문, 결제 엔티티의 경우, 주문은 '결제'까지 포함하는 비즈니스 트랜잭션 단위라 하였는데, 왜 두개의 엔티티로 분류해야하는지 궁금합니다. 현재 요구사항에서는 하나로 합쳐도 문제가 없는건가요?