분류 전체보기

    [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..

    [Git] 의미있는 commit 메시지와 깔끔한 history

    [Git] 의미있는 commit 메시지와 깔끔한 history

    의미있는 커밋 메시지 작성 방법과 깔끔한 history 유지하기 Github Repository의 커밋 내역만으로 프로젝트의 전체 흐름을 파악할 수 있다. 의미있는 커밋 메시지 작성 방법 merge 전략 3가지 Commit 메시지 구조 type(타입) : title(제목) body(본문, 생략 가능) Resolves : #issue, ...(해결한 이슈 , 생략 가능) See also : #issue, ...(참고 이슈, 생략 가능) Commit 메시지 규칙 1. 커밋 타입 지정 FEAT : 새로운 기능 추가 FIX : 버그 수정 DOCS : 문서 수정 및 추가 STYLE : 코드 스타일 관련 변경(코드 포매팅, 세미콜론 누락 등) REFACTOR : 코드 리팩토링 TEST : 테스트 코드, 리팩토링 테..

    [Git] 협업을 위한 git branch 전략

    [Git] 협업을 위한 git branch 전략

    Git branch 전략 Git branch 전략으로 불리는 git flow을 사용해 협업을 원활히 할 수 있다. git flow에 사용되는 branch 의 종류와 특징 Git branch 전략 (Git Flow) Git Flow master와 develop이라는 항상 존재하는 메인 브랜치(Main branch)가 있다. master 브랜치 배포 가능한 상태만을 관리하는 브랜치. develop 브랜치 다음에 배포할 것을 개발하는 브랜치. 통합 브랜치 역할을 하며, 평소에는 이 브랜치를 기반으로 개발을 한다. feature-* 기능을 개발하는 브랜치. develop 브랜치에서 feature를 checkout해서 작업한다. feature 브랜치를 사용한다면 feature/#이슈번호 와 같은 형태로 브랜치를 ..

    [백준 16637] 괄호 추가하기 (C++)

    16637번: 괄호 추가하기 길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순 www.acmicpc.net 꿀 조건 1. 괄호 안에는 연산자 하나만 들어갈 수 있다. 꿀 조건 2. 중첩된 괄호는 사용할 수 없고, 항상 올바른 수식만 주어진다. 모든 괄호 안에는 정직하게 정수1, 연산자, 정수2 의 형태로 구성되어있다. 이 점을 활용해서 백트래킹을 사용한 브루트 포스로 현재 연산자를 둘러싸는 괄호를 추가하는 경우, 그냥 넘어가는 경우 모두에 대해서 수식의 값을 확인하면 답을 구할 수 있다. 현재 연산자가 괄호로 둘러싸일 경우, 바로 다음 연산자(현재인덱스+2..

    프라이빗 블록체인과 블록체인의 가치

    프라이빗 블록체인과 블록체인의 가치

    이 글은 블록체인을 공부하면서 생긴 궁금증을 해소하기 위해 다양한 칼럼 및 논문을 읽고 주관적으로 요약/정리 및 개인의 생각을 담은 글입니다. 블록체인의 종류 블록체인은 운영환경 및 목적에 따라 크게 2가지 종류로 구분된다. 바로 퍼블릭(public) 블록체인과 프라이빗(private) 블록체인이다. 블록체인이라 하면 우리는 일반적으로 비트코인, 이더리움, 리플 등과 같은 거래가 가능한 암호화폐를 떠올린다. 이들이 화폐로서 안전하게 거래되는 이유는 블록체인의 특성 중 하나인 '탈중앙화' 와 깊은 관련이 있다. 탈중앙화된 시스템으로 인해 누구나 블록체인 네트워크에 참여할 수 있고, 모든 거래 내역을 볼 수 있으며, 누구나 트랜잭션 내역을 검증할 수 있다. 이러한 블록체인을 퍼블릭 블록체인이라고 한다. 퍼블..