4차산업혁명의 일꾼/Java&Spring웹개발과 서버 컴퓨터

Java/Spring 기반 서비스 개발과 MSA 구축

르무엘 2023. 3. 23. 19:55

The RED : 비즈니스 성공을 위한 Java/Spring 기반 서비스 개발과 MSA 구축 by 이희창

이희창 약력

2020.08 ~ 현재 29CM / Director of Engineering

Monolithic에서 Microservice Architecture 전환 과정 주도 (의사 결정, 도메인 도출 및 도메인간 계층 구조 정의, 기반 기술 정의, 기반 인프라 정의 및 구축) spring boot 기반의 주요 서비스 설계 및 구현 선물하기 서비스 런칭 (서비스 전체 구조를 설계함, 구현의 일부에 참여함, 개발 전체를 리딩하고 PO와 긴밀히 협업함) 29CM 대형 프로모션마다 이슈 없도록 대응 (빅토리아슈즈, 재지팩트와 같은 대량의 트래픽이 예상되는 프로모션마다 이슈 없도록 대응함, 이벤트 후 도출된 성능 개선점을 찾고 그에 맞게 개선 작업을 진행함)

2019.11 ~ 2020.07 클래스101 / Head of Engineering

Monolithic에서 Microservice Architecture 전환 과정 주도 spring boot 기반의 주요 서비스 설계 및 구현 정기구독 서비스 런칭

2017.06 ~ 2019.11 토스 / Senior Software Engineer

[Toss-X (신규 사업팀)] 펀드 소액투자, P2P 분산투자 편의점 바코드 결제 축의금 송금 서비스 자동차 이용 프로그램 (1차 파일럿) 서비스

[토스 결제팀] MSA 기반으로 결제 서버군의 인프라 분리 넥슨, 라이엇게임즈, 배달의민족, 위메프, 11번가, 이베이, 무신사, 인터파크, 롯데면세점, 스팀, 제주항공, 교보문고 등의 주요 가맹점 연동 및 지원

[토스 보험팀] 성능 개선을 위한 녹취 파일 서버 분리 elk & kafka & slack 기반의 로그 모니터링 구축

2016.03 ~ 2017.06 쿠팡 / Senior Software Engineer

Warehouse Management System Team 입고 로직의 주요기능 개발, 재고조사 로직 개선 (30% 이상의 업무 효율 개선을 만들어냄)

  1. SRP(Single Responsibility Principle): 클래스는 변경해야 할 이유가 하나만 있어야 합니다. 즉, 클래스는 하나의 책임 또는 작업만 가져야 하며 해당 책임 이외의 작업을 수행해서는 안 됩니다.
  2. 개방 폐쇄 원칙(OCP): 클래스는 확장에는 열려 있어야 하지만 수정에는 닫혀 있어야 합니다. 즉, 기존 코드를 수정하지 않고도 클래스에 새 기능을 추가할 수 있어야 합니다.
  3. Liskov 대체 원칙(LSP): 하위 유형은 기본 유형을 대체할 수 있어야 합니다. 이는 하위 유형이 프로그램의 정확성에 영향을 주지 않고 상위 유형을 대체할 수 있어야 함을 의미합니다.
  4. DIP(Dependency Inversion Principle): 고수준 모듈은 저수준 모듈에 의존해서는 안 됩니다. 둘 다 추상화에 의존해야 합니다. 즉, 구체적인 구현이 아닌 인터페이스로 프로그래밍해야 합니다.
  5. ISP(Interface Segregation Principle): 클라이언트가 사용하지 않는 인터페이스에 의존하도록 강요해서는 안 됩니다. 즉, 큰 범용 인터페이스보다 더 작고 더 구체적인 인터페이스가 있어야 합니다.

 

DataGrip : 강의에서 사용할 데이터베이스 관리 tool 이다

https://www.jetbrains.com/ko-kr/datagrip/download/

 

DataGrip 다운로드: 데이터베이스 및 SQL용 크로스 플랫폼 IDE

 

www.jetbrains.com

 

