20240305 (화) 최종 프로젝트 티켓레이더 2주차 - Lock 구현
              
          2024. 3. 5. 17:49ㆍTIL
오늘 작업한 내용
1. MemberRepositoryTest
package com.codersgate.ticketraider.domain.member.repository
import com.codersgate.ticketraider.domain.member.entity.Member
import com.codersgate.ticketraider.domain.member.entity.MemberRole
import org.assertj.core.api.AssertionsForInterfaceTypes.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.test.annotation.Rollback
import org.springframework.test.context.ActiveProfiles
import org.springframework.transaction.annotation.Transactional
@DataJpaTest
@Transactional
//@Import(JpaBaseConfiguration::class)
@Rollback(value = false)
@ActiveProfiles("test")
class MemberRepositoryTest {
    @Autowired
    lateinit var memberRepository: MemberRepository
    @Test
    fun memberInsertTest() {
        // given
        val newMember = Member(
            nickname = "testMember",
            email = "test@test.com",
            password = "123456",
            role = MemberRole.MEMBER
        )
        // when
        val savedMember = memberRepository.save(newMember)
        // then
        assertThat(savedMember).isNotNull
    }
}
멤버 회원가입시 레포지토리에 저장이 잘 되는지 확인하는 테스트코드
2. Pub-Sub 락 구현 및 AOP 과정
package com.codersgate.ticketraider.global.common.aop.redis.lock
import com.codersgate.ticketraider.domain.ticket.dto.CreateTicketRequest
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.reflect.MethodSignature
import org.redisson.api.RedissonClient
import org.springframework.stereotype.Component
import java.util.concurrent.TimeUnit
@Aspect
@Component
class PubSubLockAspect(
    private val redissonClient: RedissonClient,
) {
    @Around("@annotation(com.codersgate.ticketraider.global.common.aop.redis.lock.PubSubLock) && args(..,createTicketRequest)")
    fun runPubSubLock(joinPoint: ProceedingJoinPoint, createTicketRequest: CreateTicketRequest) {
        val methodSignature = joinPoint.signature as MethodSignature
        val annotation = methodSignature.method.getAnnotation(PubSubLock::class.java)
        val lock = redissonClient.getLock(generateKey(createTicketRequest))
        try {
            //획득시도 시간, 락 점유 시간
            val available =lock.tryLock(5, 1, TimeUnit.SECONDS)
            if (!available) {
                println("lock 획득 실패")
                return
            }
            joinPoint.proceed()
//        } catch (e: InterruptedException) {
//            throw RuntimeException(e)
        } finally {
            lock.unlock()
        }
    }
    private fun generateKey(request: CreateTicketRequest): String {
        val key = "ID : ${request.eventId}, ${request.date} : ${request.grade}-${request.seatNo}"
        return key
    }
}
3. 추가 테스트코드 구현 계획
지금 현재 작성된 테스트코드로는
티켓 예매(동시성제어 관련) 테스트코드
멤버 회원가입후 레포지토리 저장 확인 테스트코드
이렇게 2개가 있다.
개인적인 욕심으로는 유저관련 테스트코드 1개에 관리자 관련 테스트코드2개정도를 더 추가해보고 싶다.
유저관련 후보
- 티켓 스테이터스가 결제가 완료되면 결제 완료 상태로 바뀐다. << 이는 현재 티켓 스테이터스가 구현완료되면 작성해볼 예정
관리자관련 후보
- 소프트딜리트 및 영속성 전파 : 상위 테이블에서 소프트딜리트가 이루어지면 관계있는 하위테이블에서도 소프트딜리트가 이루어져야한다.
- 이벤트생성에 따른 가격, 좌석 컬럼 자동생성 : 현재 이벤트가 생성되면 자동으로 가격, 좌석 컬럼이 생성되게 해놨는데 이를 테스트코드로 표현한다면 어떻게 해야할지 살짝 고민된다..
오늘부터 기술면접 대비 질문-답변 을 작성할 예정이다.
따라서 TIL에 약간 소홀해질수도 있는데 최대한 같이 써볼수 있도록 해보겠다..
'TIL' 카테고리의 다른 글
| 20240307 (목) 최종 프로젝트 티켓레이더 2주차 - CRUD CRUD.. (2) | 2024.03.07 | 
|---|---|
| 20240306 (수) 최종 프로젝트 티켓레이더 2주차 - 다시 처음으로 (2) | 2024.03.06 | 
| 20240304 (월) 최종 프로젝트 티켓레이더 2주차 - Test-code (1) | 2024.03.04 | 
| 20240229 (목) 최종 프로젝트 티켓레이더 1주차 - CRUD 마무리단계 (0) | 2024.02.29 | 
| 20240228 (수) 최종 프로젝트 티켓레이더 1주차 - 본격적인 코딩 (0) | 2024.02.28 |