반응형

전체 글 115

JWT 토큰 발급과 검증 — 일반 토큰과 리프레시 토큰을 다르게 설계하기

실무 프로젝트 · 개발일지 JWT 토큰 발급과 검증 — 일반 토큰과 리프레시 토큰을 다르게 설계하기 Spring Boot · jjwt 요약 — 로그인 시 발급하는 일반 토큰은 유효기간 하루, 리프레시 토큰은 30년으로 설계해서 "로그인 유지" 여부에 따라 발급 메서드만 다르게 호출한다. 1. 두 개의 발급 메서드, 같은 서명 키 generateToken()은 만료를 하루 뒤로, refreshToken()은 30년 뒤로 잡는다. 같은 비밀 키(Keys.secretKeyFor(SignatureAlgorithm.HS256))로 서명하기 때문에 검증 로직은 하나로 공유할 수 있다. public String generateToken(String username) { Calen..

커넥트4 — 4방향 승리 판정과 중앙 가중 AI

오프라인 인디팩 · 개발일지커넥트4 — 4방향 승리 판정과 중앙 가중 AI2026-05-22 · v1.0 · 보드게임 / AI 알고리즘요약 — 7×6 보드에서 가로/세로/대각선 4개를 먼저 연결하면 승리. AI는 난이도별로 랜덤, 즉시승리/방어 우선 그리디, 미니맥스 3단계로 구성했다.한 지점에서 4방향으로 뻗어나가며 승리 검사돌을 놓은 직후 그 위치에서만 4개 방향(가로/세로/대각선 2개)으로 검사하면 충분하다. 양쪽으로 뻗어가며 같은 색이 몇 개 이어지는지 세고, 4개 이상이면 승리.final line = [[r, c]];int rr = r + dr, cc = c + dc;while (inBounds && b[rr][cc] == color) { line.add([rr, cc]); rr += ..

[Flutter] WebSocket으로 실시간 채팅 화면 구현하기 — 재연결과 메시지 스트림 처리

실무 프로젝트 · 개발일지 WebSocket으로 실시간 채팅 화면 구현하기 — 재연결과 메시지 스트림 처리 Flutter · GetX · web_socket_channel 요약 — GetX 컨트롤러 안에서 WebSocketChannel을 직접 다루면서, 연결이 끊겼을 때 자동으로 재연결하고 실시간으로 들어오는 메시지를 화면에 반영하는 패턴을 정리합니다. 1. 소켓 연결 초기화 — 중복 연결 방지 채팅방에 입장할 때마다 새 IOWebSocketChannel을 만들면 이전 연결이 좀비로 남을 수 있습니다. 그래서 연결을 새로 맺기 전에 채널이 비어있거나 이미 닫힌 상태(closeCode != null)인지 먼저 확인하는 가드를 둡니다. 방 식별자는 URL 경로에 그대로 실어 보..

Flutter & Dart 2026.09.22

컬러 스위치 — 회전하는 띠와 색 일치 판정

오프라인 인디팩 · 개발일지컬러 스위치 — 회전하는 띠와 색 일치 판정2026-06-08 · v1.0 · 아케이드 / 물리요약 — 공이 자유낙하하며 회전하는 4색 띠를 통과해야 하는 게임. 공의 색과 통과하려는 띠 segment의 색이 일치해야 살아남고, 중간에 색 변환기를 먹으면 다른 색으로 바뀐다.회전 각도를 세그먼트 인덱스로 변환띠는 4색 segment로 나뉘어 있고 계속 회전한다. 공이 부딪히는 순간의 상대 X 위치를 0~1 값으로 정규화한 뒤 4분할해서 segment 인덱스를 구하고, 회전 각도를 90도 단위 정수 이동으로 해석해서 실제 어떤 색인지 계산한다.final segIdx = (t * 4).floor().clamp(0, 3);final rotIdx = (b.angle / (pi ..

에임 트레이너 — 시간 게이지와 원형 히트 판정

오프라인 인디팩 · 개발일지 에임 트레이너 — 시간 게이지와 원형 히트 판정 2026-05-29 · v1.0 · 반응속도 / 미니게임 요약 — 30초 동안 무작위로 뜨는 원형 타겟을 빠르게 명중시키는 에임 트레이너. 타겟 판정은 거리 제곱 비교로, 화면 크기가 바뀌어도 항상 안전한 범위에 스폰되도록 마진을 계산한다. 원형 히트 판정 — sqrt 없이 거리 비교 탭 좌표가 타겟 안에 있는지 확인할 때 실제 거리를 구하려고 sqrt를 쓸 필요가 없다. 거리의 제곱과 반지름의 제곱을 비교하면 같은 결과를 더 싸게 얻는다. bool tryHit(double x, double y) { final dx = x - t.x; final dy = y - t.y; if (dx ..

플래피 버드 — 원-사각형 충돌과 통과 판정

오프라인 인디팩 · 개발일지 플래피 버드 — 원-사각형 충돌과 통과 판정 2026-06-08  ·  v1.0  ·  아케이드 / 물리 요약 — 탭으로 날갯짓해 파이프 사이를 통과하는 클래식. 새는 원, 파이프는 사각형이라 원-사각형 충돌 함수 하나로 상단/하단 파이프를 모두 검사한다. 원-사각형 충돌: 가장 가까운 점 찾기 원의 중심에서 사각형까지의 최단 거리를 구하는 표준적인 방법. 사각형 범위로 원 중심 좌표를 clamp하면 "사각형 위의 가장 가까운 점"이 나오고, 그 점과의 거리가 반지름보다 작으면 충돌이다. final closestX = cx.clamp(rect.left, rect.right);final closestY = cy..

2048 타일 병합 애니메이션과 이동 로직

오프라인 인디팩 · 개발일지 2048 타일 병합 애니메이션과 이동 로직 2026-06-08 · v1.0.10 · 퍼즐 게임 / 애니메이션 요약 — 타일마다 고유 id를 부여해 슬라이드 애니메이션을 자연스럽게 만들고, 이동을 "위치 계산(planMove)"과 "실제 병합 적용(applyMerges)" 두 단계로 분리했다. 같은 턴에 타일이 두 번 합쳐지는 고전적인 2048 버그도 Set으로 막았다. 타일에 고유 ID가 필요한 이유 4×4 격자를 2차원 배열로만 표현하면 이동할 때마다 위젯 트리가 통째로 재구성돼서 슬라이드 애니메이션이 끊긴다. 그래서 Tile마다 증가하는 id를 부여하고, 이 id를 AnimatedPositioned의 key로 써서 Flutter가 "같..

지뢰찾기 첫 클릭 안전 보장과 코드(Chord) 클릭 구현

오프라인 인디팩 · 개발일지 지뢰찾기 첫 클릭 안전 보장과 코드(Chord) 클릭 구현 2026-06-08 · v1.0.8 · 로직 게임 / 알고리즘 요약 — 첫 클릭이 항상 안전하도록 지뢰를 클릭 이후에 배치하고, 스택 기반 flood fill로 빈 칸을 한 번에 열었다. 데스크탑판 지뢰찾기의 코드(chord) 클릭까지 구현해 완성도를 높였다. 첫 클릭 후에 지뢰를 배치한다 보드를 만들자마자 지뢰를 심으면 첫 클릭에서 바로 지뢰를 밟는 불운이 생길 수 있다. firstClick 플래그로 첫 번째 reveal() 호출을 감지하고, 그 시점에 클릭한 좌표와 3×3 반경을 피해서 지뢰를 배치한다. void reveal(int r, int c) { if (firstCl..

수박게임 물리 엔진 직접 구현하기

오프라인 인디팩 · 개발일지 수박게임 물리 엔진 직접 구현하기 2026-06-12 · v1.0.9 · 물리 시뮬레이션 / 캐주얼 요약 — Box2D 같은 외부 물리 엔진 없이 중력, 감쇠, 원형 충돌, 회전을 직접 구현해서 수박게임 특유의 "굴러가는 느낌"을 만들었다. 서브스텝(sub-step) 적분으로 빠르게 떨어지는 과일이 서로를 뚫고 지나가는 터널링 현상도 막았다. 과일 등급 = enum + 반지름/색상 매핑 체리(반지름 12)부터 수박(반지름 100)까지 11단계를 enum 하나로 표현한다. next getter로 "이 과일 다음 단계가 뭔지"까지 enum 안에서 바로 조회한다. enum Fruit { cherry, strawberry, grape, ora..

[Flutter] Flutter로 체스 AI 만들기

오프라인 인디팩 · 개발일지 Flutter로 체스 AI 만들기 — 미니맥스 + 알파베타 가지치기 2026-06-02 · v1.0.12 · 보드게임 / AI 알고리즘 요약 — 캐슬링, 앙파상, 폰 프로모션, 체크/체크메이트/스테일메이트를 모두 구현한 표준 체스 + 미니맥스(알파베타 가지치기)로 3단계 난이도 AI. 탐색 깊이와 평가 함수 차이로 easy/medium/hard를 구분한다. 기물 표현 방식 8×8 int 배열로 보드를 표현한다. 부호로 진영을 구분 — 양수 = 백(플레이어), 음수 = 흑(AI). 값의 절댓값이 기물 종류다. class ChessPiece { static const int empty = 0; static const int pawn ..

반응형