전체 글

Jisung Jung의 기술블로그
NBCamp

[최종프로젝트] 테스트 시나리오

최종프로젝트 테스트 시나리오 참고사항 nGrinder Controller/Agnet 실행 환경 - 로컬 환경에 설치해서 EC2 서버에 요청을 보내는 방식으로 테스트 - nGrinder Controller/Agent를 실행하는 비용도 존재하기 때문에 서버와 동일한 환경에 설치해서 진행하는것은 바람직하지 않고, 서버 환경에 대한 스펙은 명시하되 Controller/Agent가 실행되는 환경의 스펙은 명시하지 않아도 무관하다. 서버 스펙에 대한 참고사항 - t2.micro: amazon linux 2023 ami / 1 vCPU / 1 GiB memory - 위 서버 스펙은 aws freetier 스펙인데 실무에서는 4vCPU, 16GiB 환경을 주로 쓴다고 한다. 본 프로젝트는 학습의 목적이 크기 때문에 낮..

NBCamp

[최종프로젝트] 상품 검색 서비스 성능개선 회고

상품 검색 기능 성능 문제 발견 및 테스트 최종프로젝트에서 상품 검색 기능을 구현하고 프로젝트를 배포했을때, 아래와 같이 조회 속도가 매우 느린 문제가 발생했다. 이를 해결하고자 먼저 포스트맨을 이용해 응답시간을 체크해보았다. 포스트맨으로 확인해보았을때 5000~6000ms의 비정상적인 응답시간을 반환하는것을 확인할 수 있었다. 클라이언트의 입장에서 2000ms가 넘어가면 서비스를 제공하기 어렵다는 점을 기준으로 봤을때 확실히 개선히 필요한 부분이었다. nGrinder로 부하테스트를 진행했는데 TPS는 1.2, MTT는 8000ms로 매우 비정상적인 매트릭을 확인할 수 있었다. 반면, 메모리나 CPU가 매우 안정적인 모습을 보여주고 있는데 이를 확인했을때 서버 외부의 문제일 가능성이 크다고 예측했다. 상..

NBCamp

[최종프로젝트] WebSocket 실시간 채팅 서비스 개발

개요 최종프로젝트는 스포츠 경기 일정 및 결과를 제공하는 서비스인데 게임별 사용자가 소통할 수 있는 실시간 채팅 기능을 제공하고자 하였다. 네이버 스포츠, 아프리카TV 등과 같은 플랫폼에서 제공하는 실시간 채팅 기능을 모티브로하여 개발하였고 그 과정에서의 기술 의사결정과 개발과정 및 느낀점에 대한 회고를 진행하고자한다. Polling vs WebSocket 개발전 실시간 채팅에 사용할 수 있는 기술로 Polling 방식, WebSocket 중 어떤 기술을 채택해야할지 고민하는 시간을 가졌다. 결과적으로 WebSocket으로 개발하였고 WebSocket을 채택한 이유는 아래와 같다. 첫 번째로, Polling 방식은 지정한 interval마다 http요청을 보내기 때문에 서버에 많은 부담을 줄 것으로 판..

Spring, JPA

[Spring] nGrinder를 이용한 대용량 데이터 부하테스트

nGrinder 설치 및 실행 (로컬 환경) nGrinder를 로컬에서 구동하는 이유는 처음 Docker를 이용해 테스트하려고 했으나 M1 환경을 지원하는 nGrinder Docker 이미지가 존재하지 않고 JDK 설정 등 Docker로 할 경우 호환성 문제가 많아 로컬 환경에 controller와 agent를 다운로드 받아 진행했다. 아래 nGrinder 공식 깃헙에서 controller war 파일을 다운받아 실행한다. GitHub - naver/ngrinder: enterprise level performance testing solution enterprise level performance testing solution. Contribute to naver/ngrinder development..

Spring, JPA

[JPA] JPA 지연로딩과 N+1 문제

