IT

IT/Clean Code

[Clean Code] 9-2 도메인 특화 테스트

단위 테스트 도메인 특화 테스트 앞서 9-1 에서 구현간 기법으로 주로 API 위에다 함수와 유틸리티를 구현한 후 테스트 코드를 작성함으로 코드작성과 높은 가독성을 가진다. 테스트 코드는 쉽고 간결하고 이해하기 쉽게 해야하지만 효율성의 측면에서는 효율적일 필요는 없다. 온드가 급격하게 떨어지면 경보, 온풍기, 송풍기가 모두 가동 되는지 확인하는 코드. func TestTurnOnLoTempAlramAtThreashold(t *testing.T) { hardware.SetTemp(WayTooCold) controller.Tic() tests.AssertEqual(t, hardware.HeaterState(), true) tests.AssertEqual(t, hardware.BlowerState(), tru..

IT/Clean Code

[Clean Code] 9-1 TDD

단위 테스트 TDD, Test Driven Development 첫째, 실패하는 단위 테스트를 작성할 때까지 서비스 코드를 작성하지 마라. 둘째, 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성 하라. 셋째, 현재 실패하는 테스트를 통과할 정도의 서비스 코드를 작성 하라. 이렇게 일을 하면 테스트 수천개의 케이스가 생기는데 이를 전부 다 방치를 하면 서비스 코드와 맞먹을 정도의 규모가 되는데 이는 심각한 관리문제를 야기한다. 깨끗한 테스트 코드 테스트 코드는 가독성이 중요하다. 변경 전은 addPage와 assertSubString를 부르는라 중복되는 코드가 매우 많다. 자질구레한 사항은 없애고 테스트 코드 표현의 중점하자. public void testGetPageHieratch..

IT/Clean Code

[Clean Code] 7-1 예외처리

예외처리 함수 깔끔하게 하기 호출자 코드와 오류 코드 처리 코드를 분리한다. 1안 class DeviceController: def shutdown(self): try: self.try_shutdown() except (DeviceControllerError, DeviceShutdownError) as e: ... logger.error() def try_shutdown(self): device = self.get_handle() device.pause() device.clear_queue() device.close() def get_handle(self, device_id: int): ... raise DeviceControllerError('Invalid device handle') 2안 def ca..

IT/Clean Code

[Clean Code] 6-2 객체지향 절차지향 2

객체와 자료구조 디미터 법칙 모듈은 자신이 조작하는 객체의 속을 몰라야 한다는 법칙이다. 객체는 조회 함수로 내부 구조를 공개한다면 안 된다는 의미 (내부 구조를 노출하는 셈) C 클래스의 f 메소드는 다음과 같은 객체의 메소드만 호출 해야 한다. 클래스 C f가 생성한 객체 f로 넘어온 인수 클래스 C 인스턴스 변수 객체 디미터 법칙을 어긴 예시 같은 객체가 아닌 서로 다른 객체를 가지고 서로 연결해서 작성한 이런 코드를 기차 충돌 이라고 부른다. 일반적으로 조잡하니 지향하는 편이 좋다. outputDir := cTxt.GetOptions().GetScratchDir().GetAbsolutePath() 변경 예시 opts := cTxt.GetOptions(); scratchDir := opts.GetS..

IT/Clean Code

[Clean Code] 6-1 객체지향 절차지향

객체와 자료구조 객체 지향적 과 절차 지향적의 차이 절차 지향적인 코드는 기존 자료구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면 객체 지향적인 코드는 변경점이 생기면 기존 함수를 변경해야 하는 부분이 생길 수 있다. 모든 것을 객체 지향적인것 보다는 때로는 단순한 것이 적합한 상황이 있을 수 있다. 절차 지향적 class Squre(object): x: float y: float side: float class Rectangle(object): x: float y: float width: float height: float class Circle(object): x: float y: float radius: float def get_arae(figure: object) -> float: if ..

IT/Clean Code

[Clean Code] 5-1 형식

형식 소스를 보았을 때 코드가 깔끔하고 일관적이며 꼼꼼하며 질서정연하다고 생각되면 좋겠다. 술 취한 사람이 짜놓은 듯한 코드로 보인다면 코드를 보는 사람은 다른 부분도 그렇다고 생각 할 것이다. 개인적으로 스파게티처럼 작성된 소스는 유지보수할때 나도 스파게티를 만든는 경향이 있는데 비교적 잘 짜여졌다고 생각되는 부분을 고칠때는 나도 조심하여 일관성 있게 코드를 작성 할려고 하는 것 같다.프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다. 팀마다 형식을 맞추고 규칙을 정하며 규칙을 따라야 한다. 필요하다면 형식을 적용하는 도구를 활용해도 된다. jetbranin 제품을 사용한다면 코드 양식을 1명이 수정한 다음 config 파일 공유해도 괜찮지 않을까? 싶다.# 형식을 맞추는 목적 누군가 "돌아가기만 ..

IT/Clean Code

[Clean Code] 4-1 주석

주석 우리는 주석을 코드로 의도를 표현 하지 못하여 사용 한다. 그러나 과거의 주석이 미래에 실패를 불러 올 수 있다. 코드는 언제나 변화하고 진화하며 이곳 저곳 옮겨지기도 한다. 주석은 그 코드를 따라가지 못한다. 누군가는 주석을 엄격하게 관리해야 한다고 할 수도 있지만 애초에 주석이 필요하지 않도록 코드를 작성 하는데 에너지를 쏟자. 코드로 주석을 대체하라 변경 전 # 직원에게 복지 혜택을 받을 자격이 있는지 체크 if (employee.flags and HOURLY_FLAG) and employee.age > 65 : do_something() 변경 후 if employee.isEnoughForFullBenefits() : do_something() # 이상적인 주석 public static Sim..

IT/Clean Code

[Clean Code] 3-2 Functions

함수 함수는 한 가지만! 문제의 코드다. session_initialize() 를 주목하자. 최초 개발시 로그인시에 암호 체크용으로 개발을 했는데 이후에 다른 곳에서도 암호를 체크가 필요한 경우가 생겼고 똑같이 가져다 썻을 경우 Session이 초기화 되어 문제가 생길수 있다. 문제를 해결하기 위해서는 함수명을 check_password_and_session_init() 등으로 함수기능 명시하는 방법 (그래도 함수가 2가지 역할을 담당하여 문제) 함수의 기능을 두개로 다시 작성을 진행하는 방법이 있다. def check_password(username: str, password: str) -> bool: try: user = User.object.get(username = username) encrypt..

IT/Git

Git 프로젝트 별로 다른 계정 사용하기

모두 같은 계정 사용 git 을 사용할때 모든 프로젝트가 같은 계정정보를 사용한다면 아래처럼 사용 git config --global user.name "username" git config --global user.email "id@abc.com"서로 다른 계정 사용 프로젝트별로 다른 계정을 사용한다면 commit시에 이상한 계정으로 업로드 될수 있음 (예를 들어서 회사에서 이렇게 사용한다면? 개인 Github + 회사 Github Entrerprise or 회사 Gitlab) 변경할 프로젝트 경로에 접속해서 아래처럼 사용 git config --local user.name "username" git config --local user.email "id@abc.com"설정 확인 git config --..

IT/Clean Code

[Clean Code] 3-1 Parameter

함수 인수 함수의 이상적인 인수개수는 0개 이다. 다음은 1개(단항) 다음은 2개(이항) 3개(삼항)은 피하는게 좋다. 4개(다항) 이상은 작성하면 안된다. 이유는 개념을 이해하기 어렵게 만든다 Test case 에서도 검증하기 위해서 다양한 인수를 작성하는 것도 어렵다. 운영 개발할때 경우에 따라서 필요한 경우가 있는데 요즘은 IDE 잘 되어 있어서 상관 없지 않을까 싶다. 그래도 줄일수 있다면 줄이자.1개 (단항 함수) 대표적인 단항의 경우는 주로 두가지로 나누어진다. 질문을 던지는 경우 def is_file_exist(filepath:string) -> bool: ... Parameter를 변환하여 결과를 Return 하는 경우 def file_open(filepath:string) -> file:..

IT/Clean Code

[Clean Code] 2-2 Method

함수는 작게 만들어라 함수는 최대한 작게 만들어라. If문, While문 등 사용시 블록안에는 라인 1개로 처리하도록 하자. 이를 통해서 우리는 1단~2단 수준에 들여쓰기 수준을 유지할 수 있고 함수는 읽기 쉬워지고 이해하기 쉬워진다. def some_method(): ... if is_something: show_something() 함수는 한 역할만 해라 def request_something(): response = requests.post('url') return response def handle_response(response: Response): if response.status_code == 200: do_success() else: do_failure()

IT/Clean Code

[Clean Code] 2-1 Class 와 Method 이름

Class 이름 Class와 Object의 이름은 명사가 적합하다. [Good] Customer, WikiPage, Account, AddressParser [Bad] Manager, Processor, Data, Info Method 이름 Method와 Function의 이름은 동사가 적합하다. [Good] postPayment, deletePage, save javabean 표준에 따라서 Accessor(접근자), Mutator(변경자), Predictate(조건자)는 앞에 get, set, is 를 붙인다. 이름을 혼용하지마라 여러 Class에 add() 함수의 역할과 Paramerter와 Return 이 동일하다면 계속 사용해도 되지만 기존과 다른 성격을 지닌다면 insert() 나 append(..

IT/Git

Git Branch 를 통한 Gitflow

참고 : gmlwjd9405.github.io/2018/05/11/types-of-git-branch.html

IT/Git

Git Branch 사용법

Git Branch 사용법 Jetbrain IDE를 사용합니다 1. branch 확인하기 git branch 현재 master branch 만 존재, *는 현재 활성화 branch 표시 git branch -r 원격 저장소 branch 확인 2. branch 생성 및 이동 첫번째 방법 git branch feature/#1 git branch git checkout feature/#1 두번째 방법 git checkout -b feature/#1 3. branch 삭제 git branch -d feature/#1 4. branch Github 원격 저장소 push git push --set-upstream origin feature/#1 혹은 git push -u origin feature/#1 로컬에만 ..

IT/Git

Gitlab 에서 Github 로 저장소 log 유지하며 옮기기

윈도우 기준입니다. gitcmd 터미널 실행을 해서 아래와 같이 실행 git clone --bare http://gitlab.kaffalab.com/project.git cd project git push --mirror https://github.nhnent.com/godo/project.git

IT

[Jenkins] 젠킨스 Dockerfile 설치

[Jenkins] 젠킨스 Dockerfile 설치 cd /home/ vi Dockerfile docker build -t demo_jenkins . docker image ls docker run -it -p 8080:8080 --name demo_jenkins docker.io/jenkins/jenkins docker run -d -p 8080:8080 --name demo_jenkins docker.io/jenkins/jenkins Dockerfile FROM centos:7 RUN echo -e '[AdoptOpenJDK]\n\ name=AdoptOpenJDK\n\ baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/$releasever/$b..

IT

[Jenkins] 젠킨스란 무엇인가

젠킨스란 무엇인가 젠킨스는 개발시에 지속적인 통합 서비스를 제공해주는 오픈소스 툴이며, 이를 CI(Continous Integration) 이라고 표현 한다. 젠킨스 사이트 접속을 하면, 젠킨스는 프로젝트를 빌드, 배포, 자동화를 해주며 다양한 플러그인들이 있다고 한다. 젠킨스는 Java로 개발되어 있고 WAR를 단독 혹은 톰캣 등의 서버로 실행을 할 수 있으며, Windows, Linux, macOS 등 크로스 플랫폼을 지원한다. 젠킨스를 실행하면 웹 화면을 생성하며 REST API 호출로 구동 된다. CI (Continous Integration) 란? Build, Test를 실시하는 프로세스로 이러한 통합 프로세스를 계속 실시해 주는 것을 CI 라고 한다. 즉, 통합을 지속적으로 수행하는 것. CD..

IT/알고리즘

프로그래머스 - 가장 큰 정사각형 찾기

문제 설명 1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요. (단, 정사각형이란 축에 평행한 정사각형을 말합니다.) 예를 들어 1234 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 가 있다면 가장 큰 정사각형은 1234 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다. 제한사항 표(board)는 2차원 배열로 주어집니다. 표(board)의 행(row)의 크기 : 1,000 이하의 자연수 표(board)의 열(column)의 크기 : 1,000 이하의 자연수 표(boar..

IT/알고리즘

프로그래머스 - 나머지 한 점

문제 설명 직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다. 제한사항 v는 세 점의 좌표가 들어있는 2차원 배열입니다. v의 각 원소는 점의 좌표를 나타내며, 좌표는 [x축 좌표, y축 좌표] 순으로 주어집니다. 좌표값은 1 이상 10억 이하의 자연수입니다. 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return 해주세요..

IT/알고리즘

프로그래머스 - 순열 검사

문제 설명 길이가 n인 배열에 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는지를 확인하려고 합니다. 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는 경우 true를, 아닌 경우 false를 반환하도록 함수 solution을 완성해주세요. 제한사항 배열의 길이는 10만 이하입니다. 배열의 원소는 0 이상 10만 이하인 정수입니다. 입출력 예 arrresult [4, 1, 3, 2] true [4, 1, 3] false 입출력 예 설명 입출력 예 #1 입력이 [4, 1, 3, 2]가 주어진 경우, 배열의 길이가 4이므로 배열에는 1부터 4까지 숫자가 모두 들어 있어야 합니다. [4, 1, 3, 2]에는 1부터 4까지의 숫자가 모두 들어 있으므로 true를 반환하면 됩니다. 입출력 예 #2 [4, 1..

상쾌한기분
'IT' 카테고리의 글 목록 (4 Page)