Skip to content

jja6312/LuckyWeeky_server

Repository files navigation

🗓LuckyWeeky: 음성을 통한 AI 일정 계획 캘린더 서비스


luckyweekylogo2 screenshot

삼성 청년 소프트웨어 아카데미 12기
개발기간 : 3주 (2024.11.04 ~ 11.26)


배포주소

https://luckyweeky.store


팀 소개

정지안 [PL] 우성문

jja

wsm

@jja6312

@tjdansw

FE, Infra, BE (AI 일정등록/음성 일정등록), APM

BE (서블릿 환경 구축/로그인/회원가입/일정 CRUD)


프로젝트 소개

음성 혹은 텍스트를 통해 할 일을 입력하면, 주간 계획을 AI로 제안받는 서비스입니다.

기존 캘린더 서비스에서 사용자는 특정 목표 달성을 위해 단계별 일정을 직접 고민하고 수동으로 입력해야 한다는 번거로움이 있었습니다.
LuckyWeeky생성형 AI음성 인식 기능을 결합하여 개인화된 주간 일정을 빠르게 추천함으로써,
사용자의 시간을 절약하고 음성 명령으로 편리하게 계획을 등록할 수 있도록 지원합니다.

주안점

  • 스프링의 소스코드를 확인해보며, 개발시 대다수의 기능을 사용하지 않는다는 사실에서 성능에 대한 의문을 가졌음. 이에 웹 서칭을 진행했고, Servlet을 사용하면 4~6배의 성능 이점을 가질수 있다는 InfoQ 사이트의 비교 표를 근거로 Servlet을 사용하기로 결정했습니다.
  • 3주 간 프로젝트를 진행하며 새로 배운 기술 : Docker, Terraform, Prometheus, Grafana, AWS ECS Fargate, https통신, AWS NAT, 다중AZ를 통한 로드밸런싱 등 필요 기술을 적극적으로 학습 및 적용

시작 가이드

환경

  • JDK 17+
  • Jakarta EE 10
  • Tomcat 10.1+
  • MySQL 8.x
  • Node.js 16+ (프론트엔드용)

설치

설치 전 주의사항: AWS 계정, Naver Cloud Platform 계정, OpenAI 계정이 필요합니다.

# 1. 프로젝트 클론 및 빌드
$ git clone https://github.com/jja6312/LuckyWeeky_server.git
$ cd LuckyWeeky_server
$ mvn clean package

# 2. Tomcat 배포
$ cp target/ROOT.war /path/to/tomcat/webapps/
$ /path/to/tomcat/bin/startup.sh  # 톰캣 실행

