코틀린 기본기 정리
·
서버
변수 선언val -> 불변(immutable, final과 유사)var -> 가변(mutable)val name = "John" // 불변var age = 20 // 변경 가능age = 30// name = "Jane" // 에러널 안정성 (Nullable vs Non-nullable)코틀린은 null을 허용하는 변수(? 사용)와 허용하지 않는 변수를 명확하게 구분한다.var a: String = "abc"a = null // 에러var b: String? = "abc"b = null // 가능// 안전한 호출println(b?.length) // b가 null이면 null 반환문자열 템플릿코틀린은 + 연산자 대신 문자열 보간(string interpolation) 사용 가능val name = "John..
Presigned URL과 CDN으로 이미지 업로드 & 조회 개선
·
서버
들어가며안녕하세요! 요즘 플러피(Fluffy)라는 온라인 시험 제작 및 관리 서비스를 개발하고 있습니다. 보통 시험 문제에는 다양한 이미지들이 포함되어 있습니다. 플러피 서비스 또한 시험 지문에 이미지를 추가할 수 있는 기능을 만들었습니다. 처음에는 클라이언트에서 이미지를 서버로 전송하고, 서버에서 다시 AWS S3로 업로드하는 방식으로 작업했습니다. 이 방식이 궁금하신 분들은, 이전에 작성한 스프링에서 AWS S3를 이용한 이미지 업로드 방법 글을 참고해주세요. 하지만 이 방식에는 몇 가지 아쉬운 점이 있었습니다. 이미지 업로드의 경우, 이미지가 서버를 거쳐야 하기 때문에 서버의 부하가 커지고, 업로드 속도 또한 상대적으로 느립니다. 이미지 조회의 경우, S3에서 이미지를 직접 가져오기 때문에 조회 속..
테스트 후 데이터 정리를 통해 테스트 간 데이터 독립성 보장
·
서버
들어가며스프링 애플리케이션을 테스트하다 보면, 예상치 못한 데이터 충돌로 인해 테스트가 실패하는 상황을 경험할 때가 있습니다. 특히, 하나의 스프링 컨텍스트에서 생성된 인메모리 데이터베이스를 여러 테스트가 공유하거나, 싱글톤 컨테이너 패턴으로 생성한 Testcontainers 인스턴스를 여러 테스트에서 함께 사용하는 경우, 테스트 간 데이터가 서로 영향을 주며 의도치 않은 충돌이 발생할 가능성이 높습니다. 이런 문제를 완전히 방지하기 위해, 각 테스트마다 서로 다른 컨텍스트를 사용하거나, 매번 새로운 컨테이너를 띄우는 방법도 있습니다. 하지만, 이 방식은 테스트 실행 속도를 매우 느리게 만들 수 있습니다. 따라서, 테스트 간 완전한 독립성은 유지하기 어렵더라도, 테스트 후 데이터를 정리해 다음 테스트에 ..
Testcontainers로 실제 서비스와 유사한 환경에서 테스트하기
·
서버
들어가며안녕하세요! 최근 저는 플러피(Fluffy)라는 온라인 시험 제작 및 관리 서비스를 개발하고 있습니다. 이번 글에서는 플러피의 테스트 환경에서 겪었던 문제들을 소개하고, 이를 해결하기 위해 Testcontainers를 도입한 경험을 공유해보려고 합니다. 기존 테스트 환경에서 겪었던 문제실제 환경과 테스트 환경의 차이로 인한 문제플러피는 서비스 중인 환경에서 데이터베이스로 PostgreSQL을 사용하고 있습니다. 테스트 환경에서는 인메모리 데이터베이스인 H2를 사용하게 됩니다. 문제는, H2와 PostgreSQL의 문법 차이로 인해 테스트 환경에서는 문제없이 통과되던 코드가 실제 서비스 환경에서는 예외를 일으키는 상황이 발생한 것입니다. 예를 들어, H2에서는 GROUP BY를 사용할 때, GROU..
분산락을 이용한 중복 생성 문제 해결
·
서버
들어가며안녕하세요! 플러피라는 온라인 시험 문제 제작 및 관리 서비스를 개발하고 있습니다. 시험을 출제할 때, 응시자가 시험을 한 번만 제출할 수 있게 하거나 여러 번 제출할 수 있게 하는 옵션이 있습니다. 한 번만 제출하게 하기 위해서는 동시성 문제를 해결해야 합니다. 이번 시간에는 분산락을 이용하여 중복 생성 문제를 해결하는 방법에 대해서 알아보겠습니다.  문제 상황제출에 관한 서비스 코드는 다음과 같습니다. 편한 이해를 위해 부분 생략했습니다. 한 번 제출과 여러 번 제출 옵션이 있기 때문에 분기 처리를 합니다. 한 번만 제출 가능한 경우 이미 제출 했을 시 예외를 발생시킵니다.@Servicepublic class SubmissionService { // 생략 ... @Transa..
로컬에서 AWS Private Subnet에 있는 인스턴스에 접속하는 방법
·
서버
들어가며안녕하세요! 오늘은 로컬에서 AWS Private Subnet에 있는 인스턴스에 접근하는 방법을 알아보겠습니다. Private Subnet에 접근하는 쉬운 방법은 퍼블릭 액세스를 허용하는 것인데요. 이것은 외부 인터넷에서 직접 접근할 수 있어 보안에 취약합니다. 또한, AWS Public IPv4의 경우 시간당 0.005USD(1달 기준 3.6USD)의 비용이 발생합니다. 그래서 일반적으로 Bastion Host를 사용하여 Private Subnet에 접근하거나 새롭게 등장한 EC2 Instance Connect 방식을 사용합니다. 이번 글에서는 로컬에서 Bastion Host를 사용해 Private Subnet의 인스턴스에 접근하는 구체적인 방법에 대해서 알아보겠습니다.Public Subnet과..