묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
만약 보드를 이용한 게임의 종류가 더 다양해진다면 어떻게 될 수 있을지에 대한 고민
안녕하세요, 열심히 강의를 수강 중인 4년차 백엔드 개발자입니다.먼저 이렇게 퀄리티 높은 강의를 제공해주셔서 감사드립니다!저는 4년차임에도 아직 리팩토링할 때 '관심사의 분리' , '같은 관심사끼리의 응집'에 대한 느낌을 체득하지 못해서 듣고 있습니다.문득 SRP까지 강의를 들은 시점에 GameBoard를 보고 'GameBoard가 셀로 나눠진 보드판'을 의미하는 것이라면 현재 GameBoard는 '지뢰찾기'에 한정된 느낌인데, 나중에 체스, 오목, 장기와 같은 보드형 게임을 추가한다면 어떻게 바꿔야 할까를 고민해보게 되었습니다.질문을 올리는 이 시점에는 GameBoard를 더 포괄적인 개념의 보드판으로 두고 상속을 하는 구조로 바꾸고, open()이나 isLandMineCell()과 같이 '지뢰찾기'에 의존적인 역할은 "MineSweeperGameBoard 같은 자식에서 구현해야 하나?" 하는 생각이 들게 되어서요!좀 두서없는 질문이고 엉뚱할 수 있지만 공유자님이라면 게임의 종류가 다양해진다면 어떤 고민을 시작으로 변경해 나가시는지, 어떤 부분을 먼저 생각해보는 것이 좋을지 궁금합니다.(사고의 흐름..?) 좋은 강의 감사드리며, 앞으로도 더 좋은 강의 부탁드리겠습니다!감사합니다 😃
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
DIP 설명 후반부에 IOC에 대한 질문 드립니다.
안녕하세요.스프링 프레임웍에서 IOC 개념을 설명 해주시면서 항상 들었던 궁금한 점을 질문드립니다.IOC는 개발자가 짠 프로그램이 아닌, 프레임워크에 의해 객체가 관리(생성, 소멸)되는 것이라고 설명 주셨습니다. 저도 스프링 컨테이너의 BEAN를 인스턴스로 활용하는 것으로 대략 알고 있는데요. 그렇다면 IOC에 의해 주입되는 BEAN은 하나의 형태의 구현체 일텐데,, 스프링은 앞서 DIP에서 설명 주신 추상화된 인터페이스가 하나의 고정된 구현체만 BEAN으로 만들어 생성하는 걸까요?스프링 IOC의 장점을 설명하라고 하면 제어의 역전이 되면서 구현 인스턴스 변경에 유연해진다라고 들었는데,, 하나의 인스턴스로만 고정된다면 그것이 유연한 것일까 항상 궁금했습니다. 아니면 주입될 객체만 바꿔끼면 되니 유연하다는 표현을 하는걸까요?질문을 해보니 약간 스프링의 질문인데.. 항상 이해가 잘 되게 설명을 해주셔서.. 실례를 무릅쓰고 여쭈어봅니다. ㅠㅠ
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
안녕하세요 ! 혹시 자바가 아닌 다른 객체지향 언어를 알고있어도 강의를 들어도 괜찮을까요 ?!
안녕하세요 ! 혹시 자바가 아닌 다른 객체지향 언어를 알고있어도 강의를 들어도 괜찮을까요 ?! ps. 사실 결제는 이미했습니다..!
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
안녕하세요 메서드명 때문에 고민이 있어서 질문드립니다.
안녕하세요 강사님제가 create 메서드 명에 대해서 고민중인데private void createTip(RequestTipDto requestTipDto, User user) { Tip tip = Tip.builder().title(requestTipDto.getTitle()).content(requestTipDto.getContent()).user(user).build(); tipRepository.save(tip); } private Tip createTip(RequestTipDto requestTipDto, User user) { Tip tip = Tip.builder().title(requestTipDto.getTitle()).content(requestTipDto.getContent()).user(user).build(); return tip; } tipRepository.save(tip); 첫번째 코드는 create메서드 안에 tip을 빌더로 생성하고 save까지 같이 하는 코드입니다.두번째 코드는 tip을 빌더로 생성 후 리턴하고 해당 createTip을 호출한 메서드에서 save를 하는 코드입니다. 첫번째 코드는 둘이 같이 할 수있다는 장점이 있고, createTip하고 save를 또 따로 할 필요가 없는 장점이 있고두번째 코드는 나중에 재상용성이나, create메서드안에서는 create만 하는 SRP(단일책임원칙)을 하고 있다는 것이 장점입니다. 위 두가지 방법중 어느것이 더 좋은 방법일까요?그리고 위처럼 builder를 사용하는 코드는 길기 때문에 이를 service 클래스에서 따로 빼서 하는게 좋은지 아니면 entity 클래스에서 하는게 좋은지 궁금합니다. 강의 잘 보고 있습니다.
-
해결됨Readable Code: 읽기 좋은 코드를 작성하는 사고법
자바 record 사용에 대해서 질문 드립니다!
안녕하세요 강사님 저번 테스트 코드 강의 부터 지금 리팩토링 강의까지 정말 잘 들었습니다!이번 강의에서는 record를 사용하지 않으셨는데 저는 보통 VO(Value Object)나 DTO를 만들 때 다음과 같은 이유로 record를 활용합니다불변성 보장보일러플레이트 감소그런데 프로젝트를 진행하다 보면 DTO나 VO에 로직이 점점 복잡해지고, 어느 순간 record로는 한계가 느껴져 class로 변환한 경험이 몇 번 있습니다. 이와 관련해 어떤 경우에 record를 사용하는 것이 좋을지 강사님의 의견이 궁금합니다!
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
강의 내용 정리 및 자료 제작 툴 문의 드립니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 강사님 안녕하세요. 🙂 우선, 테스트 코드에 이어 양질의 강의 제공해 주셔서 감사합니다! 🙏🏻프로젝트 리팩토링 단계에서 본 강의를 접한 덕분에 많이 배우고 있습니다! 혹 제가 이해한 내용을 바탕으로 블로그 혹은 깃허브에 정리해도 될지요?출처는 기재할 예정이며, 블로그 수익과는 전혀 관계없습니다. 더불어 강의 자료 제작 시 사용하시는 드로잉 툴?이 어떤 것인지도 궁금합니다. 답변 기다리겠습니다, 감사합니다!
-
해결됨Python을 위한 디자인 패턴
노션링크
conceptual_singleton.py강사님 싱글톤패턴 드롭다운 코드예시 9:25 이부분 코드 예시가 펼쳐져 있지않아서 볼수가없네요.팩토리패턴 예시도 강의영상에서는 펼쳐져있지않네요.노션링크를 보면서 학습해야할 것같은데 어디있는지 모르겠습니다 ㅠ
-
미해결클린 코더스: 실전 객체 지향 프로그래밍과 TDD 마스터 클래스
13강, 책임을 나누는 기준
3분 43초경, 책임을 나누는 부류에서"누가 해당 메서드의 변경을 유발하는 사용자인가"가 기준이 된다고 하셨는데,메서드의 변경을 유발한다는 게해당 메서드를 누가 호출하느냐? 어떤 사용자가 이 메서드를 사용하냐? 이렇게 이해하면 되나요?메서의 변경을 유발한다는 의미가 해당 메서드를 이용한다는 의미인지? 정확히 메서드의 변경을 유발한다는 점이 무슨말인지 모르겠습니다.
-
해결됨Readable Code: 읽기 좋은 코드를 작성하는 사고법
사용할 변수 가깝게 선언하기 질문
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요. 강사님.강의 내용 중 사용할 변수는 가깝게 선언하기(4:40~6:25)에 대한 내용을 설명해주셨는데요. 해당 내용이 메서드에도 적용되는 또는 적용될 수 있는 내용인지 궁금합니다. 만약 코드가 엄청 길다고 가정하면 현실적으로 단축키를 활용하여 '선언 위치'로 갔다 되돌아와서 흐름을 이어 갈 것 같습니다. 그렇게 되면 가깝게 위치 하는 것이 큰 의미가 없을 것 같습니다.반면에 아래 예시처럼 짧다고 하면 사용하는 위치가 가깝다면 한 눈에 들어올 것 같은데요.메서드에는 크게 의미가 없는 부분인지? 아니면 적용하면 좋은건지 궁금합니다. public static void main(String[] args) { showGameStartComments(); initializeGame(); } private static void showGameStartComments(){} private static void initializeGame(){} public static void main(String[] args) { showGameStartComments(); initializeGame(); } private static void showGameStartComments(){} // 코드 20줄 (다른 메서드) private static void initializeGame(){}
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
오버 엔지니어링
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요. 우빈님인프런 워밍업 클럽 덕분에 우빈님 강의를 끝까지 수강 중에 있는 러너입니다! 오버 엔지니어링 강의에서 오버 엔지니어링을 경계하고 적재적소에 리팩토링 강의에서 배웠던 것들을 써야한다. 이건 '경험'의 차원이라고 말씀하셨는데 실무에서 객체지향으로 개발하지 않는 경우에는 따로 '경험'을 쌓아야하는데 우빈님 강의 외에 적절하고 정확한 경험을 쌓을 수 있는 방법이 따로 있을까요? 간접 경험이라도 충분히 쌓을 수 있을 만한 방법이 있다면 추천 부탁드립니다!
-
해결됨클린 코더스: 실전 객체 지향 프로그래밍과 TDD 마스터 클래스
org.fitness 라이브러리를 어떻게 받을 수 있나요
안녕하세요클린 코더스 강의보면서 예제를 따라해보고 있는데 초반 function 강의 예제에 필요한 org.fitness 라이브러리가 받아지지 않는거 같습니다. 클래스 파일이 없으니 컴파일 에러가 터지는데, 라이브러리 파일 구할 수 있는 방법 없을까요?maven repository:https://mvnrepository.com/artifact/org.fitness/fitness저장소:https://github.com/msbaek/fitness-example/tree/master
-
미해결클린 코더스: 실전 객체 지향 프로그래밍과 TDD 마스터 클래스
11. Null is not an error의 예제인 top 함수는 커맨드인가요 쿼리인가요??
안녕하세요. 좋은 강의 감사합니다. CQS에서 커맨드는 내부 구조를 변경하는데 반환값이 없고, 쿼리가 내부 구조를 변경하지 않고 반환값이 있는 것이라고 설명을 들었습니다. 그런데, 11. Null is not an error에서 예제를 든 스택의 top 메소드는 내부 구조를 변경함에는 커맨드 처럼 보입니다만, 값을 반환하므로 쿼리 처럼 행동합니다. 예제라서 그런것인지 아니면 쿼리나 커맨드 둘 중에 하나인지 궁금합니다.
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
학습용 java/spring 오픈소스 추천
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 강사님, 강의 잘 듣고 있습니다.이름 짓기와 관련된 팁 중에서 "좋은 코드를 많이 보고, 자주 쓰이는 단어와 개념을 습득하라"는 내용이 인상 깊었습니다. 말씀하신 대로 좋은 코드를 보는 것이 중요한 것 같지만, 제가 Java와 Spring을 이제 막 배우기 시작한 단계라 어떤 오픈소스를 참고하면 좋을지 잘 모르겠습니다.혹시 Java와 Spring 기반의 좋은 오픈소스 프로젝트 중에서,코드 네이밍이나 구조가 잘 되어 있어서 참고하기 좋은 것실무와도 연관 지어 학습하기 좋은 것이 있다면 추천해주실 수 있을까요?또한, 강사님께서 개인적으로 공부하거나 추천하시는 오픈소스가 있으시다면 함께 공유해주시면 큰 도움이 될 것 같습니다.감사합니다!
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
중복된 메서드 줄이는 방법
안녕하세요 선생님 강의 잘 들었습니다!강의를 통해 배운 내용을 개인 프로젝트에 적용 하던 중 궁금한점이 생겨 질문 드립니다.private List<Long> getEventIdList(List<EventSimpleInfo> events) { return events.stream() .map(EventSimpleInfo::getId) .toList(); } private List<Long> getEventIds(List<BookmarkedEventSimpleInfoQuery> events) { return events.stream() .map(BookmarkedEventSimpleInfoQuery::getId) .toList(); } Dto 조회한 두개의 List 입니다.두 List에서 id 값을 뽑는 같은 행위를 하고 있는데 어떻게 하면 중복을 줄일수 있을지 모르겠습니다.Dto에 일급 컬렉션을 적용하자니 너무 클래스가 많아 질것 같고,Dto에 인터페이스를 적용 하자니 Dto에 역할을 부여 하는 것이 맞나? 라는 생각이 듭니다.다른 방법은 Dto 내부에 로직을 두는 방법도 생각해 보았는데 어떤게 좋을까요?..쿼리를 줄이기 위해 Dto 조회를 하고 부족한 상태를 조회 하여 값을 채우고 있는데 너무 중복된 행위가많아서 고민 입니다. 어떻게 해야 할까요?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
MarketPlace에서 Sonarlint 검색이 안됩니다.
intelliJ Ultimate 2024.3 버전 사용 중입니다. 마켓플레이스에서 sonarlint를 검색했는데 받을 수 있는 플러그인이 뜨지가 않습니다ㅠㅠ 웹 검색을 해봐도 저 같은 이슈는 찾을 수 없어서 질문 글 올립니다확인해봐야할 설정값이나 옵션이 있을까요??
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
isLandMineCell() 메서드 질문
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 리팩토링한 MinesweeperGame.open() 메서드에 대해서 질문있습니다! private static void open(int row, int col) { if (row < 0 || row >= BOARD_ROW_SIZE || col < 0 || col >= BOARD_COL_SIZE) { return; } if (BOARD[row][col].isOpened()) { return; } if (isLandMineCell(row, col)) { return; } BOARD[row][col].open(); if (BOARD[row][col].hasLandMineCount()) { return; }수업을 따라오면서 isLandMineCell()은 Cell이 지뢰인지 확인하는 메서드이기 때문에 MineSweeperGame 클래스의 메서드가 아닌, Cell 클래스의 메서드가 되어야 open 메서드가 동일한 추상화 레벨을 갖는게 아닌가 하는 의문이 들었습니다. if (BOARD[row][col].isOpened()) ... if (isLandMineCell(row, col)) ...위 두 조건문의 추상화레벨이 통일되지 않다는 생각도 들었구요. isLandMineCell이 Cell 클래스의 메서드로 작성하지 않은 이유가 뭔지 궁금하고, 제가 가지고 있는 생각(추상화레벨 관련)이 잘못된 이유도 궁금합니다. 항상 친절한 설명 감사합니다 많이 배우고 있습니다:)
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
Cell[][]BOARD 매개변수받기
강의 질문 있습니다![섹션4.객체지향패러다임] - SRP: Single Responsibility Principle 강의 - 14분38초경 코드28번줄 cosoleOutputHandler.showBoard(BOARD); 이 부분에서 해당 Cell[][]BOARD를 매개변수로 받고 showBoard(Cell[][] board) 사용되는 부분이 이해가 잘 안갑니다..! 흐름이 어떤식으로 진행되며, 어떤 과정으로 코드가 진행되는지 궁금합니다!
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
ConsoleInputHandler에서 왜 final붙여야 하는지
18줄 코드인 final을 붙여야하는 이유가 있을까요?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
정적 생성자 메서드 of, from
정적 생성자 메서드의 메서드 명을 정하실 때 of 혹은 from 그 외 추가로 create 등등... 몇 가지 더 있는걸로 아는데, 그 차이가 제 입장에서는 되게 미세하기도 하고 잘 와닿지 않는데 강사님은 어떤 기준을 두고 메서드 명을 정하시나요??
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
Getter관해서
수업을 통해 무분별한 Getter/Setter 사용을 지양해야 한다는 내용을 들었습니다.저는 Entity를 만들 때 @Getter를 자주 사용했는데, 수업에서는 "필요한 경우에만 추가하라"고 설명하더라고요.그런데 여기서 말하는 "필요한 경우"가 어떤 상황을 의미하는지 잘 감이 오지 않습니다.예를 들어, 비밀번호 같은 중요한 정보는 Getter를 사용하기보다는 내부에서 메서드를 통해 사용하는 게 좋다는 건 이해가 됩니다.그렇다면 일반적인 경우에서 Getter는 어떤 상황에서 사용해야 하는 걸까요...?