분류 전체보기692 [서평] 도메인 주도 개발 시작하기 : DDD 핵심 개념 정리부터 구현까지 저의 돈으로 직접 사서 직접 완독해 본 후 써보는 후기입니다. 따라서 장점은 장점대로 칭찬할 것이며, 단점은 단점대로 언급할 것입니다. 도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지 : 네이버 도서 네이버 도서 상세정보를 제공합니다. search.shopping.naver.com 몇 해 전부터 도메인 주도 개발에 대한 이야기를 들어오고 있었고 스프링(Spring) 기반의 도메인 주도 개발을 이번 Toy프로젝트에 적용해 볼까 생각하는 도중에 "최범균" 님의 "도메인 주도 개발 시작하기"를 읽어보게 되었다. 2023/01/09 ~ 2023/01/20 1) 책의 표지 2) 단원별 구성 3) 읽은 소감 우선 저의 글의 앞부분만 보는 분들을 위해 먼저 간단히 3가지에 대해 답해보겠습니다... Life/Book Record 2023. 1. 20. [LeetCode][C++/Python] 238번: Product of Array Except Self (262) 생각의 흐름 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 사실 문제를 보자마자 든 생각은 전체 수를 다 곱한다음, 해당 자리의 수로 나누는 방식이다. 아마 나같은 일반인이라면 당연히 나누는 방식을 생각했을 것 이다... 하지만 문제 제약 조거을 보면.... "나누기 금지".... 따라서 좀더 생각을 하게 되었다. 일단 문제는 O(N)안에 해결 가능해야 한다는 점이다. 일단 투포인터 비슷한 방식으로 해야 하지 않을까? 란 생각이 먼저 들었다. O(N)안에 가능해야 하니 말이다! 어떤 수 하나를 생각해보면, 그 수의 index의 양옆 => (0 ~ index - 1), (index + 1 ~ N)의 수를 전부 곱해야 한다. 그럼 우선 배열을 순회하면서 왼쪽의 곱들만 구하고.. Algorithm/LeetCode 2023. 1. 18. [TIL] 일일 회고 2023/01/15 (짧은 2022회고 포함) 요즘 한 일 아 요즘 한일이 너무너무 많다 ㅋㅋㅋㅋ 1. 백기선님의 리팩토링 강의 완강 예전에 구매하고 다 듣지 못했던 기선님의 강의를 완강하게 되었다!! 기선님이 좋은 이야기를 많이 해주셨지만, 사실상 새롭게 알게 된 내용은 딱 3개 정도였다? 개발을 시작하지 얼마 안 됐을 때, 이 강자를 들었다면 모르는 내용이 많았겠지만, 2년 넘게 하다보니 어느덧 지나간 경험들이나 다른 책으로부터 채화된 내용들이었다. 여하튼, 연초부터 TODO list에서 하나 완료해서 너무 기쁘다!! 2. Nexters 앱 개발! 요즘 22기로 활동 중인 Nexters에서 Nexters 동아리를 대표할 출석체크 앱을 만들게 되었다!! 넥터에서의 첫 프로젝트이지만, 온 힘을 다해서 기간 안에 성공적으로 출석체크 기능을 만들어야겠다.. Life/회고록 2023. 1. 15. [Refactoring] 데이터 클래스 (Data Class), 유산 포기 (Refused Bequest), 주석 (Comments), 중첩 조건문을 보호 구문으로 바꾸기 (Replace Nested Conditional with Guard Clauses) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 18. 데이터 클래스 ▶ 데이터 클래스 : public 필드 또는 필드에 대한 게터와 세터만 있는 클래스 - 코드가 적절한 위치에 있지 않기 때문에 이러한 냄새가 생길 수 있다. - 예외적으로“단계 쪼개기”에서 중간 데이터를 표현하는데 사용할 레코드는 불변 객체로 데이터를 전달하는 용도로 사용할 수 있다. public 필드를 가지고 있다면 “레코드 캡슐화하기 (Encapsulate Record)”를 사용해 getter/setter를 통해서 접근하 도록 고칠 수 있다. (여기서 말하는 "레코드"는, public 필드로 구성된 데이터 클래스를 말한다) 변경되지 않아야 할 필드에는“세터 제거하기 (Remove Setting Method)”를 적용할 수 있.. BackEnd/Refactoring 2023. 1. 8. [Refactoring] 중재자 (Middle Man), 내부자 거래(Insider Trading), 거대한 클래스 (Large Class) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 15. 중재자 캡슐화는 내부의 구체적인 정보를 최대한 감출 수 있기 때문에 자주 사용된다. 그러나, 어떤 클래스의 메소드가 대부분 다른 클래스로 메소드 호출을 위임하고 있다면 중재자를 제거하고 클라이언트가 해당 클래스를 직접 사용하도록 코드를 개선할 수 있다. 15 - 1) 중재자 제거하기 필요한 캡슐화의 정도는 상황에 따라서 달라질수가 있다. 흔히 말하는 Law of Demeter를 지나치게 따르기 보다는상황에 맞게 활용하도록 하자! 예를 들어 원래는 Person에 getManager()를 통해 한번에 manager를 얻어올 수 있었다. public class Person { private Department department; private .. BackEnd/Refactoring 2023. 1. 8. [Refactoring] 성의없는 요소 (Lazy Element), 추측성 일반화 (Speculative Generality), 임시 필드 (Temporary Field) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 12. 성의없는 요소 프로그래밍을 하면서 여러 변수, 메서드, 클래스를 만들게 된다. 만들 당시에는 의미를 명확하게 하기 위해서, 또는 중복을 제거하기 위해서 사용했겠지만... 그렇게 예상하고 만들어 놓은 요소들이 기대에 부응하지 못하는 경우가 있는데 그런 경우에 해당 요소들을 제거해야 한다! 함수 인라인, 클래스 인라인, 계층 합치기 를 통하여 리팩토링 할 수 있다. 13. 추측성 일반화 나중에 이러 저러한 기능이 생길 것으로 예상하여, 여러 경우에 필요로 할만한 기능을 만들어 놨지만 “그런 일은 없었고...”결국에 쓰이지 않는 코드가 발생한 경우. XP의 YAGNI (You aren’t gonna need it) 원칙을 따르자. => 지금 당장 .. BackEnd/Refactoring 2023. 1. 7. [Refactoring] 데이터 뭉치 (Data Clumps), 기본형 집착 (Primitive Obsession) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 10. 데이터 뭉치 ▶ 항상 뭉쳐 다이는 데이터는 한 곳으로 모아두는 것이 좋다. 1) 여러 클래스에 존재하는 비슷한 필드 목록 2) 여러 함수에 전달하는 매개변수 목록 관련 리팩토링 기술 관련된 리팩토링 기술로는, “클래스 추출하기 (Extract Class)”를 사용해 여러 필드를 하나의 객체나 클래스로 모을 수 있다. “매개변수 객체 만들기 (Introduce Parameter Object)” 또는 “객체 통째로 넘기기 (Preserve Whole Object)”를 사용해 메소드 매개변수를 개선할 수 있다. 11. 기본형 집착 보통 애플리케이션을 개발할 때 도메인에 필요한 기본 타입을 만들기보다는 프로그래밍 언어가 제공하는 기본타입을 사용하는 .. BackEnd/Refactoring 2023. 1. 6. [Refactoring] 산탄총 수술 (Shotgun Surgery), 기능 편애 (Feature Envy) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 8. 산탄총 수술 왜 그냥 Gun도 아닛고 Shotgun일까? 샷건은 여러 파편이 퍼져 나간다는점을 상기하면 납득이 간다. 이전에 살펴본 뒤엉킨 변경의 경우 여러 이유로 하나의 Class를 계속해서 손봐야 하는 경우이다. 이번 산탄총 수술의 경우 새로운 방식을 도입하려면 여러 곳을 수정해야 한다. 8 - 1) 필드 옮기기 처음에는 타당해 보였던 설계적인 의사 결정도 프로그램이 다루고 있는 도메인과 데이터 구조에 대해 더 많이 익혀나가면서, 틀린 의사 결정으로 바뀌는 경우도 있다. 필드 또한 처음 만들때는 적절해 보였을 수 있지만, 어느순간 부터 다른 데이터와 항상 함께 전달된다거나, 어떤 레코드를 변경할때 다른 곳에 있는 필드를 변경해야 하는 경우 .. BackEnd/Refactoring 2023. 1. 6. [LeetCode][C++/Python] 42번: Trapping Rain Water (261) 생각의 흐름 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 1. Stack을 활용한 풀이 처음 떠오른 방식은 Stack을 사용하는 방식이었다. (뭔가 예전에 풀어본건가? 그냥 보자마자 Stack부터 떠올랐다) Stack에 게속 index를 추가하면서, 현재를 기점으로 이전보다 높이가 더 높은 경우에 해당 volume을 계산하여 결과변수에 더해준다. 글만 보면 이해가 안갈 수 있다, 다음 그림을 살펴보자. 우선 맨처음 1번 블록을 보면, 인덱스 2에서 3으로 넘어갈때 이전보다 높이가 높아지는 곳 이다. (0에서 2로) 따라서 다음 while문의 height[i] > height[stack.top()]을 만족시키게 된다. while (!height_stack.empty() .. Algorithm/LeetCode 2023. 1. 5. [Refactoring] 마틴파울러가 말하는 리팩토링 (feat 테스트 코드를 짜는 이유) 이번 글은 유튜브의 좋은 영상을 하나 보면서, 정리하고 생각을 남기는 글 입니다. 영상 링크 : https://youtu.be/mNPpfB8JSIU 또한 추가적인 자료로 다음 PPT를 마틴파울러가 제공하고 있다. https://martinfowler.com/articles/workflowsOfRefactoring/ Workflows of Refactoring Many teams miss opportunities for refactoring by not realizing the different ways refactoring can fit into their workflows. martinfowler.com 1. TDD(Test-Driven Development)와 리팩토링 TDD 프로세스는 다음 그림과 .. Life/컨퍼런스 2023. 1. 5. [Refactoring] 뒤엉킨 변경 (Divergent Change) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 7. 뒤엉킨 변경 소프트웨어는 변경에 유연하게(soft) 대처할 수 있어야 한다. 어떤 한 모듈이 (함수 또는 클래스가) 여러가지 이유로 다양하게 변경되어야 하는 상황에서 이러한 모듈이 책임에 따라 잘 분리되어 있다면 변경에 대처하기가 쉽다. 예) 새로운 결제 방식을 도입하거나, DB를 변경할 때 동일한 클래스에 여러 메소드를 수정해야 하는 경우. 서로 다른 문제는 서로 다른 모듈에서 해결해야 한다. 모듈의 책임이 분리되어 있을수록 해당 문맥을 더 잘 이해할 수 있으며 다른 문제는 신경쓰지 않아도 된다. 7 - 1) 단계 쪼개기 다음과 같이 priceOrder라는 매우 다양한 역할을 하고 있는 메서드가 있다. public class PriceOrde.. BackEnd/Refactoring 2023. 1. 4. [Refactoring] 가변 데이터 (Mutable Data) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 6. 가변 데이터 함수형 프로그래밍에서는 데이터를 변경할 때 복사본을 전달한다. 하지만 Java와 같은 언어에서는 데이터의 변경을 허용한다. Call By Value를 생각해보면 주소값을 전달하기에 변경여파가 크다. 따라서 데이터가 변경될 시 발생할 수 있는 여파를 관리할 방법을 적용해야 한다. 6 - 1) 변수 쪼개기 어떤 변수에 할당이 여러번 되고 있다 생각해 보자. 과연 적합한 상황일까? 다음 Rectangle 코드를 살펴보자! ▶ Rectangle public class Rectangle { private double perimeter; private double area; public void updateGeometry(double heig.. BackEnd/Refactoring 2023. 1. 3. 이전 1 ··· 3 4 5 6 7 8 9 ··· 58 다음