반응형

전체 글 122

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

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

Flutter & Dart 10:00:50

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..

예약 캘린더 컨트롤러 — 휴무일 필터링과 지난 시간 제외

실무 프로젝트 · 개발일지 예약 캘린더 컨트롤러 — 휴무일 필터링과 지난 시간 제외 Flutter · GetX · TableCalendar 요약 — 파트너(기사)별 예약 가능 시간을 보여주는 캘린더 화면. 요일 단위 휴무일 설정과 이미 지난 시간대 필터링을 컨트롤러 레벨에서 처리해서, 화면(위젯)은 필터링된 결과만 그대로 그리면 되게 만들었다. 1. 휴무 요일을 숫자 코드에서 DateTime.weekday로 변환 서버는 휴무 요일을 "0,3,6" 같은 콤마 구분 문자열로 내려준다(0=일요일 관례). 이걸 그대로 비교하지 않고, 앱 시작 시 한 번 DateTime.weekday 상수 배열로 변환해둔 뒤 캘린더가 각 날짜를 그릴 때마다 이 배열만 조회한다. Future res..

Flutter & Dart 2026.09.24

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

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

SpringBoot (JAVA) 2026.09.23

커넥트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
반응형