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% 이상의 업무 효율 개선을 만들어냄)
- SRP(Single Responsibility Principle): 클래스는 변경해야 할 이유가 하나만 있어야 합니다. 즉, 클래스는 하나의 책임 또는 작업만 가져야 하며 해당 책임 이외의 작업을 수행해서는 안 됩니다.
- 개방 폐쇄 원칙(OCP): 클래스는 확장에는 열려 있어야 하지만 수정에는 닫혀 있어야 합니다. 즉, 기존 코드를 수정하지 않고도 클래스에 새 기능을 추가할 수 있어야 합니다.
- Liskov 대체 원칙(LSP): 하위 유형은 기본 유형을 대체할 수 있어야 합니다. 이는 하위 유형이 프로그램의 정확성에 영향을 주지 않고 상위 유형을 대체할 수 있어야 함을 의미합니다.
- DIP(Dependency Inversion Principle): 고수준 모듈은 저수준 모듈에 의존해서는 안 됩니다. 둘 다 추상화에 의존해야 합니다. 즉, 구체적인 구현이 아닌 인터페이스로 프로그래밍해야 합니다.
- ISP(Interface Segregation Principle): 클라이언트가 사용하지 않는 인터페이스에 의존하도록 강요해서는 안 됩니다. 즉, 큰 범용 인터페이스보다 더 작고 더 구체적인 인터페이스가 있어야 합니다.
DataGrip : 강의에서 사용할 데이터베이스 관리 tool 이다
https://www.jetbrains.com/ko-kr/datagrip/download/
Beekeeper Studio Download | Beekeeper Studio
윈도우 docker
Install Docker Desktop on Windows
[깃헙 소스]
gregshiny/example-gift: 패스트캠퍼스 강의 - 선물하기 프로젝트 (github.com)
gregshiny/example-order: 패스트캠퍼스 강의 - 주문 프로젝트 (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://sabarada.tistory.com/193
https://livenow14.tistory.com/63
- 개발할 때, SLF4J API를 사용하여 로깅 코드를 작성
https://velog.io/@kdohyeon/Spring-EnableJpaAuditing
EnableJpaAuditing
엔티티 객체가 생성이 되거나 변경이 되었을 때 @EnableJpaAuditing 어노테이션을 활용하여 자동으로 값을 등록할 수 있습니다.
https://ict-nroo.tistory.com/129
https://ugo04.tistory.com/102
AuditingEntityListener을 사용하기 위해선 어플리케이션 구동 클래스에 @EnableJpaAuditing을 달아줘야 한다 .
엔티티에서 @EntityListener( value = AuditingEntityListener.class) 를 지정하면 사용할 수 있다 .
어노테이션으로 @CreatedBy(작성자) , @CreatedDate(작성일) @LastModifiedDate(수정일) @LastModifiedBy(수정자)
을 자동으로 넣어 주는 기능을 제공한다 .
https://galid1.tistory.com/592
@org.springframework.core.annotation.Order(value = 1)
https://jjhwqqq.tistory.com/275
@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
https://baekjungho.github.io/wiki/java/java-mapstruct/
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
awssdk 는 Software Development Kit의 약자로 AWS를 프로그래밍적으로 제어하기 편리하도록 제공되는 라이브러리들을 의미합니다
@Configuration이라고 하면 설정파일을 만들기 위한 애노테이션 or Bean을 등록하기 위한 애노테이션이다.
https://castleone.tistory.com/2
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
awssqs
https://aws.amazon.com/ko/sqs/
Part3 . MSA전환과 운영에 대한 tip
api 체계
과정
msa설득, 도메인의존관계 파악
빠른 성과
처음부터 데이터베이스 분리를 고려하지 않아도 된다.
'4차산업혁명의 일꾼 > Java&Spring웹개발과 서버 컴퓨터' 카테고리의 다른 글
[컴퓨터/IT] 객체지향의 사실과 오해 정리 (0) | 2023.04.17 |
---|---|
1일 1로그 100일 완성 IT 지식 정리(브라이언 W. 커니핸) (0) | 2023.04.17 |
Kubernetes 학습(chatGPT answer) (0) | 2023.03.22 |
균일비용 탐색, 언덕오르기 탐색, A* 알고리즘을 설명하고, 각 기법의 특성을 서로 비교하라. (0) | 2023.03.22 |
HTTP 완벽 가이드 - 웹은 어떻게 동작하는가[5부 21장] (0) | 2023.03.22 |