diff --git a/backend/build.gradle b/backend/build.gradle index 5239151..658729f 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -31,6 +31,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' + // AOP + implementation 'org.springframework.boot:spring-boot-starter-aop' + // Email implementation 'org.springframework.boot:spring-boot-starter-mail' diff --git a/backend/src/main/java/com/postdm/backend/domain/estimate/entity/Estimate.java b/backend/src/main/java/com/postdm/backend/domain/estimate/entity/Estimate.java index 76f0924..82db4ad 100644 --- a/backend/src/main/java/com/postdm/backend/domain/estimate/entity/Estimate.java +++ b/backend/src/main/java/com/postdm/backend/domain/estimate/entity/Estimate.java @@ -2,6 +2,7 @@ import com.postdm.backend.domain.member.domain.entity.Member; import jakarta.persistence.*; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -25,6 +26,7 @@ public class Estimate { private LocalDateTime createdAt; + @Builder public Estimate(String content, Member member) { this.title = generateTitle(content); this.content = content; diff --git a/backend/src/main/java/com/postdm/backend/global/common/aop/PerformanceLogAspect.java b/backend/src/main/java/com/postdm/backend/global/common/aop/PerformanceLogAspect.java new file mode 100644 index 0000000..571e764 --- /dev/null +++ b/backend/src/main/java/com/postdm/backend/global/common/aop/PerformanceLogAspect.java @@ -0,0 +1,21 @@ +package com.postdm.backend.global.common.aop; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +@Slf4j +@Aspect +@Component +public class PerformanceLogAspect { + @Around("execution(* com.postdm.backend.domain.estimate..*(..))") + public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { + long start = System.currentTimeMillis(); + Object result = joinPoint.proceed(); + long end = System.currentTimeMillis(); + log.info("[PERF] " + joinPoint.getSignature() + " took " + (end - start) + "ms"); + return result; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/postdm/backend/global/init/DummyDataInitializer.java b/backend/src/main/java/com/postdm/backend/global/init/DummyDataInitializer.java new file mode 100644 index 0000000..a30df95 --- /dev/null +++ b/backend/src/main/java/com/postdm/backend/global/init/DummyDataInitializer.java @@ -0,0 +1,46 @@ +package com.postdm.backend.global.init; + +import com.postdm.backend.domain.estimate.entity.Estimate; +import com.postdm.backend.domain.estimate.entity.EstimateRepository; +import com.postdm.backend.domain.member.domain.entity.Member; +import com.postdm.backend.domain.member.domain.repository.MemberRepository; +import com.postdm.backend.global.common.exception.CustomException; +import com.postdm.backend.global.common.response.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("dev") // 로컬에서만 실행되도록 제한 +public class DummyDataInitializer implements CommandLineRunner { + private final EstimateRepository estimateRepository; + private final MemberRepository memberRepository; + + @Override + public void run(String... args) { + if (estimateRepository.count() > 0) { + log.info("[INIT] 이미 견적서 데이터가 존재합니다. 초기화를 건너뜁니다."); + return; + } + + log.info("[INIT] 더미 견적서 생성 시작"); + + Member member = memberRepository.findById(1L) + .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); + + for (int i = 0; i < 10000; i++) { + Estimate estimate = Estimate.builder() + .content("더미 데이터 자동 생성 " + i) + .member(member) + .build(); + estimateRepository.save(estimate); + } + + log.info("[INIT] 테스트용 견적서 10000건 삽입 완료"); + } +} \ No newline at end of file diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 9374622..03341e3 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -2,7 +2,7 @@ spring: application: name: backend profiles: - active: ${SPRING_PROFILES_ACTIVE:dev} + active: ${SPRING_PROFILES_ACTIVE:prod} # 로컬 테스트 시, dev로 변경 # Swagger 설정 springdoc: