[백준] 서울 지하철 2호선
·
코딩테스트 연습/백준
문제서울 지하철 2호선은 다음과 같이 생겼다.지하철 2호선에는 51개의 역이 있고, 역과 역 사이를 연결하는 구간이 51개 있다. 즉, 정점이 51개이고, 양방향 간선이 51개인 그래프로 나타낼 수 있다. 2호선은 순환선 1개와 2개의 지선으로 이루어져 있다. 한 역에서 출발해서 계속 가면 다시 출발한 역으로 돌아올 수 있는 노선을 순환선이라고 한다. 지선은 순환선에 속하는 한 역에서 시작하는 트리 형태의 노선이다.두 역(정점) 사이의 거리는 지나야 하는 구간(간선)의 개수이다. 역 A와 순환선 사이의 거리는 A와 순환선에 속하는 역 사이의 거리 중 최솟값이다.지하철 2호선과 같은 형태의 노선도가 주어졌을 때, 각 역과 순환선 사이의 거리를 구해보자. 입력첫째 줄에 역의 개수 N(3 ≤ N ≤ 3,000..
[Redis] 분산 락을 이용한 동시성 처리
·
Back-End/Redis
들어가며 팝업 스토어 정보 조회 및 예약하는 서비스인 Poppy! 프로젝트를 진행하면서, 예약 처리에 대한 고민이 생겼다. 분산 서버를 통해 예약을 구성하기 때문에 DB나 Redis를 이용해서 Lock을 걸어야 하는 상황이었다. 동시성 처리를 위해 Redis를 사용하게 되었는데, 이 과정을 포스트로 작성하려고 한다. 데이터베이스의 Lock 종류우선 데이터베이스의 Lock 종류를 알아보자. DB Lock에는 비관적 락과 낙관적 락이 있다. Pessimistic Lock (비관적 락) 비관적 락은 트랜잭션이 시작될 때 다른 트랜잭션이 해당 데이터를 읽거나 수정하지 못하도록 미리 Lock하는 방식으로, 해당 Lock의 과정은 다음과 같다.예약을 시도할 때, 해당 시간대 데이터를 조회하면서 동시에 Lock다른 ..
[AWS EC2] EC2 볼륨 할당하기
·
Back-End/DevOps
들어가며 AWS에서 제공하는 EC2에서 설정 시 기본으로 설정하면 볼륨이 8GB로 할당된다. SpringBoot 프로젝트를 실행하기에는 용량이 부족한 관계로, CI/CD를 이용해 Docker로 실행하려 했던 프로젝트가 실행이 안 되는 문제가 있었다. 문제 상황 리눅스 명령어인 df를 통해 디스크 사용량을 확인했더니 94%로, 이미 상당히 차지하고 있었다. 디스크 확인 명령어 (하단 클릭)더보기리눅스 디스크 확인 명령어df [옵션]df -a: 모든 파일 시스템을 대상으로 디스크 사용량 확인df -k: 디스크 사용량 KB 단위로 출력df -m: 디스크 사용량 MB 단위로 출력df -h: 디스크 사용량 알기 쉬운 단위로 출력df -t 파일시스템 종류: 지정한 파일 시스템 종류에 해당하는 디스크의 사용량 출력d..
[Spring Boot] 인기 공연 순위 알고리즘 구현
·
Back-End/Spring Boot
들어가며 2024년 7월 말부터 10월 초까지 약 3개월 간 진행했던 프로젝트에 대해 정리할 만한 내용을 블로그에 기재하기로 했다. 프로젝트명은 InConcert로, 공연 소식을 확인하고 동행을 구하는 서비스이다. 크게 정리할 내용은 다음과 같다.쿼리 최적화공연 정보 스크래핑 (비동기 처리)인기 공연 순위 알고리즘 ➡️ 이번 게시글 주제!이 글에서는 인기 공연 순위 알고리즘에 대해 설명하려고 한다.  배경이전 글인 스크래핑 처리 과정을 보면 메인 페이지의 인기 공연을 Play DB에서 얻어온다는 것을 확인할 수 있다. 프로젝트를 진행하면서 공연의 순위를 판단하는 것이 Play DB에 100% 의존하고 있다고 생각했고, 우리 애플리케이션인 InConert만의 순위를 매겨보자고 생각하게 됐다.  순위 알고..
[백준] 정수 삼각형
·
코딩테스트 연습/백준
문제 7 3 8 8 1 0 2 7 4 44 5 2 6 5위 그림은 크기가 5인 정수 삼각형의 한 모습이다.맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다. 입력첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. 출력첫째 줄에 합이 최..
[Spring Boot] Spring AOP
·
Back-End/Spring Boot
들어가기 전에 InConcert 프로젝트를 진행하면서 스크래핑 시간을 측정할 때, 메소드 안에서 실행 시간을 측정하는 것이 과연 올바른지 생각하게 되었다. 비즈니스 로직과 공통 로직을 분리하고 싶었고, 이를 AOP를 적용해서 코드를 수정하기로 하였다. 이전의 코드는 이 게시물에서 확인할 수 있다.  AOP? AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍으로, 기존의 OOP(객체 지향 프로그래밍)을 보완하는 확장 형태로 사용하고 있다. '관심의 분리'를 통해 핵심 관점(비즈니스 로직)과 횡단 관점(트랜잭션, 로그 등)을 분리하고자 하는 목적을 가지고 있다. AOP의 용어는 다음과 같다.📌 AOP 용어JoinPoint: 어플리케이션을 실행할 때 특정 작업이 실행되는 시점..
[Spring Boot] 스크래핑 비동기 처리
·
Back-End/Spring Boot
들어가며 2024년 7월 말부터 10월 초까지 약 3개월 간 진행했던 프로젝트에 대해 정리할 만한 내용을 블로그에 기재하기로 했다. 프로젝트명은 InConcert로, 공연 소식을 확인하고 동행을 구하는 서비스이다. 크게 정리할 내용은 다음과 같다.쿼리 최적화공연 정보 스크래핑 (비동기 처리) ➡️ 이번 게시글 주제!인기 공연 순위 알고리즘이 글에서는 스크래핑 비동기 처리 과정에 대해 설명하려고 한다.  페이지 구성메인 페이지를 보면 '오늘의 인기 공연'란을 확인할 수 있다. Play DB에서 Selenium을 통해 공연 정보를 스크래핑한 것이다. 문제 상황스크래핑 과정에서 발생했던 문제는 동기 처리로 스크래핑을 진행하다 보니 시간이 오래 걸린다는 점이었다. 동기 처리로 실행한 코드를 살펴보자. 스크래..
[Spring Boot] N+1 문제
·
Back-End/Spring Boot
들어가기 전에 엔티티를 작성할 때 연관된 다른 테이블을 필드에 작성하는 경우가 있다. 한 테이블이 외래키를 갖는 경우 @ManyToOne을 통해 매핑하게 되는데, 여기서 우리는 FetchType을 설정하게 된다. 로딩 방식에는 Lazy Loading과 Eager Loading이 있다. 이 둘에 대해 알아보고 관련해서 나타나는 N+1 문제를 살펴보자.  Lazy Loading & Eager LoadingLazy Loading Lazy Loading은 지연 로딩이라고 하며, 연관된 엔티티를 실제로 접근할 때 불러오는 방식이다. 데이터베이스에서 엔티티를 가져올 때 로드하지 않고 해당 필드에 처음 접근할 때 쿼리가 발생한다. 초기 로드 시 필요한 데이터만 가져오므로 메모리 사용량이 줄어드는 이점이 있다. 하지만..
[Spring Boot] JPA 쿼리 최적화
·
Back-End/Spring Boot
들어가며 2024년 7월 말부터 10월 초까지 약 3개월 간 진행했던 프로젝트에 대해 정리할 만한 내용을 블로그에 기재하기로 했다. 프로젝트명은 InConcert로, 공연 소식을 확인하고 동행을 구하는 서비스이다. 크게 정리할 내용은 다음과 같다.쿼리 최적화 ➡️ 이번 게시글 주제!공연 정보 스크래핑 (비동기 처리)인기 공연 순위 알고리즘이 글에서는 쿼리 최적화 과정에 대해 설명하려고 한다. 페이지 구성우선 메인 페이지를 살펴보면 카테고리 별로 게시물을 출력하고, 상단에는 인기 공연을 보여주고 있다.  문제 상황메인 페이지를 조회했을 때 글을 불러오면서 화면상에 보이는 게시물뿐만 아니라 전체 게시물을 불러오는 문제가 있어 html의 코드를 수정하였다.공연 정보를 스크래핑하는 경우를 고려한다면 게시물이 ..
[백준] -2진수
·
코딩테스트 연습/백준
문제-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다.10진법의 수를 입력 받아서 -2진수를 출력하는 프로그램을 작성하시오. 입력첫 줄에 10진법으로 표현된 수 N이 주어진다. 출력-2진법 수를 출력한다. 제한-2,000,000,000 ≤ N ≤ 2,000,000,000풀이import java.io.*;public class Main { public static void main(String[] args) throws IO..