Development/Spring&Springboot

    [Gasip] queryDSL을 활용하여 교수 평균 평점 구하기

    [Gasip] queryDSL을 활용하여 교수 평균 평점 구하기

    배경저희 비즈니스 로직을 살펴보면, 교수님에 대한 평점을 CRUD 할 수 있는 요구사항이 있습니다.(Delete 기능은 없지만,,,일단.. 예...) 계정 당 최초 1회에 한해 교수님들에 대한 평점을 1점~5점 이내로 등록할 수 있는데요.쉽게 바꿔 말하자면 각 교수님들에 대한 평점 등록을 한 번 밖에 못한다는 뜻입니다. 또한 평점을 확인하러 특정 교수님의 페이지에 접속한다면, (당연히) 교수님의 평균 평점을 확인할 수 있습니다. 이런 요구사항을 종합해본다면,한 계정 당 특정 교수님의 평점은 한번만 등록할 수 있다.특정 교수 페이지에서 각 사용자들이 평가한 평균 평점을 확인할 수 있다.사용자는 기존에 등록한 평점을 수정할 수 있다.정도입니다. 사실 이런 요구사항을 선정하는데까지 여러 논의가 있었는데요. 논..

    [Gasip] Redis & Sync Schedule 을 적용해 조회수 동시성 처리

    [Gasip] Redis & Sync Schedule 을 적용해 조회수 동시성 처리

    배경 Gasip 프로젝트를 진행하던 도중 게시글 조회수를 올릴 때 동시성 문제를 해결하고자 조사하고 고민한 방법을 공유하고자 합니다. 조사하면서 정말 다양한 방법이 있었고, 저는 왜 이런 방법을 선택했는지도 함께 풀어서 설명해보겠습니다. 해결하고자 하는 문제는 당연히 조회수 동시성 문제입니다. 로컬 환경에서 JMeter를 활용하여 500개의 멀티쓰레드 환경에서 동시에 게시글을 조회한 결과,조회수가 500만큼 오르는 것이 아닌 200~250내외로 조회수가 오르는 것을 확인할 수 있었습니다. 당시 조회수를 올리는 로직은 아래와 같습니다. 서비스 레이어에서 게시글을 조회하는 메서드 내에서 위 increaseView를 호출했습니다. @Transactional public BoardReadResponse find..

    [Gasip] 게시글 조회수 중복 방지 처리 로직 구현

    [Gasip] 게시글 조회수 중복 방지 처리 로직 구현

    자세한 코드는 깃허브 주소를 참고 부탁드립니다. (BoardService.java) https://github.com/GASIP-PROJECT/gasip-service/tree/develop/src/main/java/com/example/gasip/board gasip-service/src/main/java/com/example/gasip/board at develop · GASIP-PROJECT/gasip-service 가천 수강 프로젝트 입니다. Contribute to GASIP-PROJECT/gasip-service development by creating an account on GitHub. github.com 1. 배경 조회수 기능을 개발 중입니다. 서비스를 개발하면서, 특정 사용자에 의해..

    스프링 빈이란??

    1. 스프링 빈? 정의(What?) IoC 컨테이너(스프링 컨테이너) 안에 들어있는 객체로, 필요 시 스프링 컨테이너에서 가져와서 사용한다. 싱글톤으로 저장되기 때문에 객체의 재사용이 가능하다. 왜써?(why?) 스프링 컨테이너에서 개발자 대신 객체를 관리하도록 하기 위함. 객체를 개발자가 직접 생성하고 관리하는 것이 아니라 스프링 컨테이너에 스프링 빈으로 등록하고 컨테이너가 연관관계를 맺고 관리하도록 할 수 있다. 스프링 빈을 등록하는 방법은 아래와 같다. 1. @Bean 어노테이션 + ComponentScan 어노테이션 @ComponentScan(basePackages= {"com.example.myapp"}) @ImportResource(value= {"classpath:application-con..

    스프링 컨테이너 DI와 IoC

    1. IoC (Inversion Of Control) 제어의 역전이란? 정의(What?) 프로그램의 메서드나 객체를 개발자가 직접 제어하는 것이 아니라 외부(스프링 컨테이너)에서 관리하도록 하는 것 왜 써?(Why?) 개발자는 비즈니스 로직 구현에만 집중할 수 있기 때문 또한 제어의 역전을 통해 SOLID 원칙 중 DIP(의존관계 역전 원칙)를 준수할 수 있다. SoccerPlayer라는 인터페이스가 있다고 가정해보자. 아래 코드는 DIP를 위반한 상태이다. DIP는 추상화에 의존해야하지 구체화에 의존하면 안된다는 원칙인데, 아래 코드에서 Coach 클래스는 현재 체력 훈련 세션 객체를 의존하고 있다. 다른 훈련세션으로 변경하기 위해선 코드를 직접 수정해야하기 때문이다. public class Coach..

    [채팅] 채팅 메세지 전송 속도 개선

    [채팅] 채팅 메세지 전송 속도 개선

    안녕하세요! 반갑습니다! 이번 포스팅에서는 채팅 메세지 전송 속도를 어떻게 개선했는지 자세히 설명해보고자 합니다! 자세한 코드는 깃허브에서 확인하실 수 있습니다! https://github.com/HyemIin/Catchroom_Chat GitHub - HyemIin/Catchroom_Chat: 캐치룸 서비스의 채팅 서버 레포입니다. 캐치룸 서비스의 채팅 서버 레포입니다. Contribute to HyemIin/Catchroom_Chat development by creating an account on GitHub. github.com 또한 기초적인 채팅 아키텍처 설명은 아래 포스팅을 참고해주세요! https://hyem5019.tistory.com/entry/%EC%B1%84%ED%8C%85-%EC%..

    [채팅] 채팅방 리스트 최신화 속도 개선

    [채팅] 채팅방 리스트 최신화 속도 개선

    안녕하세요! 이번 채팅 시스템을 구축하면서 채팅방 리스트 최신화를 어떤 방식으로 진행시켰는지 설명해보겠습니다! 그 전에 이해를 돕고자 서비스(서비스명 : 캐치룸) 아키텍처에 대해 간략히 설명드리겠습니다. 자세한 코드는 깃허브에서 확인 가능합니다! https://github.com/HyemIin/Catchroom_Chat 0. 서비스(캐치룸) 프리뷰 1) 채팅서버와 메인서버 분리 먼저 채팅서버와 메인서버가 구분되어 있는 것을 확인하실 수 있습니다. 채팅서버는 말 그대로 채팅 관련 요청을 전담하는 서버이고, 메인 서버는 채팅 외 캐치룸에서 적용되는 모든 API를 처리하는 서버입니다. 서로 구분한 이유는 채팅 트래픽이 일반 API 호출 대비 많을 것이라 예상했고, 만약 모놀리식으로 서버를 구축한 상태에서 채팅..

    SpringBoot 내 html 파일을 어떻게 불러오는지 모르겠다면

    SpringBoot 내 html 파일을 어떻게 불러오는지 모르겠다면

    안녕하세요. Harry입니다. 본 포스팅의 목적은, 스프링부트를 공부하며 어려웠거나 막혔던 부분에 대한 "명확한 정리/트러블슈팅" 입니다. 목표 - 스프링부트에서 여러 개의 html 파일을 어느 폴더에 둘 때 어떻게 읽어야하는지 안다. 결론 아무설정을 안한다면 template 폴더 내 있는 html 파일을 스프링부트가 읽을 방법이 없다. 만약 스프링에서 html을 읽어 오고자 한다면 1) [귀찮게 새로운 폴더 만들기] Webapp 폴더를 따로 생성하거나, 2) [스프링이 인지할 수 있는 귀찮은 설정 추가] (MvcConfiguration implements WebMvcConfigurer) public class를 선언하거나, 정적 리소스를 탐색할 경로를 매번 만들고 관리해야하기 때문에 빡셈 3) [멋진]..