반응형

전체 글 126

벽돌깨기 — 하강하는 벽돌과 패들 반사각

오프라인 인디팩 · 개발일지벽돌깨기 — 하강하는 벽돌과 패들 반사각2026-06-08 · v1.0 · 아케이드 / 물리요약 — 고전 벽돌깨기에 시간이 지나면 벽돌이 한 줄씩 내려오는 압박 요소를 더했다. 패들의 어디에 맞았는지에 따라 반사각이 달라지고, 벽돌을 깰 때마다 공이 조금씩 빨라진다.패들 위치 기반 반사각패들 정중앙에 맞으면 수직으로, 끝쪽에 맞을수록 최대 ±60도까지 각도가 꺾인다. hitPos를 -1~1로 정규화해서 각도에 매핑하는 방식이라 조작감이 직관적이다.final hitPos = ((ballX - paddleX) / (paddleWidth / 2)).clamp(-1.0, 1.0);final angle = -pi / 2 + hitPos * (pi / 3); // 최대 ±60°ba..

네트워크 이미지 로딩 컴포넌트 — 용도별 프리셋으로 캐싱 정책 나누기

실무 프로젝트 · 개발일지 네트워크 이미지 로딩 컴포넌트 — 용도별 프리셋으로 캐싱 정책 나누기 Flutter · extended_image 요약 — ExtendedImage 위에 프로필/썸네일/상세보기 등 용도별 프리셋을 얹은 공통 이미지 컴포넌트. gubn(구분값) 문자열 하나로 여러 렌더링 모드를 스위칭한다. 1. gubn 파라미터로 5가지 렌더링 모드 스위칭 프로필 원형 이미지, 박스형 썸네일, 상세보기(핀치 줌 가능), 목록용 이미지 등 화면마다 요구사항이 다르다. 이 컴포넌트는 gubn 문자열 하나로 어떤 모드로 그릴지 정하고, 각 모드는 캐시 정책과 클리핑 방식만 다를 뿐 로딩/에러 상태 처리는 공통 패턴을 재사용한다. Widget build(BuildCont..

Flutter & Dart 2026.09.30

전역 예외 처리 — 커스텀 예외 하나당 응답 코드 하나씩 매핑하기

실무 프로젝트 · 개발일지 전역 예외 처리 — 커스텀 예외 하나당 응답 코드 하나씩 매핑하기 Spring Boot · @ControllerAdvice 요약 — 토큰 오류, 결제 오류, 세금계산서 오류 등 도메인별 커스텀 예외를 각각 정의하고, @ControllerAdvice 한 곳에서 예외 타입만 보고 알맞은 에러 코드/메시지로 변환해 응답한다. 1. 예외 타입 = 에러 코드 결정자 TokenValidationException, PopbillValidationException 같은 커스텀 예외를 만들어두고, @ExceptionHandler(value = X.class)로 각각 잡아서 미리 정의된 코드(CommonResponse.TOKENERROR 등)로 응답을 통일한다. 컨..

SpringBoot (JAVA) 2026.09.29

두들 점프 — 자동 점프와 플랫폼 하강 판정

오프라인 인디팩 · 개발일지두들 점프 — 자동 점프와 플랫폼 하강 판정2026-05-29 · v1.0 · 아케이드 / 무한 스크롤요약 — 캐릭터가 자동으로 계속 튀어 오르고, 사용자는 좌우로만 조작해 발판을 밟게 유도한다. 발판 충돌은 "하강 중일 때만, 이번 프레임에 막 발판을 지났는지"로 판정해 위에서 뚫고 올라가는 걸 막는다.이전 프레임과 비교하는 발판 통과 판정단순히 "발이 발판 y 근처에 있으면 착지"로 판정하면 빠르게 떨어질 때 발판을 통과해버리는 터널링이 생긴다. 그래서 이전 프레임의 발 위치와 현재 프레임 위치를 비교해서 "이번 프레임에 발판 표면을 막 지났는지"를 확인한다.final prevFeetY = feetY - charVy * dt;if (prevFeetY = p.y) { ..

한 위젯으로 여러 종류의 TabBar 그리기 — enum 기반 분기 구조

실무 프로젝트 · 개발일지 한 위젯으로 여러 종류의 TabBar 그리기 — enum 기반 분기 구조 Flutter · TabBar 요약 — 화면마다 탭 개수와 라벨이 제각각인 TabBar를 매번 새로 만들지 않고, enum 하나로 어떤 화면의 탭바인지 구분해서 공통 위젯 하나가 전부 그리도록 만들었다. 1. enum + switch로 12가지 TabBar를 한 클래스에서 탭바 스타일(색상, 인디케이터, 폰트)은 거의 동일하지만 탭 개수와 문구만 화면마다 다르다. tabbar_type enum 값을 생성자로 받아서 build() 안의 switch문이 알맞은 메서드를 호출하는 구조라, 새 화면의 탭바가 필요하면 enum 값 하나와 메서드 하나만 추가하면 된다. enum tab..

Flutter & Dart 2026.09.28

PortOne 본인인증 연동 — 액세스 토큰은 매번 새로 받는다

실무 프로젝트 · 개발일지 PortOne 본인인증 연동 — 액세스 토큰은 매번 새로 받는다 Spring Boot · PortOne(아임포트) REST API 요약 — 클라이언트가 SDK로 받은 imp_uid를 그대로 신뢰하지 않고, 서버가 직접 PortOne REST API에 access_token을 발급받아 그 인증 건을 재조회해서 검증하는 흐름. 1. 가맹점 키는 DB에서, 토큰은 매 요청마다 imp_key/imp_secret을 코드에 박아두지 않고 저장 프로시저로 조회한다. 이 값으로 api.iamport.kr/users/getToken을 호출해 액세스 토큰을 매번 새로 받는데, 토큰을 캐싱하지 않는 대신 구현이 단순해지고 만료로 인한 실패 케이스를 아예 없앤다. M..

SpringBoot (JAVA) 2026.09.27

체커 — 강제 캡처와 점프 체인 구현

오프라인 인디팩 · 개발일지체커 — 강제 캡처와 점프 체인 구현2026-05-22 · v1.0 · 보드게임 / AI 알고리즘요약 — 서양 체커의 핵심 규칙인 강제 캡처(잡을 수 있으면 반드시 잡아야 함)와 연속 점프 체인을 구현했다. AI는 난이도별로 랜덤/그리디/미니맥스 3단계로 나뉜다.강제 캡처: 합법수 필터링legalMoves()는 먼저 모든 캡처 가능한 수를 모으고, 하나라도 있으면 일반 이동수는 버리고 캡처만 반환한다. 이게 체커 규칙의 핵심이라 이 한 줄이 게임 전체의 전략성을 만든다.List legalMoves() { final captures = []; final normals = []; // ...모든 내 말에 대해 _movesFor 호출... return captures...

역할별 화면 분기 — 하나의 App 위젯에서 고객/파트너 탭 구성 바꾸기

실무 프로젝트 · 개발일지 역할별 화면 분기 — 하나의 App 위젯에서 고객/파트너 탭 구성 바꾸기 Flutter · GetX · IndexedStack 요약 — 고객용과 파트너(기사)용을 완전히 분리된 앱으로 만들지 않고, 로그인한 사용자의 권한값 하나로 같은 App 위젯 안에서 IndexedStack의 탭 구성 자체를 바꾸는 구조로 리팩토링한 사례. 1. 권한값 하나로 탭 구성 자체를 교체 초기에는 고객용 App과 파트너용 PartApp을 아예 별도 위젯 트리로 분리했었지만(주석 처리된 옛 코드가 남아있다), 지금은 로그인 시 내려받은 권한 플래그(LogInOut.userAuthReturn().value)를 기준으로 같은 IndexedStack 안의 마지막 탭 위젯 자체..

Flutter & Dart 2026.09.26

Spring WebSocket 채팅방 — roomId로 세션을 그룹핑하는 가장 단순한 방법

실무 프로젝트 · 개발일지 Spring WebSocket 채팅방 — roomId로 세션을 그룹핑하는 가장 단순한 방법 Spring Boot · WebSocket 요약 — 채팅방마다 별도 서버 인스턴스 없이, roomId를 키로 하는 Map> 하나로 방 단위 브로드캐스트를 구현한다. 연결/해제 시점에 이 맵만 관리하면 된다. 1. URL 경로에서 roomId를 뽑아 세션을 그룹핑 핸들러는 WebSocketHandlerRegistry에 /chat/{roomId} 패턴으로 등록되고, 세션이 연결되는 순간 URI 마지막 세그먼트를 방 ID로 파싱해서 chatRooms 맵에 추가한다. 별도의 방 생성 API 없이 URL만 다르면 자동으로 새 방이 만들어지는 구조다. private ..

SpringBoot (JAVA) 2026.09.25

블록 1010 — 도형 풀(pool)과 동시 라인 클리어

오프라인 인디팩 · 개발일지블록 1010 — 도형 풀(pool)과 동시 라인 클리어2026-06-12 · v1.0 · 퍼즐 게임 / 그리드요약 — 10×10 보드에 3개의 블록을 배치해 가로/세로 줄을 채우면 사라지는 퍼즐. 도형은 미리 정의된 풀(pool)에서 뽑고, 한 번의 배치로 여러 줄이 동시에 사라지면 콤보 보너스를 준다.도형을 좌표 목록으로 정의각 블록 모양은 상대 좌표 리스트로 정의한다. 1×1, 2×2, 3×3 정사각형부터 L자, ㄱ자 모양까지 BlockShape(cells, colorIndex) 하나로 표현되고, rows/cols는 좌표에서 자동 계산된다.list.add(BlockShape([[0, 0], [1, 0], [1, 1]], 4)); // L자list.add(BlockS..

반응형