20240312 (화) 최종 프로젝트 티켓레이더 3주차 - 1차 발표 준비
2024. 3. 12. 20:07ㆍTIL
1. 발표 PPT 틀 작성
우리가 만든 프로젝트의 PPT는 이런식으로 진행이 될것이다.
1. 목차
2. 프로젝트 설명
- 프로젝트 이름
- ERD, API 명세
- 기능(구현 예정, 완료 포함)
3. 사용한 주요 기술 (구현 완료)
- 락 (락 점유와 해제시점)
- OAuth (멤버와 소셜멤버 테이블 구분 장단점)
4. 시연
- 동시성 제어 테스트코드
- OAuth (DB에 유저정보 제대로 저장 되는지 확인)
5. 사용할 기술 (구현 예정)
- 쿼리DSL (지역별과 리뷰, 좋아요순 검색기능)
- 캐시 (인기 검색어)
- 배포 (뷰, AWS를 먼저 공부해볼 예정)
여기서 이제 자기가 만든부분은 자기가 직접 작성을 하도록 하였다.
내가 만든부분은 Lock 부분이기에 내가 사용한 Lock과 그이유, 락의 점유와 해제를 바탕으로 풀어서 쓸 것이다.
실제 PPT 내용
2. 테스트 코드 수정
package com.codersgate.ticketraider.domain.ticket.service
import com.codersgate.ticketraider.domain.category.model.Category
import com.codersgate.ticketraider.domain.category.repository.CategoryRepository
import com.codersgate.ticketraider.domain.event.dto.EventRequest
import com.codersgate.ticketraider.domain.event.repository.EventRepository
import com.codersgate.ticketraider.domain.event.repository.price.PriceRepository
import com.codersgate.ticketraider.domain.event.service.EventService
import com.codersgate.ticketraider.domain.member.entity.Member
import com.codersgate.ticketraider.domain.member.entity.MemberRole
import com.codersgate.ticketraider.domain.member.repository.MemberRepository
import com.codersgate.ticketraider.domain.place.model.Place
import com.codersgate.ticketraider.domain.place.repository.PlaceRepository
import com.codersgate.ticketraider.domain.ticket.dto.CreateTicketRequest
import com.codersgate.ticketraider.domain.ticket.dto.SeatInfo
import com.codersgate.ticketraider.domain.ticket.entity.TicketGrade
import com.codersgate.ticketraider.global.error.exception.ModelNotFoundException
import com.codersgate.ticketraider.global.infra.security.jwt.UserPrincipal
import io.mockk.junit5.MockKExtension
import kotlinx.coroutines.Delay
import kotlinx.coroutines.delay
import org.assertj.core.api.Assertions
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.data.repository.findByIdOrNull
import org.springframework.test.context.ActiveProfiles
import java.time.LocalDate
import java.util.concurrent.CountDownLatch
import java.util.concurrent.Executors
@SpringBootTest
@ExtendWith(MockKExtension::class)
@ActiveProfiles("test")
class TicketServiceImplTest(
@Autowired val memberRepository: MemberRepository,
@Autowired val placeRepository: PlaceRepository,
@Autowired val eventRepository: EventRepository,
@Autowired val categoryRepository: CategoryRepository,
@Autowired val ticketService: TicketService,
@Autowired val eventService: EventService,
) {
@Test
@DisplayName("티켓 테스트")
fun `ticket test`() {
val place = Place(
name = "문화회관",
totalSeat = 300,
seatR = 50,
seatS = 100,
seatA = 150,
address = "서울시어쩌구"
)
placeRepository.save(place)
val member = Member(
email = "test@gmail.com",
password = "test12",
nickname = "testMember",
role = MemberRole.ADMIN
)
memberRepository.save(member)
val category = Category(
title = "MUSICAL"
)
val getCate = categoryRepository.save(category)
val createEventReq = EventRequest(
title = "오페라의 유령",
posterImage = "string",
categoryId = getCate.id!!,
eventInfo = "String",
_startDate = "2024-03-10",
_endDate = "2024-03-17",
place = "문화회관",
seatRPrice = 150000,
seatSPrice = 100000,
seatAPrice = 50000
)
eventService.createEvent(createEventReq)
val getEvent = eventRepository.findByIdOrNull(1)
val threadCount = 10
val executorService = Executors.newFixedThreadPool(5)
val countDownLatch = CountDownLatch(threadCount)
var success = 0
var fail = 0
val createTicketReq = CreateTicketRequest(
date = LocalDate.now(),
eventId = getEvent!!.id!!,
)
//when 100개의 스레드로 동시에 티켓을 구매했을때
repeat(threadCount) {
executorService.submit {
try {
println("리퀘스트 전!@#(@!*#)*(!@#&(*!@#&*(!@@#&*(@!#&(*!@#&*(&!@(*@#&*(!@&#*(")
createTicketReq.seatList.add(SeatInfo(TicketGrade.R, 1))
println("크리에이트티켓 전!@#(@!*#)*(!@#&(*!@#&*(!@@#&*(@!#&(*!@#&*(&!@(*@#&*(!@&#*(")
ticketService.createTicket(member.id!!, createTicketReq)
println("티켓 생성 후 !@#(@!*#)*(!@#&(*!@#&*(!@@#&*(@!#&(*!@#&*(&!@(*@#&*(!@&#*(")
success++
countDownLatch.countDown()
} catch (e: ModelNotFoundException) {
fail++
countDownLatch.countDown()
}
}
countDownLatch.await()
// 시도한 횟수랑 = 실패 + 성공 횟수 같아야함.
// 성공 횟수가 100이 아닌거는 동시성 문제해결.
println("success : $success")
println("fail : $fail")
//then 성공50 실패50 이여야한다.
Assertions.assertThat(success).isEqualTo(1)
Assertions.assertThat(fail).isEqualTo(9)
}
}
}
저번에 만들어 둔 테스트코드를 수정된것들에 맞춰서 변경해주었다.
여러모로 힘든날인것 같다.
'TIL' 카테고리의 다른 글
20240314 (목) 최종 프로젝트 티켓레이더 3주차 - Vue.js (1) | 2024.03.14 |
---|---|
20240313 (수) 최종 프로젝트 티켓레이더 3주차 - 시연 테스트코드 (2) | 2024.03.14 |
20240311 (월) 최종 프로젝트 티켓레이더 3주차 - 1차 발표 준비 계획 (0) | 2024.03.11 |
20240308 (금) 최종 프로젝트 티켓레이더 2주차 - 끝이 보이기 시작한 CRUD (0) | 2024.03.08 |
20240307 (목) 최종 프로젝트 티켓레이더 2주차 - CRUD CRUD.. (1) | 2024.03.07 |