확장 가능한 좋아요 기능 설계 및 구현하기
·
서버
들어가며안녕하세요. 현재 플러피라는 온라인 시험 문제 제작 및 관리 서비스를 개발하고 있습니다. 최근에, 사용자들이 시험에 대해 피드백을 제공할 수 있도록 좋아요 기능을 추가했습니다. 서비스 사용자들은 좋아요 수를 통해 퀄리티가 높은 시험을 쉽게 찾아볼 수 있어, 서비스가 활성화될 수 있습니다. 서비스 개발자인 저는, 이 기능을 통해 수집한 데이터를 통해, 향후 개인 맞춤형 시험 추천 서비스 등을 제공할 수 있습니다.제목은 좋아요 기능이라고 했지만, 반응 기능이 더 적합할 것 같은데요.이번 글에서는 확장 가능한 좋아요 기능을 설계하고, 구현하는 방법에 대해 알아보겠습니다.기능 요구 사항좋아요 기능을 설계하기에 앞서, 기능 요구 사항을 정리해보겠습니다.로그인한 사용자는 시험에 대해서 좋아요를 할 수 있다...
커버링 인덱스를 활용해 페이지네이션 성능 개선하기
·
서버
들어가며안녕하세요. 요즘에 플러피(fluffy)라는 온라인 시험 문제 제작 및 관리 서비스를 개발하고 있습니다. 플러피 서비스의 첫 화면에서 최근 출제된 시험 목록을 보여줍니다. 출제된 시험이 점차 늘어남에 따라 전체 목록을 조회하는 것은 성능적으로 느려질 수 있습니다. 이러한 문제를 해결하기 위해 페이지네이션을 도입하였습니다. 페이지네이션에는 전통적인 게시판에서 자주 사용하는 Offset 방식과 SNS의 무한 스크롤에서 사용하는 Cursor (No Offset)방식이 있습니다. Offset 방식은 페이지 번호를 기반으로 사용자가 원하는 특정 페이지로 이동할 수 있도록 하며, 각 페이지의 시작 위치를 지정하여 데이터를 가져옵니다. 반면, Cursor 방식은 사용자가 마지막으로 본 항목을 기준으로 다음 항..
Docker Desktop 오류, "'com.docker.vmnetd'에 악성 코드가 포함되어 있어서 열리지 않았습니다." 해결 방법
·
서버
들어가며평소 Mac에서 Docker를 사용하던 중, Docker Desktop을 실행하려고 했더니 다음과 같은 경고 메시지가 뜨면서 실행되지 않는 문제가 발생했다.악성 코드가 차단됨, 'com.docker.vmnetd'에 악성 코드가 포함되어 있어서 열리지 않았습니다. 이 소프트웨어는 악성 코드를 포함하고 있을 수 있습니다. 이 소프트웨어는 다운로드된 후 수정되었을 수 있습니다. 이 소프트웨어를 실행하면 컴퓨터에 손상을 줄 수 있습니다.악성 코드가 차단됨  'com.docker.socket'에 악성 코드가 포함되어 있어서 열리지 않았습니다. 이 소프트웨어는 악성 코드를 포함하고 있을 수 있습니다. 이 소프트웨어는 다운로드된 후 수정되었을 수 있습니다. 이 소프트웨어를 실행하면 컴퓨터에 손상을 줄 수 있습..
Spring REST Docs로 믿을 수 있는 API 문서 만들기
·
서버
들어가며안녕하세요. 현재 플러피(fluffy)라는 온라인 시험 문제 제작 및 관리 서비스를 개발하고 있습니다. 1인 개발을 하다 보니 서버와 웹 프론트엔드를 모두 담당하고 있습니다. 개발을 진행하면서 새로운 API를 추가하거나 기존 API를 변경하는 일이 빈번한데, 작성한 API를 프론트엔드에서 사용할 때마다 헷갈려 직접 코드를 살펴보는 번거로움이 있습니다. 또한, 나중에 다른 개발자가 프로젝트에 참여하거나 제가 다시 프로젝트를 돌이켜볼 때 이해하기 어려울 수 있습니다.  이러한 문제를 해결하기 위해 자동화 문서 생성 도구인 Spring REST Docs를 도입하기로 결정했습니다. 이번 글에서는 Spring REST Docs가 무엇인지 소개하고, 이것을 선택한 이유와 구체적인 사용법에 대해서 알아보겠습니..
무중단 배포(블루/그린 배포)로 서비스 중단 없이 배포하기
·
서버
들어가며안녕하세요. 요즘에 플러피(fluffy)라는 온라인 시험 문제 제작 및 관리 서비스를 개발하고 있습니다. 현재 서비스는 초기 단계로, 새로운 기능 추가와 버그 수정을 빈번하게 진행하고 있습니다. 현재 인프라는 하나의 AWS EC2 인스턴스에서 Nginx, Docker, GitHub Actions를 활용하여 지속적으로 배포되고 있습니다. 하지만 새로운 버전을 배포할 때마다 기존 컨테이너를 중지하고, 새로운 컨테이너를 실행하며, 애플리케이션(Spring)을 시작하는 과정을 거치게 됩니다. 이 과정에서 약 20초 정도의 다운타임(downtime)이 발생하여 사용자가 서비스를 이용하지 못하는 상황이 발생하고 있습니다. 이러한 다운타임은 사용자에게 불편을 초래하고, 이탈 가능성을 높이는 문제점을 안고 있습..
Flyway를 통한 데이터베이스 마이그레이션을 알아보자
·
서버
들어가면서안녕하세요. 요즘에 플러피(fluffy)라는 온라인 시험 문제 제작 및 관리 서비스를 만들고 있습니다.플러피에서는 시험 문제를 만들 때 지시문과 선택지만을 작성할 수 있었습니다.문제를 표현하기에 한계가 있어 지문을 추가해달라는 피드백이 있었습니다. 지문을 추가한 시험 문제현재 서비스는 배포 중인 상태이고 데이터가 이미 존재하기 때문에 데이터베이스 스키마를 모두 지우고 새로 생성하는 방법은 사용할 수 없습니다. 간단하게 떠올린 방법은 데이터베이스에 직접 들어간 후 질문 테이블에 지문 컬럼을 추가하는 방법이 있습니다. 다음과 같이 SQL 문을 실행하면 됩니다.ALTER TABLE 질문 ADD COLUMN 지문 TEXT NOT NULL DEFAULT ''; 하지만 이 방법은 데이터베이스에 직접 접근해..
@JsonTypeInfo와 @JsonSubTypes를 활용하여 요청 데이터에 다형성을 적용해 보자
·
서버
들어가면서안녕하세요. 요즘에 플러피(fluffy)라는 온라인 시험 문제 제작 및 관리 서비스를 만들고 있습니다.플러피에서는 단답형, 서술형, 객관식 단일 선택, 객관식 복수 선택, True/False 등 다양한 문제 유형을 지원하고 있습니다. 이에 따라 요청 데이터에도 다양한 형태의 문제 데이터를 받아야 합니다.예를 들어, 단답형 문제와 객관식 단일 선택의 경우 질문은 동일하게 필요하지만, 옵션 여부나 정답 형태가 다릅니다. 다음의 코드를 참고해주세요.// 단답형 문제 요청 데이터{ "text": "1 + 1 = ?", "type": "SHORT_ANSWER", "correctAnswer": "2"}// 객관식 단일 선택 문제 요청 데이터{ "text": "1 + 1 = ?", "type": "..
Spring JPA를 사용할 때, OneToMany에서 Fetch Join 사용 시 문제점을 알아보자
·
서버
중복 문제Post와 Comment가 일대다(1:N) 관계이고, Post에서 @OneToMany로 Comment를 참조하고 있다.@Entity@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)@Getterpublic class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "post") private List comments;}@Entity@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)@Getterpublic class Comment { ..