개발 공부
[AWS RDS x MySQL] 운영하며 만난 버그 - RDS Timezone, MySQL current_date
현재 상황 테스트도 잘 마치고 평소에 정상 동작하는 API가 어쩔 때 한 번씩 잘 안된다는 버그 제보를 받았습니다. 문제는, API가 에러가 잡히는 것이 아닌 200으로 잘 응답하되 결과가 부정확한 것... 따라서 잘 안 되는 시점이 언제인지 정확히 트래킹도 되지 않았습니다. (에러 로그로 남지도 않잖아...) 왜 갑자기 안되지? 언제는 되고, 언제는 안 되는 게 말이 안 되지 않나?! 예상을 해보자 1. 어떤 API 인가 - 사용자가 체크를 하고 나서 (insert) - 사용자가 오늘 체크한 횟수를 알기 위해 오늘 날짜에 해당하는 사용자의 행동 데이터의 개수를 읽어옵니다 (select) - 나머지 데이터를 화면에 맞춰 가공한 뒤, 응답합니다. { "careId": 0, "careName": "strin..
[Git] git tag를 통해 release version 관리해보기
현재 상황 현재 진행 중인 "반려하루" 프로젝트가 막바지에 다다르면서, 플레이스토어에 v1.0.0을 release 했습니다. 그 이후에 쏟아지는 bugfix와 추가 feature 개발 등의 커밋이 쌓이면서 버전 관리를 하면 좋을 것 같다는 생각을 했습니다. 운영 환경에 배포된 서버 버전을 관리해야겠다! Git tag 해당 커밋에 tag을 붙여서 특정한 무언가를 표시할 수 있는 기능입니다. 특정 커밋을 태그 해줌으로써 나중에 release 된 버전을 찾거나, 롤백할 때 빠르게 찾아갈 수 있을 것이라 생각됩니다. 계속해서 쌓이는 커밋들 사이에서 태그를 통해서 쉽고 빠르게 찾아갈 수 있는 기능입니다! 과정 저는 우선 dev 브랜치에서 관리되던 소스코드를 운영 환경에 배포하기 위해 main 브랜치에 PR을 통해..
[SpringBoot x JPA] Soft Delete #2 Insert (중복, Unique 제약조건, 인덱스의 관점에서)
#1 soft delete 적용 1 https://bbeomgeun.tistory.com/176 [SpringBoot x JPA] Soft Delete 시 해당 Status 조건 추가 조회 방법 (@Where) 현재 상황 저는 현재 서버 개발 중, Delete 요청 시 실제로 데이터를 삭제하는 Hard Delete 방식이 아닌 해당 데이터의 Status를 변경해서 관리하는 Soft Delete 정책을 사용 중입니다. 그러나 요구 사항 중 bbeomgeun.tistory.com 현재 상황 저는 현재 서버 개발 중, Delete 요청 시 실제로 데이터를 삭제하는 Hard Delete 방식이 아닌 해당 데이터의 Status를 변경해서 관리하는 Soft Delete 정책을 사용 중입니다. 그러나 요구 사항 중,..
[SpringBoot X AWS S3] AWS S3 PresigendURL 적용하고 업로드해보기
현재 상황 현재 진행 중인 프로젝트에서, 이미지 저장을 위한 객체 저장소로 AWS S3를 이용하고 있습니다. 그리고 클라이언트가 서버로 MultipartFile을 이용해서 이미지를 전송하고, 서버에서는 받은 파일을 S3로 업로드하고 리턴된 URL을 저장 후 클라이언트에게 전달합니다. 이미지를 포함한 요청을 서버로 보내게 되면 네트워크적으로 일반 json을 주고받는 요청보다 부하가 크다고 생각합니다. 텍스트보다 파일 용량이 훨씬 크기 때문입니다. 그렇다면 왜 서버를 거쳐야 할까? 클라이언트에서 바로 S3에 접근한다면 보안 작업 없이 서비스의 파일에 접근해서 삭제 혹은 업로드를 할 것입니다. 또한, 클라이언트에서 접근을 위한 key 등을 갖고 있는다면 탈취될 위험도 있습니다. 따라서 미리 서명된 URL이라는..
[Junit5, Mockito] Mockito를 이용해서 Void 메서드 Mocking하기
현재 상황 현재 "반려 하루" 서비스를 개발하면서 Controller, Service, Entity 단위 테스트를 작성하면서 진행하고 있습니다. 이전 서비스를 개발하면서 테스트 코드를 작성하지 않았는데, 테스트를 하기 위해 매번 서버를 띄워서 postman으로 요청을 생성하는 건 너무나 비효율적이었습니다. 또한, 서비스 요구사항의 변경에 대처하기 위함이었습니다. 한번, 두번일 경우 기억을 해서 로직을 수정할 수 있지만 계속해서 요구사항이 변경되었을 때 코드를 수정하면서도 잘 동작하는지 믿을 수 없는 상황을 마주쳤습니다. 따라서, 테스트 코드를 작성하는 연습을 하고 있습니다. 1. 기능을 개발해도, 요구사항이 지속적으로 바뀌기 때문에 코드 변경으로 인한 발생 가능한 결함을 사전에 예방할 수 있고 2. 테스..
[Github Actions] CI 스크립트에 Redis 환경 추가하기
현재 상황 웨일던 프로젝트를 리팩토링하면서 Redis를 추가했고 @SpringBootTest를 이용해서 RedisRepository에 대한 테스트 코드를 작성했습니다. 이 어노테이션을 이용해서 테스트를 한다면 Mocking 객체가 아닌 실제 RedisRepository Bean을 이용해서 테스트가 진행됩니다. 이후 Merge를 위해 github에 push 했습니다! 빌드 실패 현재 Github action을 이용해서 CICD가 동작되는데, 도중에 CI Workflow가 실패했다고 메일이 왔습니다. 올해 초에 겪은 일이라 바로 원인을 찾았습니다. https://bbeomgeun.tistory.com/166 [SpringBoot] Error - java.net.SocketTimeoutException at ..