JPA 즉시로딩과 지연로딩 즉시로딩: Entity를 불러올때 연관된 Entity를 즉시 fetch해서 함께 불러온다. 지연로딩: 연관된 Entity가 필요할때 fetch해서 불러온다. //default 로딩 전략은 FetchType.EAGER @ManyToOne(fetch = FetchType.LAZY) @OneToOne(fetch = FetchType.LAZY) Entity 1개 조회할때 @Test @Transactional void findOne() { //fetchType이 EAGER일때: findOne을 호출하면 team도 함께 1차 캐시에 올라온다. -> query 총 1번 //fetchType이 LAZY일때: //findOne을 호출하면 user를 가져오기 위한 query 1번이 실행되고 fe..

Database

[Database] RDBMS 정규화

RDBMS에서 정규화란 테이블간의 중복 데이터를 최소화하는 전략을 말한다. 정규화는 중복 데이터를 별도의 테이블로 분리하는 1차 정규화, 복합키와 관련 칼럼을 종속 테이블로 분리하는 2차 정규화 등 여러 단계가 있는데 상황에 맞게 각 단계의 정규화 프로세스를 적용할 수 있다. 정규화를 수행하면 데이터의 중복성을 줄이고 무결성을 보장할 수 있지만, 그만큼 테이블간의 관계가 복잡해지기 때문에 적절한 정규화 단계를 적용하는것이 중요하다. 정규화와 대비되는 개념으로는 중복 데이터를 허용해 성능 향상을 기대하는 개념인 반정규화가 있다. 실제 현업에서도 성능을 고려해 중복데이터를 적절하게 허용한다고 한다.

Database

[Database] RDBMS과 NoSQL

NoSQL과 RDBMS의 차이는 데이터의 저장 방식에 있다. NoSQL은 비관계형 데이터베이스 형식으로 Key-Value 형태의 데이터가 관계 없이 저장되고, RDBMS는 관계형 데이터베이스 형식으로 규격화된 테이블에 데이터가 저장되고 각 테이블은 연관관계를 가질 수 있다. NoSQL은 가볍고 빨라 대용량 데이터를 처리하는데 유리하다는 장점이 있지만, 단순한 구조로 복잡한 데이터를 저장할 수 없고 간단한 쿼리만 이용할 수 있다는 단점이 있다. 반면 RDBMS는 무거운만큼 데이터의 무결성, 보안, 복잡한 쿼리 처리가 가능하다는 장점이 있고, 규모 확장의 어려움과 유연성이 부족하다는 단점이 있다.

Java

[Java] 메모리 구조

T 메모리 구조 JDK를 이용해 개발된 자바 애플리케이션이 JRE에 의해 JVM상에서 실행되면 OS는 JVM에 메모리를 할당한다. 이때, 자바 애플리케이션은 JVM이 OS로부터 할당받은 메모리를 사용하게 된다. 기계어를 포함한 모든 프로그래밍 언어의 공통된 메모리 사용 방식은 아래와 같은데 코드 실행 영역과 데이터 저장 영역으로 나누어진다. 코드 실행 영역은 프로그램의 코드가 저장되는 영역으로 텍스트영역이라고도 부른다. 자바 실행 파일(.java)를 컴파일러가 바이트 파일(.class)로 바꿔 JVM 메모리에 로드하는데 이때 바이트파일이 저장되는 곳이 코드 실행 영역이다. 데이터 저장 영역은 프로그램의 데이터가 저장되는 메모리 영역인데 OOP에서는 우리가 잘 아는 Static, Stack, Heap의..

NBCamp

[KPT 회고록] Trello 서버 개발

심화프로젝트 팀과제 "Trello" 만들기 KPT 회고 https://github.com/SpartaTrelloA08/SpartaTrelloA08Backend GitHub - SpartaTrelloA08/SpartaTrelloA08Backend: SpartaTrelloA08Backend SpartaTrelloA08Backend. Contribute to SpartaTrelloA08/SpartaTrelloA08Backend development by creating an account on GitHub. github.com KEEP 협업시에 정형화된 PR양식과 코드리뷰를 활용하니 누가 어떤 기능을 개발했는지와 전체적인 프로젝트 진행 흐름을 파악할 수 있어 좋았습니다. Postman을 사용하지않고 Servi..

Jisung Jung
Jisung Jung의 기술블로그