Beekeeper Studio Download | Beekeeper Studio

 

Beekeeper Studio Download

Free & Open Source SQL editor and database manager for MySQL, Postgres, SQLite, SQL Server, and more. Available for Windows, Mac, and Linux.

www.beekeeperstudio.io

윈도우 docker

Install Docker Desktop on Windows

 

Install Docker Desktop on Windows

 

docs.docker.com

 

[깃헙 소스]

gregshiny/example-gift: 패스트캠퍼스 강의 - 선물하기 프로젝트 (github.com)

 

GitHub - gregshiny/example-gift: 패스트캠퍼스 강의 - 선물하기 프로젝트

패스트캠퍼스 강의 - 선물하기 프로젝트. Contribute to gregshiny/example-gift development by creating an account on GitHub.

github.com

gregshiny/example-order: 패스트캠퍼스 강의 - 주문 프로젝트 (github.com)

 

GitHub - gregshiny/example-order: 패스트캠퍼스 강의 - 주문 프로젝트

패스트캠퍼스 강의 - 주문 프로젝트. Contribute to gregshiny/example-order development by creating an account on GitHub.

github.com

 

[도커 실행 명령어] 

example-order : docker-compose -p order-db up -d

example-gift : docker-compose -p gift-db up -d

[도커 중지 명령어]

docker-compose down 또는

docker-compose down --volume

 

Part 1 주문 프로젝트 개발

 

server:
  shutdown: graceful

spring:
  lifecycle:
    timeout-per-shutdown-phase: 20s
  jpa:
    show-sql: true
    #    database-platform: mysql
    hibernate:
      ddl-auto: none
  datasource:
    hikari:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:13307/order?serverTimezone=UTC&characterEncoding=UTF-8
      username: order-svc
      password: order-pass
  flyway:
    user: order-svc
    password: order-pass
    schemas: order
    url: jdbc:mysql://localhost:13307/order?serverTimezone=UTC&characterEncoding=UTF-8
    enabled: true

#  h2:
#    console:
#      enabled: true
#      path: /h2-console

logging:
  config: classpath:logback-local.xml

https://medium.com/naver-cloud-platform/%EA%B8%B0%EC%88%A0-%EC%BB%A8%ED%85%90%EC%B8%A0-%EB%AC%B8%EC%9E%90-%EC%95%8C%EB%A6%BC-%EB%B0%9C%EC%86%A1-%EC%84%9C%EB%B9%84%EC%8A%A4-sens%EC%9D%98-mapstruct-%EC%A0%81%EC%9A%A9%EA%B8%B0-8fd2bc2bc33b

 

편리한 객체 간 매핑을 위한 MapStruct 적용기 (feat. SENS)

Ncloud 문자/알림 발송 서비스 SENS 개발 과정에서 MapStruct를 활용해 보았습니다.

medium.com

https://sabarada.tistory.com/193

 

[flyway] flyway를 통해 DDL 형상관리를 하자 - Spring Boot (Java API) 편

안녕하세요. 오늘은 flyway를 이용하여 로컬 환경에서 DDL의 형상관리를 하는 방법을 알아보도록 하겠습니다. flyway flyway는 데이터베이스의 형상관리를 목적으로 하는 툴입니다. 데이터베이스의

sabarada.tistory.com

 

https://livenow14.tistory.com/63

 

 

[Logging] SLF4J란?

블로그를 작성하고, 테코톡을 진행했어요. 더 쉽게 이해하고 싶다면 아래 영상을 시청해주세요! [10분 테코톡] ☂️ 검프의 Logging(로깅) #1 SLF4J(Simple Logging Facade for Java)는 이름에서 확인할 수 있듯

livenow14.tistory.com

  • 개발할 때, SLF4J API를 사용하여 로깅 코드를 작성

 

https://velog.io/@kdohyeon/Spring-EnableJpaAuditing

 

[JPA] @EnableJpaAuditing

@EnableJpaAuditing 어노테이션에 대해 알아봅니다.

velog.io

EnableJpaAuditing

