Project

    [CANCER-FINE] 팩토리 메서드 패턴을 활용해 탄탄한 Entity 구성하는 방법

    1. 배경JPA를 사용하여 엔티티를 작성할 때 우리는 보통 정형화된 방식으로 작성합니다. 예를 들어 아래와 같은 형태가 일반적입니다.@Entity@Table( name = "board", indexes = [Index(name = "idx_fts", columnList = "title, content", unique = false)]) class Board( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null @Column(nullable = false) var title: String, @Column(columnDefinition = "TEXT", nul..

    [CANCER-FINE] 프로젝트 init

    [CANCER-FINE] 프로젝트 init

    1. 프로젝트 개요현재 암환자에 대한 정보는 산재되어 있으며, 각 환자에게 fit한 정보를 찾는것이 너무 어려움암환자를 위한 맞춤형 정보 제공 사이트2. ERD 다이어그램ERD는 다음과 같습니다. 그렇게 복잡하진 않습니다.3. 기술 스택FrontEnd : React.js , html, css, javaScriptBackEnd : SpringBoot 3.3.4, Kotlin1.9, MySQL, Spring Data JPA, AOP, Functional Programming, JUnit54. 참여 인원작성자 혼자 진행5. 핵심 기능1) 회원회원가입로그인로그아웃회원정보수정회원 탈퇴Session 기반 로그인 유지AOP 활용한 SessionCheck회원 본인 정보조회2) 게시글게시글 작성게시글 조회(전체 게시글 ..

    [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. 배경 조회수 기능을 개발 중입니다. 서비스를 개발하면서, 특정 사용자에 의해..

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

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

    안녕하세요! 반갑습니다! 이번 포스팅에서는 채팅 메세지 전송 속도를 어떻게 개선했는지 자세히 설명해보고자 합니다! 자세한 코드는 깃허브에서 확인하실 수 있습니다! 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 호출 대비 많을 것이라 예상했고, 만약 모놀리식으로 서버를 구축한 상태에서 채팅..

    [Gasip Project] JPA / could not initialize proxy - no Session.

    [Gasip Project] JPA / could not initialize proxy - no Session.

    잘만되던 CRUD가 갑자기 안되기 시작했다. DB에 저장된 정보 불러오기(Get)을 할 때 이런 문제를 발견했다. 1. 문제 정의 아니 왜 안돼??? 젠장 또 에러메시지야.. LazyInitializationException : could not initialize proxy - no Session 즉, 프록시를 시작할 수 없다 그말씀이시네요. 프록시 문제인 것을 보니 아무래도 JPA 연관관계 매핑에서 오류가 난 듯하다. 2. 해결방안 접근 JPA 연관관계 매핑을 해 둔 엔티티로 가보자. 현재 Professor - Major 가 1:1 연관관계를 맺고 있다. (Professor가 major_ID 를 FK로 갖고 있는 구조다) 아무래도 위 사진에서 major 객체를 OneToOne으로 연관관계 매핑해줄 때..