Skip to content
Merged

Dev #35

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
f3dbb46
feat: GlobalException κ΅¬ν˜„
bumstone Jul 14, 2025
7298b39
.gitignore μˆ˜μ •
bumstone Jul 14, 2025
5c386b1
Initial Commit
bumstone Jul 14, 2025
9a59575
Initial Commit
bumstone Jul 14, 2025
9c7f587
Merge pull request #3 from Gitdeun/feat/#1-common/exception
bumstone Jul 14, 2025
abbba3c
feat: GlobalLoggingAspect μ „μ—­ λ‘œκΉ… μ„€μ •
bumstone Jul 14, 2025
9e9268b
feat: BaseEntity κ΅¬ν˜„
bumstone Jul 14, 2025
65d9a99
feat: S3 Template λ„μž… 적용
bumstone Jul 14, 2025
2575b8a
Merge pull request #6 from Gitdeun/feat/#4#5-common
bumstone Jul 14, 2025
5c3d831
feat: RedisConfig κ΅¬ν˜„ 및 인메λͺ¨λ¦¬ μΊμ‹œ μ„€μ •
bumstone Jul 16, 2025
ccbf0a2
feat: μœ μ € 인증 κΈ°λ³Έ μ„œλΉ„μŠ€ κ΅¬ν˜„
bumstone Jul 16, 2025
9636027
feat: OAuth2 연동 μ„€μ • 및 webClient 적용, oauth 토큰 μ•”ν˜Έν™” 및 λ³΅ν˜Έν™” 적용
bumstone Jul 16, 2025
aeec789
feat: oauth 토큰 만료 μžλ™ κ°±μ‹ 
bumstone Jul 16, 2025
34b044a
feat: μœ μ € 정보 쑰회 및 νƒˆν‡΄ κΈ°λ³Έ ꡬ성
bumstone Jul 16, 2025
46f9b44
feat: SecurityConfig μ„€μ •
bumstone Jul 16, 2025
883b2f8
feat: QuerydslConfig μ„€μ • 및 μ˜μ‘΄μ„±
bumstone Jul 16, 2025
a651a2e
feat: OAuth2UserDto μˆ˜μ • 및 μ—λŸ¬μ½”λ“œ μ—…λ°μ΄νŠΈ
bumstone Jul 16, 2025
aec935b
feat: JWT 기반 인증/인가 κΈ°λ³Έ κ΅¬ν˜„ + λ¦¬ν”„λ ˆμ‹œ 토큰 및 κ΄€λ ¨ μ„œλΉ„μŠ€ κ΅¬ν˜„
bumstone Jul 16, 2025
2c47614
feat: SecurityConfig κ°œμ„ , JWT λ¬΄νš¨ν™” κΈ°λŠ₯ κ΅¬ν˜„
bumstone Jul 16, 2025
ff6db2c
feat: νšŒμ› κΈ°λ³Έ κΈ°λŠ₯ κ΅¬ν˜„ ꡬ체화
bumstone Jul 18, 2025
3f8761d
refactor: OAuth κ΄€λ ¨ ν•„λ“œ 및 μ„€μ • λ³€κ²½
bumstone Jul 18, 2025
4274787
refactor: 인증관련 κΈ°λŠ₯ κ°œμ„ 
bumstone Jul 18, 2025
7ba0cd7
feat: google -> github 인증을 ν†΅ν•œ 연동
bumstone Jul 19, 2025
1034810
refactor: 쀑볡 κ΄€λ¦¬μž API μ ‘κ·Ό μ œμ–΄ λΆ€λΆ„ 제거
bumstone Jul 19, 2025
df28283
Merge pull request #15 from Gitdeun/feat/#7-user&oauth
bumstone Jul 19, 2025
6fb90fb
style: 주석 및 api 경둜λͺ… μˆ˜μ •, λ―Έν•„μš” import 제거
bumstone Jul 19, 2025
b247087
fix: 계정 연동과 둜그인 같은 callback uri 적용 및 κ°œμ„ 
bumstone Jul 21, 2025
93e5fbc
refactor: baseEntity -> created, audited entity둜 뢄리
bumstone Jul 24, 2025
df2d97b
feat: OAuth create, connect 뢄리 생성 및 stateλ₯Ό ν†΅ν•œ ꡬ뢄 쑰회
bumstone Jul 24, 2025
679d47d
fix: ν•„μš”μ—†λŠ” λΆ€λΆ„ 제거
bumstone Jul 24, 2025
5ed7a87
feat: νšŒμ›μ˜ μ„€μ • 쑰회 및 λ³€κ²½ κ΅¬ν˜„
bumstone Jul 24, 2025
83a6b20
style: λΆˆν•„μš”ν•œ 주석 제거 및 도메인λͺ… repo둜 λ³€κ²½
bumstone Jul 26, 2025
b207454
feat: UserSettingMapper 적용
bumstone Jul 26, 2025
195649e
feat: UserSettingMapper 적용
bumstone Jul 26, 2025
e7ff591
Merge pull request #19 from Gitdeun/feat/#14-user-setting
bumstone Jul 26, 2025
8f8260a
feat: ν•„μˆ˜ Entity 생성 및 μ„€μ •
bumstone Jul 26, 2025
bb03d82
feat: FastApiClient, FastApiConfig μ„€μ •, λ°›μ•„μ˜¬ 데이터 μž„μ‹œ Dto 생성
bumstone Jul 27, 2025
e06b29f
feat: Repo 도메인 κ΅¬ν˜„
bumstone Jul 27, 2025
cbefb24
feat: oauth 토큰 μž¬λ°œκΈ‰ κ΅¬ν˜„
bumstone Jul 27, 2025
6b069de
refactor: fastapi κ΄€λ ¨ ꡬ쑰 refactor
bumstone Jul 27, 2025
5b2db4a
Merge pull request #21 from Gitdeun/feat/#18-repo
bumstone Jul 27, 2025
17460cc
refactor: repo url을 ν†΅ν•œ 등둝 확인 체크 κ°œμ„ 
bumstone Jul 27, 2025
309de5e
Merge pull request #23 from Gitdeun/feat/#18-repo
bumstone Jul 27, 2025
5cdf23d
fix: JwtTokenProvider Principal을 κ°•μ œ μΊμŠ€νŒ… 문제
bumstone Jul 29, 2025
5f34b5b
Merge pull request #25 from Gitdeun/fix/#24-jwt
bumstone Jul 29, 2025
4a5b20d
feat: λ§ˆμΈλ“œλ§΅ 생성과 repo 정보 등둝 κ΅¬ν˜„
bumstone Jul 29, 2025
609aaf7
feat: entity ν…Œμ΄λΈ”λͺ… μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€ λ³€κ²½, PinnedHistory μ—”ν‹°ν‹° 생성
bumstone Jul 29, 2025
cf0435a
refactor: Dto의 idλͺ…μΉ­ ꡬ체화, 주석 및 import 정리, @Mapping μš”μ²­ μˆ˜μ •, MindmapDetai…
bumstone Jul 29, 2025
cf61b7b
feat: λ§ˆμΈλ“œλ§΅ 방문쑰회, μƒˆλ‘œκ³ μΉ¨, μ‚­μ œ κ΅¬ν˜„
bumstone Jul 29, 2025
f96075f
fix: visitHistory mappedby 연관관계 ν•„λ“œλͺ… μˆ˜μ •
bumstone Jul 29, 2025
a4bc020
Merge pull request #28 from Gitdeun/feat/#22-mindmap
bumstone Jul 29, 2025
d0d0a18
feat: λ°©λ¬Έ 기둝 ν•€ κ³ μ • 및 ν•΄μ œ κΈ°λŠ₯
bumstone Jul 30, 2025
050ae80
feat: λ°©λ¬Έ 기둝 쑰회, 생성, μ‚­μ œ κ΅¬ν˜„
bumstone Jul 30, 2025
e23a49d
style: μ•ˆμ“°λŠ” importλ¬Έ 제거
bumstone Jul 30, 2025
841b62f
Merge pull request #29 from Gitdeun/feat/#26-visitHistory
bumstone Jul 31, 2025
f57cce1
refactor: UserSetting λͺ¨λ“œ 제거
bumstone Jul 31, 2025
a1d0559
refactor: Repo 생성 및 μ—…λ°μ΄νŠΈ RepoService둜 뢄리
bumstone Jul 31, 2025
431d4ee
feat: Mindmap 생성 μ‹œ mindmapmember μ†Œμœ μž 생성
bumstone Jul 31, 2025
b5bcdf2
feat: Mindmap κΆŒν•œ 확인
bumstone Jul 31, 2025
4154b77
feat: MindmapMember κΈ°λŠ₯ κ΅¬ν˜„
bumstone Jul 31, 2025
f11e683
feat: MindmapMember μ—”λ“œν¬μΈνŠΈ, repository λ©”μ„œλ“œλͺ… μˆ˜μ •
bumstone Aug 1, 2025
3452bff
fix: oauth 둜그인 μ‹œ μ„Έμ…˜ 좩돌, role κΆŒν•œ 인증 μˆ˜μ •
bumstone Aug 1, 2025
a876b03
feat: securityPath μΆ”κ°€
bumstone Aug 1, 2025
8c9a315
fix: connectSocialAccount() 호좜 전에 User μ €μž₯
bumstone Aug 1, 2025
eb153c6
fix: JwtTokenProvider getAuthentication 인증 μΌ€μ΄μŠ€ μΆ”κ°€
bumstone Aug 1, 2025
df107fe
fix: UserSettingController μ—”λ“œν¬μΈλ“œ μˆ˜μ •
bumstone Aug 1, 2025
245b1a8
Merge pull request #31 from Gitdeun/feat/#30-member_invitation_notifi…
bumstone Aug 1, 2025
d0673c7
feat: μ‚¬μš©μž λͺ¨λ“  μ†Œμ…œ 연동 정보 쑰회 κ΅¬ν˜„(ν™•μΈμš©)
bumstone Aug 2, 2025
dc5233a
setting: github.redirect-uri μˆ˜μ •
bumstone Aug 3, 2025
8e5dbe7
Merge pull request #34 from Gitdeun/feat/#30-member_invitation_notifi…
bumstone Aug 3, 2025
353e32c
setting: front 3000 -> 5173λ³€κ²½
bumstone Aug 3, 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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
build/
out/
*.jar
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
*.war
*.ear

