Project 15

spring boot 사이드 프로젝트 : 테스트 시나리오를 세우고 jmeter를 통해 부하 테스트 해보기

프로젝트를 배포, 운영해보면서 내 프로젝트에 어디서 병목 현상이 발생하는지, 트래픽은 어느 정도까지 감당할 수 있는지 확인이 필요한 경우를 공부한 과정입니다.  테스트하는 프로젝트는 sns 사이드 프로젝트로,  간단히 포스팅을 쓰고, 댓글 및 좋아요가 가능한 기본적인 커뮤니티입니다. 테스트는 다음과 같이 시나리오를 설정하고, 진행했습니다.  테스트 시나리오 구성 근거 실제로 클라우드에 배포하는 건 돈 때문에ㅜㅜ   제 컴퓨터 스펙의 서버를 기준으로 잡고 일단 테스트 기준을 세웠습니다.  1. 서버 스펙 제 컴퓨터 스펙은 다음과 같습니다. cpu : AMD Ryzen 5 3500X 6-Core Processor 3.59 GHz   (6코어 입니다.)메모리 : 16GBdisk : sdd 500GB   2. ..

spring boot 사이드 프로젝트 : authenticate에서 발생하는 '자격 증명에 실패하였습니다' 오류 해결

프로젝트 중 로그인 관련해서 마주친 오류에 대한 내용 정리입니다.   마주친 오류는 다음과 같습니다.     해당 오류가 발생한 원인 발생한 원인은 로그인 로직 수정 때문이었습니다.  수정 전 로그인 방식- 이메일, 비밀번호 입력해서 로그인  수정 후 로그인 방식- 아이디, 비밀번호 입력해서 로그인      오류 발생 위치   기존 로그인 과정 코드에서, 이슈가 발생한 부분은 다음과 같습니다. Authentication authentication = authenticationManagerBuilder.getObject().authenticate(usernamePasswordAuthenticationToken);   UsernamePasswordAuthenticationToken으로 생성한 토큰을 넘겨 권..

Project/9uin 2024.04.02

spring boot 사이드 프로젝트 : 채팅기능을 위한 stomp 적용

프로젝트의 요구사항 중 같은 프로젝트에 소속되어있는 인원들끼리 이용할 수 있는 채팅방을 구현해야하는 요구사항이 있었다. 이를 구현해보기 위해 공부한 내용을 정리한다.  rest api 를 사용한 프로젝트에서 채팅은 http를 이용해서 구현할 수 있을까? 가능은 해도 매우 비효율적일 것이다. 이는 http의 특성을 보면 알 수 있다. 1.  클라이언트 - 서버 구조 : 서버에서는 클라이언트의 요청이 와야 응답을 한다. 그 전까지 서버는 대기한다. 2. stateless  :  http를 이용해 클라이언트에서 서버로 한 번 요청과 응답을 주고 받았어도, 서버에서는 http 요청했던 클라이언트의 상태를 저장하지 않는다. 3. connectionless : 한 번 요청 후 응답을 받으면 클라이언트와 서버 간 연..

spring boot 사이드 프로젝트: DockerFile, docker-compose.yml 작성 및 클라우드 세팅(GCP) 2

이 글은 다음글에서 이어진다. https://yoonsys.tistory.com/22 spring boot: DockerFile, docker-compose.yml 작성 및 클라우드 세팅(GCP) 1 프로젝트 작성이 거진 다 끝나고, 테스트와 기능 개선 과제, 그리고 배포 정도의 과제가 남았다. 이제 로컬로 개발서버를 여는 것 뿐 아니라 클라우드 인스턴스에 24시간 배포를 시작해보려 한다 yoonsys.tistory.com gcp에 접속할 준비가 끝났다면, 이제 들어가서 세팅해볼까 싶다. 하지만 가장 중요한 부분인 포트 열기와 고정 ip할당 받기가 남아있다. 기본적으로 스프링 부트에서 사용하는 8080포트를 열지 않으면 외부에서 8080으로 접속을 시도해도 막히게 될 것이다. 포트 열기 위와 같이 메뉴에..

Project/9uin 2023.10.30

spring boot 사이드 프로젝트: DockerFile, docker-compose.yml 작성 및 클라우드 세팅(GCP) 1

프로젝트 작성이 거진 다 끝나고, 테스트와 기능 개선 과제, 그리고 배포 정도의 과제가 남았다. 이제 로컬로 개발서버를 여는 것 뿐 아니라 클라우드 인스턴스에 24시간 배포를 시작해보려 한다. 클라우드 서비스는 가장 대중적인 아마존의 AWS, 마이크로소프트의 Azure, 구글의 GCP 등등 여러가지가 존재하는데, 나는 여기서 GCP를 선택했다. 이유는 단순하게도 무료로 이용이 가능해서(...) 이다. 다른 서비스는 무료를 더 이상 쓸 수 없는 상황.. 당장 복잡한 클라우드 아키텍처를 설계하지는 않았다. 일단 가볍게 다음과 같은 구조를 생각했다. GCP인스턴스 하나를 실행해서 그 안에 도커를 이용해 3개의 컨테이너를 띄운다. 8080으로 요청을 보내면 설정을 통해 스프링 부트 애플리케이션이 실행중인 컨테이..

