κ΄λ¦¬μλ 곡μ°μ₯μ λ±λ‘νκ³ ν΄λΉ 곡μ°μ₯μ μ€νν μ½μνΈλ₯Ό λ±λ‘ν μ μμ΅λλ€. νμμ μνλ κ°μμ μ½μνΈλ₯Ό μ맀νκ³ μ·¨μν μ μμ΅λλ€. μ맀 μλΉμ€μ νΉμ± μ λμ μ μμκ° λ§μμ§λ νΈλν½ νκ²½μ κ³ λ €ν©λλ€. λμμ± μ μ΄, μΈλ±μ€, μΊμ± λ±μ κΈ°λ²μ μ μ©νμ¬ μμ μ μΈ μλΉμ€λ₯Ό ꡬνν©λλ€.
μ맀 μμ€ν μ±λ₯ κ°μ
-
μ맀 μμ€ν μ μ½μνΈ ν°μΌ μ맀 μλ²μμ ν΅μ¬μ μΈ κΈ°λ₯μ΄κ³ μκ°μ μΌλ‘ λ§μ νΈλν½μ μ²λ¦¬ν΄μΌνλ κΈ°λ₯μ λλ€.
-
μ맀 κΈ°λ₯ μ€μ μ’μμ μμ μ ννλ λΆλΆμ΄ λ³λͺ© μ§μ μ΄ λ μ μμμ νλ¨νκ³ λ¨κ³μ μΌλ‘ μ±λ₯μ κ°μ νμ΅λλ€.
-
μ±λ₯ν μ€νΈλ μ€μ νκ²½κ³Ό μ μ¬νκ² 1μ΄ λμ μ¬μ©μκ° κ°μ μ’μμ μ맀νλ €λ μν©μ κ°μ νκ³ νκ· μλ΅ μκ°μ κ³μ°νμ΅λλ€.
- Redis λΆμ°λ½μΌλ‘ λμμ± μ μ΄ν μν
- μ±λ₯ κ°μ μ νκ· μλ΅ μκ° 2163ms
- μ맀 λ΄μ ν μ΄λΈ μΈλ±μ€ μΆκ°
- μΈλ±μ€ μ€μ ν νκ· μλ΅ μκ° 1713ms
- μΈλ±μ€ μ€μ ν νκ· μλ΅ μκ° 20.80% κ°μ
- Redis λΆμ°λ½μΌλ‘ λμμ± μ μ΄ν μν
- Redis μΊμλ₯Ό μ΄μ©ν΄μ κ°μ ν νκ· μλ΅ μκ° 20ms
- μΈλ±μ€ κ°μ μμ νκ· μλ΅ μκ° 98.83% κ°μ
- μ±λ₯ κ°μ μ λ³΄λ€ νκ· μλ΅ μκ° 99.08% κ°μ
Test Code
- λͺ©ν
μ΄λ² νλ‘μ νΈμμλ κΈ°μ‘΄ μ½λμ μμ μ±μ 보μ₯νκ³ , μ ν리μΌμ΄μ
μ νμ₯μ±μ κ³ λ €νμ¬ Test Code
μμ±μ
μ€μ μ μΌλ‘ μ§ννμ¬ μ½λ λ³κ²½ μ μμμΉ λͺ»ν μ€λ₯λ₯Ό μ¬μ μ λ°©μ§νκ³ μ μ§λ³΄μμ±μ λμ΄λ κ²μ΄ λͺ©νμ
λλ€.
- Tools
- Junit 5
- Mockito
- Jacoco
- 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;
- Code Coverage μΈ‘μ
Code Coverage λ₯Ό ν΅ν΄μ κΈ°μ‘΄ μ½λκ° μΌλ§λ μμ μ μΌλ‘ μ΄μλλμ§ μ μ μκ³ , μμ±λ μ½λμ μμ νμ ν μ μλ μ₯μ μμ 컀λ²λ¦¬μ§λ₯Ό μΈ‘μ νμμ΅λλ€.
-
π·ββοΈ κ΄λ¦¬μ
- κ΄λ¦¬μλ 곡μ°μ₯κ³Ό μ½μνΈλ₯Ό λ±λ‘ κ°λ₯
- κ΄λ¦¬μλ 곡μ°μ₯κ³Ό μ½μνΈμ νμν μ΄λ―Έμ§ λ±λ‘ κ°λ₯
- κ΄λ¦¬μλ 곡μ°μ₯ μ맀 κ²°κ³Όλ₯Ό μ‘°ν κ°λ₯
-
πͺ 곡μ°μ₯/μ½μνΈ
- ν΄λΉ λλ©μΈ (곡μ°μ₯/μ½μνΈ) κ° λ±λ‘λ λ, AWS S3μ μ΄λ―Έμ§λ₯Ό κ°μ΄ λ±λ‘ν μ μμΌλ©°, λ±λ‘λ μ΄λ―Έμ§λ μμ λ° μμ κ° κ°λ₯
-
π¦ μ μ
- μ μ λ νμκ°μ /λ‘κ·ΈμΈμ ν΅ν΄ μΈμ¦/μΈκ°
- μ μ λ μ½μνΈλ₯Ό μ‘°ννλ©°, μ½μνΈ μ리 μ μ
- μ΅μ’ μ μΌλ‘ μ μ λ ν΄λΉ μ리μ λνμ¬ μ맀 κ°λ₯
- μ μ λ μμ μ μ맀 λ΄μμ νμΈ κ°λ₯
-
π« μ’μ μ맀
- μ½μνΈ μ’μ μ맀
- μ μ λ μ½μνΈλ₯Ό μ맀ν λ,
μ’μ μ ν
βμ’μ μ ν μλ£
λ¨κ³λ₯Ό κ±Έμ³ μ맀λ₯Ό μλ£ - μ¬κΈ°μ
μ’μ μ ν
λ¨κ³ μμλ λ μκ° λ΄μ λ§μ μμ²μ΄ μ€λλΌλRedis
μλΆμ°λ½
μ΄ μ μ©λμ΄ μμ΄λμμ± μ μ΄
κ° μλνλ©° λ°μ΄ν° λΆμΌμΉ ν΄κ²°
- μ μ λ μ½μνΈλ₯Ό μ맀ν λ,
- μ½μνΈ μ맀 λ΄μ μ‘°ν
- μ½μνΈ μ’μ μ맀
-
π§ μΈμ¦/μΈκ° λ°©μμ μ΄λ»κ²?
-
π λμμ± μ μ΄λ μ΄λ»κ²?
-
π³ CI/CDλ μ΄λ»κ²?
- β Query DSL N+1 λ¬Έμ ν΄κ²° λ° μ±λ₯ λΉκ΅
- π λμμ± μ μ΄ (Lock)
- π μΈλ±μ€λ‘ μ±λ₯ μ΅μ ν
- π Redis μΊμλ‘ λμμ± μ μ΄ λ° μ±λ₯ κ°μ
νμλͺ | ν¬μ§μ | λ΄λΉ(κ°μΈλ³ κΈ°μ¬μ ) | κΉνλΈ λ§ν¬ |
---|---|---|---|
μ μ μ° | 리λ | βΆ μ μ μΈμ¦ μΈκ° (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 |