분류 전체보기

1. 개요데이터를 실제 물리적으로 삭제하지 않고, 논리적 삭제(soft delete) 해야하는 상황이 자주 발생한다.이러한 상황에 대처하기 위해 JPA에서는 여러 soft delete 적용 방식이 사용된다. 각 방식들에 대해 장단점을 비교하고 어떤 상황에 어떤 방식으로 적용해야 좋은지 살펴보자 2. Soft Delete 방식2-1. 더티 체킹을 이용한 방식엔티티의 상태를 변경하여, 트랜잭션 종료 시점에 JPA의 더티 체킹에 의해 UPDATE 쿼리를 발생시키는 방법이다. 예제 @Table@Entity@Getterpublic class Review extends SoftDeleteBaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTIT..
1. 개요보통 횡단 관심사(로깅, 트랜잭션, 인증/인가 등)를 분리하기 위해 Spring AOP를 많이 사용한다. Spring AOP 방식 외에도 관심사를 분리하기 위해 Filter 또는 Interceptor를 사용하기도 한다. Filter와 Interceptor가 무엇인지 알아보고, 어떤 차이가 있는지 살펴보자. 2. 요청 처리 구조필터와 Interceptor를 알아보기 전에 일반적인 Spring Boot 서버는 클라이언트 요청을 어떻게 처리하는지 간략하게 짚고 넘어가자. 클라이언트가 요청을 보내면 어떻게 처리될까?클라이언트가 브라우저에서 요청을 보내면, 가장 뭔저 톰캣(WAS)이 이를 받는다. 톰캣은 웹 서버이자 서블릿 컨테이너로서 요청을 적절한 서블릿을 찾아 전달한다. 이때 Spring 컨테이너에 ..
· Algorithm
1. 문제https://www.acmicpc.net/problem/1238 2. 문제 설명이 문제는 N개 숫자로 구분된 각각의 마을이 존재하며, 각 마을에는 한 명의 학생이 살고있다.각 마을을 이어주는 시간이 T만큼 걸리는 단방향 도로가 존재한다.학생들은 파티를 위해 X마을로 모여서 파티하고 끝나며 다시 자기가 살던 마을로 돌아간다.이 때 각 학생들은 최단 시간을 통해서만 이동한다.여기서 가장 시간이 오래걸린 학생의 걸린 시간을 출력하는 문제이다. 이 문제는 다익스트라 알고리즘을 통해서 해결할 수 있다.다익스트라를 풀어본 적이 없다면, 아래 문제를 먼저 풀어보는 것을 추천한다.https://soonmin.tistory.com/179 [백준] 1753. 최단경로 - JAVA1. 문제https://www...
· Algorithm
1. 문제https://www.acmicpc.net/problem/1504 2. 풀이 과정무방향 그래프가 주어질 때 시작점(1)에서 도착점(N)으로 가는 최단 경로를 구하는 문제이다. 여기까지는 일반적인 최단 경로를 구해서 문제를 해결 할 수 있다. 하지만 이 문제는 조건이 있다. 시작점에서 출발해 반드시 v1, v2 지점을 통과한 뒤 도착점까지의 최단 경로를 구해야 한다. 문제 접근 방식v1, v2 지점을 통과하는 최단 경로를 구하기 위해 두가지 케이스를 고려해야 한다.1(시작점) -> v1 -> v2 -> N(도착점)1(시작점) -> v2 -> v1 -> N(도착점) 각각의 케이스에 따라 최단 경로를 구한 뒤, 둘 중에 더 작은 케이스의 결과를 출력해주면 된다. 만약, 두 케이스 모두 INF ..
· Algorithm
1. 문제https://www.acmicpc.net/problem/1753 2. 풀이 과정이 문제는 방향 그래프와 시작점 K가 주어진다. 시작점에서 출발해 다른 모든 정점까지의 최단 경로를 구하는 문제이다.경로가 존재하지 않으면 INF를 출력한다. 이 문제는 다익스트라(Dijkstra) 알고리즘을 활용하는 가장 기본적인 문제이다. 다익스트라 알고리즘가중치가 있는 그래프에서 하나의 시작점으로부터 다른 모든 정점가지의 최단 거리를 구하는 알고리즘이다.항상 현재까지 발견된 최단 경로 중 가장 짧은 경로부터 확정해 나가는 방식이다. 동작과정시작 노드의 최단 거리를 0으로 설정, 다른 모든 노드는 INF로 초기화방문하지 않은 노드 중 최단 거리가 가장 짧은 노드 선택그 노드를 거쳐서 다른 노드로 가는 비용을 계산..
· Algorithm
1. 문제https://www.acmicpc.net/problem/13460 2. 풀이 과정N x M 크기의 게임판이 주어지며, 각 영역은 빨간구슬(R), 파란구슬(B), 빈칸(.), 벽(#), 구멍(O)으로 구분된다.빨간구슬 파란구슬 각각 1개 씩 주어지며, 가장 바깥 행과 열이 벽으로 막혀있다.이 때, 게임판을 상,하,좌,우로 기울이며, 구슬은 벽을 만날 때까지 이동한다.게임판을 몇 번을 기울여야 빨간구슬을 구명(O)에 넣을 수 있는 지 횟수를 구하는 문제이다.단, 파란 구슬이 구멍에 들어가면 실패이고, 빨간구슬과 파란구슬이 동시에 구멍에 들어가도 실패이다.또한, 10회 이상 시도해도 실패이다.실패는 -1을 반환한다. 문제 접근어려운 문제였고, 이 문제는 BFS를 통해 최단 거리를 구하는 문제이다...
1. 개요Spring Boot로 페이지네이션 API를 구현할 때 보통, Pageable을 사용하여 간편하게 구현한다.Pageable을 컨트롤러의 메서드의 인자로 선언할 때, Spring MVC는 요청 파라미터를 자동으로 해석하여 Pageable 객체를 주입해준다. 어떤식으로 동작하는지 자세히 살펴보자.@RequiredArgsConstructor@RequestMapping("/v1/articles")@RestControllerpublic class ArticleController { @GetMapping public ResponseEntity>> getArticles( @PageableDefault(size = 10, sort = "createdAt", direction = S..
· Algorithm
1. 문제https://www.acmicpc.net/problem/14502 2. 풀이 과정이 문제는 N x M 크기의 맵이 주어지고, 각 영역은 빈 칸(0), 벽(1), 바이러스(2)로 구분된다.바이러스는 벽을 통과 못한다. 벽 3개를 추가로 설치할 수 있으며, 이 때 안전 영역의 최대 개수를 구하는 문제이다. N, M의 최대크기는 8인데 제한시간이 2초로 비교적 여유롭다. 문제 접근1. 3개의 벽을 치는 모든 케이스를 모두 구한다.DFS, 백트래킹을 통해 3개의 벽을 치는 모든 케이스를 구한다.각 케이스 마다 BFS를 통해 감염처리를 하고 안전영역의 개수를 구해서 최대값을 갱신한다.static void dfs(int depth) { if (depth == 3) { // 3개의 벽을 ..
· Algorithm
1. 문제https://www.acmicpc.net/problem/3190 2. 풀이 과정N x N이 BOARD가 주어졌을 때, 사과가 있는 영역(1)과 빈 영역(0)이 존재한다.뱀은 (0,0)에서 오른쪽 방향을 보면서 시작한다. 그리고 뱀은 주어진 시간마다 왼쪽(L) 또는 오른쪽(D)로 방향을 튼다.뱀은 자기가 바라보고 있는 방향으로 1초에 1칸 이동한다.사과가 있는 영역으로 이동: 사과를 먹고, 몸의 길이는 1만큼 늘어난다.빈 영역으로 이동: 몸의 길이는 늘어나지 않고 뱀이 이동만 한다.만약 이동할 영역이 벽이거나, 자신 몸이라면 종료된다.게임이 몇 초에 끝내는 지 계산하는 문제이다. 처음에는 DFS로 접근했었다.. DFS로 푸니깐 도저히 뱀이 길이가 늘어나는 성질이 구현이 안되서 다른 풀이 방법으로..
· Algorithm
1. 문제https://www.acmicpc.net/problem/2178 2. 풀이 과정(1, 1)에서 시작해서 (N, M)에 도달하기 위한 최단거리를 구하는 문제이다.각 영역은 0 또는 1인데, 0으로 이동할 수 없다. 처음에는 이 문제를 DFS로 접근했었다. 하지만 시간초과가 발생하는 것이었다. DFS 접근 방법의 문제DFS는 모든 경로를 끝까지 탐색하면서, MIN 값을 갱신해야 한다.최단경로를 보장하지 않으므로 모든 경우의 수를 전부 확인해야 한다.그래서 시간초과가 발생하는 것이었다. 문제 접근이 문제는 BFS로 접근해야 효율적으로 풀 수 있다.BFS는 같은 깊이의 노드부터 순차적으로 탐색한다. 이동거리를 누적하면 결국 N, M에 도달하는 시점이 최단거리가 된다. 1. 큐에 시작점 (0, 0)을 ..
kmindev
'분류 전체보기' 카테고리의 글 목록