Coding Note
throw Exception을 return 처럼 data 반환 용도로 사용하는 것은 불가능하다
throw Exception을 return 처럼 data 반환 용도로 사용하는 것은 불가능하다
2023.10.07return 대신 throw Exception 하면서 유용한 객체를 함께 반환하는 것은 불가능하다. (가능은 하지만 타입 정보가 사라져서 정적 타입 언어를 제대로 사용하는 방법이 아니다.) return Type 개수 만큼 Exception class를 정의 할 수는 없으니 generic을 이용해 CommonException 같이 정의하고 data: T에 데이터 담아서 던지면 되는거 아닌가 생각이 들 수 있는데 runtime에는 T가 사라지기 때문에 type-safe한 catching이 불가능하다. ( link ) 애초에 subclass of 'throwable' may not have type parameters 로 컴파일타임 에러가 발생하기 때문에 CommonException을 Generic으로 만들 ..
Enum VS String : 외부 API 요청에 대한 응답 수신 코드로 enum을 쓰는게 좋을까?
Enum VS String : 외부 API 요청에 대한 응답 수신 코드로 enum을 쓰는게 좋을까?
2023.07.13상황 1) 외부 API 요청에 대한 응답 수신 코드로 enum을 쓰는게 좋을까? 요약 ) 외부 API 요청에 대한 응답 코드나, 내 API에 대한 요청 코드의 타입은 enum으로 정의하는 것 보다 String으로 정의하고 enum 변환하는게 더 유연하다. (fault tolerance) enum에 정의 되어 있지 않은 값이 응답 코드로 들어올 수 있기 때문에 이에 대한 처리를 생각해 주어야 한다. (e.g., 예고 없이 갑자기 추가된 응답 코드) Exception 발생 해도 상관 없는 경우) 기본적으로 Exception 발생하게 되어 있다. 기본 Exception 메시지에서 @JsonValue 기준 값이 로깅된다. Caused by: com.fasterxml.jackson.databind.exc.Inva..
Exactly once는 가능할까?
Exactly once는 가능할까?
2023.06.19요약 ) 동작 중 서버 다운에 대한 대책. exactly once가 가능하려면... 동작 수행과 수행 결과에 대한 저장이 transaction이나 atomic으로 이루어 질 수 있어야 한다 원격지 서버 API 요청 동작 시, 네트워크 장애에 대한 대책. exactly once가 가능하려면... 처리 요청 보내기 전, 원격지에서 기존 처리 목록을 확인 할 수 있어야 한다. 또는, 원격지에서 hash나 id를 보고 동일한 요청이 들어오면 처리제외하는 방어 로직이 들어가 있어야 한다. exactly once delivery는 불가능. exactly once processing은 가능. 메시지 중복이나 누락이 발생하는 상황? 크게 2가지 어려운 포인트를 고민해야 한다. 서버 다운과 네트워크 장애다. kafka..
Unique ID, Key 생성기 설계 (with Shard Key)
Unique ID, Key 생성기 설계 (with Shard Key)
2023.06.09대규모시스템개발 #3 참고 7장. 분산 시스템을 위한 유일 ID 생성기 설계 참고 요구사항 유일해야 함. 시간 순으로 정렬 가능해야 함. (단 아주 작은 time slot 안에서는 순서가 보장되지 않아도 상관 없음) 숫자로만 구성되어야 함. DB 1대의 auto increment로 커버 불가한 규모. 분산DB 사용 중이라, ID를 보고 샤드를 찾아갈 수 있어야 함. 1-4 sol 트위터의 snowflake 데이터센터 위치, 서버 ID가 들어가서 어느 리전의 어느 서버가 채번하든 unique하도록. instagram 방식 shard ID를 넣었다. 5 sol -shard key에 대해서. id 자체를 shard key로 사용하는 방법도 가능은 하지만, 반드시 그래야 한다는 법은 없다. id 안에 shard..
[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를 위한 DB는 어떻게 구성하면 좋을까? - Testcontainers
[Test] 통합 Test를 위한 DB는 어떻게 구성하면 좋을까? - Testcontainers
2021.05.03pdf 내용 요약 Spring Batch는 통합TC 수행하고 나서 자동 rollback이 불가하다. TC에 alpha DB를 사용하는 경우 아래와 같은 문제가 생긴다. Spring MVC에서는 TC에 @Transactional @Rollback 처리하면, TC 수행 후 자동 롤백이 되기 때문에, 테스트 수행 시 alpha DB를 사용하도록 구성하는 경우가 많다. 그러나 Spring Batch에서는 TC에 @Transactional 사용이 불가하다. 따라서 @Rollback도 사용 불가하다. 롤백이 없으니 TC를 수행하고 나면 DB 상태가 매번 바뀌게 되며, alpha QA하며 실시간으로 변경되는 DB 상태와 TC 수행으로 변경되는 DB 상태가 서로에게 영향을 미치게 된다. TC에서 시작 전 어떤 테이블을..
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..