Skip to content

HappyProcess/HappyProcess_BE

Repository files navigation

HappyProcess

가족 구성원 각자의 건강 상태와 거주 지역의 기상, 대기 환경을 결합하여 개인별 건강 위험도를 분석하고, 이를 알림과 리포트로 제공하는 백엔드 서비스입니다. 사용자는 가족 단위로 구성원을 등록하고 각 구성원의 질환 정보와 지역을 관리하며, 서비스는 지역별 기상, 대기 데이터를 바탕으로 구성원마다 맞춤형 건강 위험도를 산출합니다. 산출된 위험이 기준을 넘으면 알림을 발송하고, 축적된 데이터를 요약한 주간 리포트를 생성합니다. 이 외에 일상 기록과 커뮤니티 기능을 함께 제공합니다.

기술 스택

  • 언어 및 런타임: Java 17
  • 프레임워크: Spring Boot 4, Spring Web, Spring Validation
  • 데이터: Spring Data JPA, Hibernate, PostgreSQL
  • 인증 및 보안: Spring Security, JWT
  • 외부 연동: 공공데이터포털 기상 및 대기환경 API, Gemini, SOLAPI, Supabase Storage
  • 문서화: springdoc-openapi
  • 테스트: JUnit 5, Mockito, H2
  • 인프라 및 배포: Docker, GitHub Actions, GCP

설계 원칙

  • 도메인 기반 패키지 구조를 채택하여, 각 도메인이 controller, service, repository, entity, dto 계층을 자체적으로 소유하도록 구성했습니다. 공통 관심사는 global 패키지로 분리했습니다.
  • 계층별 책임을 엄격히 분리했습니다. 컨트롤러는 요청, 응답 처리에, 서비스는 비즈니스 로직과 트랜잭션 경계에, 리포지토리는 데이터 접근에만 관여하며, 엔티티는 API 경계 밖으로 노출하지 않고 DTO로 변환하여 전달합니다.
  • 도메인 간에는 상대 도메인의 서비스를 통해서만 협력하도록 하여 결합도를 낮추고, 순환 의존을 배제했습니다.
  • 테스트 주도 개발을 기본 개발 방식으로 삼아, 서비스와 도메인 규칙에 대해 외부 의존성을 Mock으로 분리한 단위 테스트를 우선 작성하고 경계와 예외 조건을 함께 검증했습니다.

핵심 기능 및 기술적 특징

규칙 기반 건강 위험도 분석 엔진

질환별 위험 판정 로직을 하나의 공통 인터페이스인 DiseaseRiskRule로 추상화하고, 고혈압, 당뇨, 심장질환, 뇌졸중, 천식, 비염, 관절염, 피부염, 안구건조, 꽃가루 알레르기, 햇빛 알레르기 등 질환마다 독립된 구현체로 분리했습니다. 각 규칙은 기상, 대기 지표를 입력받아 해당 질환의 위험 점수를 산출하며, 기상 지표별 점수 기준은 별도의 점수 테이블과 기준 객체로 분리하여 관리합니다. 이러한 전략 패턴을 통해, 새로운 질환이 추가되더라도 기존 로직을 수정하지 않고 규칙 구현체를 추가하는 것만으로 확장할 수 있도록 설계했습니다.

외부 데이터 연동

  • 공공데이터포털에서 제공하는 기상청 단기예보 조회 서비스, 한국환경공단 에어코리아 대기오염정보 조회 서비스, 기상청 보건기상지수 조회 서비스, 기상청 생활기상지수 조회 서비스로부터 단기예보, 대기오염, 꽃가루 농도 위험지수, 생활기상지수 데이터를 수집하여 위험도 분석의 입력으로 사용합니다.
  • 생성형 AI 모델인 Gemini를 활용하여 축적된 건강, 환경 데이터를 요약한 주간 리포트를 생성합니다.
  • 문자 발송에는 SOLAPI를 사용하며, 설정에 따라 실제 발송기와 Mock 발송기를 교체할 수 있도록 구성하여 로컬 및 테스트 환경에서는 실제 발송 없이 동작을 검증할 수 있도록 했습니다.
  • 이미지 저장은 Supabase Storage를 연동하여 처리합니다.

이벤트 기반 알림

알림 생성과 실제 발송을 애플리케이션 이벤트로 분리했습니다. 알림이 생성되면 이벤트가 발행되고, 이를 구독하는 리스너가 문자 발송을 수행하는 구조로, 알림 생성 로직이 발송 수단에 직접 의존하지 않도록 했습니다. 발송 이력과 알림 이력을 별도로 저장하여 추적할 수 있게 했으며, 예약 알림은 스케줄러를 통해 처리합니다.

인증 및 인가

Spring Security와 JWT 기반의 무상태 인증을 적용했습니다. 액세스 토큰과 리프레시 토큰을 분리하여 발급하고, 리프레시 토큰은 별도로 저장하여 재발급 및 로그아웃 시 검증에 활용합니다. 인증 필터에서 토큰을 검증하여 요청을 인가하며, 만료된 액세스 토큰은 재발급 절차를 통해 갱신합니다.

데이터 계층 최적화

지연 로딩 연관관계에서 발생하는 N+1 문제를 완화하기 위해 배치 페치 크기를 설정하여 연관 데이터를 IN 절로 묶어 조회하도록 했습니다. 운영 환경에서는 HikariCP 설정을 조정하여 외부 관리형 데이터베이스 환경에 맞게 동작하도록 구성했습니다.

API 문서화

springdoc-openapi를 적용하여 API 명세를 자동으로 문서화하고, 프런트엔드와의 연동 기준을 명확히 유지했습니다.

배포 및 운영

애플리케이션을 Docker로 컨테이너화하고, GitHub Actions로 빌드부터 이미지 배포, 서버 반영까지 이어지는 배포 파이프라인을 구성했습니다. 개발과 운영 환경 설정을 분리하여 환경별로 다른 구성을 적용하며, 민감한 값은 코드에 포함하지 않고 환경 변수 및 배포 시크릿으로 주입하도록 했습니다.

프로젝트 구조

src/main/java/com/haapyProcess
├── domain
│   ├── analysis        건강 위험도 분석 엔진 (rule, score, criteria)
│   ├── auth            인증, 회원가입, 로그인, 토큰 재발급
│   ├── member          회원 및 건강 상태
│   ├── family          가족 구성 및 구성원 관리
│   ├── healthcondition 질환 정보
│   ├── condition       건강 상태 기준
│   ├── location        지역 관리
│   ├── region          행정구역 데이터
│   ├── weather         기상, 대기 데이터 수집
│   ├── alert           알림 및 문자 발송
│   ├── report          주간 리포트
│   ├── diary           일상 기록
│   └── community       커뮤니티
└── global
    ├── security        보안 설정
    ├── jwt             JWT 필터 및 토큰 처리
    ├── gemini          생성형 AI 연동
    ├── sms             문자 발송 연동
    ├── config          공통 설정
    ├── exception       공통 예외 처리
    └── util            공통 유틸리티

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages