케어링 플랫폼 백엔드 서비스 - 현대적이고 확장 가능한 케어 서비스 플랫폼
- 👤 사용자 관리: 회원가입, 로그인, 프로필 관리
- 🏥 기관 관리: 케어 기관 등록 및 정보 관리
- 📋 케어 서비스: 케어 요청, 매칭, 관리 시스템
- 🤖 AI 추천: FastAPI 기반 임베딩 벡터를 활용한 기관 추천
- 🔒 인증/인가: JWT 기반 보안 시스템
- 📊 모니터링: 시스템 상태 및 성능 모니터링
- Language: Java 17
- Framework: Spring Boot 3.5.5
- Database: PostgreSQL
- ORM: Spring Data JPA
- AI Integration: FastAPI + Sentence-Transformers + ChromaDB
- Documentation: Swagger/OpenAPI 3
- Build: Gradle
- Containerization: Docker
- Cloud: AWS (ECR, EC2, RDS)
graph TB
A[GitHub Actions] -->|Push Image| B[AWS ECR]
B -->|Deploy| C[AWS EC2]
C -->|Connect| D[AWS RDS PostgreSQL]
subgraph "EC2 Instance"
C1[Docker Container]
C2[Spring Boot App]
end
C --> C1
C1 --> C2
develop 브랜치 PR merge → main 브랜치 push → GitHub Actions → Docker Build → ECR Push → EC2 Deploy
- 🔀 코드 병합:
develop→main브랜치로 PR 승인 후 병합 - 🤖 자동화: GitHub Actions 워크플로 트리거
- 🏗️ 빌드: Docker 이미지 빌드 (멀티스테이지)
- 📦 배포: AWS ECR로 이미지 푸시
- 🚀 실행: EC2에서 새 컨테이너 배포
- 운영 DB: AWS RDS PostgreSQL
- 개발 DB: 로컬 PostgreSQL
main (운영)
├── develop (개발)
│ ├── feature/기능명-#이슈번호
│ ├── bugfix/버그명-#이슈번호
│ └── hotfix/긴급수정명-#이슈번호
└── release/버전명
먼저 GitHub에서 이슈를 생성합니다.
예시:
제목: [FEAT] ERD 기반 엔티티 코드화
내용: User, Institution, Care 엔티티를 ERD 기반으로 구현
라벨: 🚀 enhancement
생성된 이슈의 번호를 확인합니다. (예: #6)
이슈 번호를 포함한 브랜치를 생성합니다.
# 이슈 #6에 대한 브랜치 생성
git checkout develop
git pull origin develop
git checkout -b feature/ERD-기반-엔티티-코드화-#6| 브랜치 타입 | 네이밍 형식 | 예시 |
|---|---|---|
| 기능 개발 | feature/기능명-#이슈번호 |
feature/erd-기발-엔티티-코드화-#12 |
| 버그 수정 | bugfix/버그명-#이슈번호 |
bugfix/로그인-인증-버그수정-#24 |
| 긴급 수정 | hotfix/수정명-#이슈번호 |
hotfix/security-patch-#35 |
| 릴리즈 | release/버전 |
release/v1.0.0 |
/**
* 👤 사용자 서비스
*
* 사용자 관련 비즈니스 로직을 처리합니다.
*
* @author caring-team
* @since 1.0.0
*/
@Service
public class UserService {
/**
* 🔍 사용자 ID로 조회
*
* @param userId 사용자 ID
* @return 사용자 정보
* @throws UserNotFoundException 사용자를 찾을 수 없는 경우
*/
public User findById(Long userId) {
// 구현 내용
}
}src/main/java/com/caring/caringbackend/
├── 📱 api/ # API 계층
│ ├── controller/ # 컨트롤러
│ ├── dto/ # 데이터 전송 객체
│ │ ├── request/ # 요청 DTO
│ │ └── response/ # 응답 DTO
│ └── mapper/ # 엔티티-DTO 매퍼
├── 🏢 domain/ # 도메인 계층
│ ├── member/ # 사용자 도메인
│ │ ├── entity/ # 엔티티
│ │ ├── repository/ # 레포지토리
│ │ ├── service/ # 서비스
│ │ └── dto/ # 도메인 DTO
│ ├── institution/ # 기관 도메인
│ ├── care/ # 케어 도메인
│ └── notification/ # 알림 도메인
├── 🌐 global/ # 글로벌 설정
│ ├── config/ # 설정 클래스
│ │ ├── jpa/ # JPA 설정
│ │ ├── security/ # 보안 설정
│ │ ├── swagger/ # API 문서 설정
│ │ └── web/ # 웹 설정
│ ├── exception/ # 예외 처리
│ ├── model/ # 공통 모델
│ ├── response/ # 공통 응답
│ └── util/ # 유틸리티
└── 🧪 CaringBackendApplication.java
[타입] 간단한 설명 (#이슈번호)
예시:
[FEAT] 사용자 로그인 기능 구현 (#123)
[BUG] 회원가입 시 이메일 중복 검증 오류 (#124)
[DOCS] API 문서 업데이트 (#125)
🚀 enhancement: 새로운 기능🐛 bug: 버그 수정📚 documentation: 문서 작업🔧 maintenance: 유지보수🚨 critical: 긴급 수정
1. 이슈 생성
[FEAT] ERD 기반 엔티티 코드화 #6
2. 브랜치 생성
git checkout develop
git pull origin develop
git checkout -b feature/ERD-기반-엔티티-코드화-#6
3. 작업 및 커밋
git commit -m "feat: User 엔티티 구현 #6"
git commit -m "feat: Institution 엔티티 구현 #6"
4. PR 생성
제목: [FEAT] ERD 기반 엔티티 코드화 #6
5. 코드 리뷰 및 병합
- 클래스: PascalCase (
UserService,OrderController) - 메서드/변수: camelCase (
findUser,userName) - 상수: UPPER_SNAKE_CASE (
MAX_RETRY_COUNT) - 패키지: lowercase (
com.caring.caringbackend.domain.member)
// ✅ 좋은 예
public User findUserById(Long id)
public void createUser(CreateUserRequest request)
public boolean isEmailDuplicated(String email)
// ❌ 나쁜 예
public User getUser(Long id)
public void makeUser(CreateUserRequest request)
public boolean checkEmail(String email)## 🎯 작업 내용
- [ ] 구현한 기능 1
- [ ] 구현한 기능 2
## 🧪 테스트
- [ ] 단위 테스트 작성
- [ ] 통합 테스트 확인
## 📸 스크린샷 (필요시)
## 📝 특이사항- 필수: 최소 1명의 리뷰어 승인
- 권장: 2명의 리뷰어 승인 (중요 기능)
- 빌드: 빌드 성공 확인
spring:
application:
name: caring
profiles:
active: dev
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
path: /swagger-ui.htmlspring:
datasource:
url: ${DATASOURCE_URL}
username: ${DATABASE_USERNAME}
password: ${DATABASE_PASSWORD}
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
logging:
level:
com.caring.caringbackend: DEBUGspring:
datasource:
url: ${DATASOURCE_URL}
username: ${DATASOURCE_USERNAME}
password: ${DATASOURCE_PASSWORD}
jpa:
hibernate:
ddl-auto: update
show-sql: false
logging:
level:
com.caring.caringbackend: INFO| 변수명 | 설명 | 예시 |
|---|---|---|
DATASOURCE_URL |
데이터베이스 URL | jdbc:postgresql://rds-endpoint:5432/caring |
DATASOURCE_USERNAME |
DB 사용자명 | caring_user |
DATASOURCE_PASSWORD |
DB 비밀번호 | secure_password |
JWT_SECRET |
JWT 서명 키 | your-secret-key |
KAKAO_API_KEY |
Kakao Map API 키 | your-kakao-api-key |
기관 등록 시 주소를 위도/경도로 자동 변환하기 위해 Kakao Map API를 사용합니다.
- Kakao Developers 접속
- 애플리케이션 생성
- REST API 키 복사
- 플랫폼 설정 → Web 플랫폼 추가 (도메인 등록)
개발 환경 (로컬)
# .env 파일 또는 환경변수
export KAKAO_API_KEY=your-kakao-rest-api-key운영 환경 (EC2)
# EC2 인스턴스에서 환경변수 설정
sudo vi /etc/environment
# 또는 Docker 실행 시 -e 옵션 사용
docker run -e KAKAO_API_KEY=your-kakao-rest-api-key ...application.yml
kakao:
api:
key: ${KAKAO_API_KEY:dummy-key} # 환경변수로 주입@Service
@RequiredArgsConstructor
public class InstitutionService {
private final GeocodingService geocodingService;
public void registerInstitution(InstitutionCreateRequestDto dto) {
// 주소 생성
Address address = Address.builder()
.city(dto.getCity())
.street(dto.getStreet())
.zipCode(dto.getZipCode())
.build();
// 주소 → 위도/경도 자동 변환
GeoPoint location = geocodingService.convertAddressToGeoPoint(address);
// Institution 저장 (위도/경도 포함)
// ...
}
}요청 주소: 서울시 강남구 테헤란로 123
변환 결과:
{
"latitude": 37.5012345,
"longitude": 127.0398765
}- API 호출 제한: Kakao Map API는 무료 플랜 기준 일일 300,000건 제한
- 에러 처리: API 호출 실패 시에도 기관 등록은 진행 (location = null)
- 로깅: Geocoding 성공/실패 여부가 로그에 기록됨
- Java 17+
- Docker & Docker Compose
- PostgreSQL 13+
- 개발 환경: http://localhost:8080/swagger-ui/index.html
- 운영 환경: http://43.203.41.246:8080/swagger-ui/index.html
- 이슈 생성 및 할당
- 브랜치 생성 (
feature/기능명) - 코드 작성 및 테스트
- PR 생성 (템플릿 활용)
- 코드 리뷰 및 승인
- 메인 브랜치 병합
- 🐛 버그 리포트: GitHub Issues
- 💡 기능 제안: GitHub Discussions
- 📧 일반 문의: [email protected]
Made with ❤️ by Caring Team