Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
65cc5ed
Update SecurityConfig.java
7910trio Mar 12, 2025
4f170ed
Update Dockerfile
CJ-Park Mar 12, 2025
6140a55
Update CorsConfig.java
7910trio Mar 12, 2025
a420800
Update SubscriptionController.java
7910trio Mar 12, 2025
dc207b6
Update ResumeController.java
7910trio Mar 12, 2025
2525dd1
Update mentoview-be.yaml
linkpond Mar 12, 2025
bae6784
Update Dockerfile
CJ-Park Mar 12, 2025
53407fe
Update SecurityConfig.java
syjoy1993 Mar 12, 2025
b787258
Update SecurityConfig.java
syjoy1993 Mar 12, 2025
fcef704
Update mentoview-be.yaml
linkpond Mar 12, 2025
73ab434
Update SecurityConfig.java
syjoy1993 Mar 12, 2025
837c77b
Update mentoview-be.yaml
linkpond Mar 12, 2025
279b707
Update mentoview-be.yaml
linkpond Mar 12, 2025
4454b5a
Update Dockerfile
linkpond Mar 12, 2025
592809f
Update Dockerfile
linkpond Mar 12, 2025
f8b1df4
[MV-112] :feat: Security 고도화1
syjoy1993 Mar 13, 2025
bb9855f
Merge branch 'test' into feature/Token&Security
syjoy1993 Mar 13, 2025
1178391
Merge pull request #33 from linkpond/feature/Token&Security
syjoy1993 Mar 13, 2025
6733ac2
Update MvOAuth2FormSuccessHandler.java
syjoy1993 Mar 13, 2025
04df073
Update InterviewQuestionRepository.java
CJ-Park Mar 13, 2025
df4650d
Update mentoview-be.yaml
7910trio Mar 13, 2025
8205304
Update SubscriptionController.java
7910trio Mar 13, 2025
9a34851
Update ResumeController.java
7910trio Mar 13, 2025
af6c5e0
Update mentoview-be.yaml
7910trio Mar 13, 2025
2b1abe0
Update SecurityConfig.java
linkpond Mar 13, 2025
4444b75
Update ResumeController.java
CJ-Park Mar 13, 2025
09c30d5
Update ResumeController.java
CJ-Park Mar 13, 2025
8b3abd1
Update UserService.java
CJ-Park Mar 13, 2025
bc7e584
Update OAuth2Controller.java
CJ-Park Mar 13, 2025
a36a712
Update MvOAuth2FormSuccessHandler.java
CJ-Park Mar 13, 2025
3103e90
Update UserDto.java
CJ-Park Mar 13, 2025
8fab789
Update MvOAuth2FormSuccessHandler.java
CJ-Park Mar 13, 2025
29df3ce
Update MvOAuth2UserService.java
CJ-Park Mar 13, 2025
bbd26a0
Update UserDto.java
CJ-Park Mar 13, 2025
4ac859c
Update ResumeController.java
CJ-Park Mar 13, 2025
bf3221f
Update OAuth2Controller.java
CJ-Park Mar 13, 2025
0c639d0
Update MvRequestFilter.java
CJ-Park Mar 13, 2025
5af9948
Update SecurityConfig.java
linkpond Mar 13, 2025
aee15bd
:bug:X:fix: SecurityConfig & JwtProvider & UserDto edit
syjoy1993 Mar 13, 2025
bcaa9dd
Update SecurityConfig.java
syjoy1993 Mar 14, 2025
7dda721
Merge branch 'test' into feature/test-v2
CJ-Park Mar 14, 2025
2aba204
Merge pull request #34 from linkpond/feature/test-v2
CJ-Park Mar 14, 2025
bee83b8
Update OAuth2Controller.java
CJ-Park Mar 14, 2025
1f15b75
[MV-137] :zap: feat: AWS Lambda 필터 추가
CJ-Park Mar 14, 2025
89044cf
Merge pull request #35 from linkpond/feature/lambda-filter
CJ-Park Mar 14, 2025
b8ec93f
[MV-137] :pencil2: fix: AWS Lambda 필터 관련 SecurityConfig 수정
CJ-Park Mar 14, 2025
ddf60a8
Merge pull request #36 from linkpond/feature/lambda-filter
CJ-Park Mar 14, 2025
d869e84
[MV-138] :zap: feat 포트원 웹훅 필터 추가
7910trio Mar 14, 2025
7e59a1a
Update WebhookFilter.java
7910trio Mar 14, 2025
b119c0f
[MV-137] :pencil2: fix: AWS Lambda 필터 관련 SecurityConfig 수정 및 필터 Compo…
CJ-Park Mar 14, 2025
270c125
Merge pull request #38 from linkpond/feature/lambda-filter
CJ-Park Mar 14, 2025
bee6857
[MV-137] :pencil2: fix: AWS Lambda 필터에서 secret key 사용하도록 수정
CJ-Park Mar 14, 2025
8f0d5cd
Merge pull request #39 from linkpond/feature/lambda-filter
CJ-Park Mar 14, 2025
9f2eb95
[MV-115]/[MV-147]:feat:X:fix: logoutHandler && Securty MonitoringChain
syjoy1993 Mar 15, 2025
149ca8f
[ãMV-145] :bug: formlogin details typeㅠbug 해결
syjoy1993 Mar 15, 2025
77f2212
edit anotation in RefreshTokenService
syjoy1993 Mar 15, 2025
f1ccba5
ë미반영 수정
syjoy1993 Mar 16, 2025
c4093eb
Update MvOAuth2FormSuccessHandler.java
syjoy1993 Mar 17, 2025
6fb0a4f
Merge pull request #40 from linkpond/feature/test-0315
syjoy1993 Mar 17, 2025
68ca79e
:sparkles: social password
syjoy1993 Mar 17, 2025
6a6679c
:bug: social login bug
syjoy1993 Mar 17, 2025
655e905
:bug:
syjoy1993 Mar 17, 2025
46b6e12
:bug:X2
syjoy1993 Mar 17, 2025
01f5e94
Update User.java
syjoy1993 Mar 17, 2025
97d6d5e
:bug:ãX3
syjoy1993 Mar 17, 2025
8afe824
Merge remote-tracking branch 'origin/test' into test
syjoy1993 Mar 17, 2025
926e200
nu:bug: ll 방ì지
syjoy1993 Mar 17, 2025
69d56ea
[MV-138] :zap: feat Webhook Filter 테스트중
7910trio Mar 17, 2025
b9f11c7
formlogin FEE 요청
syjoy1993 Mar 17, 2025
8ab272f
Update SubscriptionController.java
7910trio Mar 17, 2025
7f3cf00
Update SubscriptionController.java
7910trio Mar 17, 2025
da7d555
Update WebhookFilter.java
7910trio Mar 17, 2025
00c818f
delete start
syjoy1993 Mar 18, 2025
980e293
Update mentoview-be.yaml
linkpond Mar 19, 2025
a96ef82
[MV-156] :zap: feat 프리티어 기능 추가
7910trio Mar 20, 2025
212a513
[ãMV-152/ MV-160/ MV-159/ MV-150/ MV-153/ MV-161/ MV-162]
syjoy1993 Mar 20, 2025
782d064
Merge remote-tracking branch 'origin/test' into test
syjoy1993 Mar 20, 2025
44fb9ff
Merge branch 'test' into MV-156-BE-FREE-TIRE-구독-추가
7910trio Mar 21, 2025
25c0416
Merge pull request #41 from linkpond/MV-156-BE-FREE-TIRE-구독-추가
7910trio Mar 21, 2025
a205be2
Merge remote-tracking branch 'origin/test' into test
syjoy1993 Mar 21, 2025
74403e4
Merge remote-tracking branch 'origin/test' into feature/test-0318-arc…
syjoy1993 Mar 21, 2025
cdfa02a
Merge remote-tracking branch 'origin/test' into feature/test-0318-arc…
syjoy1993 Mar 21, 2025
5483c2b
Merge pull request #42 from linkpond/feature/test-0318-archive1
syjoy1993 Mar 21, 2025
5aa8787
Update SubscriptionController.java
7910trio Mar 21, 2025
c539573
[MV-156] :zap: feat 프리티어 구독 기능 보완
7910trio Mar 21, 2025
d017729
Merge branch 'MV-156-BE-FREE-TIRE-구독-추가' of https://github.com/linkpo…
7910trio Mar 21, 2025
c2e29fc
Merge branch 'test' into MV-156-BE-FREE-TIRE-구독-추가
7910trio Mar 21, 2025
eab5a4d
edit Scheduled, EventListener
syjoy1993 Mar 21, 2025
a0d7a33
Merge pull request #43 from linkpond/MV-156-BE-FREE-TIRE-구독-추가
7910trio Mar 21, 2025
84d5a6a
[MV-156] :pencil2: fix SubscriptionPlan 수정
7910trio Mar 21, 2025
43a8970
Merge pull request #44 from linkpond/MV-156-BE-FREE-TIRE-구독-추가
7910trio Mar 21, 2025
4c1fffb
[MV-156] :pencil2: fix SubscriptionPlan 수정
7910trio Mar 21, 2025
77f2a6f
Merge pull request #45 from linkpond/MV-156-BE-FREE-TIRE-구독-추가
7910trio Mar 21, 2025
85f2253
:fix: edit Securityconfig
syjoy1993 Mar 21, 2025
1f486d8
Merge pull request #46 from linkpond/feature/test-0321-admin
syjoy1993 Mar 21, 2025
95149f2
[MV-156] :pencil2: FreeTire 구독 로직 수정
7910trio Mar 21, 2025
81d2eab
Merge pull request #47 from linkpond/MV-156-BE-FREE-TIRE-구독-추가
7910trio Mar 21, 2025
af140dd
Update mentoview-be.yaml
linkpond Mar 22, 2025
73adad6
Update mentoview-be.yaml
linkpond Mar 23, 2025
cb35d1c
[MV-164] :pencil2: x :fire: fix x remove: Entity Nullable, DTO 정리
7910trio Mar 23, 2025
3e59e7a
Merge pull request #48 from linkpond/MV-164-BE-DTO-Entity-Nullable-정리
7910trio Mar 23, 2025
6031230
[MV-165] :pencil2: fix: Entity 컬럼 nullable false 옵션 추가
CJ-Park Mar 23, 2025
22f1866
[MV-165] :pencil2: fix: Entity 컬럼 nullable false 옵션 추가
CJ-Park Mar 23, 2025
8f47f4d
[MV-165] :fire: remove: Interview 관련 미사용 DTO 삭제
CJ-Park Mar 23, 2025
0acf890
[MV-164] :bug: fix: column 중복 선언 수정
CJ-Park Mar 23, 2025
f87a0ef
Update UserPasswordModify.java
syjoy1993 Mar 23, 2025
214768b
Update UserPasswordCreate.java
syjoy1993 Mar 23, 2025
d77b3ee
Update UserCreateForm.java
syjoy1993 Mar 23, 2025
50c655b
Update UserCreateForm.java
syjoy1993 Mar 23, 2025
581687f
form edit
syjoy1993 Mar 24, 2025
4cbe2e3
regexp
syjoy1993 Mar 24, 2025
796ee7a
regexp2
syjoy1993 Mar 24, 2025
4f5b86a
regexp3
syjoy1993 Mar 24, 2025
90aa999
not using
syjoy1993 Mar 24, 2025
c35ae8d
[MV-168] :pencil2: fix: 피드백 생성 프롬프트 업데이트
CJ-Park Mar 25, 2025
d13792a
readme update
syjoy1993 Mar 25, 2025
3d5c052
Merge remote-tracking branch 'origin/test' into test
syjoy1993 Mar 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/mentoview-be.yaml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
name: mentoview backend 12
name: mentoview backend test 06

on:
# workflow_dispatch
push:
branches:
- dev
- test

jobs:
ci:
Expand Down Expand Up @@ -84,4 +84,4 @@ jobs:
git config --local user.name "${{ secrets.G_USER_NAME }}"
git add .
git commit -m "Update application image version for ArgoCD"
git push
git push
38 changes: 34 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,34 @@
FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
# FROM openjdk:17
# ARG JAR_FILE=build/libs/*.jar
# COPY ${JAR_FILE} app.jar
# ENTRYPOINT ["java", "-jar", "/app.jar"]

### Tesseract와 Leptonica가 설치된 베이스 이미지 사용
FROM joe1534/mentoview-tesseract:v3

### 라이브러리 경로 설정 (Tesseract와 Leptonica)
ENV TESSDATA_PREFIX=/usr/local/share
ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
echo "Asia/Seoul" > /etc/timezone && \
dpkg-reconfigure --frontend noninteractive tzdata

# 타임존을 Asia/Seoul로 설정
#ENV TZ=Asia/Seoul

### 워킹 디렉토리 설정
WORKDIR /app

### jar 파일 app.jar로 복사
COPY build/libs/*.jar app.jar

### app.jar 실행
#CMD ["java", "-jar", "app.jar"]
ENTRYPOINT ["java", "-jar", "app.jar"]

# 타임존을 환경 변수로 설정하여 JVM 옵션으로 전달합니다.
#ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-Duser.timezone=${TZ}", "-jar", "app.jar"]
137 changes: 136 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,136 @@
# MentoView-BE
# 🧠 Mentoview - AI 면접 서비스
> "이력서 기반으로 AI가 면접 질문을 생성하고, 응답을 분석하여 피드백을 제공합니다."

## 📌프로젝트 개요 (Overview)
> 사용자가 이력서를 제출하면 AI가 면접을 진행하고, 응답 분석 결과를 피드백으로 제공합니다.

## 💻기술 스택 (Tech Stack)
- Backend: Java 17, Spring Boot 3, Spring Security 6, Spring Data JPA, JPA, OpenAI, PDFBOX, Tesseract OCR, SWAGGER, Spring Reactive
- Frontend : React, JS ES6 , HTML5, CSS3 ,Redux, React-Query, Styled-Components
- DB: MySQL 8
- Infra: AWS EKS, S3, Lambda, Docker, Prometheus, Grafana
- CICD : GitHub Actions, ArgoCD


## ⚙️기능 소개 (Features)
- 회원가입 (폼 & OAuth2)
- 이력서 등록 및 관리
- AI 면접 질문 자동 생성
- 응답 분석 및 피드백 제공
- 정기 구독 및 결제
- 모니터링

## ☁️배포 (Deployment)
- GitHub Actions CI/CD
- ArgoCD
- AWS CloudFormation(AWS EKS)

## dependency
- joe1534/mentoview-tesseract:v3
- S3

## 모니터링 / 성능 (Optional)
- Prometheus
- Grafana
- Alert(discord)

## 💻 개발 환경 (Development Environment)

- Java 17 (Temurin)
- Spring Boot 3.4.3
- Gradle 8.12.1
- MySQL 8.0.40
- transcribe 2.30.26
- openapi
- awssdk V2
- s3:3.0.2
- pdfbox 3.0.3
- Tesseract 5.5.0
- Leptonica 1.85.0
- portone server-sdk 0.15.0
- webflux
- prometheus
- jjwt jjwt-api:0.12.3/ jjwt-impl:0.12.3/ jjwt-jackson:0.12.3
- spring security 6

## 👩‍💻팀원 / 역할 (Optional)
- 이승연 / 팀장 (linkpond0629@gmail.com)
- 박청조 / 팀원 (king01286@naver.com)
- 배희창 / 팀원 (madsens0527@gmail.com)
- 이서영 / 팀원 (7910trio@naver.com)
- 이사야 / 팀원 (syjoy1993@gmail.com)

### FrontEnd
> https://github.com/linkpond/MentoView-FE
### manifast
> https://github.com/linkpond/MentoView-manifest

### application.properties

```
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=

# JPA
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

# Actuator

management.endpoint.prometheus.access=unrestricted
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=health,info,prometheus,metrics
management.server.port=9090
management.endpoints.web.base-path=/api/management

#prometheus

# aws
cloud.aws.credentials.access-key=
cloud.aws.credentials.secret-key=
cloud.aws.s3.bucket.name=
cloud.aws.region.static=ap-northeast-2
aws.lambda.header=
aws.lambda.secret-key=

spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB

# OAuth
spring.jwt.secret=
temporary-token-expiration: 120000
access-token-expiration: 3000000
refresh-token-expiration: 604800000

##
spring.task.scheduling.enabled=true

### registration
spring.security.oauth2.client.registration.google.client-name=google
spring.security.oauth2.client.registration.google.client-id
spring.security.oauth2.client.registration.google.client-secret

openai
spring.ai.openai.api-key=
spring.ai.openai.chat.options.model=gpt-4o-mini

portone
IMP_API_KEY=
PORTONE_WEBHOOK_SECRET=
NOTIFICATION_URL=http://?/api/webhook/payment

# tesseract
tesseract.tessdata.path=/usr/local/share/tessdata

#swagger
#springdoc.api-docs.path=/api/v3/api-docs springdoc.swagger-ui.path=/api/swagger-ui
#springdoc.api-docs.path=/v3/api-docs springdoc.swagger-ui.path=/swagger-ui
springdoc.swagger-ui.path=/swagger-ui.html
springdoc.api-docs.path=/v3/api-docs

```
3 changes: 2 additions & 1 deletion src/main/java/ce2team1/mentoview/MentoviewApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;


@EnableScheduling
@SpringBootApplication
public class MentoviewApplication {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ce2team1.mentoview.archive.dto;

import ce2team1.mentoview.archive.entity.InterviewArchive;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

/**
* DTO for {@link ce2team1.mentoview.archive.entity.InterviewArchive}
*/
@AllArgsConstructor
@Getter
@Builder
public class InterviewArchiveDto {
private final Long userId;
private final String interviewKey;


public static InterviewArchiveDto of(Long userId, String interviewKey){
return new InterviewArchiveDto(
userId,
interviewKey
);
}

public static InterviewArchiveDto by(InterviewArchive interviewArchive){
return InterviewArchiveDto.builder()
.userId(interviewArchive.getUserId())
.interviewKey(interviewArchive.getInterviewKey())
.build();

}
}
24 changes: 24 additions & 0 deletions src/main/java/ce2team1/mentoview/archive/dto/InterviewData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ce2team1.mentoview.archive.dto;

import lombok.*;

import java.util.List;
import java.util.UUID;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class InterviewData {

private String interviewId;

private List<InterviewEntry> interviewEntries;

public static InterviewData of(List<InterviewEntry> entries) {
return InterviewData.builder()
.interviewId(UUID.randomUUID().toString())
.interviewEntries(entries)
.build();
}
}
31 changes: 31 additions & 0 deletions src/main/java/ce2team1/mentoview/archive/dto/InterviewEntry.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ce2team1.mentoview.archive.dto;

import ce2team1.mentoview.entity.InterviewQuestion;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class InterviewEntry {

private Long interviewId; // 인터뷰 id
private int questionNumber; // 번호

private String question; // 질문 내용
private String response; // 응답 내용
private String feedback; // 피드백 내용

public static InterviewEntry of(InterviewQuestion question) {
return InterviewEntry.builder()
.interviewId(question.getInterview().getInterviewId())
.questionNumber(question.getQuestionId().intValue())
.question(question.getQuestion())
.response(question.getInterviewResponse()!= null? question.getInterviewResponse().getResponse() : "")
.feedback(question.getInterviewFeedback()!= null? question.getInterviewFeedback().getFeedback() : "")
.build();
}
}
20 changes: 20 additions & 0 deletions src/main/java/ce2team1/mentoview/archive/entity/ArchiveBase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ce2team1.mentoview.archive.entity;

import jakarta.persistence.Column;
import jakarta.persistence.MappedSuperclass;
import jakarta.persistence.PrePersist;

import java.time.LocalDateTime;

@MappedSuperclass
public class ArchiveBase {

@Column(nullable = false)
protected LocalDateTime archivedAt; // 아카이브된 시간

@PrePersist
protected void prePersistArchivedAt(){
this.archivedAt = LocalDateTime.now();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package ce2team1.mentoview.archive.entity;

import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;


@Builder
@NoArgsConstructor
@Getter
@AllArgsConstructor
@Entity
@ToString
public class InterviewArchive {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private Long userId;

@Column(length = 255, nullable = false)
private String interviewKey; // S3 키 값

@Column(nullable = false)
private LocalDateTime archivedAt; // 아카이브된 시간


public static InterviewArchive of(Long userId, String interviewKey) {
return InterviewArchive.builder()
.userId(userId)
.interviewKey(interviewKey)
.archivedAt(LocalDateTime.now())
.build();
}
}



Loading
Loading