Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
mclub4 authored May 22, 2024
1 parent e002c1a commit d8ad40e
Showing 1 changed file with 27 additions and 10 deletions.
37 changes: 27 additions & 10 deletions back/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,29 @@

### 기능적 고려 사항

<br>

#### 채팅 구현

채팅 서버는 크게 Polling, Long Polling, Steaming, Websocket 방식으로 구현할 수 있다. 앞선 3가지 방법은 일반적인 RESTFUL API를 이용한 구현 방법이다. 그래서 비교적 구현이 쉽다. 하지만, 이들의 특성상 클라이언트 → 서버로 데이터 전송이 가능하지만, 서버 → 클라이언트로 전송은 불가능하다. 또한, 100% 실시간성을 보장하지 않는다. 이를 극복하기 위해서 나온 방법이 바로 4번 WebSocket 방식이다.

<img src = "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0nL7K%2FbtsG3fIiHYm%2FfyJV4CzEyPGylE3NwfSk51%2Fimg.png" width = 600 height=300>

[2200만 당근마켓 채팅 아키텍처](https://www.youtube.com/watch?v=lCxgddyxDyg) 영상을 보면 당근 마켓은 WebSocket을 활용한 위와 같은 아키텍처로 채팅을 구현했다고 한다.

반면에 [FaceBook 채팅 구현](https://stackoverflow.com/questions/43944729/how-does-facebook-real-time-works) 해당 글을 보면 FaceBook은 Long Polling으로 채팅을 구현했다. 그런데 채팅을 websocket으로 구현하면, 굉장히 리소스를 많이 잡아먹고 구현이 까다롭다.

<img src = "https://velog.velcdn.com/images/bruni_23yong/post/5d014368-7e40-4297-bbeb-163ef3e2fa3e/image.png" width = 600>

그래서 우리 서비스는 Long Polling을 이용하여 채팅을 개발하기로 결정했다. 우리 서비스의 채팅은 100% 실시간성을 보장할 필요 없을 뿐더러, 채팅이 메인 비즈니스 기능이 아니고, 프로젝트 마감기한이 임박하여 빠르게 개발해야되기 때문에 Long Polling을 이용하여 채팅을 개발하기로 결정했다.

채팅 시스템 설계 및 시나리오에 관한 더 자세한 내용은 [채팅 구현에 대한 고찰](https://mclub4.tistory.com/31) 필자의 블로그에 서술해놓았다.

#### 크롤링

현재 크롤링은 학식과 공지사항 분야에서 실시되고 있다.


### 성능적 고려 사항

#### 캐싱
Expand Down Expand Up @@ -86,28 +109,22 @@ Write 전략은 Write Around 전략을 활용했다. 데이터를 쓸 때, Redis

### 테스트 고려 사항

#### JUnits

JUnit은 자바 프로그래밍 언어를 위한 오픈 소스 단위 테스트 프레임워크로, 개발자가 자바 애플리케이션의 소프트웨어 테스트를 자동화하고 효율적으로 수행할 수 있게 합니다. JUnit은 테스트 주도 개발(TDD)을 촉진하며, 코드 변경 시 발생할 수 있는 버그를 조기에 발견하고 수정하는 데 유용하다. 주요 기능으로는 어노테이션을 사용한 간편한 테스트 정의, Test Suite을 통한 여러 테스트의 그룹화, 다양한 메서드를 통한 테스트 결과 검증, 테스트 실행 중 예외 상황 처리, 그리고 테스트 실행 결과를 시각적으로 보여주는 리포트 기능 등이 있다. JUnit은 모듈화된 코드 테스트를 장려하며, 지속적 통합(CI) 도구와의 통합을 통해 자동화된 빌드 프로세스에서도 중요한 역할을 한다. 직관적이고 사용하기 쉬운 API 덕분에 개발자들이 테스트 케이스를 작성하고 유지보수하는 데 걸리는 시간을 줄이는 데 도움이 된다.

#### Test Container

Test Containers는 통합 테스트에서 사용되는 자바 라이브러리로, Docker 컨테이너를 통해 데이터베이스, 메시징 큐, 웹 서버 등의 외부 리소스를 손쉽게 설정하고 관리할 수 있다. 이를 통해 개발자는 테스트 환경을 실제 운영 환경과 유사하게 구성할 수 있으며, 테스트의 신뢰성과 재현성을 높일 수 있다. 주요 특징으로는 코드 내에서 직접 Docker 컨테이너를 제어할 수 있는 API 제공, 다양한 프리셋과 유연한 구성 옵션, 테스트 실행 시 필요한 컨테이너를 자동으로 시작하고 종료하는 기능, 각종 데이터베이스(MySQL, PostgreSQL 등)와의 통합 지원, 그리고 쿠버네티스 환경에서도 사용 가능한 확장성 등이 있다. Test Containers는 JUnit과 같은 테스트 프레임워크와도 통합되어, 단위 테스트와 통합 테스트를 쉽고 일관성 있게 작성할 수 있다는 장점도 있다.

우리가 실제 서비스하는 RDS를 가지고 테스트를 진행한다면, 매우 위험할 것이다. 따라서, Test Container를 이용하여 독립된 환경에서 안전하게 테스트를 진행하도록 하였다.

#### Jacoco

JaCoCo는 자바 애플리케이션의 코드 커버리지를 측정하는 데 사용되는 오픈 소스 라이브러리이다. 코드 커버리지는 테스트가 애플리케이션의 소스 코드에서 얼마나 많은 부분을 실행하는지를 나타내는 지표로, 소프트웨어 테스트의 품질을 평가하는 중요한 요소이다. JaCoCo는 개발자들이 테스트의 효과를 분석하고, 테스트 범위를 확장하여 보다 신뢰성 있는 소프트웨어를 개발할 수 있도록 돕는다.

Jacoco를 이용하여 쉽게 테스트 코드 커버리지를 측정하고, 이를 html로 추출해서 팀원들이 쉽게 볼 수 있도록 구성하기 위해 택하였다.

#### Apache Jmeter

Apache JMeter는 자바 기반의 오픈 소스 소프트웨어로, 웹 애플리케이션 및 다양한 서비스의 성능 테스트와 부하 테스트를 수행하기 위해 사용된다. JMeter는 초기에는 웹 애플리케이션을 테스트하기 위해 개발되었으나, 현재는 데이터베이스, FTP 서버, 웹 서비스, JMS, LDAP, SMTP, POP3, IMAP 서버 등 다양한 프로토콜 또한 지원한다.

프로젝트에서 동시성 문제 테스트와 같이 대규모 부하 테스트를 위해서 사용하게 되었다.

#### JUnits

JUnit은 자바 프로그래밍 언어를 위한 오픈 소스 단위 테스트 프레임워크로, 개발자가 자바 애플리케이션의 소프트웨어 테스트를 자동화하고 효율적으로 수행할 수 있게 합니다. JUnit은 테스트 주도 개발(TDD)을 촉진하며, 코드 변경 시 발생할 수 있는 버그를 조기에 발견하고 수정하는 데 유용하다. 주요 기능으로는 어노테이션을 사용한 간편한 테스트 정의, Test Suite을 통한 여러 테스트의 그룹화, 다양한 메서드를 통한 테스트 결과 검증, 테스트 실행 중 예외 상황 처리, 그리고 테스트 실행 결과를 시각적으로 보여주는 리포트 기능 등이 있다. JUnit은 모듈화된 코드 테스트를 장려하며, 지속적 통합(CI) 도구와의 통합을 통해 자동화된 빌드 프로세스에서도 중요한 역할을 한다. 직관적이고 사용하기 쉬운 API 덕분에 개발자들이 테스트 케이스를 작성하고 유지보수하는 데 걸리는 시간을 줄이는 데 도움이 된다.

<br>

### 아키텍처 설계
Expand Down

0 comments on commit d8ad40e

Please sign in to comment.