Skip to content

Seonu-Jeong/spring-ITS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ€– I.T.S (Immortal-Ticketing Service)


main_image

🌈 μ„œλΉ„μŠ€/ν”„λ‘œμ νŠΈ μ†Œκ°œ

"μ“°λŸ¬μ§€μ§€ μ•ŠλŠ” μ½˜μ„œνŠΈ 예맀 μ„œλ²„"

κ΄€λ¦¬μžλŠ” 곡연μž₯을 λ“±λ‘ν•˜κ³  ν•΄λ‹Ή 곡연μž₯에 μ˜€ν”ˆν•  μ½˜μ„œνŠΈλ₯Ό 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€. νšŒμ›μ€ μ›ν•˜λŠ” κ°€μˆ˜μ˜ μ½˜μ„œνŠΈλ₯Ό μ˜ˆλ§€ν•˜κ³  μ·¨μ†Œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예맀 μ„œλΉ„μŠ€μ˜ νŠΉμ„± 상 λ™μ‹œ μ ‘μ†μžκ°€ λ§Žμ•„μ§€λŠ” νŠΈλž˜ν”½ ν™˜κ²½μ„ κ³ λ €ν•©λ‹ˆλ‹€. λ™μ‹œμ„± μ œμ–΄, 인덱슀, 캐싱 λ“±μ˜ 기법을 μ μš©ν•˜μ—¬ μ•ˆμ •μ μΈ μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

πŸ”‘ Key Summary

예맀 μ‹œμŠ€ν…œ μ„±λŠ₯ κ°œμ„ 
  • 예맀 μ‹œμŠ€ν…œμ€ μ½˜μ„œνŠΈ ν‹°μΌ“ 예맀 μ„œλ²„μ—μ„œ 핡심적인 κΈ°λŠ₯이고 μˆœκ°„μ μœΌλ‘œ λ§Žμ€ νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

  • 예맀 κΈ°λŠ₯ 쀑에 μ’Œμ„μ„ μž„μ‹œ μ„ νƒν•˜λŠ” 뢀뢄이 병λͺ© 지점이 될 수 μžˆμŒμ„ νŒλ‹¨ν–ˆκ³  λ‹¨κ³„μ μœΌλ‘œ μ„±λŠ₯을 κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.

  • μ„±λŠ₯ν…ŒμŠ€νŠΈλŠ” μ‹€μ œ ν™˜κ²½κ³Ό μœ μ‚¬ν•˜κ²Œ 1초 λ™μ•ˆ μ‚¬μš©μžκ°€ 같은 μ’Œμ„μ„ μ˜ˆλ§€ν•˜λ €λŠ” 상황을 κ°€μ •ν•˜κ³  평균 응닡 μ‹œκ°„μ„ κ³„μ‚°ν–ˆμŠ΅λ‹ˆλ‹€.

  1. Redis λΆ„μ‚°λ½μœΌλ‘œ λ™μ‹œμ„± μ œμ–΄ν•œ μƒνƒœ

main_image

  • μ„±λŠ₯ κ°œμ„  μ „ 평균 응닡 μ‹œκ°„ 2163ms
  1. 예맀 λ‚΄μ—­ ν…Œμ΄λΈ” 인덱슀 μΆ”κ°€

main_image

  • 인덱슀 μ„€μ • ν›„ 평균 응닡 μ‹œκ°„ 1713ms
  • 인덱슀 μ„€μ • ν›„ 평균 응닡 μ‹œκ°„ 20.80% κ°œμ„ 
  1. Redis λΆ„μ‚°λ½μœΌλ‘œ λ™μ‹œμ„± μ œμ–΄ν•œ μƒνƒœ

main_image

  • Redis μΊμ‹œλ₯Ό μ΄μš©ν•΄μ„œ κ°œμ„  ν›„ 평균 응닡 μ‹œκ°„ 20ms
  • 인덱슀 κ°œμ„ μ—μ„œ 평균 응닡 μ‹œκ°„ 98.83% κ°œμ„ 
  • μ„±λŠ₯ κ°œμ„  전보닀 평균 응닡 μ‹œκ°„ 99.08% κ°œμ„ 
Test Code
  1. λͺ©ν‘œ

이번 ν”„λ‘œμ νŠΈμ—μ„œλŠ” κΈ°μ‘΄ μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ 보μž₯ν•˜κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν™•μž₯성을 κ³ λ €ν•˜μ—¬ Test Code μž‘μ„±μ„ μ€‘μ μ μœΌλ‘œ μ§„ν–‰ν•˜μ—¬ μ½”λ“œ λ³€κ²½ μ‹œ μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜λ₯Ό 사전에 λ°©μ§€ν•˜κ³  μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ΄λŠ” 것이 λͺ©ν‘œμž…λ‹ˆλ‹€.

  1. Tools
  • Junit 5
  • Mockito
  • Jacoco
  1. SQL 파일 ν™œμš©
