메뉴 34

spring boot 사이드 프로젝트 : spring의 @EventListener 사용기

sse 를 이용한 알림 시스템을 구현하며, 코드 개선을 고민하던 중 EventListener를 적용해 개선이 가능하다는 것을 알게 되었습니다. 이 글은 해당 기능 적용기에 대한 포스팅입니다. 1. spring의 @EventListener란? 이벤트 발행/구독 메커니즘특정 이벤트가 발생했을 때, 해당 이벤트를 구독하고 있는 리스너들에게 알림을 보내 관련 로직을 수행하도록 하는 방식입니다.제 코드에서 이벤트 발생 위치는 포스팅 생성 메서드가 되겠고, 이벤트를 구독하는 리스너는 알림 시스템이 되겠습니다. EventListener 원리이벤트 발행/구독 시스템은 spring에서 제공하는 @EventListener 어노테이션을 이용해 구현이 가능합니다.EventListener 를 통해 이벤트 발행/구독 동작을..

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

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

spring boot : entity <-> dto 변환 방법에 대한 고민( MapStruct 에 대해)

개요프로젝트를 진행하며 여러 layer사이에 데이터를 전달할 때, dto, entity 간 변경이 자주 일어나는 상황에 변환하는 코드를 일일이 적어넣는 것이 불편했습니다.   예시로 보면, member  한 명을 생성하는 post api는 다음처럼 작성되어 있었습니다.  @Controller@RequiredArgsConstructorclass MemberController { private final MemberService memberService; @PostMapping() public Member createMember(@RequestBody MemberDto memberDto){ //dto 사용 Member member = memberService.createM..

Backend/spring boot 2024.10.09

concurrentHashMap가 어떻게 thread safety하게 동작하는가?

기업에서 요구했던 사항들 중 하나는 멀티 쓰레드로 운용되는 서비스에서 thread safety한 자료구조를 사용하는 것이었습니다. key value 형식으로 데이터를 저장할 때 java에서는 주로 HashMap을 많이 사용하게 되는데, 이 자료구조는 멀티 쓰레드 환경에서는 동시성 문제(concurrency issues) 가 발생할 수 있습니다.   실제로 java.util에 있는 HashMap으로 찾아가보면 위와 같은 주석 내용을 발견할 수 있습니다. 바로 해석할 수 있듯 synchronized가 되어있지 않기에, 멀티 쓰레드 환경에서 이 HashMap에 동시에 다수 쓰레드가 access하면 문제가 생길 수 있다는 내용입니다.   동시성 문제란? 동시성 문제는 여러 쓰레드가 동시에 같은 자원에 접근할 때..

Language/Java 2024.09.10

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

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

Project/9uin 2024.04.02

[ 프로그래머스 lv 2 ] 뉴스 클러스터링 (c++)

풀이 내가 한 풀이는 좋은 풀이는 아닌 것 같다. 두 글자씩 나눠서 입력하는 부분을 함수로 만들어 코드 길이를 줄일 수 있었을 것이다. v1, v2에 각각 두 글자씩 묶은 문자열을 넣어준다. 이 때, 알파벳으로만 이루어져 있는 지 체크하고, 동시에 대문자는 소문자로 변경한다. 이는 대소문자 구분 없이 하기 위해서 이다. 교집합의 개수만 구했다. 교집합의 원소 개수를 알면, 합집합 원소 개수도 구할 수 있기 때문이다. A U B = A + B - A n B 공식을 이용한다. 중요한 점은 double을 이용해 형변한을 해서 소수점까지 나오게 한 뒤 계산해야 한다. #include #include #include #include using namespace std; int solution(string str1..

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

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

[ 프로그래머스 lv2 ] 가장 큰 정사각형 찾기 (c++)

문제 풀이 처음에는 그래프나 탐색형 문제로 생각했다. 그러나 이것은 방법도 난해했고, 시간 복잡도도 기본적으로 벡터 최대 크기가 1000 * 1000 인데, 그 안에서 또 정사각형인지 체크하는 방식도 최대 1000 * 1000 만큼 걸릴 수 있기에, 1000 * 1000 * 1000 * 1000으로 시간초과가 난다는 점이 문제였다. 이 문제는 dp 문제였다. 정사각형을 탐색할 때 나는 board에서 1을 찾으면 왼쪽 위의 1로 생각해서 밑으로 내려갈 생각을 했는데, 1을 왼쪽 위가 아닌 오른쪽 아래로 두고 계산을 하는 것이 방법이였다. 왜 dp 인가?? 그림을 그려서 확인해보면, (3, 2)의 1을 오른쪽 밑 꼭짓점으로 두는 정사각형 중 가장 큰 정사각형을 찾으려면, board[2 - 1][3], boa..

[프로그래머스 lv2] 큰 수 만들기 (c++)

문제 풀이 문제는 이해하기 쉽지만, 아이디어를 떠올리는 것이 굉장히 어려웠다. number 최대 길이는 1000000이기에 조합을 위해 dfs를 쓰거나 하면 시간 초과가 날 것이다. 그리디(greedy)한 , 즉 매 순간 최선의 결과를 반환하는 걸 고르는 방법을 통해 문제를 풀어야한다. 한 번 예제를 따라가면서 방법을 찾아보도록 하자. 위 그림은 0이 10개 있는게 아니라, 무작위 숫자가 10개 있는 걸 나타낸 그림이다. k는 4로 주어진 상태이다. 이 상태라면 우리는 10개의 숫자 중 총 4개의 숫자를 제거해서 최대의 숫자를 만들어야한다. 최대의 숫자는 당연하게도 자리수가 크거나, 앞자리 숫자가 제일 큰 숫자일 것이다. 여기서 자리수는 고정되니, 앞자리 숫자가 최대한 크도록 숫자를 골라야 할 것이다. ..

[프로그래머스 lv2] 소수 판별 (c++)

문제 풀이 numbers의 길이가 7 이하이니, 완전 탐색을 고려할 수 있다. numbers에서 몇 개 뽑아 나열해서 숫자를 만든다는 것은 순열을 떠올리게 만든다. numbers가 최대 7자이니 순열 공식 7 * 6 .. 2 * 1 = 2520인데, 만약 소수 판별 부분에서 2부터 나눠가는 방식을 사용한다면 어떻게 될까? 7자리면 숫자 크기가 1000000을 넘어갈 수 있는데, 이러면 2520 * 1000000 = 2520000000으로 시간 초과가 발생할 위험이 있다. 즉 소수를 구하는 식을 에라토스테네스 체를 이용해야한다. 순열을 구하는 방식은 재귀함수를 이용한 완전 탐색을 이용하거나, c++에서 제공하는 next_permutation이 있다. 코드 #include using namespace std..