프로젝트/미디어 스트리밍 서버 프로젝트
-
리팩토링에 대하여프로젝트/미디어 스트리밍 서버 프로젝트 2022. 10. 8. 00:01
개요 1주차 스프린트에서는 한번도 해보지 못했던 미디어 서버를 구축하기위해 달렸습니다. 또한 그 과정속에서 Git에 익숙해지며, Covention을 정하는 등 공동의 목표를 위한 계획을 세워나갔습니다. 그러나 기능 구현에 포커스를 맞춘 만큼 코드 품질은 조금 떨어지게 되었습니다. 하지만 이러한 점을 인지한 상태로 기술 부채를 쌓아나갔으며 스프린트 2에서는 코드 품질을 향상하고자 합니다. 다음과 같은 문제점들을 인지하고 있었습니다. 부적합해 보이는 변수명/함수명 너무 많은 일을 하는 메서드 떨어지는 가독성 반복 되는 코드 테스트하기 어려운 코드 부족한 테스트 코드 리팩터링이 필요한 이유는? 고객의 모든 요구사항을 예측하고 논리적으로 완벽한 소프트웨어를 단번에 설계하는 것은 거의 불가능에 가까운 일입니다. ..
-
Kotlin 동시성 테스트하기프로젝트/미디어 스트리밍 서버 프로젝트 2022. 10. 7. 00:01
개요 Multi Thread 환경에서 데이터의 정합성을 보장할 수 있는지 확인하고자 합니다. 코틀린 공식문서를 기반으로 학습해 보겠습니다. https://kotlinlang.org/docs/multiplatform-mobile-concurrency-overview.html Concurrency overview | Kotlin kotlinlang.org 규칙 1 : 변경 가능한 상태라면 1개의 스레드에서 동작해야 합니다. data class SomeData(var count:Int) fun simpleState(){ val sd = SomeData(42) sd.count++ println("My count is ${sd.count}") // It will be 43 } 위의 메서드 처럼 상태를 가지는 경우..
-
JPA 연관관계 Paging 최적화프로젝트/미디어 스트리밍 서버 프로젝트 2022. 10. 6. 00:01
개요 @OneToOne과 @Embedded를 고민하던 중 만약 하나의 Column에서 업데이트가 빈번하게 일어난다면 row lock이 발생할 수 있기 때문에 그 칼럼을 다른 테이블로 분리하는 방법이 존재한다는 것을 알게 되었습니다. Row Lock row lock은 테이블의 각 행에 걸리며 read를 위한 S-lock, select.. for update, update, delete 등의 wirte에 걸리는 X-lock으로 구분됩니다. 트랜잭션의 동시성을 최대한 보장하기 위해서 Lock을 활용합니다. 이때 S lock을 사용하는 쿼리끼리는 같은 row에 접근 가능합니다. 반면, X lock이 걸린 row는 다른 어떠한 쿼리도 접근 불가능합니다. Video Entity Video Entity는 비디오에 대..
-
@TestConfiguration 설정하기프로젝트/미디어 스트리밍 서버 프로젝트 2022. 10. 5. 00:01
개요 인터셉터를 설정하던 도중에 secretKey를 관리해야 해서 application.properties에서 주입받아서 사용하려고 했습니다. @Configuration("WebConfig") class WebConfig : WebMvcConfigurer { @Value("\${interceptor.secretKey}") lateinit var secretKey: String override fun addInterceptors(registry: InterceptorRegistry) { registry.addInterceptor(AdminInterceptor(secretKey)) .addPathPatterns("/admin/**/") } } class AdminInterceptor(var secretKey..
-
@Transactional 롤백과 @TransactionalEventListener프로젝트/미디어 스트리밍 서버 프로젝트 2022. 10. 4. 00:01
개요 비동기 EventListener를 다루면서 예외처리를 하던 중 고민했던 일들을 적어보고자 합니다. @Transactional을 사용하는 메서드 예시 @Transactional public void function(request: UploadRequest) { val registeredVideo = videoService.registerVideo(request) // 1. request DB 저장 applicationEventPublisher.publishEvent(); // 2. 이벤트 발생 throw IOException() //예외 발생 return registeredVideo //A 반환 } 로직을 간소화하면 다음과 같습니다. 이때 과연 중간에 throw IOException()을 넣으면 롤백..
-
@Embedded vs @OneToOne프로젝트/미디어 스트리밍 서버 프로젝트 2022. 10. 3. 00:01
개요 현재 Video, Url, Metadata로 테이블을 관리하고 있습니다. 3가지 테이블을 하나의 단일 테이블로 관리해도 되지만 각각의 의미들을 나누기 위해 3개의 테이블로 분리하여 1:1 연관관계로 매핑했습니다. 이때 @Embedded를 사용해서 값 타입처럼 사용하는 것과 @OneToOne을 사용하는 것에 대해 어떤 차이가 있을지 궁금해져 찾아보려고 합니다. @Embedded와 @OneToOne의 차이 @Embedded - 실제 table은 쪼개지지 않지만 개발자가 볼 때는 쪼개 볼 수 있습니다. - parent가 update나 delete될 때 생명주기를 같이 합니다. @OneToOne - 실제로 테이블을 분리되어 있습니다. - cascadeType 옵션을 통해 생명주기를 같이 할 수 있지만 부모..
-
동시성 문제를 해결하자프로젝트/미디어 스트리밍 서버 프로젝트 2022. 9. 30. 00:00
개요 val findVideo = videoRepository.findByIdOrNull(hitId) ?: throw IllegalArgumentException() findVideo.updateHit() videoRepository.save(findVideo) 조회수를 증가시키기 위해 read and write 하는 작업을 수행하였습니다. 이때 트랜잭션 내 데드락 혹은 데이터 불일치 등의 발생 위험이 존재했습니다. 이를 해결하기 위한 방법은 어떤 것들이 있는지 그리고 어떤 방법을 적용하는 게 좋을지 찾아보는 시간을 가지려고 합니다. 문제가 발생하는 이유는? 위 상태는 3가지 작업으로 분리할 수 있습니다. 1. hit 변수의 값을 가져온다. 2. hit 변수의 값을 증가한다. 3. 변경된 hit 변수를 ..
-
배포 스크립트 작성하기프로젝트/미디어 스트리밍 서버 프로젝트 2022. 9. 29. 00:00
개요 매번 EC2 환경에서 반복적인 작업을 수행하기 때문에 이를 조금이나마 자동화해보려고 합니다. 만약 CD환경을 구축한다면 더 편리하게 사용할 수 있을 것 같습니다. 스크립트란? Shell Script(쉘 스크립트)란 Shell(쉘)에서 사용할 수 있는 명령어들의 조합을 모아서 만든 배치(batch) 파일입니다. 즉, 운영체제의 Shell을 이용하여 한 줄씩 순차적으로 읽으면서 명령어들을 실행시켜주는 인터프리터 방식의 프로그램이다. Shell Script를 활용하여 묶어진 명령어 조합을 수행하거나 반복적인 명령어를 단일 명령으로 쉽게 사용할 수 있다. 반복되는 작업 //1번 연결된 git 저장소로 부터 git pull 받아오기 git pull username입력 password입력 //2번 build/..