25-03-19
๐ Daily Reportโ
๐ ํ๋ก์ ํธ ์ํฉโ
์ํ๊น๊ฒ๋ ๋ด ์ฒด๋ ฅ์ด ์์ง์ ์ ๋ฐ๋ผ์ฃผ๋ ๊ฒ ๊ฐ๋ค.
๋ชจ๋ํฐ๋ฅผ ๋ชป ์ณ๋ค๋ณด๊ฒ ์ ์ ๋๋ก ํธ๋ํต์ ์๊ตฌ๊ฑด์กฐ์ฆ์ ๋ฌต์งํ ํผ๋ก์ ๋ญ์ง ๋ชจ๋ฅผ ๋ถ ๋ฌ ๋๋๊น์ง ๋ค์ด์ ๊ฑฐ์ ๋ ๊ฐ์์ฑ๋ก ๋ณ์์ ๊ฐ๋ค.
ํ ์คํธ๋ง ๋ณด๋ฉด ๋ญ๊ฐ ์์๋ด๋๊ฑฐ ๊ฐ์๋ฐ ์ ๊ฒ ๋ค ์ข ํฉ์ธํธ๋ก ์ค๋๊น ์ต์ง๋ก ๋ชจ๋ํฐ ๋ณด๋ฉด์ ์์ ํด๋ ํ 70%๋ ๋ฉ๋๋ฆด ๊ฒ ๊ฐ์ ์ ๋๋ก ํ๋ค์๋ค.
๊ทธ๋์ ์์ก 2์ข ๋ฅ ์์ด ๋ง๊ณ ์งํต์ ๋ ์ฒ๋ฐฉ๋ฐ์๋๋ฐ, ์ข ๋น์ผ๊ฒ ํ ์ด์ง๋ง ๊ธฐ์ ๊ฐ์ด ์ง์ฅ์์ ์ด์๋์๋ค; ์์งํ ๊ธฐ๋ ์ํ๋๋ฐ ๋ฌด์จ ๋ฏธ๋ ์๋ช ๋ก๊ฒจ์จ์ค ใ ใ ใ
์ํ๊ฐ ํธ์ ๋ผ์ ๋คํ์ด์ง๋ง ๋ด์ฌ ์ง์ฆ์ด ๋๋ค.
์๋ ์ ์ฒด๋ ฅ์ด ํ์กฐ๋ฅผ ์ํด์ฃผ์ง?
๋ด๊ฐ ์ผ๋ง๋ ์์นจ์๋ ๋ฎ์๋ ์ ๋ ์๋ ์๋ฒฝ์๋ ๊ฐ๋ฐํ๊ณ ์ถ์๋ฐ? ์ง๊ธ ํ ๊ฒ ์ผ๋ง๋ ๋ง์๋ฐ?
๐ ๋ฌด์๋ฏธํ synchronized
โ
์์ฝ ๋์์ฑ TDD๊ฐ ๋๋์ด ๋ง๋ฌด๋ฆฌ ๋์๋ค. ํ ์คํธ๋ 10000๋ช ์ ์ ์์ ๊ฐ์ง ์ํธ๋ฆฌ์ ๋ํ์ฌ 50000๊ฐ์ ๋์ ์์ฝ ์๋๋ฅผ ๊ฑธ์๋๋ฐ, ๊ฐ์ด ํฌ๋ค๋ณด๋ ํ๊ฒฝ ์ธํ ๋ ๋ค์ด๊ฐ์ ์๊ฐ๋ณด๋ค ๊น๋ค๋กญ๋๋ผ. ์ผ๋จ ๋ค์์ ์ค์ ๋ค์ด ํ์ํ๋ค.
- MySQL์ max-connections ๋๋ฆฌ๊ธฐ (-> ํด๋ผ์ด์ธํธ ์ ์ํด์ ์ค์ )
- JVM heap memory ๋๋ฆฌ๊ธฐ (-> gradle ํ์ผ์์ ์ค์ [๋ ํผ๋ฐ์ค])
- hikari max-pool ๋ฐ timeout ๋๋ฆฌ๊ธฐ (-> yml์์ ์ค์ )
ํ๋จ์ ๋ณ๋ค๋ฅธ ์ฒ๋ฆฌ ์์ด ์๋น์ค์ @Transactional๋ง ๋ถ์ธ ํ ์คํธ์ ๊ฒฐ๊ณผ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ์๋น์ค์ synchronized
ํค์๋๋ฅผ ์ถ๊ฐํ ํ
์คํธ์ ๊ฒฐ๊ณผ์ด๋ค.
๊ฒฐ๊ณผ๊ฐ ๋ ์์ข์ ใ ใ ใ ใ ใ ใ
synchronized์ ๋ํ ๋ณด์์ฑ ๊ณผ ๊ทธ ๋ณด์์ฑ ์ ํ๊ณ์ ์ ์ฌ๊ธฐ์ ์ ์ค๋ช ํด์ฃผ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ํ์ฌ ์ํฉ์ ํ์ํ ์กฐ๊ฑด์ ๋จ๊ธฐ๊ฐ์ ๊ฐ๋ฐ ์ผ์ ์ ๋ง์กฑํ๋ ค๋ฉด Pessimistic Lock์ด ์ข์ ๊ฒ ๊ฐ๋ค.
๋ง์ง๋ง์ผ๋ก, ์ด๊ฑด Pessimistic Lock์ ์ ์ฉํ ๊ฒฐ๊ณผ์ด๋ค.
๐ API Gateway์ ํธ๋ฆฌํ uri ์ค์ โ
ํ์ฌ API Gateway์ ๋ผ์ฐํ ์ ์ด๋ฐ์์ผ๋ก ์ค์ ๋์ด ์๋ค.
spring:
gateway:
routes:
############## RESERVE-SERVICE ##############
######## [reserve-service] REST APIs ########
- id: reserve-service
uri: http://localhost:9091 # 2) localhost:9000 ๋ง๊ณ ์ฌ๊ธฐ๋ก ๋ณด๋ด์ค
predicates: # 1) ์ฌ๊ธฐ๋ก ์ ์ ์๋ํ๋ฉด
- Path=/v2/reserve/**
############## COMMON-SERVICE ###############
##### [common-service] Public Endpoints #####
- id: common-service
uri: http://localhost:9093
predicates:
- Path=/, /auth/**, /search, /store, /noti/**, /v1/auth/**, /v1/auth/**, /v1/store/**
filters:
- PublicFilter
###### [common-service] Member Endpoints #####
- id: common-service
uri: http://localhost:9093
predicates:
- Path=/member/**, /reserve/**, /v1/member/**, /v1/reserve/**
filters:
- MemberAuthFilter
###### [common-service] Manager Endpoints #####
- id: common-service
uri: http://localhost:9093
predicates:
- Path=/store/reserve/**
filters:
- ManagerAuthFilter
###### [common-service] Admin Endpoints #####
- id: common-service
uri: http://localhost:9093
predicates:
- Path=/store/registration
filters:
- AdminAuthFilter
########### static files ##############
- id: common-service
uri: http://localhost:9093
predicates:
- Path=/css/**, /js/**, /icon/**, /img/**
์ด๋ฌํ ์ค์ ์ ๋ฌธ์ ๋ผ๋ฉด, ์ถํ ํฌํธ๊ฐ ๋ฐ๋๋ฉด ์ฌ์ด๋ ์ดํํธ ๊ฑธ๋ฆด ํ๋ฅ ์ด ๋๋ค๋ ์ ์ด๋ค.
๋ฌผ๋ก ํ ์คํธ ๊ณผ์ ์์ ๋ค ๊ฑธ๋ฆฌ๊ฒ ์ง๋ง ์ ์ง๋ณด์ํ๊ธฐ ๋ณดํต ๊ท์ฐฎ์๊ฒ ์๋๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋๋? ์ฌ์ค API Gateway๋ Service Discovery์ ๋ฑ๋ก๋ ์๋น์ค๋ช ์ผ๋ก uri๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ง์ํ๋ค.
์๋ฅผ ๋ค์ด, ์ด๋ฐ์์ผ๋ก ์์ ํ ์ ์๋ค.
spring:
gateway:
routes:
############## RESERVE-SERVICE ##############
######## [reserve-service] REST APIs ########
- id: reserve-service
uri: lb://RESERVE-SERVICE # 2) localhost:9000 ๋ง๊ณ ์ฌ๊ธฐ๋ก ๋ณด๋ด์ค
predicates: # 1) ์ฌ๊ธฐ๋ก ์ ์ ์๋ํ๋ฉด
- Path=/v2/reserve/**
############## COMMON-SERVICE ###############
##### [common-service] Public Endpoints #####
- id: common-service
uri: lb://COMMON-SERVICE
predicates:
- Path=/, /auth/**, /search, /store, /noti/**, /v1/auth/**, /v1/auth/**, /v1/store/**
๊ทธ๋์ ์ด๋ฒ ํ๋ก์ ํธ์์ Nginx ์์ฐ๋๊ณ ๋ง๋ฅด๊ณ ๋ณ๋๋ก ๋ค์๋๋ฐ, ์ธ ํ์๋ฅผ ๋ชป๋๋ผ๊ฒ ๋ค.