Coding Note
[Test] 대역(Test Doubles) : Stubs, Mocks
[Test] 대역(Test Doubles) : Stubs, Mocks
2022.06.10대역의 필요성 테스트를 작성하다 보면 다양한 사유로 대역이 필요해지게 됩니다. 테스트 수행이 외부 의존성에 영향을 주면 안되는 경우 e.g., withdraw 요청이 포함된 기능을 테스트 할 때, 실제로 withdraw 요청이 API 서버에 전달되어서는 안됨. 테스트 내에서 같은 요청을 보냈을 때, 외부 의존성의 응답이 항상 동일할 것이라고 신뢰 할 수 없는 경우 (대부분) e.g., 테스트용 카드를 받았으나, 만료되는 경우 e.g., 외부 의존성에 장애가 발생하는 경우 외부 의존성으로 부터 원하는 응답을 일으키기 어려운 경우 대역의 간단한 예제 테스트 하고자 하는 것이 아래와 같을 때 `` AutoDebitRegister.register(user, cardNum)`` - cardNum 유효성에 따라 V..
개발을 잘 한다는건 뭘까? 좋은 개발자란?
개발을 잘 한다는건 뭘까? 좋은 개발자란?
2022.02.22이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
나는 풀스택이 아닌데, 풀스택이란 뭘까
나는 풀스택이 아닌데, 풀스택이란 뭘까
2022.02.18FE 개발자들 보면 나 스스로 FE를 할 줄 안다고 생각하는게 얼마나 오만한 생각인지 깨닫고는 한다. 난 그냥 FE, react를 조금 끄적거릴 줄 안다 뿐이지 제대로 된 FE 개발자라고 할 수는 없다. 이런 저런 생각 하다, 최근에 누가 물어본게 떠올라서. 풀스택은 뭘까?에 대해서 짧게 생각해봤다. 풀스택이란 뭘까 보통 사람이 쓸 수 있는 리소스가 100이라고 하면, A: BE에 100 투자했다. B: FE에 100 투자했다. C: BE 50, FE 50 투자했다. 당연히 C는, BE는 A보다, FE는 B 보다 못할거다. 같은 리소스를 분산해서 썼는데, A와 B 각자의 전문 분야에서 그들 만큼 잘하기를 바라는건 욕심이다. 하지만 그렇다고 C가 가치없는 개발자라고 얘기하고 싶은 것은 아니다. 분명 어떤 ..
[Thread-safety] 동시성 문제와 shared mutable state 관리
[Thread-safety] 동시성 문제와 shared mutable state 관리
2021.08.30스레드, 컨텍스트 스위칭에 대한 이해 스레드가 수행하는 더 이상 쪼개지지 않는 작업 최소 단위는 CPU instruction 이다. 즉. 어셈블리. interrupt가 들어오면, 지금 하고 있는 인스트럭션 까지 마치고 나서 컨텍스트 스위칭 하게 된다. 스레드 context switching 시, 스레드 컨텍스트(레지스터 등등)가 저장되었다가, 재시작 시 불러와서 이어서 실행하게 된다. e.g., CPU instruction 어디까지 수행했는지는 EIP 레지스터. 직전에 더하려던 값은 EAX 레지스터 등등. 무언가에 1을 더하는 작업을 CPU instruction으로 나누어 보면 최소 아래 3가지로 구성된다. (CAS는 예외) ```assembly load (from mem to reg) add reg, ..
[Test] 통합 Test에 in-memory DB 를 쓰는게 더 좋을까?
[Test] 통합 Test에 in-memory DB 를 쓰는게 더 좋을까?
2021.05.03블로그 포스팅은 업데이트 X. 상세 내용은 위 pdf 참조. Spring Batch는 통합TC 수행하고 나서 자동 rollback이 불가하다. -> 직접 rollback 코드를 작성해주어야 하는데 잡이 복잡한 경우 까다롭다. 매번 롤백 코드 신경써서 작성하는 것도 리소스 낭비다. -> 그러면 TC 수행 후 삭제되는 H2를 쓰면 어떨까? 생각하게 되는데, 이는 아래와 같은 문제점이 있다. 운영에서는 다른 DB 쓰고, TC는 다른 DB(In-Memory) 사용할 때의 문제점 유닛테스트에서는 DB를 안쓰거나, 간단한 쿼리 정도 사용하게 되므로 In-Memory 사용해도 무방하지만 복잡한 쿼리를 포함하여 실행하는 통합테스트는 In-Memory DB를 사용하면 아래와 같은 문제를 마주할 수 있다. 운영 DB는 O..
Serverless computing platform의 장점
Serverless computing platform의 장점
2020.12.04Lambda에 대해서 적었지만, 이런 식의 Serverless computing platform의 활용처라고 생각하면 됨. N사는 사내에 Lambda라는 플랫폼을 제공하고 있음 Serverless computing platform = Function as a Service(Faas) = event-driven compute platform 별도의 서버 없이 특정 이벤트에 대응하여 코드를 실행하거나, 직접 코드를 실행할 수 있다. 급하게 개발해야 할 때나, 가볍게 개발해야 할 때 서버 신청 / 설정 / 관리 안해도 되니 부담 적음. 배포 필요 없이 수정하면 수정하는대로 바로 반영된다는게 장점. 이러한 플랫폼의 장점과 언제 어떻게 사용하면 유용한지? A. 유저가 직접 기능 확장이 필요할 때 내 생각에 이런 ..
Promise / Future에 대한 개념 정리
Promise / Future에 대한 개념 정리
2020.03.20Promise / Future란? `` Future``는 미래에 실행이 완료될 것으로 예상되는 객체를 의미한다. 따라서 아직 실행되지 않은 경우나, 실행 중이지만 아직 완료되지 않은 경우를 포함하는 개념임. Future 객체에 요청한 값이 들어오기를 기다리는 동안 다른 연산을 수행할 수 있다. `` Promise`` 기본적으로 Future와 비슷하지만, Future는 외부에서 완료된 결과가 들어오기만 하므로 read-only, Promise는 강제로 내가 complete 할 수 있는 메서드를 제공한다는 차이점이 있다. (그래서 completable) 자바에서 `` Promise == CompletableFuture`` `` .complete()`` 라는 메서드를 제공하고 있음. https://stacko..
의존성 주입(DI, Dependency Injection)이란?
의존성 주입(DI, Dependency Injection)이란?
2019.05.10의존성이란? "의존성 주입"이 무엇인지 얘기하기 전에 "의존성"이 무엇인지부터 명확히 해야 한다. 우리가 의존성 의존성 말은 많이 하는데, 의존성이라는 단어가 등장할때면 어김없이 추상적인 개념이 하나 둘 튀어나오다 보니 코드에서 정확히 뭘 의미하는건지 감을 못잡는 경우가 많다. ```java public class SimpleMovieLister { // the SimpleMovieLister has a dependency on a MovieFinder private MovieFinder movieFinder; } ``` 이게 의존성이다. 별게 아님. 그냥 한 객체에서 다른 객체 갖다 쓰면 의존성이다. 그렇다면 의존성 주입은 무엇이냐? ```java public class SimpleMovieLister..
자료 구조 선택 가이드
자료 구조 선택 가이드
2018.12.20Java에서 `` Vector``는 `` ArrayList``다. `` Vector``가 있기는 하지만 사용할 필요가 없다. `` Vector``와 `` ArrayList``의 차이점은 동기화 처리에 있는데, `` Vector``는 무조건 동기화이기 때문에 단일 쓰레드에서 성능이 떨어지며 멀티 스레드 모델에서도 Collection, Map, synchronizedCollection, synchronizedList을 쓰는게 더 낫기 때문이다. deque? (발음은 deck) 양쪽에서 삽입/삭제가 가능한 원통형 구조를 생각하면 됨. C++에서 vector와 map 키-벨류 구조이긴 한데 컨테이너의 사이즈가 작아서 둘 중 뭘쓸까 애매한 경우가 있다. vector를 사용하는 경우라면, obj의 어떤 항목을 ke..
직렬화, Serialization
직렬화, Serialization
2017.12.01어떤 언어를 사용하든 변수에 담기는 데이터는 크게 Value와 Address 두 가지로 구분할 수 있다.포인터, 객체 변수 등등은 변수 자체에 담기는 데이터가 Address다.문제는 객체를 저장/전송하려고 할 때 발생하는데, 객체 변수에 들어있는 Address를 저장/전송한다면 받는 측에서 그 Address를 참조해봐도 아무런 데이터가 없기 때문에 전혀 의미가 없다. 그래서 레퍼런스를 따라가서 실제로 의미있는 데이터인 Value를 저장하는 작업이 직렬화, Serialization이다.직렬화 결과 데이터 형식은 선택에 따라 Binary일 수도, JSON, CSV일 수도 있다. 그래서 그냥 포인터로 따라가서 직접 저장하는 방식으로도 구현할 수 있겠지만 객체 내부에서 또 다른 객체 변수가 있다던지, 클래스 내..
함수형 프로그래밍 (Functional Programming)
함수형 프로그래밍 (Functional Programming)
2017.11.10이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
소켓 프로그래밍 관련 ( Socket programming )
소켓 프로그래밍 관련 ( Socket programming )
2017.08.252016/09/20 - [Network] - TCP { TIME_WAIT }실험적, 경험적으로 판단한 내용이라 항상 이렇게 동작함을 보장하지는 않는다. ```client → output_buf → ~network~ → input_buf → recv └─────── not app layer ───────┘```TCP socket에서, socket 사이에 주고받는 데이터의 단위는 TCP segment다.client에서 `` send(str)`` 시 `` str``이 하나의 TCP segment에 들어가 전송된다.server에서 `` recv()``는 다음과 같이 동작한다.buffer에 데이터가 있는 경우 buffer에 있는 데이터를 모두 또는 지정된 크기만큼 가져오면서 blocking을 해제하고 다음 코드를..