[Zipkin] 사용법 가이드 - MSA 요청추적 (springboot/ sleuth/ grpc/ http)

tracing이 필요한 이유

Monolithic 시스템의 경우 클라이언트의 요청을 받으면 하나의 스레드에서 모든 요청을 실행하므로 로그를 확인하기 쉽다는 장점이 있습니다.
그에 반해 MSA의 경우에는 각 서비스의 복잡도가 낮아지고 역할 분담이 용이하지만 클라이언트의 요청을 받았을 때 여러 개의 마이크로 서비스 간에 통신이 발생해 로그를 확인하기 어려운 문제가 있습니다.
이를 해결하기 위한 어플리케이션 간 분산 추적을 위한 표준이 OpenTracing이며, 대표적은 구현체는 zipkin과 jaeger가 있습니다.

클라이언트가 서버로 호출한 하나의 호출을 Trace라고 했을 때, 서비스 컴포넌트간의 호출을 Span이라고 한다.각 서비스 컴포넌트들은 하나의 클라이언트 호출을 추적하기 위해서 같은 Trace Id를 사용하고,
각 서비스간의 호출은 각각 다른 SpanId를 사용합니다. 이렇게 함으로써 전체 트렌젝션 시간을 Trace로 추적이 가능하고, 각 서비스별 구간 시간은 Span으로 추적할 수 있습니다.

Read more

지극히 개인적인 맥북 초기셋팅

java-spring을 메인으로 사용하는 개발자 기준입니다.
맥북을 신규로구입한 경우 셋팅할 내용을 간단히 적어보았습니다.

mac

develop tools

etc

JPA-DDD 3 (단방향vs양방향, 중복된 컬럼 객체 문제)

one to many 관계에서 단방향 vs 양방향

단방향의 문제점 ( / 양방향의 장점)

해결방법

  • 부모측에서 nullable 을 설정해준다.
    • 이렇게 해놓고 컴파일을 해보면 org.hibernate.MappingException 이 나올탠데
    • (should be mapped with insert=”false” update=”false”) 라는 안내문구가나온다
  • 자식쪽에는 insertable = false,updatable = false 를 셋팅해주면 컴파일이 된다

부모

1
2
@JoinColumn(name = "car", nullable = false)
private List<Car> Cars;

자식

1
2
@JoinColumn(name = "resource_id",  insertable = false,updatable = false)
private List<Car> resourceId;
Read more

JPA-DDD 2 (readonly로 관계 맺기 / N+1 / ...)

readonly?

  • department - line 관계를 맺고싶을때?

  • 어떤 department가있다. 이department가 포함된 market - factory의 어떤 생산 line에서 제품을만든다

  • 강결합정도에 따라

    • 상호 참조 하지않고 service에서 로직으로 연관데이터 조합
    • readonly로 데이터 참조
    • read & write가능 (-> 지양하기, 하위 도메인취급이 되어버림)
  • 보수적으로 설계 -> 필요할때 하나씩 열어주는 방식으로 고려하면 :+1:

Read more

JPA-DDD 1 프로젝트 시작하기 - 1

시작하기전에


DDD / JPA기반의 프로젝트를 처음 도입하며 고민한 내용을 모아보았습니다.

모든 예제를 자세하게 다루지는 않습니다.
구체적인 예시보다는 방향성을 중점으로 봐주시면 감사하겠습니다.
같이 작업한 전OO님과 많은 의논을하며 공부했습니다. 감사합니다

의존성

1
2
3
4
5
dependencies {
...
compile("org.springframework.boot:spring-boot-starter-data-jpa")
...
}

DOMAIN 모델링 - 방향설정하기 ★★★★

  • 방향을 잘못정하면 관계가 복잡해진다 -> DDD의 의도와 맞지않음
  • 책임 관계가 모호해진다
  • ….
  • 자세한 권한설정및 방향은 뒤에서 다룸.

예제

공장에서 만든 제품을 매장공급한다고 가정

Read more

web api 서비스 application에서 예외 (오류와 거절)

외부에 제공하는 api

오픈 api처럼 외부에 api를 제공하고, api 명세서 제공한다.
이경우 api의 스팩이 정해져있고 다양한 clientem들이 이 규칙에 따라서 호출하게된다.
api는 성공하는경우가 대부분이겠지만 상황에 따라서 실패하기도 하고 이에따라 실패 메시지를 받게된다.
실패에도 다양한 경우가 있다.

이포스트는 여러가지 실패한 상황과 예외에 대해 다뤄보려고한다

Read more

java에서 exception

주로 문법과 활용방법에관해 다루는 포스트이다.

  • try-catch-final
  • throw, throws
  • checked, unchecked exception
  • custom exception
Read more

프로그래밍에서 예외 - 기초 개념

예외란?

프로그램의 동작이 정상적인 처리 범주에서 벗어난 경우 “ 예외(Exception)가 발생했다.” 라고 말한다. 예상하지 못한 사건의 발생이라고 볼 수 있다. 예외는 언제 발생하고 우리는 어떤 마음가짐으로 대해야할까?

Read more

온라인 url encoder, decoder ( euc-kr ) / JAVA에서 구현방법

euc-kr

다양한 회사와 협업을 하다보면 그만큼 다양한 요구사항이 있다.
http기반의 api호출이 아닌, socket통신을 하는 회사도 많이있다.

필자가 맡은 서비스의 대부분의 통신이 utf-8로 이루어지고 있다.
euc-kr기반의 url encoding을 요청받아 방법에 대해 메모한다.

Read more