Spring/프로젝트 코드 리뷰 12

메시징 웹 애플리케이션 아키텍처 분석

메시징 기능을 갖춘 웹 애플리케이션의 현대적인 아키텍처에 대해 상세히 알아보겠습니다. 이 아키텍처는 실시간 메시징, 확장성, 모니터링 기능을 갖춘 엔터프라이즈급 시스템을 위해 설계되었습니다.  전체 아키텍처 구성이 메시징 웹 아키텍처는 다음과 같은 주요 구성 요소로 이루어져 있습니다:개발 환경 (Development)CI/CD 파이프라인프론트엔드 서버백엔드 서버메시지 브로커캐시 시스템데이터베이스모니터링 시스템테스트 인프라이미지 서버각 구성 요소의 역할과 상호작용을 자세히 살펴보겠습니다.  1. 개발 환경 (Development)개발자는 코드를 작성하고 Git을 통해 소스 코드를 관리합니다:Git: 분산형 버전 관리 시스템으로, 개발자는 이를 통해 코드 변경사항을 푸시합니다.Git Push: 개발자가 코드..

웹 애플리케이션 관리자 사이트 아키텍처 분석

프로젝트를 하면서 잊지 않기 위해 정리용으로 작성하였습니다.관리자 사이트 아키텍처에 대해 상세히 알아보겠습니다. 이 아키텍처는 대규모 트래픽을 처리하고 개발 효율성을 높이는 데 최적화되어 있습니다.    전체 아키텍처 구성 이 아키텍처는 크게 다음과 같은 주요 구성 요소로 이루어져 있습니다:개발 환경 (Development)CI/CD 파이프라인 (Jenkins)서버 인프라 (프론트엔드, 백엔드)테스트 인프라데이터베이스 시스템 각 구성 요소의 역할과 상호작용을 자세히 살펴보겠습니다. 1. 개발 환경 (Development) 백엔드 개발 환경백엔드는 다음과 같은 기술 스택으로 구성되어 있습니다:Kotlin: JVM 기반의 현대적인 프로그래밍 언어로, Java와 완벽한 상호 운용성을 제공하면서도 더 간결한 문..

프로젝트 : CDN과 24년 선거 대비 자체 이미지 서버 개발 및 최적화

CDN(Content Delivery Network) 적용 및 운영 경험CDN은 전 세계 여러 지역에 분산된 엣지 서버(Edge Server)를 통해 사용자에게 정적 및 동적 컨텐츠를 빠르고 안정적으로 전달하는 기술입니다. 대규모 트래픽을 효율적으로 분산하고, 웹사이트의 로딩 속도를 단축하며, 서버 부하를 줄이는 데 중요한 역할을 합니다. 프로젝트 배경24년 선거 기간 중 Kakao, RCS, MMS 메시지 대량 발송 시 서버 다운 및 전송 속도 저하 문제 발생 가능성기존 메시지 서버에서 이미지 트래픽이 혼합되어 처리되면서 부하 급증트래픽 폭증에도 안정적으로 이미지 전송을 처리할 수 있는 독립적인 이미지 서버 필요 주요 개발 내용자체 이미지 서버 설계 및 구축메시지 본문과 이미지 트래픽을 분리하여 전용 ..

관리자 웹 마이그레이션 프로젝트 정리

프로젝트 배경 기존 18개의 서버와 9개의 DB로 나뉘어 저 있어 운영 및 관리와 보안의 위험성이 존재합니다. 또한 20년이 넘은 JSP로 만들어진 구 애플리케이션으로 느린 페이지 로딩 시간과 비효율적인 콘텐츠 관리 시스템, 비응답형 웹 디자인 및 사용자 비 친화적이기 때문에  사용자의 UI/UX 측면에서의 향상과 차 후 리셀러(유통) 활성화로 점진적 시장 점유율 확대와 콘텐츠 관리 용시성과 효율성 증가를 목표로 만들게 되었습니다.   프로젝트 개요 이 프로젝트는 문자 전문기업을 위한 관리자 웹 애플리케이션 입니다. 해당 애플리케이션은 React와 Next.js를 사용하여 프론트앤드를 개바하였으며, 백앤드는 Kotlin과 Spring Boot 를 사용하여 구축하였습니다. 이 애플리케이션은 문자 전송을 위..

Spring WatchaPedia 클론코딩 프로젝트 취향 분석(선호 배우, 국가, 장르, 감상 시간)

