diff --git a/build.gradle b/build.gradle index ac8c824..11ffe8d 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,9 @@ dependencies { implementation platform("org.springframework.ai:spring-ai-bom:1.0.0-SNAPSHOT") implementation 'org.springframework.ai:spring-ai-vertex-ai-gemini-spring-boot-starter:1.0.0-SNAPSHOT' + implementation 'io.micrometer:micrometer-tracing:latest.release' + implementation 'io.micrometer:micrometer-tracing-bridge-brave:latest.release' + // Swagger implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0' diff --git a/docker-compose.yml b/docker-compose.yml index 9844c08..3b329f3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,22 +1,21 @@ services: springboot: - container_name: someup # ec2내에서 동작하는 컨테이너명 + container_name: someup image: someupsite/someup:latest ports: - 8080:8080 environment: - - SPRING_PROFILES_ACTIVE=dev-env # 사용할 profile + - SPRING_PROFILES_ACTIVE=dev-env - GOOGLE_APPLICATION_CREDENTIALS=/credentials/application_default_credentials.json volumes: - /home/ubuntu/.config/gcloud/application_default_credentials.json:/credentials/application_default_credentials.json networks: - my_network - redis: image: redis container_name: redis-cache - command: [ "redis-server", "--port", "6379" ] # 비밀번호 설정 제거 + command: ["redis-server", "--port", "6379"] ports: - 6379:6379 networks: diff --git a/src/main/java/project/backend/BackendApplication.java b/src/main/java/project/backend/BackendApplication.java index 24d9434..d6fc254 100644 --- a/src/main/java/project/backend/BackendApplication.java +++ b/src/main/java/project/backend/BackendApplication.java @@ -9,5 +9,4 @@ public class BackendApplication { public static void main(String[] args) { SpringApplication.run(BackendApplication.class, args); } - } diff --git a/src/main/java/project/backend/business/archive/implement/ArchiveManager.java b/src/main/java/project/backend/business/archive/implement/ArchiveManager.java index fcebe56..1f47a2a 100644 --- a/src/main/java/project/backend/business/archive/implement/ArchiveManager.java +++ b/src/main/java/project/backend/business/archive/implement/ArchiveManager.java @@ -12,9 +12,12 @@ @RequiredArgsConstructor public class ArchiveManager { + private static final int MAX_ARCHIVES = 20; + private final ArchiveRepository archiveRepository; public Archive createArchive(User user, String name) { + validateArchiveCount(user); Archive newArchive = Archive.createArchive(user, name); return archiveRepository.save(newArchive); } @@ -34,4 +37,10 @@ public void deleteArchive(Archive archive) { archive.setActivated(Boolean.FALSE); archiveRepository.save(archive); } + + private void validateArchiveCount(User user) { + if (archiveRepository.countByUserIdAndActivatedTrue(user.getId()) >= MAX_ARCHIVES) { + throw new CustomException(ErrorCode.BAD_REQUEST); + } + } } diff --git a/src/main/java/project/backend/presentation/archive/request/CreateUpdateArchiveRequest.java b/src/main/java/project/backend/presentation/archive/request/CreateUpdateArchiveRequest.java index 89c1e14..3db520f 100644 --- a/src/main/java/project/backend/presentation/archive/request/CreateUpdateArchiveRequest.java +++ b/src/main/java/project/backend/presentation/archive/request/CreateUpdateArchiveRequest.java @@ -1,7 +1,6 @@ package project.backend.presentation.archive.request; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; import lombok.Getter; import project.backend.business.archive.request.CreateUpdateArchiveServiceRequest; @@ -10,8 +9,7 @@ public class CreateUpdateArchiveRequest { @NotBlank(message = "아카이브 이름은 필수 입력 값입니다.") - @Size(min = 2, max = 30, message = "아카이브 이름은 2자 이상 30자 이하로 입력해야 합니다.") - @Pattern(regexp = "^[a-zA-Z0-9가-힣 ]*$", message = "아카이브 이름에는 특수 문자를 포함할 수 없습니다.") + @Size(max = 30, message = "아카이브 이름은 30자를 초과할 수 없습니다.") private String name; public CreateUpdateArchiveServiceRequest toServiceRequest() { diff --git a/src/main/java/project/backend/presentation/post/request/SummaryUrlRequest.java b/src/main/java/project/backend/presentation/post/request/SummaryUrlRequest.java index 03b3b49..490067e 100644 --- a/src/main/java/project/backend/presentation/post/request/SummaryUrlRequest.java +++ b/src/main/java/project/backend/presentation/post/request/SummaryUrlRequest.java @@ -11,7 +11,7 @@ public class SummaryUrlRequest { @NotBlank(message = "URL은 필수 값입니다.") - @Pattern(regexp = "^(https?|ftp)://[^\\s/$.?#].\\S*$", message = "유효한 URL 형식이어야 합니다.") + @Pattern(regexp = "^(https?|ftp)://[^\\s/$.?#@].*\\S*$", message = "유효한 URL 형식이어야 합니다.") private String url; @NotNull(message = "요약 옵션은 필수 값입니다.") diff --git a/src/main/java/project/backend/presentation/post/request/UpdatePostRequest.java b/src/main/java/project/backend/presentation/post/request/UpdatePostRequest.java index a5a79bc..3ce6b54 100644 --- a/src/main/java/project/backend/presentation/post/request/UpdatePostRequest.java +++ b/src/main/java/project/backend/presentation/post/request/UpdatePostRequest.java @@ -1,7 +1,6 @@ package project.backend.presentation.post.request; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; import java.util.List; import lombok.Getter; @@ -11,8 +10,7 @@ public class UpdatePostRequest { @NotBlank(message = "제목은 필수 입력 값입니다.") - @Size(max = 30, message = "제목은 30자를 초과할 수 없습니다.") - @Pattern(regexp = "^[a-zA-Z0-9가-힣 ]*$", message = "제목에 특수 문자를 사용할 수 없습니다.") + @Size(max = 100, message = "제목은 100자를 초과할 수 없습니다.") private String title; @NotBlank(message = "내용은 필수 입력 값입니다.") diff --git a/src/main/java/project/backend/repository/archive/ArchiveRepository.java b/src/main/java/project/backend/repository/archive/ArchiveRepository.java index 7801d56..2102db9 100644 --- a/src/main/java/project/backend/repository/archive/ArchiveRepository.java +++ b/src/main/java/project/backend/repository/archive/ArchiveRepository.java @@ -10,5 +10,8 @@ public interface ArchiveRepository extends JpaRepository { List findByUserIdAndActivatedTrue(Long userId); + Optional findByIdAndActivatedTrue(Long archiveId); + + int countByUserIdAndActivatedTrue(Long userId); }