목록전체 글 (149)
Taking baby-developer steps
객체 지향 입문자들은 데이터나 클래스를 중심으로 애플리케이션을 설계한다. 이는 협력이라는 문맥을 고려하지 않고 각 객체를 독립적으로 생각하기 때문이다. 그러나 다음을 명심해야한다. 객체가 존재하는 이유는 행동을 통해 협력에 참여하기 위함이다. 객체에서 중요한 것은 데이터보단 객체의 행동, 즉 책임이다. 객체지향은 클래스를 어떻게 구현할 것인가가 핵심이 아니다. 중요한 것은 객체가 협력 안에서 어떤 책임과 역할을 수행할 것인지를 결정하는 것이다. 잘못된 객체지향설계의 예를 살펴보자. "토끼"의 인스턴스 모델링을 할 때 흰털에 빨간 눈, 귀여운 자태를 생각하고 그 모습을 기반으로 클래스를 개발 했다. 그러나 이 전형적인 토끼의 모습으로 소프트웨어 객체를 창조하는 것은 도움이 되지 않는다. "토끼"가 참여할 ..
데이터베이스(DB) 구조화된 데이터를 저장하고 관리하는 시스템. 논리적인 데이터 구조 및 데이저 조작을 담당한다. 효율적인 데이터 조작을 위한 쿼리 언어(SQL 등)를 지원하며, 데이터의 무결성을 유지하고 보안을 제공하는 등의 기능을 수행한다. ex> MySQL, PostgreSQL, Oracle 등 저장소(스토리지) 데이터의 물리적인 저장 공간. 데이터베이스에서 사용되는 실제 데이터 파일, 로그 파일 등을 저장하는 데 사용된다. 데이터베이스는 저장소를 효과적으로 활용해 데이터를 읽고 쓰고 관리한다. ex> 하드 디스크 드라이브(HDD), SSD, 클라우드 스토리지 등 현업에서는 데이터베이스 서버의 스토리지를 따로 두는 경우가 흔하다는 말을 들었다. 순간 DB와 스토리지의 차이를 내가 명확하게 알고 있지..
쿠버네티스는 마스터 노드와 워커노드라는 두 가지 유형의 노드로 구성된다. 마스터 노드와 워커노드로 구성된 쿠버네티스 시스템을 클러스터라고 한다. 클러스터는 사람이 개입하지 않아도 마스터 노드에 설정된 내용에 따라 워커 노드를 관리하며 자율적으로 동작한다. 마스터 노드 전체적인 제어를 담당한다. 마스터 노드에서는 컨테이너를 실행하지는 않는다. 워커 노드에서 실행되는 컨테이너를 관리한다. 마스터 노드의 초기 설정후 조정만 하면 관리자가 직접 워커 노드를 관리하지 않는다. 워커노드 실제 서버에 해당한다. 컨테이너가 실제 동작하는 서버이다. 설치 프로그램 쿠버네티스를 사용하려면 1. 쿠버네티스 소프트웨어 2. CNI(Container Networking Interface, 가상 네트워크 드라이버) 3. etcd..
역할(role)이 왜 필요할까 협력 안에서 어떤 객체가 "수행하는 책임의 집합"은 "수행하는 역할"을 의미한다. 역할과 객체 자체는 어떻게 다를까? 역할은 재사용성을 높이고 유연한 객체지향 설계를 돕는다. 맨 처음 손님이 카페에서 커피를 주문하는 협력과정을 다시 떠올려보자. 손님이 캐셔에게 음료 주문을 요청하고, 캐셔가 바리스타에게 음료 제조 요청을 보낸다. 바리스타는 음료를 제조함으로써 캐셔의 요청에 응답하고, 캐셔는 손님에게 음료가 완성되었음을 알림으로서 응답한다. 이때, 손님이 김철수일 때와 Elin일 때, 캐셔가 박고슴일때와 Nate일 때 이 협력의 과정이 다르지 않다. 모두 "캐셔", "바리스타", "손님"이라는 역할을 할 수 있다면 해당 자리를 어떤 객체라도 대신할 수 있다. 이는 협력을 추상..
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/1844?language=python3 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의풀이 from collections import deque visited = set() def bfs(maps, y, x, n, m): global visited dx = [0, 1, 0, -1] dy = [1, 0, -1, 0] queue = deque([(y, x)]) while queue : current = queue.popleft(); visite..
쿠버네티스 컨테이너 오케스트레이션 도구의 일종이다. k8s라고 줄여쓰기도 한다.(k와 s 사이 8개 글자가 있다는 의미) 여러개의 컨테이너(=서버)를 관리하는 도구이기에 대규모 시스템에 적용되는 경우가 많다. 쿠버네티스로 관리되는 시스템은 이를 전제로 개발되어야한다. 쿠버네티스는 여러 대의 물리적 서버가 존재하는 것을 전제로 한다. 도커 컴포즈를 사용한다고 해도, 물리적 서버가 여러 대라면 반복 작업을 해야한다. 또 물리적 서버를 일일이 모니터링하는 것도 큰 수고가 따른다. 이런 상황에서 쿠버네티스는 컨테이너의 생성 및 관리를 편하게 하는 도구이다. 정의 파일(매니페스트 파일)만 작성하면 이 정의에 따라 모든 물리적 서버에 컨테이너를 생성하고, 생성한 컨테이너를 관리한다. 참고문헌 : 그림과 실습으로 배..
객체가 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우, 해당 객체는 책임을 가진다. 책임을 객체에 잘 할당하는 것은 객체지향 설계에서 중요하다. 책임 객체에 의해 정의되는 응집도 있는 행위의 집합이다. 객체의 책임은 "객체가 무엇을 알고 있는가(knowing)"와 무엇을 할 수 있는가(doing)"로 구성된다. 각 객체가 명확한 책임을 가지는 것이 좋다. 책임은 객체의 공용 인터페이스(public interface)를 구성하는데, 이는 객체 지향의 중요한 원리 중 하나인 캡슐화와 깊은 관련이 있다. 책임과 메시지 협력 내의 객체는 다른 객체로부터 요청이 전송됐을 경우에만 자신의 책임을 수행한다. 한 객체가 다른 객체에게 주어진 책임을 다하라고 요청 보내는 것을 메시지 전송(mes..
협력이라는 문맥(context)이 객체의 행동 방식을 결정한다. 객체지향 설계의 전체적인 품질을 결정하는 것은 개별 객체의 품질이 아니라 여러 객체들이 모여 이뤄내는 협력의 품질이다. 객체 하나만 따로 떼어놓고 봤을 때 겉모습이 다소 비합리적이더라도, 조화를 이루고 적극적으로 협력하는 객체를 창조하는 것이 훨씬 중요하다. 객체 하나의 행동이나 상태가 아닌, 객체들 간의 협력에 집중하라. 협력 협력은 다수의 연쇄적 요청과 응답의 흐름으로 구성된다. 협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작된다. 요청받은 사람은 일은 처리하고 요청한 사람에게 지식 혹은 서비스 제공하는 것으로 요청에 응답한다. 어떤 사람이 특정 요청을 받아들일 수 있는 이유는, 그 요청에 대한 적절한 방식으로 응답할 수 있는 지..
타입의 목적 왜 타입을 사용해야 할까? 객체가 시간에 따라 동적으로 변화할 때 요긴하게 쓰인다. 타입을 사용하면 동적으로 변하는 객체의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 한다. 타입은 결국 추상화다 타입은 추상화로 볼 수 있다. 객체에서 불필요한 특정 시간, 상태 변화를 제거하고 정적인 관점에서 객체를 표현할 수 있게 된다. 예를 들어 객체 작가는 "글을 쓴다, 글을 퇴고한다, 글을 삭제한다, 밥을 먹는다"의 행동을 할 수 있다. 작가는 "허기짐"의 상태를 가진다. 앞에서 서술한 작가의 행동 및 상태만으로 객체를 표현할 수 있었다. 이는 시간에 따른 상태변경이 배제된 단순화된 효과적 방법이다. 동적 모델, 정적 모델 스냅샷(snapshot) -> 어떤 객체가 특정 시점에 구체적으로 어떤..
타입의 계층 강아지는 꼬리를 흔들고 물을 마시고 산책을 한다. 골든 리트리버는 강아지의 행동에 더해 물을 보면 돌진해 들어가고, 사람이라면 모두 반기고, 입에 무언가 물고 다닌다. (객체를 결정하는 것은 행동이므로 행동 위주로 썼다) 골든 리트리버는 강아지이기도 하다. 골든 리트리버 타입의 외연(집합)은 강아지의 외연의 부분집합인 셈이다. 골든 리트리버는 강아지 보다 좀 더 특화된 행동을 하는 특수한 개념이다. 일반화/특수화 관계(generalization / specialization) 일반화와 특수화는 동시에 일어난다. 이 때 중요한 것은 일반화/특수화 관계 역시 객체의 "행동"에 의해 결정 된다. 일반화/특수화 관계가 성립하려면 한 타입이 다른 타입보다 더 특수하게/일반적으로 행동해야한다. 일반적인..