엔티티 객체가 생성이 되거나 변경이 되었을 때 @EnableJpaAuditing 어노테이션을 활용하여 자동으로 값을 등록할 수 있습니다.

 

https://ict-nroo.tistory.com/129

 

[JPA] @MappedSuperclass

@MappedSuperclass객체의 입장에서 공통 매핑 정보가 필요할 때 사용한다.id, name은 객체의 입장에서 볼 때 계속 나온다.이렇게 공통 매핑 정보가 필요할 때, 부모 클래스에 선언하고 속성만 상속 받아

ict-nroo.tistory.com

 

https://ugo04.tistory.com/102

 

SPRING DATA JPA 공부 7 - AuditingEntityListener 사용

지금까지 직접 EntityListener를 작성했지만 사실 자주 사용 되는 기능들을 이미 스프링에서 구현해놓은 EntityListner가 있다 . 바로 AuditingEntityListener 이다 . AuditingEntityListener을 사용하기 위해선 어플

ugo04.tistory.com

AuditingEntityListener을 사용하기 위해선 어플리케이션 구동 클래스에  @EnableJpaAuditing을 달아줘야 한다 .  

엔티티에서 @EntityListener( value = AuditingEntityListener.class) 를 지정하면 사용할 수 있다 .

어노테이션으로 @CreatedBy(작성자) , @CreatedDate(작성일) @LastModifiedDate(수정일) @LastModifiedBy(수정자) 

을 자동으로 넣어 주는 기능을  제공한다 .  

 

https://galid1.tistory.com/592

 

JPA - Entity의 가독성을 높이자(@Embedded, @Embeddable, @AttributeOverride 사용법)

@Embedded, @AttributeOverride JPA에서는 Entity안의 값을 조금 더 의미있는 값으로 표현하기 위해 응집된 하나의 객체로 데이터를 표현합니다. 이번 포스팅에서는 이 처럼 JPA의 Entity를 조금 더 확실한 의

galid1.tistory.com

 

 

@org.springframework.core.annotation.Order(value = 1)

https://jjhwqqq.tistory.com/275

 

@Order 사용시 주의점

Spring에서 제공하는 @Order는 List 형태로 DI 받을때 주입받는 Bean의 우선순위가 필요할때 사용한다. @Order(value = 1), @Order(value = 2), @Order(value = 3).. @Order의 value가 작을수록 우선순위가 높아 앞쪽으로

jjhwqqq.tistory.com

@Order의 value가 작을수록 우선순위가 높아 앞쪽으로 정렬되고, value가 클수록 우선순위가 낮아 뒷쪽으로 정렬된다.

 

 

@Mapper 애노테이션을 사용해서 MapStruct 클래스라는 것을 알린다.
 * 빌드하게 되면 @Mapper 인터페이스를 찾아서 XXXImpl의 형태로 구현체를 모두 만들게 된다.
 * 이때 componentModel을 spring으로 준다면 생성되는 Impl은 스프링의 싱글톤 빈으로 관리된다. -> @Component가 붙는다.
@Mapper(
        componentModel = "spring",
        injectionStrategy = InjectionStrategy.CONSTRUCTOR,
        unmappedTargetPolicy = ReportingPolicy.ERROR
)

https://velog.io/@backtony/Spring-Mapper-Mapstruct-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

Spring Mapper - Mapstruct 사용하기

모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다.(공부한 내용을 정리하는 Github와 이 모든 내용을 담고 있는 블로그가 있습니다. )복잡한 애플리케이션을 여러 개

velog.io

https://baekjungho.github.io/wiki/java/java-mapstruct/

 

Mapstruct

 

BAEKJungHo.github.io

 

 

 

 

 

Part 2. 선물하기 프로젝트 개발

Retrofit?

안드로이드와 서버간의 REST API 통신을 도와주는 라이브러리로, OkHTTP에 기반을 두고 있으며 현재 가장 널리 쓰이는 통신 라이브러리이다.

https://velog.io/@hoyaho/Retrofit2%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

Retrofit2에 대해 알아보자! | Android Study

