본문 바로가기

package7

DDD - Module (package) - 출처: 도메인 주도 설계 - 에릭 에반스 - Module (package) 인간이 한번에 받아들일 수 있는 인지력은 한계가 있기 마련이다. 만약 legacy 시스템을 운영해야 하는 업무를 수행한다고 가정해보자. legacy가 방대하다면 해당 시스템을 한번에 이해하기란 쉽지 않을것이다. 그럼 어떻게 해당 시스템을 분석할것인가? 가장 기본적인 접근법은 특정 단위로 나누어서 분석하고 그들간의 관계를 파악하는것이다. module은 왜 필요한가? 위에서 언급한대로 인간의 인지적인 과부하를 줄이기 위한 단위가 필요한데 이것이 바로 module 또는 package 라고할 수 있다. module을 분석하는 관점에는 2가지가 있다. 하나는 module과 module간의 관계를 파악하는 관점이고, 다른 하나는 해당 m.. 2022. 8. 7.
package name base, util, or common - 출처: https://dave.cheney.net/2019/01/08/avoid-package-names-like-base-util-or-common - package name 좋은 Go package를 작성하려면 이름을 잘 지어야 한다. 하나의 단어로 해당 package가 무엇을 하는지 간략하게 나타낼 수 있어야 한다. package name을 보다보면 utility 라는 이름을 종종 볼 수 있다. 이런 package명은 관계없는 기능들이 많이 포함되어있어서 package 명을 보고 무엇을 제공하는지 알기가 힘들다. utils나 helpers 같은 package 이름은 계층 구조가 깊은package를 개발하고 순환참조 없이 helper 기능들을 공유하기를 원할 때 사용하곤 한다. utility 기.. 2022. 6. 26.
Protocol buffer - Proto3 - 출처: https://developers.google.com/protocol-buffers/docs/proto3 - Message Type 정의 아래는 .proto 파일에 메시지를 정의한 예제이다. syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; } 맨 첫줄 syntax = "proto3";은 proto3 문법을 사용하겠다는것을 나타낸다. 만약 이 선언이 없다면 proto2를 사용한다고 가정한다. 위의 .proto 파일에는 SearchRequest 메시지 안에 3개의 field가 존재한다. 그리고 각 field는 이름과 형을 갖는다. 예제에서는 scal.. 2022. 4. 24.
Go - called module 과 caller module 참조: https://go.dev/doc/tutorial/call-module-code 개요 이번에는 2 개의 Go 모듈을 만들어 본다. 처음에는 다른 라이브러리나 어플리케이션에서 import 되도록 하는 모듈을 만들고, 그 다음에 이를 호출하는 호출 어플리케이션 모듈을 만든다. 호출되는 모듈 만들기 Go 코드는 package 로 그룹화되고, package 는 module 로 그룹화 된다. 모듈은 코드를 실행하는데 필요한 종속성과 Go 버전, 해당 코드가 필요한 모듈의 집합을 정의한다. 일반적으로 모듈에 기능을 추가하거나 개선하면 모듈의 새로운 버전을 배포한다. 만약 내가 작성한 모듈의 기능을 호출한 사용자가 있다면 해당 사용자는 갱신된 package 를 import 하고 운영에 배포하기 전에 새로운 버.. 2021. 11. 28.
Go - hello world 와 external package 참조: Get started with go - https://go.dev/doc/tutorial/getting-started - 기본환경 Go 를 설치했다고 가정하고 글을 작성한다. 설치는 https://go.dev/doc/install 에서 진행한다. IDE 는 GoLand 를 이용하였다. - Hello world 내가 작성한 코드가 다른 모듈에 포함된 package 들을 import 해야할 때, 내가 작성한 코드의 자체 모듈을 통해 의존성 관리를 한다. 자체 모듈은 go.mod 파일에서 정의하며 import 해야하는 package 들을 제공하는 모듈을 추적한다. go.mod 파일을 생성하여 내 코드가 의존성을 추적할 수 있게 하려면 go mod init 명령어를 수행해야 하는데, 내 코드가 위치할 모.. 2021. 11. 28.
이펙티브 자바 - 클래스와 멤버 접근 권한 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 어떤 클래스가 잘 설계되었는지 판단할 수 있는 요소에는 여러 가지가 있지만, 그 중 하나는 구현 세부사항을 얼마나 잘 감추었는가이다. 이 규칙을 잘 지키면 각 모듈들끼리는 API 를 통해서만 의사소통하며 구현 세부사항은 각 모듈내부로 제한된다. 이것이 우리가 흔히 말하는 '정보은닉'과 '캡슐화'이다. - 정보은닉 정보은닉은 모듈과 모듈사이의 의존성을 줄여주기때문에 중요하다. 모듈 사이의 의존성이 줄어들면 각각 개발, Test, 최적화, 변경을 손쉽게 할 수 있으며 대규모 시스템을 개발할때 위험(Risk)을 낮춰준다. Java 에서 정보은닉을 구현하려면 클래스, 인터페이스 멤버들에 접근제어자를 사용해야 한다. 정보은닉을 위한 몇 .. 2021. 10. 19.
UML - 패키지 다이어그램 - 개요와 의존 - 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다. - 패키지 다이어그램 UML 에서 패키지는 어떤 구성요소라도 더 높은 수준의 단위로 묶을 수 있도록 해주는 구조이다. 각각의 패키지는 네임스페이스를 나타내는데, 이는 모든 클래스가 자신이 속한 패키지내에서 유일해야 한다는 소리이다. 어떤 클래스가 어디에 속하는지를 완벽하게 알기 위해서는 완전한 이름(fully qualified name)을 사용해야 한다. UML 에서 패키지 이름을 나타낼때에는 :: 을 사용한다. Date는 System::Date 와 같이 될 것이다. - 패키지와 의존 규모가 큰 시스템에서는 패키지 다이어그램을 보아야 그 시스템의 구조를 제어할 수 있다. 패키지 다이어그램은 패키지간의 의존을 보여준다. A .. 2021. 2. 10.