Expand Down
28 changes: 26 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,12 @@ repositories {
}

ext {
mapstructVersion = "1.6.0.Final"
springDocVersion = "2.5.0"
mapstructVersion = "1.6.3"
springDocVersion = "2.8.9"
jjwtVersion = "0.12.6"
awsSdkVersion = "2.25.68"
springCloudAwsVersion = "3.1.1"
queryDslVersion = "5.1.0"
}

dependencies {
Expand Down Expand Up @@ -80,6 +81,15 @@ dependencies {
implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:${springCloudAwsVersion}")
implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3'

// queryDsl
implementation "com.querydsl:querydsl-core:${queryDslVersion}"
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta"
annotationProcessor (
"com.querydsl:querydsl-apt:${queryDslVersion}:jakarta",
// JPA 메타λͺ¨λΈ μƒμ„±μš©
"jakarta.persistence:jakarta.persistence-api:3.1.0"
)

// db
runtimeOnly 'com.h2database:h2'
runtimeOnly 'com.mysql:mysql-connector-j'
Expand All @@ -90,11 +100,25 @@ dependencies {
// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// Reactive μ›Ή ν”„λ ˆμž„μ›Œν¬ WebFlux
implementation 'org.springframework.boot:spring-boot-starter-webflux'

// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

/** Q 클래슀 생성 경둜 μ§€μ • **/
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile

sourceSets {
main { java.srcDirs += querydslDir }
}

tasks.withType(JavaCompile).configureEach {
options.annotationProcessorGeneratedSourcesDirectory = querydslDir
}

tasks.named('test') {
useJUnitPlatform()
}
1 change: 1 addition & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
volumes:
- redis-data:/data # 데이터 지속성을 μœ„ν•œ λ³Όλ₯¨ μΆ”κ°€
command: redis-server --appendonly yes
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
Expand Down
Binary file added gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
5 changes: 5 additions & 0 deletions src/main/java/com/teamEWSN/gitdeun/GitdeunApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;


@EnableJpaAuditing
@EnableScheduling
@SpringBootApplication
public class GitdeunApplication {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
package com.teamEWSN.gitdeun.codereference.controller;

public class CodeReferenceController {

}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,31 @@
package com.teamEWSN.gitdeun.codereference.entity;

import com.teamEWSN.gitdeun.mindmapnode.entity.MindmapNode;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "code_reference")
public class CodeReference {


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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "node_id", nullable = false)
private MindmapNode node;

@Column(name = "file_path", columnDefinition = "TEXT", nullable = false)
private String filePath;

@Column(name = "start_line", length = 255)
private String startLine;

@Column(name = "end_line", length = 255)
private String endLine;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,46 @@
package com.teamEWSN.gitdeun.codereview.entity;

public class CodeReview {

import com.teamEWSN.gitdeun.common.util.AuditedEntity;
import com.teamEWSN.gitdeun.mindmapnode.entity.MindmapNode;
import com.teamEWSN.gitdeun.user.entity.User;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "code_review")
public class CodeReview extends AuditedEntity {

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id", nullable = false)
private User author;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "node_id", nullable = false)
private MindmapNode node;

@Column(name = "ref_id")
private Long refId;

@Enumerated(EnumType.STRING)
@Column(nullable = false)
@ColumnDefault("'PENDING'")
private CodeReviewStatus status;

@Column(name = "comment_cnt")
@ColumnDefault("0")
private Integer commentCount;

@Column(name = "unresolved_thread_cnt")
@ColumnDefault("0")
private Integer unresolvedThreadCount;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.teamEWSN.gitdeun.codereview.entity;

public enum CodeReviewStatus {
PENDING,
RESOLVED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.teamEWSN.gitdeun.comment.controller;

public class CommentController {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.teamEWSN.gitdeun.comment.dto;

public class CommentResponseDto {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.teamEWSN.gitdeun.comment.entity;

public enum AttachmentType {
IMAGE,
FILE
}
44 changes: 44 additions & 0 deletions src/main/java/com/teamEWSN/gitdeun/comment/entity/Comment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.teamEWSN.gitdeun.comment.entity;

import com.teamEWSN.gitdeun.codereview.entity.CodeReview;
import com.teamEWSN.gitdeun.common.util.AuditedEntity;
import com.teamEWSN.gitdeun.user.entity.User;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "comment")
public class Comment extends AuditedEntity {

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "code_review_id", nullable = false)
private CodeReview codeReview;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_comment_id")
private Comment parentComment;

@Column(columnDefinition = "TEXT", nullable = false)
private String content;

@Enumerated(EnumType.STRING)
@Column(name = "emoji_type")
private EmojiType emojiType;

@Column(name = "resolved_at")
private LocalDateTime resolvedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.teamEWSN.gitdeun.comment.entity;

import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "comment_attachment")
public class CommentAttachment {

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "comment_id", nullable = false)
private Comment comment;

@Column(length = 255, nullable = false)
private String url;

@Column(name = "file_name", length = 200, nullable = false)
private String fileName;

@Column(name = "mime_type", length = 100, nullable = false)
private String mimeType;

@Column(nullable = false)
private Long size;

@Enumerated(EnumType.STRING)
@Column(name = "attachment_type", nullable = false)
private AttachmentType attachmentType;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.teamEWSN.gitdeun.comment.entity;

public enum EmojiType {
QUESTION,
IDEA,
BUG,
IMPORTANT,
LOVE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.teamEWSN.gitdeun.comment.repository;

public class CommentRepository {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.teamEWSN.gitdeun.comment.service;

public class CommentService {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.teamEWSN.gitdeun.common.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Slf4j
@Aspect
@Component
public class GlobalLoggingAspect {

@Pointcut("execution(* com.teamEWSN.gitdeun..*(..))")
private void globalPointcut() {

}

@Before("globalPointcut()")
public void logBeforeMethod(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().toShortString();
Object[] args = joinPoint.getArgs();

log.debug("[μ‹€ν–‰ λ©”μ„œλ“œ]: {} [λ§€κ°œλ³€μˆ˜]: {}", methodName, Arrays.toString(args));
}

@AfterReturning(value = "globalPointcut()", returning = "result")
public void logAfterMethod(JoinPoint joinPoint, Object result) {
String methodName = joinPoint.getSignature().toShortString();

log.debug("[μ’…λ£Œ λ©”μ„œλ“œ]: {} [λ°˜ν™˜κ°’]: {}", methodName, result);
}

@AfterThrowing(value = "globalPointcut()", throwing = "ex")
public void logAfterThrowing(JoinPoint joinPoint, Throwable ex) {
String methodName = joinPoint.getSignature().toShortString();

log.error("[μ˜ˆμ™Έ λ°œμƒ λ©”μ„œλ“œ]: {} [μ˜ˆμ™Έ]: {}", methodName, ex.getMessage());
}
}
35 changes: 35 additions & 0 deletions src/main/java/com/teamEWSN/gitdeun/common/config/CacheConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.teamEWSN.gitdeun.common.config;

import com.github.benmanes.caffeine.cache.Caffeine;
import com.teamEWSN.gitdeun.common.util.CacheType;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;
import java.util.Arrays;

@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();

// 각 μΊμ‹œ νƒ€μž…μ— λŒ€ν•œ μ„€μ • 등둝
Arrays.stream(CacheType.values())
.forEach(cacheType -> {
cacheManager.registerCustomCache(cacheType.getCacheName(),
Caffeine.newBuilder()
.recordStats() // μΊμ‹œ 톡계 기둝
.expireAfterWrite(Duration.ofHours(cacheType.getExpiredAfterWrite())) // ν•­λͺ© 만료 μ‹œκ°„
.maximumSize(cacheType.getMaximumSize()) // μ΅œλŒ€ 크기
.build()
);
});

return cacheManager;
}
}
Loading