반응형

전체 글 130

MyBatis Mapper로 저장 프로시저 호출하기 — 비즈니스 로직을 DB에 둔 이유

실무 프로젝트 · 개발일지 MyBatis Mapper로 저장 프로시저 호출하기 — 비즈니스 로직을 DB에 둔 이유 Spring Boot · MyBatis 요약 — 복잡한 쿼리 로직 상당수를 저장 프로시저로 두고, Java 계층은 @Mapper 인터페이스로 프로시저를 호출하는 아주 얇은 래퍼 역할만 한다. 1. @Select 애노테이션 하나로 프로시저 실행 MyBatis의 XML 매퍼 파일 없이, 인터페이스 메서드에 @Select("exec SP_xxx #{param}")만 붙이면 파라미터 바인딩까지 자동 처리된다. 반환 타입은 대부분 List>로 통일해서, 프로시저 결과 컬럼이 바뀌어도 Java 쪽 DTO를 매번 수정할 필요가 없다. @Mapper@Repositorypub..

SpringBoot (JAVA) 2026.10.03

공룡 러너 — 무한 장애물 생성과 하드코어 히트박스

오프라인 인디팩 · 개발일지공룡 러너 — 무한 장애물 생성과 하드코어 히트박스2026-06-08 · v1.0 · 아케이드 / 무한 러너요약 — 크롬 오프라인 게임을 오마주한 무한 러너. 거리에 비례해 속도가 계속 빨라지고, 점수가 일정 이상 넘어가면 새 장애물(새)이 등장한다. 히트박스는 그래픽보다 살짝 작게 잡아 억울한 충돌을 줄였다.거리 기반 스폰과 난이도 곡선장애물은 고정 간격이 아니라 "다음 스폰 거리"를 매번 무작위로 갱신하는 방식이다. 최소 간격은 현재 속도에 비례해서 늘어나기 때문에, 빨라질수록 장애물 사이 여유가 자동으로 조정된다.if (distance > _nextSpawnDistance) { _spawnObstacle(); final minGap = 280.0 + 80 * (..

본인인증 SDK 연동 — 서버에서 키를 받아오는 이유

실무 프로젝트 · 개발일지 본인인증 SDK 연동 — 서버에서 키를 받아오는 이유 Flutter · iamport_flutter 요약 — 회원가입 시 휴대폰 본인인증을 아임포트(PortOne) SDK로 처리한다. 인증 완료 콜백에서 결과를 그대로 믿지 않고, 서버에 다시 조회해서 검증한 뒤에야 다음 화면(가입 정보 입력)으로 넘어간다. 1. 가맹점 시크릿은 클라이언트에 두지 않는다 아임포트 인증 토큰을 발급받으려면 imp_key/imp_secret이 필요한데, 이 값을 앱에 하드코딩하지 않고 자체 API에서 매번 조회해온다. 클라이언트 코드에는 공개 식별자인 userCode만 남는다. var getKeyUrl = '${ApiAdress.getApiAdress()}v1/SP_..

Flutter & Dart 2026.10.02

FCM 푸시 — 일반 사용자와 파트너를 별도 Firebase 프로젝트로 분리하기

실무 프로젝트 · 개발일지 FCM 푸시 — 일반 사용자와 파트너를 별도 Firebase 프로젝트로 분리하기 Spring Boot · Firebase Admin SDK 요약 — 앱이 두 개(고객용/파트너용)라 Firebase 프로젝트도 둘로 나눠서 관리하고, 서버에서는 FirebaseApp 인스턴스를 이름으로 구분해 알맞은 프로젝트로 메시지를 보낸다. 1. 이름을 가진 FirebaseApp 인스턴스 2개 FirebaseApp.getInstance("이름")으로 이미 초기화된 인스턴스가 있으면 재사용하고, 없으면(IllegalStateException) 서비스 계정 키 파일로 새로 초기화한다. 일반 사용자용과 파트너용이 각각 별도 이름의 인스턴스로 관리되기 때문에 서로 다른 F..

SpringBoot (JAVA) 2026.10.01

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

오프라인 인디팩 · 개발일지벽돌깨기 — 하강하는 벽돌과 패들 반사각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
반응형