# 3. MySQL DB 설정
CREATE DATABASE luckyweeky CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- (1) 사용자 테이블
CREATE TABLE user (
    user_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    oauth_provider VARCHAR(50),
    oauth_id VARCHAR(255),
    birth_date DATE,
    profile_image_key VARCHAR(255),
    last_login_at DATETIME,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- (2) 사용자 토큰 테이블
CREATE TABLE usertoken (
    user_id BIGINT PRIMARY KEY,
    token VARCHAR(1000) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);

-- (3) 사용자 솔트 테이블
CREATE TABLE usersalt (
    user_id BIGINT PRIMARY KEY,
    salt VARCHAR(255) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);

-- (4) 메인 일정 테이블
CREATE TABLE mainschedule (
    main_schedule_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    title VARCHAR(255) NOT NULL,
    start_time DATETIME NOT NULL,
    end_time DATETIME NOT NULL,
    color CHAR(7),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);

-- (5) 서브 일정 테이블
CREATE TABLE subschedule (
    sub_schedule_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    main_schedule_id BIGINT NOT NULL,
    title VARCHAR(255) NOT NULL,
    description TEXT,
    start_time DATETIME,
    end_time DATETIME,
    is_completed TINYINT(1) DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (main_schedule_id) REFERENCES mainschedule(main_schedule_id) ON DELETE CASCADE
);

# 4. src/main/webapp/WEB-INF/local-secrets.json 파일 생성 및 환경 변수 적용
{
  "AWS_ACCESS_KEY": "YOUR_AWS_ACCESS_KEY",
  "AWS_SECRET_KEY": "YOUR_AWS_SECRET_KEY",
  "BUCKET_NAME": "YOUR_S3_BUCKET_NAME",
  "DB_URL": "jdbc:mysql://localhost:3306/luckyweekydb",
  "DB_USERNAME": "root",
  "DB_PASSWORD": "1234",
  "MACHINE_ID": "1",
  "OPENAI_API_KEY": "YOUR_OPENAI_API_KEY",
  "GPT_API_ENDPOINT": "https://api.openai.com/v1/chat/completions",
  "CLOVA_API_URL": "https://naveropenapi.apigw.ntruss.com/recog/v1/stt",
  "CLOVA_ACCESS_KEY": "YOUR_CLOVA_ACCESS_KEY",
  "CLOVA_SECRET_KEY": "YOUR_CLOVA_SECRET_KEY",
  "SECREATKEY": "pdFfOvKx3mEmfhkZcTWd5WNCaHxeInRK"
}

기술 스택🐈

Category Technologies
FE React Badge TailwindCSS Badge Zustand Badge
BE Servlet Badge MyBatis Badge Docker Badge Tomcat Badge
DB MySQL Badge
Infra AWS Badge Terraform Badge
APM Prometheus Badge Grafana Badge JMeter Badge

화면 구성 📺

대표 이미지

대표이미지

기능명 이미지 기능명 이미지
1. 로그인 0로그인 2. 회원가입 1회원가입
3. 메인화면 2메인화면 4. 일정생성 3_1일정생성
5. 일정조회 3_2일정조회 6. 일정수정 3_3일정수정png
7. AI 일정생성 4_1AI일정생성 8. AI 완료 4_2AI일정생성완료
9. AI 수정 4_3AI일정수정 10. 재요청 4_4AI일정재요청
11. 재요청 완료 4_5AI일정재요청완료

주요 기능 📦

⭐️ AI 기반 일정 생성

  • 음성 또는 텍스트로 목표를 입력하면, AI가 구체적이고 전문적인 일정을 제안합니다.
  • 제안 받은 AI 일정에 대해 보완할 부분을 텍스트로 재요청하거나, 반영할 수 있습니다.

아키텍처

클라우드 아키텍처 ☁

real

UML: 유스케이스 다이어그램

usecase drawio

UML: 시퀀스 다이어그램

기능명 이미지 기능명 이미지
1. 로그인 1로그인 2. 회원가입 5회원가입
3. 일정등록 3일반일정등록 4. AI 일정등록 2AI일정등록
5. 일정 수정 삭제 4일정수정삭제

UML: 플로우 차트

FlowChart

ERD

erd


디렉토리 구조

LuckyWeeky_server/
├── Dockerfile                 # Docker 설정 파일
├── ecs-task-definition.json   # AWS ECS 태스크 정의 파일
├── pom.xml                    # Maven 프로젝트 설정 파일
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── io/ssafy/luckyweeky/
│   │   │       ├── common/            # 공통 모듈 (DispatcherServlet, 필터, 유틸리티)
│   │   │       │   ├── DispatcherServlet.java   # 커스텀 DispatcherServlet
│   │   │       │   ├── filter/
│   │   │       │   │   ├── AuthFilter.java      # 인증 필터
│   │   │       │   │   ├── CORSFilter.java      # CORS 처리 필터
│   │   │       │   │   └── JwtAuthenticationFilter.java # JWT 인증 필터
│   │   │       │   ├── config/
│   │   │       │   │   ├── XmlBeanFactory.java  # XML 기반 Bean 관리
│   │   │       │   │   └── XmlParser.java       # XML 파싱 유틸리티
│   │   │       │   └── util/
│   │   │       │       ├── OpenCrypt.java       # 암호화 유틸리티
│   │   │       │       └── RequestJsonParser.java # JSON 요청 파서
│   │   │       ├── schedule/          # 일정 관리 모듈
│   │   │       │   ├── application/   # 서비스, DTO
│   │   │       │   │   ├── dto/
│   │   │       │   │   │   ├── ScheduleDto.java # 일정 DTO
│   │   │       │   │   │   └── SubScheduleDto.java # 서브 일정 DTO
│   │   │       │   │   └── service/
│   │   │       │   │       └── ScheduleService.java # 일정 관련 서비스
│   │   │       │   ├── domain/        # 엔티티, 레포지토리
│   │   │       │   │   ├── model/
│   │   │       │   │   │   ├── MainScheduleEntity.java # 메인 일정 엔티티
│   │   │       │   │   │   └── SubScheduleEntity.java  # 서브 일정 엔티티
│   │   │       │   │   └── repository/
│   │   │       │   │       └── MainScheduleMapper.java # MyBatis 매퍼
│   │   │       │   └── presentation/
│   │   │       │       └── ScheduleController.java # 일정 관련 API 컨트롤러
│   │   │       ├── user/              # 사용자 관리 모듈
│   │   │       │   ├── application/
│   │   │       │   │   └── service/
│   │   │       │   │       └── UserService.java # 사용자 서비스
│   │   │       │   ├── domain/
│   │   │       │   │   ├── model/
│   │   │       │   │   │   └── UserEntity.java  # 사용자 엔티티
│   │   │       │   │   └── repository/
│   │   │       │   │       └── UserMapper.java  # 사용자 MyBatis 매퍼
│   │   │       │   └── presentation/
│   │   │       │       └── UserController.java  # 사용자 API 컨트롤러
│   │   │       ├── scheduleAi/        # AI 기반 일정 추천 모듈
│   │   │       │   ├── application/
│   │   │       │   │   ├── dto/
│   │   │       │   │   │   └── CreateAiScheduleRequestDTO.java # AI 일정 요청 DTO
│   │   │       │   │   └── service/
│   │   │       │   │       ├── ChatgptService.java   # ChatGPT 서비스
│   │   │       │   │       └── ScheduleAiService.java # AI 일정 추천 서비스
│   │   │       │   └── presentation/
│   │   │       │       └── ScheduleAiController.java # AI 일정 추천 API 컨트롤러
│   │   └── resources/
│   │       ├── mappers/               # MyBatis 매퍼 XML
│   │       │   ├── MainScheduleMapper.xml
│   │       │   └── UserMapper.xml
│   │       └── mybatis-config.xml     # MyBatis 전역 설정
│   └── webapp/
│       ├── WEB-INF/
│       │   ├── beans/                 # Bean 설정
│       │   │   ├── controller.xml
│       │   │   └── model.xml
│       │   └── web.xml                # 서블릿 설정
│       └── META-INF/                  # 메타데이터
└── target/
    └── LuckyWeeky_server.war          # 배포 가능한 WAR 파일

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published