분류 전체보기 193

99클럽 코테 스터디 1일차 TIL: [프로그래머스] 베스트앨범

https://school.programmers.co.kr/learn/courses/30/lessons/42579 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr정렬 조건에 주의해야 하며, 그 외로는 해시를 사용하여 단순히 구현만 하면 되는 문제이다. 그런데 이렇게도 생각하고 저렇게도 생각해야 해서 간단한듯 좀 지저분하게 코드를 짠 거 같다.. 좀 더 효율적으로 풀 수 있는 방법이 생각나면 수정해야겠다. 그리고 항상 동적으로 배열 길이가 정해질 때, List에 값을 먼저 채운 후 list.size() 만큼의 크기의 배열을 선언하여 리스트 값을 배열로 옮기는 작..

CS/Algorism 2024.05.20

멀티 스레드 환경에서 @Transactional을 사용할 때 주의할 점

이 글에서 소개하는 내용은 동시성 환경을 테스트하기 위한 테스트 코드를 작성하던 중에 만난 문제이다. 문제우선 다음과 같이 동시성 환경을 테스트하기 위한 테스트 코드를 작성했다. 게시글인 post 엔티티를 save() 한 후10개의 스레드에서 해당 엔티티를 조회해와서 좋아요를 등록한다.@Transactional@SpringBootTestclass PostServiceTest { @Autowired private PostService postService; @Autowired private PostRepository postRepository; @Test @DisplayName("좋아요 등록 성공-한 사람이 동시에 여러번 좋아요를 눌러도 중복 저장되지 않아야 한다.") void ..

Trouble Shooting 2024.05.20

테스트 코드에서 @Transactional이 적용되지 않는 문제

상황 설명ScheduleService에 대한 테스트 코드를 작성하던 중에 다음 에러가 발생했다. Exception in thread "pool-5-thread-6" org.springframework.dao.InvalidDataAccessApiUsageException: Query requires transaction be in progress, but no transaction is known to be in progressCaused by: jakarta.persistence.TransactionRequiredException: Query requires transaction be in progress, but no transaction is known to be in progress찾아보니 트랜잭션..

Trouble Shooting 2024.05.14

캐싱을 통한 인기글 조회 API 성능 개선

인기글 선별프로젝트에서 구현한 기능 중 인기글 조회 기능이 있다. 그런데 인기글 조회 API는 자주 호출된다는 특징이 있으므로, 캐싱을 적용해봤다.  인기글에 대한 캐싱을 적용하기 전에, 우선 인기글은 어떻게 정의할까? 인기글은 한시간 동안 조회수가 가장 많은 10개의 게시글이다. 그리고 인기글을 선별하기 위해 레디스를 사용했는데, 그 방식은 다음과 같다.게시글 조회시 조회수를 레디스에 반영한다.이때 레디스에 저장되는 데이터 형식은 다음과 같다.key: 날짜와 시간이 String 형태로 저장된다.value: 한시간 동안 조회된 게시글 id들이 sortes set 형태로 저장된다. 이때 정렬 기준은 조회수이다.다음 사진을 예로 들면, key는 "2024-05-09T16:00"가 되고, 그 값은 게시글 id..

카테고리 없음 2024.05.09

RabbitMQ

메시지 브로커가 필요한 이유RabbitMQ는 AMQP(Advanced Message Queuing Protocol)라는 표준 프로토콜을 사용하는 메시지 브로커로, 송신자로부터 전달받은 메시지를 수신자로 전달해주는 중간 역할을 한다. 즉, 메시지 큐를 관리하고 애플리케이션 간에 메시지를 송수신할 수 있게 해준다. 그런데 이러한 메시지 브로커가 필요한 이유가 뭘까? 즉, 애플리케이션 간에 직접적인 통신이 아니라, 굳이 중간에 메시지 브로커를 두는 이유가 뭘까?비동기 처리를 통해 애플리케이션 간 결합도를 낮출 수 있다. 만약 메시지 브로커를 사용하지 않고 송신 측과 수신 측이 직접적으로 통신한다면 어떻게 될까? 동기적 통신의 경우, 송신 측은 수신 측에게 작업을 요청하고 요청에 대한 응답이 돌아올 때까지 블로..

Backend/RabbitMQ 2024.05.02

깃허브 액션, 도커, EC2, RDS를 통해 배포하기

도커를 처음 사용해보며 3일 간 많이 헤맸지만 그만큼 많이 배운 거 같다. 다음에 같은 실수를 반복하지 않기 위해 이번에 도커를 사용한 과정을 기록하고자 한다.배포 과정1. RDS 생성, EC2 서버 구축 및 설정우선 AWS의 RDS와 EC2를 생성해야 한다.  그리고 EC2 서버에 도커 컨테이너를 통해 자바 프로그램을 실행시킬 것이기 때문에 EC2 서버에 도커를 설치해야 한다. ssh를 통해 EC2 서버에 접속한 다음, 이 블로그를 따라 서버에 도커를 설치하면 된다. 설치 후에는 docker --version을 통해 설치된 도커 버전을 확인할 수 있다. 이어서 자바 프로그램 외에도 redis도 도커 컨테이너로 띄워야 하므로, docker pull redis 명령어를 통해 redis 이미지를 pull 받..

Backend/Docker 2024.04.26

도커(Docker) 사용하기

도커를 통해 프로젝트 구동시키기1. 서버에 Docker 설치하기다음 블로그 (https://everydayyy.tistory.com/121)를 따라 서버에 Docker를 설치하면 된다.2. 이미지 생성하기도커에는 스프링부트 프로젝트, MySQL, Redis가 각각 컨테이너로 생성되어야 한다. 그리고 컨테이너를 실행시키기 위해서는 도커 이미지가 필요하다.2-1. 스프링부트 프로젝트 이미지 생성우선 스프링부트 프로젝트를 기반으로 도커 이미지를 생성해보자. 이를 위해서는 프로젝트 내에 도커 파일을 생성해줘야 한다. 도커 파일은 도커가 이해할 수 있는 설정 파일로, 도커 이미지를 만드는데 필요한 정보를 담고 있다. 따라서 어떤 자바를 사용할 것인지, 어떤 jar 파일을 사용할 것인지 등을 설정해줘야 한다. 내가..

Backend/Docker 2024.04.24

[백준] 2240. 자두나무

https://www.acmicpc.net/problem/2240 2240번: 자두나무 자두는 자두를 좋아한다. 그래서 집에 자두나무를 심어두고, 여기서 열리는 자두를 먹고는 한다. 하지만 자두는 키가 작아서 자두를 따먹지는 못하고, 자두가 떨어질 때까지 기다린 다음에 떨어 www.acmicpc.net 이 문제는 처음에 봤을 때는 풀이를 봐도 이해를 못했다가 다음 날 다시 차근차근 생각해보니 스스로 풀 수 있었던 문제이다. 역시 dp는 i = 0부터 하나씩 생각하면서 dp 배열을 채워나가다 보면 규칙을 발견하게 되는 거 같다. 1초일 때, 2초일 때, ... w초일 때까지의 최대로 획득한 자두 개수를 구해야 한다. 그런데 몇 번 움직였는지에 따라 경우가 나뉘므로 dp 배열은 2차원 배열로, dp[][] ..

CS/Algorism 2024.04.22

[백준] 11562. 백양로 브레이크

https://www.acmicpc.net/problem/11562 11562번: 백양로 브레이크 서울 소재 Y모 대학교에서 대규모 공사를 진행하면서, 학교가 마치 미로처럼 변해버리고 말았다. 공사 이전까지는 어떤 건물에서 출발하더라도 다른 모든 건물로 갈 수 있는 길이 있었으나, 공 www.acmicpc.net 플로이드 워셜 알고리즘을 통해 간단한 풀이가 나오는 문제이다. 그런데 나는 플로이드는 알았지만 알고리즘을 적절하게 사용하는 아이디어를 떠올리지 못해서 못 푼 문제이다. 양방향으로 바꿔야 하는 길의 수를 찾아야 한다. 따라서 양방향으로 바꿔줄 필요가 없으면, 길을 1번 건너든 2번 건너든 같다. 즉, start 노드와 end 노드가 양방향 길을 가졌으면, dist[start][end] = 0, ..

CS/Algorism 2024.04.21

[백준] 1600. 말이 되고픈 원숭이

https://www.acmicpc.net/problem/1600 1600번: 말이 되고픈 원숭이 첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있 www.acmicpc.net 도착점에 도착하는 최소 시간을 구하면 되므로 bfs를 사용하면 된다. 말의 움직임으로 움직일 수도 있고, 상하좌우로 움직일 수도 있다. 따라서 하나의 노드에 최소 시간으로 도착하는 경로는 여러 개일 수 있다. 예를 들어 (0, 0)에서 (1, 1)로 이동한다고 가정했을 때, 다음과 같이 2가지 방법으로 최소 시간으로 도착할 수 있다. 상하좌우로만 움직였을 때: 2의 시간이 걸린다..

CS/Algorism 2024.04.18