🎬 선호배우 분석 Service public List peopleCnt(Long userIdx){ Map peopleMap = new HashMap(); List movIdxs = starRepository.findStarMovie(userIdx); List peopleList = List.of(movieRepository.findPeopleList(movIdxs).toString() .split("\\[")[1].split("]")[0].split(", ")); for(String str: peopleList){ String[] personList = str.split(","); for(String per : personList){ if(per.contains("주연")){ Long personIdx ..

Spring 클론코딩 프로젝트 취향분석( 유저정보, 평가수, 별점분포)

🎬 취향분석 유저 아이디 타임리프 입력 부분 취향분석 ㅁㄴㅇ tb_user 테이블에 있는 해당 로그인한 정보를 출력하는 부분이다. 🎬 취향분석 유저 평가수 타임리프 부분 37 영화 21 TV 프로그램 11 책 20 웹툰 해당 콘텐츠에 대한 별점의 수를 합처 출력하는 부분이다. 🎬 취향분석 유저 평가 별점 분포 타임리프 부분 대중의 평가에 잘 휘둘리지 않는 '지조파' 해당 사용자가 준 별점의 평가를 기준으로 사용자의 성향을 글로 표현하였다. 기존 왓챠피디아는 20여개 이상의 별점 성향이 존재하지만 클론코딩간 많은 데이터가 존재하지 않고 동일한 기능의 반복이기 때문에 '독수리파'와 같이 특정 3개의 성향을 표출하였다. 그래프 표현 방식은 기존 DetailPage의 그래프 방식과 유사하다. 🎬 취향분석 유저 ..

Spring 클론코딩 프로젝트 콘텐츠 DetailPage( 비슷한 장르의 작품 추천)

🎬 MovieRespose - Containing 이용하여 유사 장르 뽑기 List findByMovGenreContaining(String genre); 🎬 MovieService @Transactional(readOnly = true) public List similarGenre(String genre, Long movieIdx){ List result = new ArrayList(); List movieIdxList = new ArrayList(16); if(genre.contains("/")){ List genreList = Arrays.stream(genre.split("/")).toList(); HashMap containMovie = new HashMap(); for(String idx: g..

Spring 클론코딩 프로젝트 콘텐츠 DetailPage( 감상 가능한 곳, 유튜브(youtube) 예고편, 겔러리)

🎬 감상가능한 곳 타임리프 tb_movie 테이블의 mov_watch 컬럼에서 해당 movieIdx 값을 통해 해당하는 링크와 이미지 이름을 주기위해 타임리프에서 splt과 삼항연산자를 이용하여 구현하였다. th:title="${#strings.contains(wat,'aHR0cHM6Ly93d3cubmV0ZmxpeC5jb20vdGl0b')} or ${#strings.contains(wat,'netflix')}? '넷플릭스' : 1. {#strings.contains(wat,'aHR0cHM6Ly93d3cubmV0ZmxpeC5jb20vdGl0b' 이 부분은 넷플릭스의 고유 주소 값이다. 2. netflix 가 포함되어도 넷플릭스인걸 알 수 있기 때문에 타임리프에서 or 조건을 사용해서 1번과 2번이 포함되면..

Spring 클론코딩 프로젝트 콘텐츠 DetailPage( 출연/제작)

✔ 출연/제작 - Controller 부분 // 인물 리스트 List peopleList = new ArrayList(); List people = new ArrayList(); List personList = new ArrayList(); if(movie.people() != null){ peopleList = List.of(movie.people().split(",")); for(String per : peopleList){ people.add(per.split("\\(")[0] + "," + per.split("\\(")[1].split("\\)")[0]); } } try{ personList = personService.personList(people); }catch (Exception e){ S..

Spring 클론코딩 프로젝트 콘텐츠 DetailPage(별점,별점 그래프, 해당 유저 별점 달았는지)

✔ MovieController - @RequesdtMapping("/movie") 기본 주소 @Controller @RequestMapping("/movie") @RequiredArgsConstructor ✔ @GetMapping("/{movieIdx}") // http://localhost:8080/movie/1 @GetMapping("/{movieIdx}") // http://localhost:8080/movie/1 public String movieDetail( @PathVariable Long movieIdx, @PageableDefault(size = 5, sort = "commIdx", direction = Sort.Direction.DESC) Pageable pageable, ModelMa..

Spring 프로젝트 별점 순 출력

/* 별점 높은순 출력, 어느정도 인원이 평가해야(타임리프 적용) 0명이 평가한 경우 한명이 바로 5점을 주면 1등이 나오기 때문*/ @Transactional(readOnly = true) public List movieStar() { //평균 구하기 List result = new ArrayList(); // 평균점수가 최소 4.2 이상인 : 설정을 안할 경우 데이터가 없을경우 1점도 들어갈 수 있음 List result2 = new ArrayList(); // 평가한 인원이 최소 5명인 : 평가자가 0명인 경우 처음 평가한 이가 5점을 주면 바로 최고 점수 List result3 = new ArrayList(); List movieStar = movieRepository.findAll(); for(..

Spring 클론코딩 프로젝트 MovieController 랜덤출력

✔ 사전 준비(MovieService) // 나라&장르 랜덤출력 하기위한 부분 @Transactional(readOnly = true) public List searchCri(String genre, String country) { //빈 웹툰리스폰스 리스트 List result = new ArrayList(); List result2 = new ArrayList(10); List movieList2 = movieRepository.findByMovGenreContainingAndMovCountryContaining(genre, country); for(Movie m : movieList2){ double sum = 0; int starCount = 0; for(Star star : m.getStar()..