관리자 목록 화면

엔티티 메타데이터 선언을 읽어 검색, 정렬, 페이지 이동이 되는 관리자 목록을 표시합니다. 테이블 머리글에는 선언에 맞춘 정렬 옵션과 열 너비를 지정하고 엑셀 작업과 등록 버튼을 둡니다. 체크박스, 줄 번호, 오류 알림 배너가 기본으로 들어 있어 마크업을 따로 작성하지 않습니다. 백엔드 API와 상태 저장소가 이어져 있어 검색 조건을 바꾸거나 페이지를 이동할 때 목록을 갱신합니다.
Features

엔티티 메타데이터 선언을 읽어 검색, 정렬, 페이지 이동이 되는 관리자 목록을 표시합니다. 테이블 머리글에는 선언에 맞춘 정렬 옵션과 열 너비를 지정하고 엑셀 작업과 등록 버튼을 둡니다. 체크박스, 줄 번호, 오류 알림 배너가 기본으로 들어 있어 마크업을 따로 작성하지 않습니다. 백엔드 API와 상태 저장소가 이어져 있어 검색 조건을 바꾸거나 페이지를 이동할 때 목록을 갱신합니다.

관리자는 표에 보여 줄 열을 직접 골라 업무에 맞게 맞춤 화면을 짭니다. 엔티티에 선언된 필드 중에서 필요한 항목만 켜고 필요 없는 항목은 바로 숨깁니다. 업무에 맞춰 보고 싶은 필드 조합을 그때그때 바꾸어 같은 화면을 여러 용도로 씁니다. 바꾼 열 목록은 상태 저장소에 바로 들어가 화면을 다시 그리지 않고 표를 바꿉니다.

여러 필드 조건을 함께 걸어 많은 데이터 속에서 원하는 줄을 찾아내는 검색 창을 엽니다. 필터 가능으로 지정한 필드만 검색 칸에 나오며 포함, 일치, 범위 같은 연산자를 타입에 맞게 붙입니다. 통합 검색을 켜면 단어 하나로 지정한 여러 필드를 한꺼번에 찾는 OR 검색을 만듭니다. 입력한 조건들은 백엔드 검색 요청 규격으로 묶여 서버 검색 엔진으로 넘어갑니다.

엔티티 데이터를 엑셀 파일로 내려받거나 파일을 올려 데이터를 한꺼번에 넣고 고칩니다. 내려받을 때는 원하는 필드를 골라 필요한 열만 담긴 파일을 만듭니다. 올릴 때는 행마다 필수 값이 들었는지 확인해 보고 기존 데이터 수정과 새 데이터 추가 중 골라 넣습니다. 엔티티에 데이터 전송 설정을 켜면 복합 타입 제외와 글자 변환 규칙이 알맞게 들어맞습니다.

데이터 한 건을 넣고 고칠 수 있도록 그룹과 탭으로 나눈 입력 폼을 표시합니다. 필드 선언에 따라 필수 표시와 기본값을 지정하고 다른 엔티티는 팝업 창에서 찾아 연결합니다. 연결된 하위 목록은 폼 안에 작은 표로 넣어 부모 데이터와 함께 편집하고 저장합니다. 입력한 값은 스키마 검사를 거친 뒤 백엔드 등록과 수정 API로 안전하게 넘어갑니다.

엔티티 명세 하나만 선언하면 관리자 목록, 검색창, 입력 폼, 연관 선택창이 다 만들어집니다. 필드를 적을 때 필수 여부, 목록 노출, 정렬, 검색 조건, 엑셀 입출력 여부를 함께 적습니다. 문자열, 불리언, 다대일 연결, 긴 글 타입에 맞추어 알맞은 입력 부품이 자동으로 붙습니다. 하나의 스키마로 화면 겉모습과 백엔드 API 연동을 모두 돌려 중복 코드를 없앱니다.

기본 컨트롤러를 상속받고 엔티티와 DTO 레코드를 지정하면 표준 REST API가 만들어집니다. 개발자는 엔티티를 DTO로 바꾸는 메서드와 키 값을 꺼내는 코드만 짜면 됩니다. 값 검증은 DTO 레코드에 표준 어노테이션을 붙여 손을 덜 수 있습니다. 상속만으로 등록, 목록, 조건 검색, 건수, 단건 조회, 수정, 삭제 엔드포인트가 열립니다.

서버를 실행하면 컨트롤러 매핑을 바탕으로 OpenAPI 명세와 Swagger 문서가 열립니다. 기본 컨트롤러가 주는 등록, 검색, 수정, 삭제 엔드포인트와 요청 형식이 문서에 표시됩니다. 컨트롤러를 더 만들 때마다 문서도 함께 늘어나므로 명세를 따로 적을 필요가 없습니다. 프런트엔드 개발자는 이 화면에서 파라미터 규격을 보고 직접 호출해 볼 수 있습니다.

엔티티에 검색 마커를 붙이면 조건 조합 검색과 스키마 조회 API가 열립니다. 검색 요청은 필드 이름, 비교 조건, 검색값을 트리 구조로 묶어 AND와 OR을 섞어 씁니다. 같음, 다름, 포함, 크기 비교, 날짜, NULL 확인 등 스무 가지가 넘는 연산자를 갖추었습니다. 스키마 엔드포인트는 이 엔티티에서 쓸 수 있는 필드와 조건 목록을 클라이언트에 알려 줍니다.

