Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 9 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,20 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-redis")
implementation("org.springframework.session:spring-session-data-redis")

// AWS S3
implementation("io.awspring.cloud:spring-cloud-aws-starter-s3:3.4.0")

runtimeOnly("com.h2database:h2")
runtimeOnly("com.mysql:mysql-connector-j")

annotationProcessor("org.projectlombok:lombok")

//json
implementation("io.jsonwebtoken:jjwt-api:0.11.5")
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5")
runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5")
// json 파싱용

//Spring AI
implementation(platform("org.springframework.ai:spring-ai-bom:1.0.0-M4"))

Expand Down
4 changes: 4 additions & 0 deletions cookies.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Netscape HTTP Cookie File
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

@Entity
@Getter
@Table(name = "cocktailcomment")
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
@AllArgsConstructor
Expand Down
15 changes: 2 additions & 13 deletions src/main/java/com/back/domain/post/category/entity/Category.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,12 @@
package com.back.domain.post.category.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@Entity
@Getter
@Setter
@Table(name = "category")
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
@AllArgsConstructor
Expand Down
18 changes: 3 additions & 15 deletions src/main/java/com/back/domain/post/comment/entity/Comment.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,8 @@

import com.back.domain.post.comment.enums.CommentStatus;
import com.back.domain.post.post.entity.Post;
import com.back.domain.post.post.enums.PostStatus;
import com.back.domain.user.entity.User;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -25,9 +12,10 @@
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Entity
@Getter
@Table(name = "comment")
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
@AllArgsConstructor
Expand Down
23 changes: 5 additions & 18 deletions src/main/java/com/back/domain/post/post/entity/Post.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,7 @@
import com.back.domain.post.category.entity.Category;
import com.back.domain.post.post.enums.PostStatus;
import com.back.domain.user.entity.User;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -28,9 +12,12 @@
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Table(name = "post")
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
@AllArgsConstructor
Expand Down
25 changes: 5 additions & 20 deletions src/main/java/com/back/domain/post/post/entity/PostLike.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,17 @@

import com.back.domain.post.post.enums.PostLikeStatus;
import com.back.domain.user.entity.User;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Entity
@Getter
// 같은 사용자(user_id)가 같은 게시글(post_id)을 중복 추천하지 못하도록 DB 레벨에서 보장.
@Table(name = "post_like", uniqueConstraints = {
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = {"post_id", "user_id"})
})
@EntityListeners(AuditingEntityListener.class)
Expand Down
12 changes: 1 addition & 11 deletions src/main/java/com/back/domain/post/post/entity/PostTag.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,6 @@
package com.back.domain.post.post.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -18,7 +9,6 @@

@Entity
@Getter
@Table(name = "post_tag")
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PostTag {
Expand Down
8 changes: 1 addition & 7 deletions src/main/java/com/back/domain/post/post/entity/Tag.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,10 @@
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.*;

@Entity
@Getter
@Table(name = "tag")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ public class UserAuthController {
})
@PostMapping("/refresh")
public RsData<RefreshTokenResDto> refreshToken(HttpServletRequest request, HttpServletResponse response) {
RefreshTokenResDto refreshToken = userAuthService.refreshTokens(request, response);
RefreshTokenResDto refreshTokenData = userAuthService.refreshTokens(request, response);

if (refreshToken != null) {
return RsData.of(200, "토큰이 갱신 성공.", refreshToken);
if (refreshTokenData != null) {
return RsData.of(200, "토큰이 갱신 성공.", refreshTokenData);
} else {
return RsData.of(401, "토큰 갱신에 실패했습니다. 다시 로그인해주세요.");
}
Expand Down
16 changes: 13 additions & 3 deletions src/main/java/com/back/domain/user/service/UserAuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public User joinSocial(String oauthId, String email, String nickname){
String uniqueNickname = generateNickname(nickname);

User user = User.builder()
.email(email)
.email(email != null ? email : "")
.nickname(uniqueNickname)
.abvDegree(0.0)
.createdAt(LocalDateTime.now())
Expand All @@ -112,7 +112,8 @@ public RsData<User> findOrCreateOAuthUser(String oauthId, String email, String n
if (existingUser.isPresent()) {
// 기존 사용자 업데이트 (이메일만 업데이트)
User user = existingUser.get();
user.setEmail(email);
// null 체크 후 빈 문자열로 대체
user.setEmail(email != null ? email : "");
return RsData.of(200, "회원 정보가 업데이트 되었습니다", user); //더티체킹
} else {
User newUser = joinSocial(oauthId, email, nickname);
Expand All @@ -137,15 +138,24 @@ public void issueTokens(HttpServletResponse response, Long userId, String email,
String accessToken = jwtUtil.generateAccessToken(userId, email, nickname);
String refreshToken = refreshTokenService.generateRefreshToken(userId);

log.debug("토큰 발급 완료 - userId: {}, accessToken: {}, refreshToken: {}", userId, accessToken, refreshToken);

jwtUtil.addAccessTokenToCookie(response, accessToken);
jwtUtil.addRefreshTokenToCookie(response, refreshToken);
}

public RefreshTokenResDto refreshTokens(HttpServletRequest request, HttpServletResponse response) {
try {
String oldRefreshToken = jwtUtil.getRefreshTokenFromCookie(request);
log.debug("토큰 갱신 시도 - 받은 RefreshToken: {}", oldRefreshToken);

if (oldRefreshToken == null) {
log.error("RefreshToken이 쿠키에서 발견되지 않음");
return null;
}

if (oldRefreshToken == null || !refreshTokenService.validateToken(oldRefreshToken)) {
if (!refreshTokenService.validateToken(oldRefreshToken)) {
log.error("RefreshToken 검증 실패: {}", oldRefreshToken);
return null;
}

Expand Down
23 changes: 0 additions & 23 deletions src/main/java/com/back/global/controller/HomeController.java

This file was deleted.

40 changes: 40 additions & 0 deletions src/main/java/com/back/global/file/FileController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.back.global.file;

import com.back.global.rsData.RsData;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.Bucket;

import java.util.List;
import java.util.stream.Collectors;


@Tag(name = "File", description = "file API")
@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
public class FileController {
private final S3Client s3Client;

@Operation(summary = "S3 버킷 목록 조회", description = "모든 버킷 목록을 조회")
@GetMapping("/buckets")
public RsData<List<String>> listBuckets() {

return RsData.of(
200,
"버킷 목록 조회",
s3Client
.listBuckets()
.buckets()
.stream()
.map(Bucket::name)
.collect(Collectors.toList())
);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
import com.back.global.rsData.RsData;
import com.fasterxml.jackson.core.JsonProcessingException;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.transaction.TransactionException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingRequestHeaderException;
Expand All @@ -30,6 +33,7 @@
* 500: Internal Server Error
*/

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

Expand Down
Loading