목록CS 지식 (87)
Taking baby-developer steps
엔터프라이즈 애플리케이션이란? 대규모의 복잡한 데이터를 관리하는 애플리케이션을 말한다. 예시로 은행 시스템을 생각해보자. 동시에 몇 백만, 몇 천만의 사람이 한꺼번에 잔고를 조회하고, 입금, 출금 요청을 한다. 엔터프라이즈 애플리케이션은 많은 사용자의 요청을 동시에 처리해야한다. 따라서 서버 성능과 안정성, 보안이 매우 중요하다. 이것을 신경 쓰며 사이트 기능, 비즈니스 로직까지 개발하기는 매우 어렵다. 스프링의 등장 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구. 이 덕에 개발자들은 기능 개발에 집중할 수 있게 됐다. 장점이 많은 개발 도구이지만 설정이 매우 복잡하다. 그래서 스프링 개발팀에서도 이런 단점을 인식하고 단점을 보완하고자 스프링 부트를 출시했다. 스프링 부트 스프링 프레임워..
분류는 객체지향의 가장 중요한 개념 중 하나다. 어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다. 분류를 적절한 개념에 따라 분류하지 못한 애플리 케이션은 유지보수가 어렵고 변화에 쉽게 대처하지 못한다. 적절한 분류체계는 애플리케이션을 다루는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 지도를 제공하는 셈이다. 최대한 직관적으로 분류하는 것이 중요하다. 분류는 추상화를 위한 도구 추상화가 2가지 차원에서 이뤄진다고 했다. 분류 또한 추상화의 2가지 차원을 모두 사용한다.
도커를 한마디로 정의하자면 "데이터 또는 프로그램을 격리시키는 기능"을 제공하는 소프트웨어이다. 프로그램을 격리하는 주체를 컨테이너라고 하며, 이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 도커이다. 도커를 사용하려면 도커 소프트웨어의 본체인 도커 엔진을 설치해야한다. 도커 엔진 외에도 "이미지"가 필요한데, 컨테이너를 만들 틀 같은 존재라고 생각하면 된다. 용량이 허락하는 한 하나의 도커에서 여러개의 컨테이너를 만들 수 있다. 도커는 내부적으로 리눅스를 사용한다. 따라서 컨테이너 내부에서도 리눅스만 동작 가능하다. 서버 환경 격리가 왜 필요한가 서버 구축시 설계할 때는 문제가 없던 프로그램끼리도 실제로 설치하면 오류가 발생하는 일이 있다. 대부분 문제의 원인은 "프로그램 간 공유"에 있다. 일반적 ..
세상에는 수 많은 객체들이 있다. 우리는 이 모든 것을 각자 고유한 개별적 단위로 매번 취급하기에는 인지능력이 턱 없이 부족하다. 이때 공통적인 특성을 기준으로 객체를 여러 그룹으로 묶어 동시에 다뤄야하는 가짓수를 줄임으로써 상황을 단순화 할 수 있다. 예를 들어 "사과, 강아지, 해달, 귤, 토끼, 판다, 딸기"가 있을 때 이들을 "과일, 동물"로 묶어서 단순화 할 수 있다. 개념(Concept), 인스턴스(Instance) 객체들을 공통점으로 묶기위한 관념을 말한다. 개념을 이용하면 객체를 여러 그룹으로 분류(Classification)할 수 있다. 사과, 귤, 딸기는 "과일"이라는 개념으로 분류할 수 있고, 강아지,해달,판다 는 "동물"이라는 개념으로 분류할 수 있다. 개념은 객체를 분류할 수 있는..
추상화가 왜 중요할까? 현대의 지하철 노선도를 생각해보자. 실제 지형, 축적은 무시하고 역 사이 연결성에만 집중해있다. 승객들은 지하철을 갈아탈 때 지형, 축적은 관심이 없다. 중요한 것은 역의 순서와 갈아타는 역이다. "승객"이 꼭 "알아야 하는 사실"만 정확하게 표현하고 몰라도 되는 정보는 무시함으로서 이해하기 쉽고 단순하며 목적에 부합한다. 복잡성을 극복하는 추상화 추상화란 불필요한 부분을 가지치기해 사물의 본질을 드러나게 하는 과정이다. 현실에 존재하는 복잡성을 극복할 수 있다. 가장 좋은 추상화는 "목적에 부합"하는 것이다. 이 책에서는 추상화를 다음과 같이 정의한다. 추상화 : 양상, 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 ..
객체 지향에서 상태를 먼저 결정하고 행동을 나중에 결정하는 것은 다음과 3가지 이유로 설계에 나쁜 영향을 미친다. 1. 캡슐화 저해 상태에 초점을 맞출 경우, 상태가 객체 내부에 깔끔하게 캡슐화 되지 못하고 공용 인터페이스에 그대로 노출될 수 있는 위험이 높아 진다. 2. 협력성 저하(고립된 섬으로서의 객체) 객체는 협력자여야한다. 존재 이유 자체가 다른 객체와 협력하기 위함이다. 상태를 먼저 고려하게 되면 문맥에서 벗어난 객체가 될 위험이 커진다. 3. 재사용성 저하 재사용성은 협력할 수 있는 능력에 좌우된다. 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵고 재사용성이 저하된다. 객체는 "협력"하기 위해 존재하며, "행동"이 협력에 참여하는 유일한 방법이다. 우리가 애플리케이션 안에서 어떤 행..
롤링배포 특정 개수의 서버들을 돌아가며 배포하는 방법 블루 그린 배포 똑같은 서버 인스턴스를 띄우고, 로드밸런서 설정을 바꾸어 배포하는 방법. 카나리 배포 전체 서버의 특정 비율만큼 배포해보고 문제 없는 경우 점점 배포를 늘려가는 방법. 백엔드 개발자는 코드의 개발부터 테스트, 배포, 모니터링까지를 여러번 반복한다. 빌드부터 배포까지의 과정을 자동화 하는 것을 보통 CI/CD라고 한다. CI(Continuous Integration) 지속적 통합. 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 저장소에 통합되는 것. CD(Continuous Delivery & Deployment) 지속적 배포. 실제 프로덕션 환경까지 변경된 코드가 반영 되는 것.
라이브러리 재사용 가능한 코드 모음. 개발에 필요한 기능인 클래스, 함수 등을 모은 것. 개발자가 필요한 기능을 직접 호출하여 사용하며, 개발 프로젝트에 대한 제어권을 가지고 있다. 수학 함수, 데이터베이스 연결, 그래픽 처리 등을 위한 라이브러리등이 있다. 프레임워크 어떤 작업을 수행하도록 구조를 제공하는 뼈대나 틀. 서비스 개발에 필요한 구조, 패턴 및 도구를 제공. 개발자가 프레임워크에 따라 정해진 규칙과 구조를 따라야 한다. URL 라우팅, 데이터베이스 연결, 보안, 템플릿 엔진 등을 제공한다. 차이점 : 가장 큰 차이는 제어와 역할 분담 라이브러리는 개발자가 필요한 기능을 직접 호출하고 제어하지만, 프레임워크는 개발자에게 구조와 규칙을 제시하며, 개발자는 이 구조에 따라 코드를 작성해야한다. 사..
HTTP(Hypertext Transfer Protocol)는 웹에서 정보를 주고받는 데 사용되는 프로토콜로, 다양한 메서드를 제공해 클라이언트와 서버간의 상호작용을 정의한다. HTTP 프로토콜에서 지원하는 주요 메서드는 다음과 같다. GET / HEAD POST / PUT / PATCH DELETE OPTIONS CONNECT TRACE GET / HEAD - 리소스 요청, 조회 GET 메서드는 서버로부터 리소스를 요청하는 데 사용된다. 요청된 리소스는 URL에 포함된 쿼리 매개변수에 따라 반환된다. 이 메서드는 요청한 리소스를 읽기만 하고 변경하지 않는다. HEAD 메서드는 GET과 유사하지만, 서버는 응답으로 실제 데이터(메시지의 body부)를 반환하지 않고 헤더 정보만 반환한다. 이는 리소스의 메..
기계로서의 객체 객체 지향의 세계를 창조하는 개발자들은 "객체의 상태를 조회"하고 "객체의 상태를 변경"하는 것이 주 업무이다. 객체의 상태를 조회하는 작업 : 쿼리(query) 객체의 상태를 변경하는 작업 : 명령(command) 라고 일반적으로 부르며, 객체가 외부에 제공하는 행동의 대부분은 쿼리와 명령으로 구성된다. 객체는 일반적으로 기계와 같다. 우리가 기계를 분해해 보기 전까지는 그 내부를 들여다 볼수 없다. 그저 행동 버튼을 통해 결과를 얻는다. 행동 버튼에는 명령과 쿼리가 있다. 명령 버튼을 누른 직후에 그 행동이 기계의 상태를 어떻게 변경시킨지는 알 수 없다. 원하는 상태의 조회 버튼을 눌러야 명령에 의해 변화된 상태를 확인 할 수 있다. 버튼을 눌러 상태를 변경 혹은 조회하는 것을 요청하..