본문 바로가기

Project28

[Monitoring] 구축 (Prometheus + Grafana) 이번에는 Urdego의 모니터링 구축 과정에 대해 다뤄볼려 합니다. MSA 에서 서비스가 분산되어 있는데 모니터링을 어떻게 해야 할까 🤔 모니터링 (Monitoring)모니터링의 정의는 인프라 및 응용프로그램의 성능이나 효율성을 확인하는 작업이다.각 대상에서 수집한 Metric 정보를 통해서 리소스, 사용률, 트래픽등을 수치로 표현하는 기능인 셈이다. 여기서 Metric 정보를 수집하는 방법에는 Push 와 Pull 2가지 방식이 존재한다.  Push-based SystemPush 방식은 애플리케이션에서 데이터들을 직접 모니터링 시스템으로 보내주는 방식이다.새로운 애플리케이션이 추가되더라도 모니터링 시스템에 데이터를 보내기만하면 되지만 Metric을 중앙에서 정의하기 때문에 새로운 Metric을 수용하.. 2025. 3. 4.
[TensorFlow - NSFW] 부적절한 컨텐츠 감지 이번에는 Urdego 컨텐츠 서비스의 부적절한 컨텐츠 감지에 대한 포스팅을 작성하고자 합니다  도입 계기Urdego 프로젝트는 사용자가 생성하는 컨텐츠(UGC)를 게임에 사용하는 특성익명성이 보장되는 플랫폼에서 '유해 콘텐츠가 업로드될 가능성' 해결방법Amazon Rekognition (AWS에서 제공하는 부적절한 이미지 및 비디오 감지 API)Cloud Vision API - SafeSearch (GCP에서 제공하는 유해성 컨텐츠 감지)Green-eye (Naver에서 제공하는 음란물 차단 AI)등등...찾아보면서 느낀점은 API를 사용하면 손쉽게 구축할 수 있지만 역시 사용에 따른 비용이 발생한다는 점이다..블로그 포스팅하면서 매번 언급했지만 Urdego는 이미 비용문제 -> 홈서버로 구축했기에 부가.. 2025. 2. 18.
[깃허브 액션 - CI&CD] Self-hosted Runner 이번에는 urdego 백엔드 서비스들의 CI&CD 를 위한 깃허브 액션 도입에 대해 다뤄 볼려 합니다 도입 계기urdego 프로젝트는 여러개의 마이크로서비스 (User, Content, Game, 등) 으로 구성되어있어 각 서비스의 코드 변경 시마다 수동으로 빌드, 테스트, 배포를 진행하기에는 무리가 있었다.다수의 팀원이 협업하는 환경에서는 코드 병합시 의도치 않은 오류가 발생하거나 환경별 종속성으로 인한 문제가 드러나기도 하기에 코드 변경 사항에 대해 자동으로 빌드와 테스트를 실행하고 배포까지 자동화하는 도구가 필요했는데 Github Actions를 선택했다. Self-hosted ??urdego는 이미 AWS의 EC2 비용이 부담스러워 홈서버로 구축했기에 Github Actions의 퍼블릭 클라우드 .. 2025. 1. 12.
[홈서버 구축] Public Cloud(AWS) -> On-premise(홈서버) 구축 전환 오랜만에 포스팅입니다 약4개월..? 이번포스팅은 데브코스 최종 프로젝트인 'urdego 어데고?!'를 Public Cloud에서 On-premise 전환 과정에 대해서 다뤄볼려 합니다.  1. 왜 Aws 대신 홈서버로 구축하는가? 마침 노트북을 맥북프로로 갈아타면서 쉬고있는 윈도우 놑북이 존재했다 ㅎㅎaws ec2(t2.medium)를 이용하여 팀프로젝트에서 공용으로 사용하였는데 3주? 안된 기간을 사용하였는데도 성능대비 비용이 너무너무 순식간에 차는것을 볼 수가 있었다..프로젝트 최종 발표날에 데모를 진행하는데 70~80명이 한번에 접속하고 이것저것 눌러보니 cpu 사용률이 100%가 되더니 서버가 죽어버렸다. (t2.medium은 vCPU=2 RAM=4.0 이였다ㅜㅜ)그렇다 하나의 ec2안에 다섯개정.. 2024. 12. 18.
[깃터디/Alarm] 스터디장 가입승인/거부 알림(fcm) api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고 비동기 처리의 테스트 도중 아래와 같이 오류가 발생했다.Wanted but not invoked:fcmService bean.sendMessageSingleDevice( );-> at com.example.backend.study.api.event.service.FcmService.sendMessageSingleDevice(FcmService.java:37)Actually, there were zero interactions with this mock.Wanted but not invoked:fcmService bean.sendMessageSingleDevice( );-> at com.example.backend.study.api.eve.. 2024. 5. 16.
[깃터디/Alarm] 스터디 가입 신청 알림(fcm) api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고 비동기처리 공부Spring Boot에서 비동기 처리는 멀티스레딩 환경에서 비동기적으로 실행되는 작업을 처리하는 것으로, 동기적인 방식과 비교해 처리 속도와 성능을 개선할 수 있다.비동기 처리 작업이란 멀티스레드를 사용하여 작업을 분리하고, 작업이 끝날 때까지 대기하지 않고 다른 작업을 처리할 수 있다.@Async어노테이션은 Spring이 제공하는 기능으로, 해당 어노테이션이 붙은 메서드를 비동기 처리로 실행할 수 있도록 해준다. 이를 사용하면 메서드가 실행되는 동안 다른 작업을 수행할 수 있으며, 작업의 완료 여부를 확인할 수 있다. @Async @EventListener public void applyMemberListener(A.. 2024. 5. 16.
[깃터디/Convention] 컨벤션 삭제 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고  // 컨벤션 삭제 @Transactional public void deleteStudyConvention(Long conventionId) { // Convention 조회 StudyConvention studyConvention = studyConventionRepository.findById(conventionId).orElseThrow(() -> { log.warn(">>>> {} : {} studyConventionRepository.findById(conventionId)를 통해 데이터베이스에서 해당 ID를 가진 StudyConvention 객체를 찾고 객체가 존재하면, stu.. 2024. 5. 11.
[깃터디/Convention] 컨벤션 수정 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고  @Test @DisplayName("컨벤션 수정 테스트") public void updateStudyConvention() { //given User savedUser = userRepository.save(generateAuthUser()); StudyInfo studyInfo = StudyInfoFixture.createDefaultPublicStudyInfo(savedUser.getId()); studyInfoRepository.save(studyInfo); StudyMember leader = StudyMemberFixture.createStudyMemberLe.. 2024. 5. 11.
[깃터디/Convention] 컨벤션 조회 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고 비즈니스 로직을 구현할때 그에 맞는 컨트롤러, 서비스 구현도 중요하지만 테스트를 작성하는 과정이 중요하다고 느낀다. CRUD에서 R은 유저에게 보여줘야할 정보들이기 때문에 특히나 테스트가 더욱 중요하다고 느낀다. // StudyInfoId로 Convention 전체 가져오기 List findStudyConventionListByStudyInfoId_CursorPaging(Long studyInfoId, Long cursorIdx, Long limit);페이지네이션중에서 커서 기반 페이지네이션 (Cursor-based Pagination) 를 사용하여 구현했다.페이지 네이션이란 전체 데이터에서 지정된 갯수만 데이터를 전달하는 방법을 말하며.. 2024. 5. 11.
[깃터디/Convention] 컨벤션 등록 api 구현 💡 .java를 클릭시 관련 커밋으로 이동💡   회고  @ApiResponse(responseCode = "200", description = "컨벤션 등록 성공") @PostMapping("/") public JsonResult registerStudyConvention(@AuthenticationPrincipal User user, @RequestParam(name = "studyInfoId") Long studyInfoId,StudyConventionController 에서 studyInfoId 를 @RequestParam 어노테이션 즉, 쿼리 파라미터로 처리를 했었지만 쿼리 파라미터는 주로 f.. 2024. 5. 11.