SqlGroup( {
	@Sql(
		value = "/sql/domain/concert/repository/setup.sql",
		config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.DEFAULT),
		executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS
	),
	@Sql(
		value = "/sql/domain/concert/repository/delete.sql",
		config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.DEFAULT),
		executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS
	)
})

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ConcertRepositoryTest {

	@Autowired
	private ConcertRepository concertRepository;

	@Autowired
	private ReservationRepository reservationRepository;
  1. Code Coverage μΈ‘μ •

Code Coverage λ₯Ό ν†΅ν•΄μ„œ κΈ°μ‘΄ μ½”λ“œκ°€ μ–Όλ§ˆλ‚˜ μ•ˆμ •μ μœΌλ‘œ μš΄μ˜λ˜λŠ”μ§€ μ•Œ 수 있고, μž‘μ„±λœ μ½”λ“œμ˜ 양을 νŒŒμ•…ν•  수 μžˆλŠ” μž₯μ μ—μ„œ 컀버리지λ₯Ό μΈ‘μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • Code Coverage - 70% 달성 main_image

🏒 인프라 섀계도


infra_image

πŸ‘‰ μ£Όμš” κΈ°λŠ₯

  1. πŸ‘·β€β™‚οΈ κ΄€λ¦¬μž

    • κ΄€λ¦¬μžλŠ” 곡연μž₯κ³Ό μ½˜μ„œνŠΈλ₯Ό 등둝 κ°€λŠ₯
    • κ΄€λ¦¬μžλŠ” 곡연μž₯κ³Ό μ½˜μ„œνŠΈμ— ν•„μš”ν•œ 이미지 등둝 κ°€λŠ₯
    • κ΄€λ¦¬μžλŠ” 곡연μž₯ 예맀 κ²°κ³Όλ₯Ό 쑰회 κ°€λŠ₯
  2. πŸŽͺ 곡연μž₯/μ½˜μ„œνŠΈ

    • ν•΄λ‹Ή 도메인 (곡연μž₯/μ½˜μ„œνŠΈ) κ°€ 등둝될 λ•Œ, AWS S3에 이미지λ₯Ό 같이 등둝할 수 있으며, λ“±λ‘λœ μ΄λ―Έμ§€λŠ” μˆ˜μ • 및 μ‚­μ œκ°€ κ°€λŠ₯
  3. πŸ‘¦ μœ μ €

    • μœ μ €λŠ” νšŒμ›κ°€μž…/λ‘œκ·ΈμΈμ„ 톡해 인증/인가
    • μœ μ €λŠ” μ½˜μ„œνŠΈλ₯Ό μ‘°νšŒν•˜λ©°, μ½˜μ„œνŠΈ 자리 μ„ μ •
    • μ΅œμ’…μ μœΌλ‘œ μœ μ €λŠ” ν•΄λ‹Ή μžλ¦¬μ— λŒ€ν•˜μ—¬ 예맀 κ°€λŠ₯
    • μœ μ €λŠ” μžμ‹ μ˜ 예맀 내역을 확인 κ°€λŠ₯
  4. 🎫 μ’Œμ„ 예맀

    • μ½˜μ„œνŠΈ μ’Œμ„ 예맀
      • μœ μ €λŠ” μ½˜μ„œνŠΈλ₯Ό μ˜ˆλ§€ν•  λ•Œ, μ’Œμ„ 선택 β†’ μ’Œμ„ 선택 μ™„λ£Œ 단계λ₯Ό 걸쳐 예맀λ₯Ό μ™„λ£Œ
      • μ—¬κΈ°μ„œ μ’Œμ„ 선택 단계 μ—μ„œλŠ” 동 μ‹œκ°„ 내에 λ§Žμ€ μš”μ²­μ΄ μ˜€λ”λΌλ„ Redis 의 뢄산락 이 μ μš©λ˜μ–΄ μžˆμ–΄ λ™μ‹œμ„± μ œμ–΄ κ°€ μž‘λ™ν•˜λ©° 데이터 뢈일치 ν•΄κ²°
    • μ½˜μ„œνŠΈ 예맀 λ‚΄μ—­ 쑰회

πŸ›  기술 μŠ€νƒ

1. 라이브러리 & ν”„λ ˆμž„ μ›Œν¬

2. DB & Optimization

3. 인프라 & 배포

4. CI/CD

5. ν˜‘μ—…νˆ΄

6. μ–Έμ–΄ 및 IDE

πŸ’¬ 기술적 μ˜μ‚¬ κ²°μ •

  • 🚧 인증/인가 방식은 μ–΄λ–»κ²Œ?

  • πŸ”€ λ™μ‹œμ„± μ œμ–΄λŠ” μ–΄λ–»κ²Œ?

  • 🐳 CI/CDλŠ” μ–΄λ–»κ²Œ?

  • 링크

πŸ“Œ νŠΈλŸ¬λΈ”μŠˆνŒ…

  • ✌ Query DSL N+1 문제 ν•΄κ²° 및 μ„±λŠ₯ 비ꡐ
  • πŸ”’ λ™μ‹œμ„± μ œμ–΄ (Lock)
  • πŸ“ˆ 인덱슀둜 μ„±λŠ₯ μ΅œμ ν™”
  • πŸš€ Redis μΊμ‹œλ‘œ λ™μ‹œμ„± μ œμ–΄ 및 μ„±λŠ₯ κ°œμ„ 

와이어 ν”„λ ˆμž„

ERD

erd_image

API λͺ…μ„Έμ„œ

πŸ‘ Contributor

νŒ€μ›λͺ… ν¬μ§€μ…˜ λ‹΄λ‹Ή(κ°œμΈλ³„ 기여점) κΉƒν—ˆλΈŒ 링크
μ •μ„ μš° 리더 β–Ά μœ μ € 인증 인가 (Spring Security)
- JWT 토큰 인증/인가
β–Ά CI/CD
- EC2 + DOCKER + ECR을 μ΄μš©ν•œ CI/CD
- Docker Composeλ₯Ό μ΄μš©ν•΄ ν™˜κ²½ ꡬ성
β–Ά Redisλ₯Ό μ΄μš©ν•œ λ™μ‹œμ„± μ œμ–΄ 및 μ„±λŠ₯ μ΅œμ ν™”
- 'Redisson`을 μ΄μš©ν•˜μ—¬ '뢄산락' κ΅¬ν˜„
- Redisλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”
GitHub Seonu-Jeong
κΉ€νƒœν˜„ 뢀리더 β–Ά 곡연μž₯ CRUD
- μ’Œμ„ κ΄€λ ¨ Bulk insert 적용
β–Ά 이미지 둜직 (AWS S3)
- μ €μž₯/μˆ˜μ •/μ‚­μ œ 적용
β–Ά λ™μ‹œμ„± μ œμ–΄
- DB 'λ„€μž„λ“œ 락' 적용
β–Ά Redis μ„±λŠ₯ μ΅œμ ν™”
- Redis λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”
GitHub kimuky
μž₯μš°νƒœ νŒ€μ› β–Ά μ½˜μ„œνŠΈ CRUD
- μ½˜μ„œνŠΈ 쑰회 μ‹œ Querydsl κ³Ό Pageable μ‚¬μš©ν•˜μ—¬ 쑰회
- λ³΅μž‘ν•œ 쿼리 λ¬Έ projections μ‚¬μš©ν•˜μ—¬ 쑰회 λŒ€μƒμ„ 지정해 μ›ν•˜λŠ” κ°’λ§Œ 쑰회
β–Ά ν…ŒμŠ€νŠΈ μ½”λ“œ
-μ½˜μ„œνŠΈ, 곡연μž₯ κ΄€λ ¨ domain에 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±
- @SqlGroup 으둜 sql νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ ν…ŒμŠ€νŠΈ μ‹€ν–‰ν•˜κ³  @BeforeEach λŒ€μ‹  μ‚¬μš©ν•˜μ—¬ μ½”λ“œ 가독성을 λ†’μž„
- Jacocoλ₯Ό ν™œμš©ν•˜μ—¬ test coverage μΈ‘μ •
GitHub Jangutm600
ν—ˆμ€€ νŒ€μ› β–Ά 예맀 κ΄€λ ¨ CRUD
- 예맀, μ·¨μ†Œ λͺ©λ‘ 쑰회 μ‹œ QueryDsl κ³Ό Pageable μ‚¬μš©ν•˜μ—¬ 쑰회
β–Ά ν…ŒμŠ€νŠΈ μ½”λ“œ
- 예맀, μ·¨μ†Œ λͺ©λ‘, μœ μ €, S3 ν…ŒμŠ€νŠΈ μž‘μ„±
- Jacocoλ₯Ό ν™œμš©ν•˜μ—¬ test coverage μΈ‘μ •
GitHub huhjune98

About

Immortal Ticketing Server

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •