전체279 테스트 더블을 강력한 위력을 이해해보자. 아래 내용은 Effective Unit Testing - 라쎼 코스켈라 에서 발췌한 내용으로 이루어져 있습니다. 0. 들어가기 Stub과 Dummy는 왜 태어났을까? 이 둘의 처음 등장된 가장 큰 이유는 제품에 다른 제품이 준비되기 전까지 대신 사용할 용품이 필요했기 때문이다. 그러나 오늘날, Stub과 Dummy는 처음 나왔던 목적보다, 테스트 추종자에 의해 쓰음새가 다양해졌다. 다양한 테스트 전용 장치가 만들어지면서, 테스트 대상 코드를 격리 속도 개선 예측 불가능한 요소 제거 특수한 상을 시뮬레이션 감춰진 정보를 얻어내는 용도 이같이 목적은 비슷하면서도 다른 객체를 사용하는데 그 전부를 테스트 더블이라고 한다. 그럼 테스트 더블은 우리에게 어떤 득이 있을까? 1. 테스트 더블의 목적 "세상이 변하길.. 2020. 12. 28. [마틴파울러]GivenWhenThen 번역본 원본은 아래 링크를 클릭해주세요. bliki: GivenWhenThen a bliki entry for GivenWhenThen martinfowler.com Given-When-Then은 SpecificationByExample을 사용하여 시스템의 동작을 지정하는 테스트를 나타내는 스타일입니다 . BDD ( Behavior-Driven Development)의 일부로 Daniel Terhorst-North 와 Chris Matts가 개발 한 접근 방식입니다 . [1] Cucumber와 같은 많은 테스트 프레임 워크에 대한 구조화 접근 방식으로 보입니다. 4 단계 테스트 패턴 의 재구성으로 볼 수도 있습니다 . 기본적인 아이디어는 시나리오 (또는 테스트) 작성을 세 부분으로 나누는 것입니다. Given .. 2020. 12. 27. [Vue]왜 mutation 에서는 왜 비동기(async wait 문법)를 사용하면 안될까? (수정: 되긴 된다) 이번에 Vue 프로젝트를 진행하면서 mutations의 남용으로 Vuex에 대한 이해를 도왔습니다. 그 부분을 조금 더 자세히 기입합니다. 문제 발생 mutations: { ... async getUserInfos(state, loginId) { const basicUserInfo = await UserInfoApi.getUserInfoById(loginId); state.userinfo.userId = basicUserInfo.data.userId state.userinfo.userLoginId = basicUserInfo.data.userLoginId state.userinfo.userName = basicUserInfo.data.userName state.userinfo.dutyName = basi.. 2020. 12. 26. 테스트 주도 설계를 실천한다는 것 밥 로스 로스가 대중에게 인상적인 모습을 보인 것 중 하나가, 그림은 형태를 정하고 하나하나 디테일을 정해가면서 그려 나아가는 것이라는 일반인의 고정관념을 깬 것도 한몫 한다. 이미 그린 수풀이 붓으로 몇 번 칠하니 호수가 된다든지 하는 모습은, 그때그때 마음가는 대로 그려 나아가는 것이 낭만적이라는 느낌을 주기도 한데다, 유화를 배우지 않은 일반인 입장에서 보면 신기할 수밖에 없다. - 밥 로스에 대한 평가 우리는 밥 로스라는 사람을 알고 있습니다. 누가봐도 어려운 그림을 "참 쉽죠?(That easy)" 라는 대사로 유명한 밥로스는 그림을 그리는 방식이 특이하다고 합니다. 그림을 그릴 때, 밥 로스는 하얀 캔버스 위에 아주 약간의 덧칠로서 그림 전체의 윤곽을 만들어 완성 시키면서 그 다음 스텝을 이어.. 2020. 12. 18. [개발자의 글쓰기] 2장 개발 시간을 줄여주는 이름 짓기와 주석 쓰기 중요한 단어는 앞에 쓴다. // 안좋은 예 int totalVisitor int totalRegister int totalBuyer int totalSalesOfThisMonth int maxSizeOfWindow int numberOfTotalVIP int visitorTotal int registerTotal int buyerTotal int salesOfthisMonthTotal int windowSizeMax int vipCount 함수 이름 짓는 순서 함수는 시스템이 할 일을 나타내는 것이지 사용자가 할 일을 나타내는 것이 아니다. 따라서 함수의 주체, 즉, 주어도 없앤다. 좋은 이름의 기준, SMART 좋은 이름이 가진 5가지 특징 easy to Search 검색하기 쉽고 easy to Mix.. 2020. 12. 13. [JPA] Field or Property access? 원본 - thorben-janssen.com/access-strategies-in-jpa-and-hibernate/ Access Strategies in JPA and Hibernate - Which is better, field or property access? - Thorben Janssen JPA and Hibernate support field-based and property-based access strategies. But what exactly is the difference and which one should you choose? thorben-janssen.com 들어가기 JPA를 활용해 연관관계를 맺을 때, 나도 간과했던 부분이 하나 있었습니다. Entity 의 attributes.. 2020. 12. 13. @DataJpaTest 흟어보기 Spring JPA에서 Repository 테스트를 하기 위한 애노테이션으로 @DataJpaTest 를 사용합니다. 왜 Repository 를 테스트 해야 하는걸까? 반버논의 도메인 주도설계에서 테스트를 하는 이유는 아래와 같은 이유라고 합니다. "#리파지토리의 테스트를 바라보는 두 가지 방향 1. 리파지토리 자체가 바르게 동작하는지 증명하기 위해서 2. 그들이 생성하는 애그리게잇을 저장하고 기존의 애그리게잇을 검색하기 위해 리파지토리를 사용하는 코드를 테스트한다. 첫번째 유형의 테스트에선 완전한 프로덕션 수준 품질의 구현을 사용해야 한다. 그렇지 않으면 프로덕션 코드가 작동할지 알 수 있는 방법이 없다. 두번 째 유형의 테스트에선 프로덕션 구현을 사용하거나 그 대신 인메모리 구현을 사용할 수 있다." .. 2020. 12. 12. 개발자로서 부족한 점은 무엇이 있을까? 최근, 재택근무로 시간이 많아졌다. 재택근무를 시행하게 되면서, 집에 있는 시간이 많았다. 그만큼 할 수 있는게 많을 줄 알았는데, 그게 아니였다. '시간이 많다' == '공부할 시간이 많다.' 라는 법칙은 설립되지 않는다. 그보다도, 목표가 중요하다는 사실을 꺠달았다. 더 나아가 목표가 명확할 때, 내가 무엇을 원하는지 구체적일 때 시간이 빛나더라. 어...? 이거 안되네? 안되나보다! 개발을 하다보면, 라이브러리,프레임워크 라는 것에 많이 의존해 사용하게 된다. Spring, Vue.js 를 개발하면서도 마찬가지이다. 최근 이런 글을 우연히 알았다. 이 글은 JPA가 DDD에 적합한 도구가 아니기 때문에, JPA의 이점을 가져가면서도 DDD처럼 활용할 수 있도록 도와주기 위해서 개발되고 있는 오픈소스.. 2020. 12. 11. [Vue] vue-router에서 Hash Mode Vs History Mode 차이점은 무엇인가? 들어가기 최근 Vue 를 사용하게 되면서 Hash Mode와 History Mode에 대해서 의문점을 가지게 되었습니다. Vue.js에 router 관련된 설정을 추가하면서 다음과 같은 설정에 직면하게 되었습니다. import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) export default new Router({ mode: 'history', base: process.env.BASE_URL, routes: [ { .... } ] }) 여기서 history와 hash를 String으로 작성하여 설정할 수 있습니다 그렇다면 이 둘의 차이점은 무엇일까? 대체 무슨 차이이지? Hash mode Hash mode는 모든 URL을 HASH(.. 2020. 12. 8. [개발자의 글쓰기] 1장 개발자가 알아야 할 글쓰기 기본 01. 문장과 단락을 구조화하는 법 문자을 구조화하는 법 색상 RGB 값을 각각 사용하기 때문에 입력 데이터는 3차원 벡터다 > 입력데이터는 색상 RGB 값을 각각 사용하기 때문에 3차원 벡터다. > 입력데이터는 색상 RGB 값을 각각 사용한다. 그래서 입력데이터는 3차원 벡터다. > 입력 데이터는 3차원 벡터다. > 입력 데이터는 3차원 백터다. 색상 RGB 값을 각각 사용하기 때문이다. 문장을 쉽게 쓰기 위해서는, 간단한 문장 구조로 핵심을 만한 뒤, 필요에 따라 부가 설명을 하면 된다. 서술식, 개조식, 도식의 차이 서술식 '~다' 로 끝나는 완전한 문장으로 구성 된 글 개조식 '~했음, 종결어미' 로 끝내는 문장 도식 사물의 구조나 관계, 상태를 그림이나 서식으로 보여주는 것 개조식을 활용해 문장.. 2020. 12. 2. Java Garbage Collection 다시 살펴보기 출처: d2.naver.com/helloworld/1329 docs.google.com/presentation/d/1wkTP8YaSsxK-Zjd_cv9ofBEgihz1-ZiZfXNWYo3oRPM/edit#slide=id.g8c711dc557_1_92 과정 GC에 대해서 알아보기 전에 알아야 할 용어가 있다. 바로 'stop-the-world'이다. stop-the-world란, GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다. 어떤 GC 알고리즘을 사용하더라도 stop-the-world는 발생한다. 대개의 경우 GC 튜닝이.. 2020. 11. 25. JVM 이해하기 - 3 (JVM 구조 - 클래스로더, 런타임 데이터 영역, 실행 엔진) 참고자료 - d2.naver.com/helloworld/1230 위 페이지에서 가져온 내용입니다. 클래스 로더(Class Loader)가 컴파일된 자바 바이트코드를 런타임 데이터 영역(Runtime Data Areas)에 로드하고, 실행 엔진(Execution Engine)이 자바 바이트코드를 실행. 클래스 로더 자바는 동적 로드, 즉 컴파일 타임이 아니라 런타임에 클래스를 처음으로 해당 클래스를 로드하고 링크하는 특징이 있다. 이 동적 로드를 담당하는 부분이 JVM의 클래스 로더이다. 자바 클래스 로더의 특징은 다음과 같다. 계층 구조: 클래스 로더끼리 부모-자식 관계를 이루어 계층 구조로 생성된다. 최상위 클래스 로더는 부트스트랩 클래스 로더(Bootstrap Class Loader)이다. 위임 모델.. 2020. 11. 25. JVM 이해하기 - 2 (자바의 바이트 코드) Write Once, Run anywhere(WORA) 자바의 바이트 코드 WORA를 구현하기 위해 JVM은 사용자 언어인 자바와 기계어 사이의 중간 언어인 자바 바이트코드를 사용합니다. 이 자바 바이트코드가 자바 코드를 배포하는 가장 작은 단위입니다. JVM을 이야기 할 때에는 자바 바이트코드를 빼놓을 수 없다. JVM은 자바 바이트코드를 실행하는 실행기이다. 자바 컴파일러는 C/C++등의 컴파일러처럼 고수준 언어를 기계어, 즉 직접적인 CPU명령으로 변환하는 것이 아니라, 개발자가 이해하는 자바 언어를 JVM이 이해하는 자바 바이트코드로 번역한다. 따라서 자바 바이트코드는 플랫폼 의존적인 코드가 없기 때문에 JVM이 설치된 장비라면 CPU나 운영체제가 다르더라도 실행할 수 있고, 컴파일 결과물의 크기.. 2020. 11. 24. JVM 이해하기 - 1 (JVM 특징 이해하기) 자바를 이용하는 개발자라면 자바 바이트 코드가 JRE위에서 동작됨을 이해한다. 그러나, JRE에서 가장 중요한 요소는 자바 바이트 코드를 해석하고 실행하는 JVM(Java Virtual Machine) JVM은 하나의 개념이고, 스펙이다. 이를 구현한 객체가 Java VM, Delvik VM 등이 있다. JRE는 자바 API와 JVM, Native Method으로 구성되며, JVM의 역할은 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어 들여서 자바 API와 함께 실행하는 것 JVM의 특징 스택 기반의 가상 머신 : 대표적인 컴퓨터 아키텍처인 인텔 x86아키텍처, ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는 데 비해 JVM은 스택 기반으로 동작한다. 심볼릭 레퍼런스 .. 2020. 11. 24. HTTP Caching에 대해서 좀 이해해보자!!! 이번에 HTTP Code 중 304 에러 코드에 대해서 이해하는 과정에서 WebCache에 대한 정보를 일부 활용했다. 304 에러 코드는 웹 캐시에 저장된 데이터가 같은 데이터를 Get하려고 한다면, 이를 웹 브라우저가 변경되지 않은 데이터라는 것을 인지한다. 그럼 WebCache에 대해서 한꺼풀씩 이해해봅시다. HTTP Caching이 뭘까? 우리는 일반적으로 웹서버에 정적 파일을 다운로드 받습니다. 예를 들어, '/login' page 라고 했을 때, 로그인 페이지에는 css, js, html 등의 파일을 가져와야 합니다. 이때, http, css, js 등 여러 HTTP요청을 만드는 것이 일반적입니다. 그러나, 이제 이러한 페이지를 매우 자주 요청하면 네트워크 트래픽이 많이 발생하고 이러한 페이지.. 2020. 11. 14. HTTP 304 Not Modified의 이해 및 예제(with. spring) 1. HTTP 상태 코드 1.1 응답 메시지 & 상태라인 After receiving and interpreting a request message, a server responds with an HTTP response message. 요청 메시지를 받고 해석한 뒤에, 서버는 HTTP 응답 메시지를 보낸다. Example: HTTP/1.1 304 Not Modified Date: Fri, 07 Sep 2012 14:51:43 GMT Server: Apache/2.2.22 (Win32) mod_jk/1.2.37 Connection: Keep-Alive Keep-Alive: timeout=5, max=94 ETag: "d00000001f216-1e7-4c908f1fc4d6e" The first line o.. 2020. 11. 14. 클린 소프트웨어 책에서 말하는 VISITOR PATTERN이란? 이 책에서 가장 서두에 쓰여져 있는 VISITOR PATTERN을 쓰기 위해서 문제를 제기하는데, 그 문제는 바로 이것입니다. "클래스 계층 구조에 새로운 메소드를 추가할 필요가 있지만, 그렇게 하는 작업은 고통스럽거나 설계를 해치게 된다." 이런 문제는 흔하게 발생합니다. 이전 포스트했던 클린 소프트웨어 책에서 말하는 어탭터패턴은 무엇인가?에서도 마찬가지의 문제로 어탭터 패턴을 통해서도 해결방안을 찾았다면 이번에는 비지터 패턴을 활용해서 해결하는 방법을 살펴봅시다. 우리는 흔히 SOLID 원칙이라 불리는 객체지향 원칙이 있습니다. 디자인패턴은 이런 SOLID 원칙을 보다 더 SOLID 하게 만들기 위한 하나의 패턴입니다. 비지터는 변경해야 할 계층 질서에 새로운 파생형을 자주 추가할 필요가 없는 프로그.. 2020. 11. 8. HTTP에서 HTTPS로, 그렇다면 왜 HTTPS일까? HTTP는 우리에게 친숙하다. 개발자이든, 아니든 언젠가 한번쯤은 들어봤을 법한 용어라고 생각합니다. 왜냐하면, 지금 이곳을 접속했을때, 변하는 URL(URL은 Uniform Resource Locator로 네트워크 상에서 자원이 어디있는지 알려주는 규약)을 활용해 이곳에 왔을 것이기 때문입니다. HTTP(HyperText Transfer Protocal)는 웹 브라우저를 뜻합니다. HTTP는 인터넷에서 웹 서버와 사용자 컴퓨터에 설치된 웹 브라우저 사이에 문서를 전송하기 위한 통신 규약(protocal)입니다. 곧, HTTP는 인터넷에서 하이퍼텍스트(HyperText)를 전송(Transfer)하기 위해 사용되는 통신 규약(Protocal)입니다. HTTP에 대해서 더 학습하게 된다면, HTTP는 단순합.. 2020. 11. 8. 클린 소프트웨어 책에서 말하는 어탭터 패턴이란? 디자인 패턴중 어탭터 패턴이라는 것이 있습니다. 위키에서 말하길 어탭터 패턴은 어댑터 패턴(Adapter pattern)은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다. 클린 소프트웨어 예시로 설명하는 어탭터 패턴을 활용하는 예시는 아래와 같습니다. 위와같은 상황에서 Light가 서드파티에서 사온 것이라서, 소스코드가 없을 수도 있습니다. 아니면 Switch로 제어하고 싶은 다른 클래스가 있는데, 그 클래스가 Switchable로부터 파생받을 수 없다면 어떻게 해야 할까요? 여기서 ADAPTER 패턴이 등장합니다. 아래 그림은 클라이언트가 제어할 수 없는 Light 라는 클래스가 등장할.. 2020. 11. 8. HTTP 상태 코드 이해하기. 일반적으로 HTTP 응답 상태 코드의 목록. 1xx(정보-조건부 응답) : 요청을 받았으며 프로세스를 계속한다. 2xx(성공) : 요청을 성공적으로 받았으며 인식했고 수용하였다. 3xx(리다이렉션) : 요청 완료를 위해 추가 작업 조치를 필요하다. 4xx(클라이언트 오류): 요청의 문법의 잘못되었거나 요청을 처리할 수 없다. 5xx(서버 오류) : 서버가 명백히 유효한 요청에 대해 충족을 실패했다. 1xx (조건부 응답) 100(계속) 요청자는 요청을 계속해야 한다. 서버는 이 코드를 제공하여 요청의 첫 번째 부분을 받았으며 나머지를 기다리고 있음을 나타낸다. 101(프로토콜 전환) 요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 중이다. 102(처리) 2xx(성공) 200(성공) 서버가.. 2020. 11. 7. 이전 1 ··· 6 7 8 9 10 11 12 ··· 14 다음