아이디와 비밀번호를 살펴 액세스 토큰과 리프레시 토큰을 발급하고 세션을 관리합니다. 토큰을 다시 바꿀 때는 리프레시 토큰을 새것으로 바꾸고 로그아웃하면 쓰던 토큰을 버립니다. 로그인 주소에는 연속 요청을 막는 속도 제한 어노테이션과 멱등성 검사 필터가 붙습니다. TOTP 기반 다중 요소 인증 모듈을 붙여 로그인에 2단계 인증을 더할 수 있습니다.

고객사 데이터를 따로 나누어 담는 멀티테넌트 방식을 세 가지로 갖추었습니다. 구분 컬럼, 테넌트별 스키마, 별도 데이터베이스 방식 중에서 설정값으로 고릅니다. 스키마 방식은 요청마다 스키마 경로를 바꾸고 데이터베이스 방식은 테넌트마다 연결 풀을 둡니다. HTTP 요청에 든 테넌트 헤더를 읽어 처리하며 다른 고객사 데이터에 접근하지 못하게 막습니다.

여러 단계로 이어지는 업무 흐름을 단계별로 나누어 짜는 가벼운 워크플로 엔진입니다. 병렬 단계를 쓰면 여러 점검을 동시에 돌리고 하나라도 실패하면 전체를 멈춥니다. 뒤쪽 단계가 실패하면 사가 패턴에 따라 앞서 바꾼 내용을 거꾸로 되돌리는 보상 작업이 돕니다. 잠시 일어난 오류는 다시 시도하고 액추에이터 엔드포인트에서 진행 상태를 살펴봅니다.

엔티티에 감사 마커를 붙이면 데이터를 넣고 고친 기록이 리스너를 거쳐 저절로 저장됩니다. 처음 만든 일시와 만든 사람, 마지막에 고친 일시와 고친 사람 계정이 빠짐없이 적힙니다. 서비스 코드에서 날짜나 사람 이름을 직접 넣지 않아도 되므로 기록이 틀어지지 않습니다. 이렇게 남은 기록은 관리자 목록과 상세 폼에서 작성자와 수정 시각으로 바로 나옵니다.
데이터가 언제 어떻게 바뀌었는지를 폼 안에서 차례대로 봅니다.
데이터를 아주 지우지 않고 삭제 표시만 남기는 방식을 마커로 켭니다.
로컬 메모리와 Redis를 묶은 2단계 캐시를 엔티티마다 겁니다.
비즈니스 예외가 나면 RFC 7807 규격의 오류 응답으로 바꾸어 클라이언트에 일정한 형식으로 돌려줍니다.
탭과 입력 칸마다 필요한 권한을 적어 두고 권한이 없는 사람에게는 보이지 않게 숨깁니다.
우편번호 주소 검색, 파일 올리기, 이미지 미리보기, 날짜 선택기, 색상 입력 부품을 골라 씁니다.
검색 마커 어댑터와 Nori 형태소 분석기, 아웃박스 워커로 Elasticsearch 색인을 비동기로 바꿉니다.
이메일, SMS 문자, 카카오 알림톡, 앱 푸시 알림을 한 자리에서 보냅니다.
로컬 디스크와 S3 호환 스토리지를 SPI 플러그인 방식으로 갈아 끼워 씁니다.
웹 에디터 본문 그림과 첨부 파일 올리기, 정보 읽기, 보안 검사를 한 모듈에서 다룹니다.
Asciidoctor 기술 문서와 Postman 컬렉션, DB 스키마 문서를 빌드할 때 저절로 만듭니다.
스프링 HTTP 클라이언트에 서킷 브레이커와 재시도를 붙여 외부 서비스 장애가 번지지 않게 막습니다.
메시지를 DB에서 읽어 서버를 껐다 켜지 않고도 언어별 안내문과 검증 문구를 바꿉니다.
주민등록번호와 사업자등록번호 검사식, 전화번호와 우편번호 어노테이션, 공휴일 달력을 갖추었습니다.
소수점 계산 오차가 나지 않도록 금액, 비율, 부가세 전용 레코드 타입으로 계산합니다.
CSS 변수 토큰만 덮어써서 컴포넌트 코드를 손대지 않고 브랜드 색과 글꼴을 바꿉니다.
확장 포인트 인터페이스로 CRUD 로직 앞뒤에 추가 검사나 후속 작업을 끼워 넣습니다.
기능 플래그 인터페이스와 어노테이션으로 배포 없이도 기능을 켜고 끕니다.
MDC와 분산 추적 헤더를 JSON 로그에 남겨 요청 흐름을 처음부터 끝까지 따라갑니다.
Testcontainers로 실제 DB를 띄우고 계층별 슬라이스 테스트와 픽스처 생성을 함께 씁니다.
표준 웹 CRUD, 조회 전용 API, 보고서, 결재용의 네 가지 틀 중에서 골라 새 프로젝트를 시작합니다.
기술 스택
JDK 25 · Spring Boot 4.0.6 · Hibernate 7 · Gradle · PostgreSQL · React · TypeScript