Back-End

    [Cloud Native] 분산 시스템의 기초 개념들

    [Cloud Native] 분산 시스템의 기초 개념들

    비둘기 책을 읽고 정리한 글입니다 분산 시스템이란? 분산 시스템은 개별 컴퓨터들이 네트워크로 연결되어서 하나의 컴퓨터로 보이는 시스템이다. 분산 시스템의 8가지 일반화 오류 네트워크는 안정적이다 네트워크는 언제든지 불안정해질 수 있다. 서비스들은 서로 다른 장비에 존재하기 때문에 잠재적인 네트워크 장애에 대응할 수 있도록 어플리케이션을 설계해야 한다. 네트워크 지연이 없다 넓은 의미의 네트워크 지연은 데이터를 받을 때까지 걸리는 시간을 의미한다. 서로 다른 장비에 있는 서비스들 간의 통신은 네트워크 지연이 반드시 존재한다. 네트워크 호출, 네트워크 통신 횟수를 줄여야 한다. 클라이언트와 가까운곳에 데이터를 두도록 한다. 이를 위해 캐싱, CDN, 멀티리전 배포 등을 활용할 수 있다. Pub/Sub 방법을..

    [Spring] 멀티모듈 단일 프로젝트 구성하기 (gradle)

    [Spring] 멀티모듈 단일 프로젝트 구성하기 (gradle)

    마이크로서비스의 복잡성 모든 것이 분리된 마이크로서비스는 정말 복잡하다. 장점을 100% 사용하려고 하면 그만큼 프로젝트가 복잡해지고 많은 리소스 비용이 발생한다. 예를 들어 서비스를 도메인 별로 분리한다고 생각해보자. 이때 들어가는 비용으로는 다음과 같은 것들이 있을 수 있다. 1. 인스턴스 생성 또는 컨테이너 생성 비용 2. MS간 통신에 사용되는 네트워크 I/O 3. 데이터 동기화 4. CI/CD 운영의 복잡도 증가 5. 도메인에 대한 비즈니스 로직 fragmentation 기존 모놀리식 서비스에는 모든 코드가 서로 섞여있을 수 있다. 그러면 스파게티같은 의존성때문에 함부로 마이크로서비스로 나누기 힘들 수 있다. 이때 점진적으로 서비스를 나누기 위해서 Spring의 멀티모듈을 사용할 수 있다. 왜 ..

    [MSA] 리액티브 마이크로 서비스 패턴

    마이크로 서비스 아키텍처에도 디자인 패턴이 존재한다. 그 중 하나가 바로 '리액티브 마이크로 서비스 패턴'이다. 리액티브 패턴은 기존 마이크로 서비스의 문제를 해결하기 위해 등장한 패턴으로 서비스간의 의존도를 낮추는것이 가장 큰 목적이다. 보통의 경우에 서비스 간의 통신을 위해서 RESTful API와 같은 블로킹 I/O 모델을 사용해 동기식 통신을 구현하곤 했다. 동기식 블로킹 I/O를 사용하면 서비스가 요청을 처리하는 동안 운영체제의 스레드를 점유하게 된다. 동시 요청 수가 증가하거나 요청과 관련된 컴포넌트가 증가하면 운영체제의 가용 스레드가 부족해 응답 시간이 늦어지거나 서버가 중단되는 문제가 발생할 수 있다. 따라서 동기식 블로킹 I/O를 과도하게 사용하면 마이크로서비스 시스템에 에러가 발생하기 ..

    [spring] SpringBoot mongodb 인덱싱 안되는 문제 (SpringBoot mongodb Unique index not created)

    [spring] SpringBoot mongodb 인덱싱 안되는 문제 (SpringBoot mongodb Unique index not created)

    embedded mongodb를 사용해 테스트를 진행했다. 인덱스가 중복되는 Entity를 저장하려 할 경우에 DuplicateKeyException 에러를 던질 줄 알았지만.. 아무일도 일어나지 않았다. @Document(collection = "products") @NoArgsConstructor @Getter @Setter public class ProductEntity { @Id private String id; @Version private Integer version; @Indexed(unique = true) private int productId; ... } 테스트에 사용중인 Entity의 일부이다. productId에 @Indexed 어노테이션을 unique = true 로 걸어주었다. ..

    [Spring] mongoDB Test Error (Error creating bean with name 'embeddedMongoServer' defined in class path resource)

    [Spring] mongoDB Test Error (Error creating bean with name 'embeddedMongoServer' defined in class path resource)

    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-05-10 23:00:10.030 ERROR 7765 --- [ Test worker] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'embeddedMongoServer' defined in class path resource [org/springframework/boot/aut..

    [Spring] Gradle dependencies 정리

    dependencies implementation & api 컴파일 타임과 런타임 모두에 걸쳐서 사용자에게 의존성을 부여하는 지시어이다. api 컴파일 타임과 런타임에 사용자에게 의존성을 노출시킨다. 의존 라이브러리가 수정되는 경우 해당 라이브러리를 의존하는 모든 모듈들을 재빌드한다. implementation 내부적으로만 사용되고 사용자에게는 의존성을 노출시키지 않게 선언한다. 의존 라이브러리를 수정해도 직접적으로 사용하는 모듈까지만 재빌드한다. 클래스 A, B, C가 있다. B는 A를 호출한다. (B는 A를 의존) C는 B를 호출한다. (C는 A, B를 의존) 즉, A > B > C 와 같은 의존성을 보인다. api를 사용해 A에 의존성을 부여했다고 하자. 만약 A가 수정된다면 A를 직접적으로 참조하..

    [Spring] 전역 REST 컨트롤러 예외 핸들러 만들기

    예외 처리를 REST 컨트롤러의 비즈니스 로직, 즉 API 구현부분과 분리하기 위해 @RestControllerAdvice 를 사용할 수 있다. @RestControllerAdvice @ControllerAdvice 와 @ResponseBody 가 합쳐진 어노테이션이다. @ResponseBody는 컨트롤러의 return 값으로 객체를 넘길 경우 Json으로 변환해주는 어노테이션이다. @ControllerAdvice는 아래 설명을 참고할 수 있다. @ControllerAdvice @ExceptionHandler, @ModelAttribute, @InitBinder 가 적용된 메서드들을 AOP를 적용해 컨트롤러에 적용하기 위해 만들어진 어노테이션이다. basePackageClasses, basePackage..

    확장 가능한 json 형식

    익숙하게 사용했던 패턴이지만 표준인 줄 모르고 넘어갔던 내용을 스프링의 API 작성을 공부하던 중에 다시 보게되어 확실히 정리하기위해 포스팅함 Django의 Serailizer에 many=True 옵션을 주는 경우 + Spring에서 @RestController를 사용해 Entity를 그대로 반환하는 경우 API의 response를 보면 아래와 같이 []배열 형태로 Json이 반환된다. [ { "id": 1, "name": "newhello", "address": null, "orders": [] }, { "id": 2, "name": "member1", "address": { "city": "서울", "street": "test", "zipcode": "1234" }, "orders": [] }, { ..

    [JPA] Java Persistence API

    [JPA] Java Persistence API

    자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 초급자를 위해 준비한 [백엔드, 웹 개발] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자 www.inflearn.com 김영한 님의 자바 ORM 표준 JPA 프로그래밍 강좌를 듣고 정리한 내용입니다. ORM이란? Object Relational Mapping(객체 관계 매핑) 객체는 객체대로 설계한다. 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다. ORM 프레임워크가 중간에서 매핑한다. 대중적인 언어에는 대부분 ORM 기술이 존재한다. JPA의 동작 JPA가 JAVA 애플리케이션에서 어떤 순서로 동작하는지 간단하게 알아볼 ..

    RabbitMQ, Redis, Kafka의 특징

    마이크로서비스에 대한 비동기 통신을 구현하기 위해서 메시지 브로커를 선택해 사용할 수 있다. MSA를 구축하기 위해서 메시지 브로커가 무엇인지를 이해하고, 많은 브로커들 중 어떤걸 사용할 지도 정해야 한다. 그래서 메시지 브로커중에서 가장 많이 쓰이는 RabbitMQ, Redis, kafka를 비교, 정리해보려고 한다. RabbitMQ, Redis, Kafka 같은 기술을 메시지 플랫폼이라고 한다. 메시지 플랫폼은 2가지 종류로 나뉘어진다. 메시지 브로커 이벤트 브로커 이 둘을 간단히 설명하면 다음과 같다. 메시지 브로커는 이벤트 브로커의 역할을 할 수 없지만, 이벤트 브로커는 메시지 브로커의 역할을 할 수 있다. 메시지 브로커 대규모 메시지 기반 미들웨어 아키텍쳐에서 사용되어왔다. 미들웨어란? 애플리케..