가장 널리 쓰이는 통신 라이브러리

velog.io

 

awssdk 는 Software Development Kit의 약자로 AWS를 프로그래밍적으로 제어하기 편리하도록 제공되는 라이브러리들을 의미합니다

 

 @Configuration이라고 하면 설정파일을 만들기 위한 애노테이션 or Bean을 등록하기 위한 애노테이션이다.

https://castleone.tistory.com/2

 

[Spring] @Configuration 개념과 장점

더보기 1. @Configuration 이란? : @Configuration이라고 하면 설정파일을 만들기 위한 애노테이션 or Bean을 등록하기 위한 애노테이션이다. 더보기 2. @Configuration을 사용하면 뭐가 좋은데? : @Configuration 애

castleone.tistory.com

 

server:
  port: 18080
  shutdown: graceful

spring:
  lifecycle:
    timeout-per-shutdown-phase: 20s
  jpa:
    show-sql: true
    #    database-platform: mysql
    hibernate:
      ddl-auto: none
  datasource:
    hikari:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:13306/gift?serverTimezone=UTC&characterEncoding=UTF-8
      username: gift-svc
      password: gift-pass
  flyway:
    user: gift-svc
    password: gift-pass
    schemas: gift
    url: jdbc:mysql://localhost:13306/gift?serverTimezone=UTC&characterEncoding=UTF-8
    enabled: true

logging:
  config: classpath:logback-local.xml

example.order:
  base-url: http://localhost:8080/

cloud:
  aws:
    access-key: aaaa
    secret-key: bbbb

 

선물하기 주문,결제 특징

-> 주문시 배송지 정보 받을수가 없다.

 

API 설계 3가지 방법 검토

(1) 기존 서비스 API 변경 : 기존 주문등록 배송지 정보 선택값으로 변경

  => 기존 배송의 배송지 정보 이슈 발생 위험

(2) 신규 API : 선물용 API - 주문등록시 배송지 선택

  =>  주문 API 추가식으로 하면 계속 추가해야하는 번거로움

(3) 신규 서비스 , 기존 API 스택 맞추기

 => 배송지 컬럼을 temp_value ( 없을때 temp_value를 넣는다.)

 

이슈 발생 위험없고 미래 번거로움 적은 3번으로 한다

 

Retrofit   

retrofit은 네트워크로 부터 전달된 데이터를 우리 프로그램에서 필요한 형태의 객체로 받을 수 있는 Httpclient 라이브러리입니다. 과거에는 이러한 상황에서 우리는 OKHttp를 사용하였습니다. 하지만 과거에는 여러가지 예외적인 상황을 고려해서 개발자가 직접 손봐줘야 했습니다.

https://dotiromoook.tistory.com/8

 

[Android] [Java] retrofit 이란, retrofit을 사용하여 서버와 통신하기(예제포함)

안녕하세요~ 여러분 오늘은 retrofit 이란 걸 사용하여 서버와 통신을 해보겠습니다. 먼저 retrofit이 무었인지와 왜 써야 하는지에 대해 알아보겠습니다. https://square.github.io/retrofit/ Retrofit A type-safe H

dotiromoook.tistory.com

 awssqs

https://docs.aws.amazon.com/ko_kr/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-getting-started.html

 

Amazon SQS 시작하기 - Amazon Simple Queue Service

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

https://aws.amazon.com/ko/sqs/

 

완전관리형 메시지 대기열 - Amazon Simple Queue Service - Amazon Web Services

Amazon Simple Queue Service(SQS)를 사용하면 메시지 손실을 우려하거나 다른 서비스를 제공할 필요 없이 소프트웨어 구성 요소 간에 어떤 볼륨의 메시지든 전송, 저장 및 수신할 수 있습니다. 확대하려

aws.amazon.com

 

 

Part3 . MSA전환과 운영에 대한 tip

 

 

 

 

api 체계

 

과정 

msa설득, 도메인의존관계 파악

빠른 성과

처음부터 데이터베이스 분리를 고려하지 않아도 된다.

LIST