일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- tolerated
- taint
- kotlin
- VARCHAR (1)
- JanusWebRTCServer
- 깡돼후
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- vfr video
- k8s #kubernetes #쿠버네티스
- 겨울 부산
- 티스토리챌린지
- python
- 오블완
- JanusWebRTC
- 코루틴 빌더
- terminal
- 자원부족
- table not found
- 달인막창
- pytest
- Value too long for column
- JanusWebRTCGateway
- Spring Batch
- PytestPluginManager
- 코루틴 컨텍스트
- PersistenceContext
- mp4fpsmod
- JanusGateway
- preemption #
- 개성국밥
목록개발 (101)
너와 나의 스토리
배경 데이터 구조 설계에 대해 경험이 많은 사람도 초기 설계에서는 실수가 빈번하다. 프로젝트를 진행할수록 문제 도메인과 데이터 구조에 대해 더 많은 것을 배우게 된다. 현재 데이터 구조가 적절치 않음을 깨달으면 곧바로 수정해야 한다. 필드를 옮겨야 할 상황 함수에 어떤 레코드를 넘길 때마다 또 다른 레코드의 필드도 함께 넘기고 있다면 데이터 위치를 옮겨야 할 것 한 레코드를 변경하려 할 때 다른 레코드의 필드까지 변경해야 하는 상황 → 필드 위치가 잘못되었다는 신호 클래스를 사용하면 '필드 옮기기' 리팩터링을 수행하기 더 쉬워진다. 클래스의 데이터들은 접근자 메서드들 뒤에 캡슐화되어 있으므로 클래스에 곁들여진 메서드들은 데이터를 이리저리 옮기는 작업을 쉽게 해준다. 데이터의 위치를 옮기더라도 접근자만 그..
stf 설치 가이드: stf README 참고 문제 stf를 설치하려고 하니 에러가 발생했다. 설치 명령어: npm install -g @devicefarmer/stf 문제는 node 버전이 맞지 않아서 설치에 실패하는 것이다. STF는 node 8.17.0만 지원한다 출처: https://stackoverflow.com/questions/47668771/error-while-trying-to-install-openstf node version 변경 node의 version management인 n을 설치해서 버전 변경 $ npm install -g n 명령어 n으로 간단하게 node version 변경 $ n 아래처럼 출력되면 화살표로 원하는 버전을 선택한 후 enter하면 된다. Permission..
배경 적용된 알고리즘보다 간명한 방법을 찾아내면 기존 코드를 고친다. 알고리즘 전체를 걷어내고 훨씬 간결한 알고리즘으로 바꿔야 할 때가 있다. 문제를 더 확실히 이해하고 훨씬 쉽게 해결하는 방법을 발견했을 때 내 코드와 똑같은 기능을 제공하는 라이브러리를 찾았을 때 이 작업에 착수하려면 반드시 메서드를 가능한 한 잘게 나눴는지 확인해야 한다. 절차 교체할 코드를 함수 하나에 모은다. 이 함수만을 이용해 동작을 검증하는 테스트를 마련한다. 대체할 알고리즘을 준비한다. 정적 검사를 수행한다. 기존 알고리즘과 새 알고리즘의 결과를 비교하는 테스트를 수행한다. 두 결과가 같다면 리팩터링이 끝난다. 그렇지 않으면 기존 알고리즘을 참고해서 새 알고리즘을 테스트하고 디버깅한다. 출처: - [리팩터링 2판]
클래스는 반드시 명확하게 추상화하고 소수의 주어진 역할만 처리해야 한다 * 추상화: 공통의 속성이나 기능을 묶는 것(클래스 정의) 배경 메서드와 데이터가 너무 많은 클래스는 이해하기가 쉽지 않으니 잘 살펴보고 적절하게 분리하는 것이 좋다. 일부 데이터와 메서드를 따로 묶을 수 있다면 어서 분리하라는 신호다. 함께 변경되는 일이 많거나 서로 의존하는 데이터들도 분리한다. 특정 데이터나 메서드 일부를 제거해도 다른 필드나 메서드들이 논리적으로 문제가 없다면 분리할 수 있다는 뜻이다. 절차 클래스의 역할을 분리할 방법을 정한다. 분리될 역할을 담당할 클래스를 새로 만든다 원래 클래스에 남은 역할과 클래스 이름이 어울리지 않는다면 적절히 바꾼다. 원래 클래스의 생성자에서 새로운 클래스의 인스턴스를 생성하여 필드..
단순한 출력 이상의 기능이 필요해지는 순간 그 데이터를 표현하는 전용 클래스를 정의하라 -> 나중에 특별한 동작이 필요해지면 이 클래스에 추가함으로써 점점 유용해진다. 절차 변수 캡슐화 단순한 값 클래스(value class) 만들기 생성자는 기존 값을 인수로 받아서 저장(setter), 이 값을 반환하는 getter 추가 정적 검사 값 클래스의 인스턴스를 새로 만들어서 필드에 저장하도록 setter를 수정 새로 만든 클래스의 getter를 호출한 결과를 반환하도록 getter 수정 테스트 함수 이름 바꾸기 리팩터링 예시: 레코드 구조에서 데이터를 읽어 들이는 단순한 주문(Order) 클래스 Before: Order 클래스의 우선순위(priority) 필드를 단순히 string 타입으로 사용 class ..
decode할 apk 파일: AppTest.apk 1. dex2jar 다운 다운 링크: https://sourceforge.net/projects/dex2jar/ dex2jar 다운 받아 압축을 풀어주세요. 그리고 해당 폴더 안에 decoding할 apk 파일을 넣어줍니다. 2. apk 파일을 jar 파일로 변환 터미널에서 dex2jar 폴더로 이동 아래 명령어 입력 $ sh ./d2j-dex2jar.sh AppTest.apk Permission denied 에러 발생 시 다음의 명령어로 권한 부여 $ sudo chmod +x d2j_invoke.sh 3. jar파일을 java 코드로 보기 JD-gui 다운 다운 링크: http://java-decompiler.github.io/#jd-gui-downlo..
배경 여러 함수를 한데 묶는 이유 하나는 도출 로직이 중복되는 것을 피하기 위해서다. 이 리팩터링 대신 여러 함수를 "클래스로 묶기"로 처리해도 된다. 원본 데이터가 코드 안에서 갱신될 때 → 클래스로 묶기 원본 데이터가 수정되면 일관성이 깨지는 경우 → 변환 함수 사용 변환 함수로 묶으면 가공한 데이터를 새로운 레코드에 저장 const base(aReading) = {...} const taxableCharge(aReading) = {...} ▼ function enrichReading(aReading){ const result = _.cloneDeep(original); result.baseCharge = calculateBaseCharge(result); result.taxableCharge = M..
function amountInvoiced(startDate, endDate) {...} function amountEceived(startDate, endDate) {...} function amountOverdue(startDate, endDate) {...} function amountInvoiced(aDateRange) {...} function amountEceived(aDateRange) {...} function amountOverdue(aDateRange) {...} 데이터 항목 여러 개가 여러 함수에서 몰려다니는 경우를 자주 볼 수 있다. 이런 데이터 무리를 발견하면 데이터 구조 하나로 모아주면 좋다. 데이터 뭉치를 데이터 구조로 묶었을 때 장점 데이터 사이의 관계 명확 매개변수의 수가 ..