소프트웨어 개발원칙 YAGNI
소프트웨어 개발원칙 YAGNI "You ain't gonna need it" 에서 따온 약자로 정말 필요할때까지 만들지 말라는 의미를 가진다. 언제 사용될지도 모르는 것에대해서 작성하는 것은 현재 상황에 대해서 더욱 복잡하게 만들며 시간을 소요하게 하고 이후 변경 시 2차적으로 시간을 잡아먹게 된다. 따라서, 현재 사용되지 않을 것에 대해서 먼저 작성하는 것을 지양하라는 의미.
소프트웨어 개발원칙 YAGNI "You ain't gonna need it" 에서 따온 약자로 정말 필요할때까지 만들지 말라는 의미를 가진다. 언제 사용될지도 모르는 것에대해서 작성하는 것은 현재 상황에 대해서 더욱 복잡하게 만들며 시간을 소요하게 하고 이후 변경 시 2차적으로 시간을 잡아먹게 된다. 따라서, 현재 사용되지 않을 것에 대해서 먼저 작성하는 것을 지양하라는 의미.
소프트웨어 개발원칙 KISS “Keep it small and simple.”, “Keep it short and simple.”, 또는 “Keep it simple, stupid.” 에서 따온 약어이다. 소스코드에 대해서 최대한 간단 명료하게 작성하라는 의미로 불필요하게 장황하고 복잡하게 작성하는 것을 지양하며 경계하라는 원칙. 단순할수록 이해하기 쉽고 버그가 발생하기 어렵다.
소프트웨어 개발 원칙 DRY - Don't Repeat Yourself 똑같은 일을 두번하지 말아라! 중복 되는 내용의 함수, 모듈 등에 대해서 리팩토링을 해라. 한 프로젝트내에서 개발 과정이든 개발 완료 후 유지보수 과정에서든 언제든지 같은 역할을 수행하는 중복된 내용의 소스코드가 작성 될 수 있다. 이렇게 중복된 코드들은 시간이 지남에 따라서 프로젝트가 덩치가 커지면서 오버헤드를 발생시키고 쓸데없는 시간과 노력이 소요되게 하며 버그가 발견되었을 경우 여러군데를 고쳐야 하는 등의 단점이 발생한다.
I - ISP - Interface Segregation Principle (인터페이스 분리 원칙) 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다. 클래스에서 사용하지 않는 메서드는 분리해야 한다. 차량 소유주 정보는 변경점이 없어 그대로 구현 class CarOwnerInfo: def __init__(self, car_number, owner_name): self.__car_number = car_number self.__owner_name = owner_name @property def car_number(self): return self.__car_number @car_number.setter def car_number(self, value): self.__car_numb..
O - OCP - Open/Closed Principle (개방/폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. Truck 외에 차량 종류가 추가 될 경우 공통 속성을 가지는 Car Interface로 추상화를 합니다. class Car: id_number = None owner_info = None detail_info = None def __init__(self, id_number, owner_info: CarOwnerInfo, detail_info: CarDetailInfo): self.id_number = id_number self.owner_info = owner_info self.detail_info = detail_info class Suv(Car): pass..
S - SRP - Single Responsiblity Principle (단일 책임 원칙) 한 클래스는 하나의 책임만 가져야 한다. 다음과 이미지처럼 트럭 정보를 관리하는 클래스가 있다고 가정 class Truck: id_number = None car_number = None owner_name = None def __init__(self, id_number, car_number, owner_name): self.id_number = id_number self.car_number = car_number self.owner_name = owner_name 트럭의 차대번호는 생산에 따라 부여된 고유 번호로 변경되지 않지만, 소유주나 차량등록번호는 변경 될 가능성이 있는 정보이다. 따라서 TruckOwne..
객체지향 설계 5대 원리 SOLID 컴퓨터 프로그래밍에서 SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다. SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다. 이 원칙들은 애자일 소프트웨어 개발과 적응적 소프트웨어 개발의 전반적 전략의 일부다. S - SRP - Single Responsiblity Principle (단일 책임 원칙) 한 클래스는 하..
캐시 (Cache) 캐시란 컴퓨팅에서 캐시는 일반적으로 일시적인 특징이 있는 데이터 하위 집합을 저장하는 고속 데이터 스토리지 계층입니다. 따라서 이후에 해당 데이터에 대한 요청이 있을 경우 데이터의 기본 스토리지 위치에 액세스할 때보다 더 빠르게 요청을 처리할 수 있습니다. 캐싱을 사용하면 이전에 검색하거나 계산한 데이터를 효율적으로 재사용할 수 있습니다. 캐시의 작동방법 캐시의 데이터는 일반적으로 RAM(Random Access Memory)과 같이 빠르게 액세스할 수 있는 하드웨어에 저장되며, 소프트웨어 구성 요소와 함께 사용될 수도 있습니다. 캐시의 주요 목적은 더 느린 기본 스토리지 계층에 액세스해야 하는 필요를 줄임으로써 데이터 검색 성능을 향상하는 것입니다. 속도를 위해 용량을 절충하는 캐시..
DNS(Domain Name System) DNS(Domain Name System) 란? 도메인 네임 시스템 (Domain Name System, DNS) 은 호스트의 도메인네임 (www.example.com)을 네트워크주소(192.168.1.0)로 변환하거나, 그 반대의 역학을 수행하는 시스템이다. 인터넷의 DNS 시스템은 이름과 숫자 간의 매핑을 관리하여 마치 전화번호부와 같은 기능 DNS 작동원리 위의 그림과 같이 PC 브라우저에서 www.naver.com 을 입력한다. 그러면 PC는 미리 설정되어 있는 DNS (단말에 설정되어 있는 이 DNS를 Local DNS라 부름, 위에서는 203.248.252.2) 에게 "www.naver.com 이라는 hostname" 에 대한 IP 주소를 요청한다. ..
브라우저 동작 원리 브라우저의 주요 기능 브라우저의 주요 기능은 사용자가 선택한 자원을 서버에 요청하고 브라우저에 표시하는 것이다. 자원은 보통 HTML 문서지만 PDF나 이미지 또는 다른 형태일 수 있다. 자원의 주소는 URI(Uniform Resource Identifier)에 의해 정해진다. 브라우저의 기본 구조 브라우저의 주요 구성 요소는 다음과 같다. 사용자 인터페이스 - 주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등. 요청한 페이지를 보여주는 창을 제외한 나머지 모든 부분이다. 브라우저 엔진 - 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어. 렌더링 엔진 - 요청한 콘텐츠를 표시. 예를 들어 HTML을 요청하면 HTML과 CSS를 파싱하여 화면에 표시함. 통신 - HTTP 요청과 같은 ..
HTTP Response Status Code (HTTP 응답 상태 코드) Status Code 란? HTTP response is called the status line and includes a numeric status code (such as "404") and a textual reason phrase (such as "Not Found"). The way the user agent handles the response depends primarily on the code, and secondarily on the other response header fields. Custom status codes can be used, for if the user agent encounters a cod..
HTTP Request Method (HTTP 요청 방법) HTTP 는 GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH Reqeust Method 가 있으며, 상황별 알맞게 사용을 권장한다. GET The GET method requests a representation of the specified resource. Requests using GET should only retrieve data and should have no other effect. (This is also true of some other HTTP methods.)[1] The W3C has published guidance principles on this distin..
HTTP (HyperText Transfer Protocol) 란? HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다. W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. 이 정보가 모니터와 같은 출력 장치를 통해 사용자에게 나타나는 것이다. 추가로, HTTP는 여러가지 버전이 있다. HTTP의 버전은 이후 알아보기로 한다. 클라이언트 요청 ..
통신사별 DNS IP 리스트 (구글, SKT, KT, LG) 구글 (Google Public) 기본 DNS 서버 : 8.8.8.8 보조 DNS 서버 : 8.8.4.4 SKT 기본 DNS 서버 : 219.250.36.130 보조 DNS 서버 : 210.220.163.82 KT 기본 DNS 서버 : 168.126.63.1 보조 DNS 서버 : 168.126.63.2 LG 기본 DNS 서버 : 164.124.101.2 보조 DNS 서버 : 203.248.252.2
5S 철학... 1. 정리 또는 조직화(정렬) : 적절한 명명법 방법 등을 통해 무엇이 어디에 있는지 알아야 한다. 2. 정돈 또는 체계화 : 코드는 누구나 예상하는 위치에 있어야 한다. 그렇지 않다면 위치 정돈을 하여라. 3. 청소 또는 정리 : 소스에 과거 이력이나 주석으로 처리한 코드 등은 제거하기 바란다. 4. 청결 또는 표준화 : 프로젝트 내 일관적인 구현 스타일과 기법을 가져라. 5. 규율 또는 생활화 : 관례를 따르고, 변경이 필요하다면 기꺼이 변경 하여라. 맞는 말도 있는 것 같고 아닌 말도 있는 것 같고...
간단한 수식을 대입받는 임시변수를 사용할때는 임시변수 참조 부분을 수식으로 치환 변경 전 double basePrice = anOrder.basePrice(); return (basePrice > 1000); 변경 후 return (anOrder.basePrice() > 10000); 변경 전 double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.5; else return basePrice * 0.9; 변경 후 A if (getBasePrice() > 1000) return getBasePrice() * 0.5; else return getBasePrice() * 0.9; double getBasePric..
호출하는 메소드의 기능이 너무 간단해서 내용이 뻔하다면 메소드 기능을 한개로 병합하고 삭제하자. 변경 전 String getRating() { return (isPassRate())? "Y" : "N"; } boolean isPassRate() { return _score > 5; } 변경 후 String getRating() { return (_score > 5)? "Y" : "N"; }
리팩토링의 주된 작업은 코드를 포장하는 메소드를 적절히 정리하는 것이다. 핵심적인 리팩토링 기법은 코드 뭉치를 별도의 메소드로 빼내는 메소드 추출, 반대로 메소드를 호출 하는 곳에 메소드 삽입 기법이다. 메소드 추출 메소드 추출시에 가장 힘든 작업은 지역변수 처리, 주로 임시변수로 힘든경우가 많음. 1. 임시변수를 메소드 호출로 전환 후 없어도 되는 임시변수 삭제 2. 임시변수가 여러곳에서 사용된다면 임시변수 분리 3. 임시변수가 너무 얽혀 있다면 자료 객체 클래스로 전환해서 사용 void printOwing(double amound) { printBanner(); print("name : " + _name); print("amount : " + amound); } void printOwing(doubl..
중복 코드 똑같은 코드 구조가 두 군데 이상 있을 때 그 부분을 하나로 통일하면 개선할 수 있다. 단순한 예는 한 클래스의 두 메소드 안에 같은 코드가 들어 있는 경우다. 이럴 때는 메소드 추출 기법을 적용해서 겹치는 코드를 빼내어 별도의 메소드로 만들고 그 메소드를 두 곳에서 호출 또, 한 클래스의 두 하위 클래스에 같은 코드가 들어 있는 경우가 있다. 메소드 추출 기법을 적용해서 중복을 없앤 후 메소드 상향 기법을 적용한다. 코드가 같지 않고 비슷하다면, 같은 부분과 다른 부분을 분리한 다음 템플릿 메소드 형성 기법을 알고리즘만 다르다면, 알고리즘 전환 기법을 중복코드가 중간에 있다면 주변 메소드 추출 기법을 적용한다. 서로 상관없는 두 클래스 안에 중복 코드가 있다면, 모듈 추출로 제3의 클래스로 ..