전체 글
문제 상황 서비스 개발 중 여러 쓰레드에서 발생하는 작업에 대한 처리가 필요한 상황이 있습니다. 사실 우리 서비스는 아주 영세..해서 여러 사용자들의 동시 요청에 대한 처리를 할 필요는 없는데요. 하지만 학습은 좋은거니까..^^ redis에 대해서, 그리고 데이터 원자성을 보장하는 방법에 대해 공부할 겸 redis를 사용한 분산락을 구현하였습니다. 락(Lock)을 구현하는 방법 고유락/모니터락 자바는 멀티스레드 환경에서 동기화를 지원하기 위해 가장 기초적인 장치인 고유락(Intrinsic Lock)을 제공합니다. Java의 synchronized 키워드가 이의 예시이며 synchronized 블록은 객체 단위로 락을 다룹니다. Portfolio Entity에 synchronized 으로 락이 걸린 메소드..
좋아요 기능 구현 : RDB vs Redis redis로 구현 시 실시간성이나 동시성에 대해 처리가 쉽고 구조가 간단하다는 장점이 있지만 데이터 유실과 용량에 대한 부분이 우려스럽고 또 rdb는 데이터가 안정적이나 속도가 느린 것이 걱정되어 멘토님들께 의견을 구하였습니다. 현실적인 답변드리자면, 현재 유저의 규모가 크지 않기 때문에 RDB만 사용해서 구현하는게 좋습니다. 만약 데이터가 많다면, redis를 쓰더라도 데이터 정책 설정하기 나름이긴한데, 저라면 좋아요 데이터자체는 RDB에 저장하고, 게시글마다 좋아요 수 같은 통계데이터는 redis에 캐싱할듯하네요. 말씀하신 것처럼 각각의 장단점을 명확합니다! 잘 파악해주셨네요! 사실 트래픽이 크지도 않고, 데이터가 많지도 않을 것이기 때문에 rdb도 절대 ..
문제 상황 개발을 하다보면 코드 성능을 측정해야하는 경우가 생깁니다. 그리고 가장 보편적인 경우는 코드의 수행시간을 측정하는 것입니다. 기존에는 직접 코드 내에 성능 측정 로직을 작성하여 이를 측정하고 있었습니다. @Test public void testLikeRepositoryFindByUsersAndLikeTypeAndLikedId() { Users users = usersRepository.findByNickname("test0").get(); long startTime = System.currentTimeMillis(); likeRepository.findByUsersAndLikeTypeAndLikedId(users,LikeEnum.ITEM, Long.valueOf(1)); long endTime..
문제 상황 ec2 인스턴스를.. 실수로.. 종료시킴^^ code deploy 를 적용시키는 상황에서 auto scaling된 인스턴스를 중지 시킬 일이 많았다. 그래서 여러 개의 인스턴스를 한번에 종료시키는 상황에서, 실수롤 개발서버 인스턴스를 종료시킴. - 종료 vs 중지 인간적으로 말이 너무 헷갈린거아닙니까 종료 시킨 인스턴스 다시 실행할 수 없을까? NO....😭 https://repost.aws/ko/knowledge-center/recovery-terminated-instance 원본 Amazon EC2 인스턴스 또는 종료 프로세스의 일부로 삭제된 볼륨은 복구할 수 없습니다. 인스턴스 AMI 인스턴스 ami를 설정해두어 빠르게 복구할 수 있었다. 종료된 Amazon EC2 인스턴스에서 생성된 A..
문제 상황 Code deploy, Blue Green 배포 전략이란 무중단 배포(Zero-downtime Deployment) Blue Green 배포 전략 Code Deploy를 위한 AWS 설정 1. IAM 설정 2. AMI 생성 3. 시작 템플릿 생성 4. Target Group(대상그룹) 생성 5. Load Balancer 생성 6. Auto Scaling Group 설정 7. CodeDeploy 설정하기 8. health check API 분리 CI/CD 설정 : github actions와 연동 마주한 에러들 aka 삽질일기 배포 2 단계 오류 CodeDeploy 배포 로그 위치 Codedeploy AllowTraffic 에서 무한 로딩 후 배포 실패 Slack Notification 추가 마..
최근 가장 핫한 노트앱 옵시디언 요즘 개발자들 사이에서 핫한 메모앱 옵시디언! 내 최애 개발자 유튜버 노마드코더가 추천한 그 메모앱이다. https://youtu.be/h6rxKbbgI28?si=56j-P9kyLMLdoqgk A second brain, for you, forever 제텔카스텐(Zettelkasten) 노트끼리 서로 연결하는 메모 방법론입니다. 옵시디언 테마 설정 현재 Things 사용 중인데 아주 깔끔해서 만족하면서 사용중입니다. 옵시디언 템플릿 추가 자주 사용하는 문서는 템플릿을 만들어서 따로 정리하는 것이 좋습니다. - 코어 플러그인 > 템플릿 단축키로 템플릿 삽입 설정해두면 편합니다. 옵시디언 플러그인 추천 1. Obsidian Git github 저장소와 연동시켜 백업 가능 옵시..
문제 상황 Spring Boot로 개발을 진행하던 중 random한 list를, 그것도 filter를 적용한 list를 page로 직접 변환해야 하는 일이 생겼다. JPA는 pageable을 사용하여 손쉽게 pagination을 적용할 수 있게 해주지만 내 경우에는 list를 page 객체로 직접 변환해야 했기 때문에 구글링을 좀 했어야 했다. 해결 방법 결론적으로 그 방법은 List를 하나 정의 한 후, List fileList = new ArrayList(); fileList를 생성 후 반복문을 돌면서 list에 원소를 추가한다. fileRepository.findAll().forEach(file-> { if (file.getItem() != null) { if (Boolean.FALSE.equals..
Python GIL GIL이란 Global Interpreter Lock의 약자로 여러 개의 스레드가 파이썬 코드를 동시에 실행하지 못하도록 하는 것이다. 즉, 인터프리터 락을 걸어 쓰레드를 아무리 여러개 만들어 멀티 쓰레딩을 하더라도 한번에 하나의 쓰레드만 사용할 수 있도록 하는 제약. 따라서 멀티 CPU 환경에서도 python thread는 어느 시점에나 1개의 스레드가 실행된다는 단점이 있다. GIL은 CPython에만 존재 CPython은 python code를 bytecode로 변환한 뒤, interpreting을 진행. 따라서 compiler와 interpreter의 역할을 모두 수행한다. 대부분의 python의 내부는 CPython으로 이루어져 있어 이 글에서 python이라함은 CPytho..