전체 글

Dev/Spring

[Spring] 롤백된 트랜잭션에서 실패 로그만 남기는 법

1. 마이그레이션 도메인마이그레이션에 걸려 있는 요구사항은 네 가지다.첫째, 클라이언트가 보낸 학습 이력을 4개 테이블에 일괄 저장한다. (단어 진행도, 용어장 진행도, 북마크, 일일 진행도)둘째, 도중에 어느 한 부분이라도 실패하면 전체가 롤백되어야 한다.셋째, 마이그레이션 세션의 상태는 FAILED 로 기록되어야 한다. (그래야 클라이언트가 재시도 가능)넷째, 같은 사용자가 두 번 호출해도 안전해야 한다. (멱등성) 문제는 두 번째와 세 번째가 서로 부딪힌다는 점이다. 데이터는 롤백이면서 세션 상태는 커밋이기에 한 트랜잭션 안에서 양쪽을 동시에 만족시킬 수 없다. 이 충돌을 어떻게 풀었는지를 이 글에서 다루려고 한다. 2. 도메인 모델마이그레이션은 단발성 작업이 아니라 여러 HTTP 요청에 걸친 세..

Dev

[iOS] FCM vs UNUserNotificationCenter

역할 구분UNUserNotificationCenter — Apple 프레임워크iOS에서 알림을 실제로 표시하고 처리하는 주체로컬 알림 / 리모트 알림 모두 여기서 처리권한 요청, 알림 탭 핸들링, 뱃지 관리 등FCM (Firebase Cloud Messaging) — Google 인프라서버 → 기기로 푸시를 전달하는 인프라내부적으로는 APNs를 통해 iOS에 전달함토큰 관리, 멀티플랫폼(Android/iOS/Web) 통합, 토픽 구독 등즉, FCM을 써도 최종 수신/처리는 UNUserNotificationCenter 담당 실제 흐름 비교FCM 사용 시백엔드 → FCM 서버 → APNs → iOS (UNUserNotificationCenter) FCM 없이 APNs 직접 연동 시백엔드 → APNs → iO..

PS/Codetree

[Codetree] 민트 초코 우유 (Java)

주의할 점저녁 전파 순서 정렬할 때, {민트 -> 초코 -> 우유 -> 초코우유 -> 민트우유 -> 민트초코 -> 민트초코우유} 가 아니라 {{민트 초코, 우유} -> {민트초코, 민트우유, 초코우유} -> {민트초코우유}} 로 묶인다.방어 상태는 저녁이 지나자마자 바로 풀린다.방어 상태인 대표자는 전파를 할 수 없다. 정답 코드import java.util.*;import java.lang.*;import java.io.*;public class Main { static int N, T; static Student[][] board; static int[] dx = {-1, 1, 0, 0}; static int[] dy = {0, 0, -1, 1}; static class Student implem..

PS/Codetree

[Codetree] 마법의 숲 탐색 (Java)

주의할 점현재 위치(cx, cy)가 현재 이동 중인 정령의 탈출구이면서, 다음 위치(nx, ny)가 다른 정령의 골렘이어야 한다. 처음에는 탈출구 방향을 활용해서 계산하려다가 도저히 안 풀려서 그냥 각 정령 번호의 음숫값을 탈출구로 고정시켰다. 정답 코드import java.util.*;import java.lang.*;import java.io.*;public class Main { static int R, C, K; static int[][] board; static Fairy[] fairys; static int answer = 0; // 골렘의 출구 방향 정보 d는 0~3 사이의 수로 주어지며 각각 북 동 남 서 static int[] dx = {-1, 0, 1, 0}; static int[]..

PS/Codetree

[Codetree] 고대 문명 유적 탐사 (Java)

힘들었던 점...board 상태 관리가 너무 힘들었다.. 집중력이 떨어졌을 때 풀어서 더 힘들었다유물을 획득하고 새로운 보물로 채워줘야 하기 때문에 유물 획득 위치를 저장해야 한다조각 채우는 우선순위랑 3x3 선택 우선순위가 다르다..조각을 채운 후 유물 획득이 가능하면 유물을 획득할 수 없을 때까지 연쇄 획득으로 들어간다 (while 처리) 정답 코드import java.util.*;import java.lang.*;import java.io.*;public class Main { static int K, M; static int[][] board; static int totalValue = 0; static int valueIndex = 0; static int[] dx = {0, 1, 0, -1};..

PS/Codetree

[Codetree] 루돌프의 반란 (Java)

주의할 점루돌프가 산타에게 돌진했을 때랑, 산타가 루돌프에 돌진했을 때 발생한 충돌은 다르게 계산해야 한다. (C, D)루돌프는 상하좌우대각선으로 이동 가능하지만 산타는 상우하좌로만 이동 가능하다.기절 상태여도 충돌은 발생할 수 있으며, 산타가 루돌프를 들이박을 때는 이동 방향의 반대이니 주의해야 한다. 정답 코드import java.util.*;import java.lang.*;import java.io.*;public class Main { static int N, M, P, C, D; static int[][] board; static int rx, ry; static Santa[] santas; static int turn = 1; static class Santa { int number; ..

PS/Codetree

[Codetree] 왕실의 기사 대결 (Java)

주의할 점연쇄반응으로 인해 밀쳐진 기사들 중 한명이라도 벽에 부딪히거나, 범위를 벗어나는 경우 이 일련의 과정을 없던 일로 함. 즉, 이번 명령은 취소된다.기사의 체력이 0이 되면 죽게 되고, 이 경우 명령이 내려져도 수행할 수 없으니 주의해야 한다. 정답 코드import java.util.*;import java.lang.*;import java.io.*;public class Main { static int L, N, Q; static int[][] bombBoard; static int[][] warriorBoard; static Warrior[] warriors; static ArrayList bombs; static int[] dx = {-1, 0, 1, 0}; static int[] dy =..

PS/Codetree

[Codetree] 메이즈러너 (Java)

풀이처음에 정사각형을 만드는 기준이 난해해서 어떻게 해야할까 엄청 오래 고민했는데, N이 최대 10이라 변의 길이를 1씩 늘려가며 완전탐색 하였다. 만들어진 사각형 안에 출구와 플레이어가 있으면 바로 셀렉했다.그리고 이 문제 덕분에 이차원배열 회전의 상대좌표 기준을 제대로 이해했다.개인적인 견해지만 메두사 다음으로 어렵다.ㅜㅜ 정답 코드import java.util.*;import java.lang.*;import java.io.*;public class Main { static class Square implements Comparable { int leftX; int topY; int rightX; int bottomY; int size; boolean hasEscape; boolean..

띵동이
기록 기록 기록