Project/9uin 2023.10.30

spring boot 사이드 프로젝트 : spring boot + github action을 통해 CI/CD구축

ci/cd란 continuous integration / continuout deploy(delivery) 의 줄임말로, 지속적 통합과 배포를 말한다. 스프링 예제를 하나라도 해보면 알겠지만 서버 코드를 업데이트 했다고 실행중인 애플리케이션에 바로 적용되지는 않고, 서버를 껐다 켜야 업데이트한 코드가 적용된다. 개발서버와 배포 서버를 따로 둔 상황에서 업데이트 내용을 적용하려면 배포 서버에 직접 접속해서 git pull이나 docker pull같은 작업을 거친뒤 다시 서버를 껐다 켜야되는데 서버가 한 두대면 모를까 여러대면 이런건 고역이 따로 없다. ci/cd를 통해 이런 작업을 할 필요 없이, 트리거만 충족되면 배포 서버에도 업데이트한 내용이 바로 적용되고, 다시 배포를 알아서 시작해준다. 프로젝트 마..

Project/9uin 2023.10.29

springboot 사이드 프로젝트[9] : controller 작성

사용자와 상호작용을 위한 controller 레이어를 만들었다. 기본적으로, 이 프로젝트에 구현한 대부분의 컨트롤러는 이렇게 crud하는 구조를 가진다. (물론, 특수한 로직을 사용해야하는 경우 추가로 다른 구조로 작성되었다.) 가장 자주 사용되는 게시글 api를 살펴보자. Board controller BoardController.java @RestController @RequestMapping("/boards") @Tag(name = "board", description = "게시글 관련 api") public class BoardController { private BoardService boardService; private static final Logger log = LoggerFactory...

Project/9uin 2023.09.04

spring boot 사이드 프로젝트[8] : 게시글 태그 필터링 (querydsl join)

이전글 https://yoonsys.tistory.com/9 spring boot 사이드 프로젝트[7] : Custom Repository 작성(사용자명, 글제목으로 게시글 검색) JpaRepository를 인터페이스에 상속하면 기본적인 메서드들 (ex. findbyid, findAll) 을 제공하지만, 디테일한 데이터를 쿼리하기 위해서는 내가 직접 작성할 필요가 있었다. 처음에는 다음과 같이 메서드 yoonsys.tistory.com 앞에서는 동적 쿼리를 이용해 사용자 이름, 게시글 이름으로 게시글들을 필터링하는 repository코드를 작성했다. 이번에는 복수의 태그를 이용해 게시글을 필터링해보려 한다. Entity 수정 여기서 중요한 점은 entity의 수정이었다. 게시글 하나에는 여러개의 기술 스..

Project/9uin 2023.06.14

spring boot 사이드 프로젝트[7] : 게시글 검색 기능 구현, 동적 쿼리 적용

JpaRepository를 인터페이스에 상속하면 기본적인 메서드들 (ex. findbyid, findAll) 을 제공하지만, 디테일한 데이터를 쿼리하기 위해서는 내가 직접 작성할 필요가 있었다. 처음에는 다음과 같이 메서드들을 나눠서 작성했었다. CustomPostRepositoryImpl.java @Override public Page findAllPost(Pageable pageable) { List content = jpaQueryFactory .selectFrom(qPost) .orderBy(qPost.createAt.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); JPAQuery count = getCo..

Project/9uin 2023.06.13

spring boot 사이드 프로젝트[6] : querydsl 설정 및 작성

이전에 만든 repository는 JpaRepositroy를 상속받았기에 기본적인 crud 쿼리 메서드들을 사용할 수 있다. 추가로 디테일한 쿼리를 원하면, 우리가 직접 쿼리 메서드를 작성해서 커스텀이 가능하다. 그렇기에 JPQL(Java Persistence Query Language)의 사용이 필연적이게 된다. 문제는 원하는 쿼리가 복잡해질수록 너무 쿼리문자열, 또는 메서드 이름의 길이가길어져 가독성이 떨어지고, 오류도 체크하기 어려워진다. 그렇기에 우리는 querydsl을 사용하기로 결정했다. querydsl 개요 querydsl은 SQL쿼리를 정적 타입을 이용해 생성하게 해주는 프레임워크이다. 이것을 이용하면 다음과 같은 장점이 있다. 1. 자동완성 기능을 사용할 수 있다. 2. 문법이 틀리면 오..

Project/9uin 2023.05.26