프로젝트
-
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/..
-
kotlinDSL + RestDocs 적용하기프로젝트/미디어 스트리밍 서버 프로젝트 2022. 9. 28. 00:01
개요 Controller 단위 테스트 이후에 RestDocs를 통해 문서화를 진행해보려고 합니다. Build.gradle.kts 설정 plugins{ id("org.asciidoctor.jvm.convert") version "3.3.2" } val asciidoctorExt by configurations.creating dependencies{ // rest-docs testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc") asciidoctorExt("org.springframework.restdocs:spring-restdocs-asciidoctor") } val snippetsDir by extra { file("buil..
-
dto 코틀린으로 변환하기프로젝트/자프링 -> 코프링 마이그레이션 2022. 9. 26. 00:01
dto의 특징 dto는 양이 많다는 특징이 있습니다. 이때 dto 파일 우클릭을 통해 convert java file to kotlin file을 선택해줍니다. 이렇게 되면 변환이 끝나게 되는데 Null이 될 수 있는 값이 그대로 Null이 될 수 없는 Int로 변환될 수 있습니다. 또한 data 키워드를 앞에 붙여 dto클래스들의 toString, hashCode, equals 등을 정의해줄 수 있습니다. 또한 init부분을 취향에 따라 부생성자를 사용하거나 정적 팩토리 메서드로 만들 수 있습니다. class UserResponse(user: User) { val id: Long val name: String val age: Int? init { id = user.id!! name = user.name..