From f002a65ba4d9f8730137fd62fe77df20557aaa92 Mon Sep 17 00:00:00 2001 From: lcs9317 Date: Tue, 30 Sep 2025 10:34:21 +0900 Subject: [PATCH 1/3] initdata --- .../node/controller/BaseLineController.java | 1 - .../node/repository/BaseLineRepository.java | 6 +- .../domain/node/service/BaseLineService.java | 7 + .../com/back/global/exception/ErrorCode.java | 1 + .../com/back/global/initdata/InitData.java | 155 +++++++++++++++--- 5 files changed, 143 insertions(+), 27 deletions(-) diff --git a/back/src/main/java/com/back/domain/node/controller/BaseLineController.java b/back/src/main/java/com/back/domain/node/controller/BaseLineController.java index e491c15..d470f2a 100644 --- a/back/src/main/java/com/back/domain/node/controller/BaseLineController.java +++ b/back/src/main/java/com/back/domain/node/controller/BaseLineController.java @@ -52,7 +52,6 @@ public ResponseEntity getBaseNode(@PathVariable Long baseNodeId) { // 사용자 전체 트리 조회 (베이스/결정 노드 일괄 반환) @GetMapping("/{baseLineId}/tree") public ResponseEntity getTreeForBaseLine(@PathVariable Long baseLineId) { - // 트리 조회 서비스 호출 TreeDto tree = nodeService.getTreeForBaseLine(baseLineId); return ResponseEntity.ok(tree); } diff --git a/back/src/main/java/com/back/domain/node/repository/BaseLineRepository.java b/back/src/main/java/com/back/domain/node/repository/BaseLineRepository.java index 5afe7d4..0bb05de 100644 --- a/back/src/main/java/com/back/domain/node/repository/BaseLineRepository.java +++ b/back/src/main/java/com/back/domain/node/repository/BaseLineRepository.java @@ -13,7 +13,9 @@ @Repository public interface BaseLineRepository extends JpaRepository { Optional findByUser(User user); - long countByUser(User user); // 기본 인덱스 계산용 + long countByUser(User user); + // Guest 베이스라인 1개 제한 확인용 + boolean existsByUser_id(Long userId); - boolean existsByUserAndTitle(User user, String title); // 충돌 회피용 + boolean existsByUserAndTitle(User user, String title); } \ No newline at end of file diff --git a/back/src/main/java/com/back/domain/node/service/BaseLineService.java b/back/src/main/java/com/back/domain/node/service/BaseLineService.java index c75b42e..3af5ffd 100644 --- a/back/src/main/java/com/back/domain/node/service/BaseLineService.java +++ b/back/src/main/java/com/back/domain/node/service/BaseLineService.java @@ -13,6 +13,7 @@ import com.back.domain.node.mapper.NodeMappers; import com.back.domain.node.repository.BaseLineRepository; import com.back.domain.node.repository.BaseNodeRepository; +import com.back.domain.user.entity.Role; import com.back.domain.user.entity.User; import com.back.domain.user.repository.UserRepository; import com.back.global.exception.ApiException; @@ -35,9 +36,15 @@ class BaseLineService { // 노드 일괄 생성(save chain) public BaseLineBulkCreateResponse createBaseLineWithNodes(BaseLineBulkCreateRequest request) { + support.validateBulkRequest(request); User user = userRepository.findById(request.userId()) .orElseThrow(() -> new ApiException(ErrorCode.USER_NOT_FOUND, "User not found: " + request.userId())); + + // Guest는 베이스라인 1개 제한 + if (user.getRole() == Role.GUEST && baseLineRepository.existsByUser_id(user.getId())) { + throw new ApiException(ErrorCode.GUEST_BASELINE_LIMIT, "Guest user can have only one baseline."); + } String title = support.normalizeOrAutoTitle(request.title(), user); BaseLine baseLine = baseLineRepository.save(BaseLine.builder().user(user).title(title).build()); diff --git a/back/src/main/java/com/back/global/exception/ErrorCode.java b/back/src/main/java/com/back/global/exception/ErrorCode.java index 8937101..70bf1e0 100644 --- a/back/src/main/java/com/back/global/exception/ErrorCode.java +++ b/back/src/main/java/com/back/global/exception/ErrorCode.java @@ -44,6 +44,7 @@ public enum ErrorCode { NODE_NOT_FOUND(HttpStatus.NOT_FOUND, "N001", "Node Not Found"), BASE_LINE_NOT_FOUND(HttpStatus.NOT_FOUND, "N002", "BaseLine Not Found"), DECISION_LINE_NOT_FOUND(HttpStatus.NOT_FOUND, "N003", "DecisionLine Not Found"), + GUEST_BASELINE_LIMIT(HttpStatus.BAD_REQUEST, "N004" , "Guest Base Line Limit Exceeded"), // Scenario Errors SCENARIO_NOT_FOUND(HttpStatus.NOT_FOUND, "SC001", "Scenario Not Found"), diff --git a/back/src/main/java/com/back/global/initdata/InitData.java b/back/src/main/java/com/back/global/initdata/InitData.java index 688421e..c2145f1 100644 --- a/back/src/main/java/com/back/global/initdata/InitData.java +++ b/back/src/main/java/com/back/global/initdata/InitData.java @@ -1,9 +1,14 @@ package com.back.global.initdata; -import com.back.domain.user.entity.Gender; -import com.back.domain.user.entity.Mbti; -import com.back.domain.user.entity.Role; -import com.back.domain.user.entity.User; +import com.back.domain.node.dto.PivotListDto; +import com.back.domain.node.dto.base.BaseLineBulkCreateRequest; +import com.back.domain.node.dto.base.BaseLineBulkCreateResponse; +import com.back.domain.node.dto.decision.DecNodeDto; +import com.back.domain.node.dto.decision.DecisionNodeFromBaseRequest; +import com.back.domain.node.dto.decision.DecisionNodeNextRequest; +import com.back.domain.node.entity.NodeCategory; +import com.back.domain.node.service.NodeService; +import com.back.domain.user.entity.*; import com.back.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.boot.CommandLineRunner; @@ -11,10 +16,10 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.List; /** - * 애플리케이션 시작 시 초기 데이터를 생성하는 컴포넌트. - * 개발 환경에서 필요한 기본 사용자(관리자, 일반 사용자)를 데이터베이스에 저장합니다. + * [요약] 기동 시 admin·user1 생성 → user1에 베이스라인(총7: 헤더+피벗5+테일) 1개와 결정라인(총5 노드) 1개 시드 주입. */ @Component @RequiredArgsConstructor @@ -22,12 +27,14 @@ public class InitData implements CommandLineRunner { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; + private final NodeService nodeService; + // 가장 중요한 함수 위에 한줄로만 요약 + // user1을 만들고 베이스라인(7)과 결정라인(5)을 시드로 주입한다 @Override - public void run(String... args) throws Exception { - // 애플리케이션 시작 시 초기 사용자 데이터 생성 + public void run(String... args) { if (userRepository.findByEmail("admin@example.com").isEmpty()) { - User admin = User.builder() + var admin = User.builder() .email("admin@example.com") .password(passwordEncoder.encode("admin1234!")) .role(Role.ADMIN) @@ -41,19 +48,119 @@ public void run(String... args) throws Exception { userRepository.save(admin); } - if (userRepository.findByEmail("user1@example.com").isEmpty()) { - User user1 = User.builder() - .email("user1@example.com") - .password(passwordEncoder.encode("user1234!")) - .role(Role.USER) - .username("사용자1") - .nickname("사용자닉네임") - .birthdayAt(LocalDateTime.of(1995, 5, 10, 0, 0)) - .gender(Gender.F) - .mbti(Mbti.ENFP) - .beliefs("개인주의") - .build(); - userRepository.save(user1); - } + var user1 = userRepository.findByEmail("user1@example.com") + .orElseGet(() -> userRepository.save( + User.builder() + .email("user1@example.com") + .password(passwordEncoder.encode("user1234!")) + .role(Role.USER) + .username("사용자1") + .nickname("사용자닉네임") + .birthdayAt(LocalDateTime.of(1995, 5, 10, 0, 0)) + .gender(Gender.F) + .mbti(Mbti.ENFP) + .beliefs("개인주의") + .build() + )); + + // 피벗 5개만 전송(서비스가 헤더/테일 자동 부착 -> 총 7노드) + BaseLineBulkCreateResponse baseRes = nodeService.createBaseLineWithNodes( + new BaseLineBulkCreateRequest( + user1.getId(), + "user1-기본 라인", + List.of( + new BaseLineBulkCreateRequest.BaseNodePayload( + NodeCategory.EDUCATION, "중학교 진학", "일반계 선택", 13, "중등 입학 및 진로 탐색 시작" + ), + new BaseLineBulkCreateRequest.BaseNodePayload( + NodeCategory.EDUCATION, "고교 진학", "이과 트랙", 16, "수학·물리 집중 선택" + ), + new BaseLineBulkCreateRequest.BaseNodePayload( + NodeCategory.EDUCATION, "대학 합격", "컴공 전공", 19, "알고리즘/네트워크 관심" + ), + new BaseLineBulkCreateRequest.BaseNodePayload( + NodeCategory.CAREER, "인턴 경험", "백엔드 인턴", 23, "스프링 부트 실무 체험" + ), + new BaseLineBulkCreateRequest.BaseNodePayload( + NodeCategory.CAREER, "첫 직장", "주니어 백엔드", 25, "API/DB 설계 중심" + ) + ) + ) + ); + + Long baseLineId = baseRes.baseLineId(); + PivotListDto pivots = nodeService.getPivotBaseNodes(baseLineId); + if (pivots.pivots() == null || pivots.pivots().isEmpty()) return; + + DecNodeDto d0 = nodeService.createDecisionNodeFromBase( + new DecisionNodeFromBaseRequest( + user1.getId(), + baseLineId, + 0, + null, + 0, + NodeCategory.CAREER, + "개발자 커리어 진입", + List.of("자바/스프링", "파이썬/데이터", "프론트/리액트"), + null, + "백엔드 중심 트랙을 초기 선택지로 제시" + ) + ); + + nodeService.createDecisionNodeNext( + new DecisionNodeNextRequest( + user1.getId(), + d0.id(), + NodeCategory.CAREER, + "클라우드 기초", + null, + List.of("AWS 기초", "GCP 기초"), + 0, + 0, + "EC2/RDS·CI/CD 파이프라인 구축" + ) + ); + + DecNodeDto d2 = nodeService.createDecisionNodeNext( + new DecisionNodeNextRequest( + user1.getId(), + d0.id(), + NodeCategory.CAREER, + "보안 기초", + null, + List.of("웹 보안", "네트워크 보안"), + 0, + 0, + "JWT·세션·CSRF/XSS 대응 심화" + ) + ); + + DecNodeDto d3 = nodeService.createDecisionNodeNext( + new DecisionNodeNextRequest( + user1.getId(), + d2.id(), + NodeCategory.CAREER, + "대용량 처리", + null, + List.of("캐시·큐", "검색"), + 0, + null, + "Redis·Kafka·Elasticsearch 실습" + ) + ); + + nodeService.createDecisionNodeNext( + new DecisionNodeNextRequest( + user1.getId(), + d3.id(), + NodeCategory.CAREER, + "운영/관측성", + null, + List.of("로그·모니터링", "SLO/알림"), + 0, + null, + "프로덕션 운영 지표와 알림 체계 정착" + ) + ); } -} \ No newline at end of file +} From 55ef3f7f3f2adbb5f4406977d5e73d6eeb6defd9 Mon Sep 17 00:00:00 2001 From: lcs9317 Date: Tue, 30 Sep 2025 11:05:56 +0900 Subject: [PATCH 2/3] initdata --- .../com/back/global/initdata/InitData.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/back/src/main/java/com/back/global/initdata/InitData.java b/back/src/main/java/com/back/global/initdata/InitData.java index c2145f1..ca21f24 100644 --- a/back/src/main/java/com/back/global/initdata/InitData.java +++ b/back/src/main/java/com/back/global/initdata/InitData.java @@ -29,7 +29,6 @@ public class InitData implements CommandLineRunner { private final PasswordEncoder passwordEncoder; private final NodeService nodeService; - // 가장 중요한 함수 위에 한줄로만 요약 // user1을 만들고 베이스라인(7)과 결정라인(5)을 시드로 주입한다 @Override public void run(String... args) { @@ -63,26 +62,25 @@ public void run(String... args) { .build() )); - // 피벗 5개만 전송(서비스가 헤더/테일 자동 부착 -> 총 7노드) BaseLineBulkCreateResponse baseRes = nodeService.createBaseLineWithNodes( new BaseLineBulkCreateRequest( user1.getId(), "user1-기본 라인", List.of( new BaseLineBulkCreateRequest.BaseNodePayload( - NodeCategory.EDUCATION, "중학교 진학", "일반계 선택", 13, "중등 입학 및 진로 탐색 시작" + NodeCategory.EDUCATION, "중학교 진학", "일반계 선택", 18, "중등 입학 및 진로 탐색 시작" ), new BaseLineBulkCreateRequest.BaseNodePayload( - NodeCategory.EDUCATION, "고교 진학", "이과 트랙", 16, "수학·물리 집중 선택" + NodeCategory.EDUCATION, "고교 진학", "이과 트랙", 20, "수학·물리 집중 선택" ), new BaseLineBulkCreateRequest.BaseNodePayload( - NodeCategory.EDUCATION, "대학 합격", "컴공 전공", 19, "알고리즘/네트워크 관심" + NodeCategory.EDUCATION, "대학 합격", "컴공 전공", 22, "알고리즘/네트워크 관심" ), new BaseLineBulkCreateRequest.BaseNodePayload( - NodeCategory.CAREER, "인턴 경험", "백엔드 인턴", 23, "스프링 부트 실무 체험" + NodeCategory.CAREER, "인턴 경험", "백엔드 인턴", 24, "스프링 부트 실무 체험" ), new BaseLineBulkCreateRequest.BaseNodePayload( - NodeCategory.CAREER, "첫 직장", "주니어 백엔드", 25, "API/DB 설계 중심" + NodeCategory.CAREER, "첫 직장", "주니어 백엔드", 26, "API/DB 설계 중심" ) ) ) @@ -101,13 +99,13 @@ public void run(String... args) { 0, NodeCategory.CAREER, "개발자 커리어 진입", - List.of("자바/스프링", "파이썬/데이터", "프론트/리액트"), - null, + List.of("자바/스프링", "파이썬/데이터"), + 0, "백엔드 중심 트랙을 초기 선택지로 제시" ) ); - nodeService.createDecisionNodeNext( + DecNodeDto d1 = nodeService.createDecisionNodeNext( new DecisionNodeNextRequest( user1.getId(), d0.id(), @@ -124,7 +122,7 @@ public void run(String... args) { DecNodeDto d2 = nodeService.createDecisionNodeNext( new DecisionNodeNextRequest( user1.getId(), - d0.id(), + d1.id(), NodeCategory.CAREER, "보안 기초", null, @@ -144,7 +142,7 @@ public void run(String... args) { null, List.of("캐시·큐", "검색"), 0, - null, + 0, "Redis·Kafka·Elasticsearch 실습" ) ); @@ -158,7 +156,7 @@ public void run(String... args) { null, List.of("로그·모니터링", "SLO/알림"), 0, - null, + 0, "프로덕션 운영 지표와 알림 체계 정착" ) ); From 8864e8e4e5ad243d138d00f37bfb2a4750cbdc3d Mon Sep 17 00:00:00 2001 From: lcs9317 Date: Tue, 30 Sep 2025 11:53:58 +0900 Subject: [PATCH 3/3] bug fix --- .../comment/service/CommentService.java | 5 +-- .../controller/CommentControllerTest.java | 22 +++++++++++-- .../controller/BaseLineControllerTest.java | 27 ++++++++++++++-- .../DecisionFlowControllerTest.java | 27 ++++++++++++++-- .../DecisionLineControllerTest.java | 31 ++++++++++++++++--- .../post/controller/PostControllerTest.java | 19 ++++++++++-- 6 files changed, 112 insertions(+), 19 deletions(-) diff --git a/back/src/main/java/com/back/domain/comment/service/CommentService.java b/back/src/main/java/com/back/domain/comment/service/CommentService.java index 6af17f0..06c22c5 100644 --- a/back/src/main/java/com/back/domain/comment/service/CommentService.java +++ b/back/src/main/java/com/back/domain/comment/service/CommentService.java @@ -3,7 +3,6 @@ import com.back.domain.comment.dto.CommentRequest; import com.back.domain.comment.dto.CommentResponse; import com.back.domain.comment.entity.Comment; -import com.back.domain.comment.enums.CommentSortType; import com.back.domain.comment.mapper.CommentMappers; import com.back.domain.comment.repository.CommentRepository; import com.back.domain.post.entity.Post; @@ -12,12 +11,9 @@ import com.back.domain.user.repository.UserRepository; import com.back.global.exception.ApiException; import com.back.global.exception.ErrorCode; -import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -60,6 +56,7 @@ public Long updateComment(Long userId, Long commentId, CommentRequest request) { return comment.getId(); } + @Transactional public void deleteComment(Long userId, Long commentId) { Comment comment = commentRepository.findById(commentId) .orElseThrow(() -> new ApiException(ErrorCode.COMMENT_NOT_FOUND)); diff --git a/back/src/test/java/com/back/domain/comment/controller/CommentControllerTest.java b/back/src/test/java/com/back/domain/comment/controller/CommentControllerTest.java index d499dc5..714a975 100644 --- a/back/src/test/java/com/back/domain/comment/controller/CommentControllerTest.java +++ b/back/src/test/java/com/back/domain/comment/controller/CommentControllerTest.java @@ -12,6 +12,7 @@ import com.back.domain.user.repository.UserRepository; import com.back.global.security.CustomUserDetails; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -23,8 +24,9 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ReflectionUtils; import java.lang.reflect.Field; @@ -40,7 +42,21 @@ @ActiveProfiles("test") @SpringBootTest @AutoConfigureMockMvc(addFilters = false) -@Transactional +@SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED) +@Sql( + statements = { + "SET REFERENTIAL_INTEGRITY FALSE", + "TRUNCATE TABLE COMMENTS", + "TRUNCATE TABLE POST", + "TRUNCATE TABLE USERS", + + "ALTER TABLE COMMENTS ALTER COLUMN id RESTART WITH 1", + "ALTER TABLE POST ALTER COLUMN id RESTART WITH 1", + "ALTER TABLE USERS ALTER COLUMN id RESTART WITH 1", + "SET REFERENTIAL_INTEGRITY TRUE" + }, + executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD +) class CommentControllerTest { @Autowired private UserRepository userRepository; @@ -48,12 +64,14 @@ class CommentControllerTest { @Autowired private CommentRepository commentRepository; @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; + @Autowired private EntityManager em; private User testUser; private User anotherUser; private Post testPost; private Comment testComment; + @BeforeEach void setUp() { String uid1 = UUID.randomUUID().toString().substring(0, 5); diff --git a/back/src/test/java/com/back/domain/node/controller/BaseLineControllerTest.java b/back/src/test/java/com/back/domain/node/controller/BaseLineControllerTest.java index fe0f4d1..120bb3e 100644 --- a/back/src/test/java/com/back/domain/node/controller/BaseLineControllerTest.java +++ b/back/src/test/java/com/back/domain/node/controller/BaseLineControllerTest.java @@ -20,6 +20,8 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; import org.springframework.test.web.servlet.MockMvc; import java.time.LocalDateTime; @@ -35,6 +37,25 @@ @AutoConfigureMockMvc(addFilters = false) @TestInstance(TestInstance.Lifecycle.PER_CLASS) @DisplayName("Re:Life — BaseLine/BaseNode 통합 테스트") +@SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED) +@Sql( + statements = { + "SET REFERENTIAL_INTEGRITY FALSE", + "TRUNCATE TABLE DECISION_NODES", + "TRUNCATE TABLE DECISION_LINES", + "TRUNCATE TABLE BASE_NODES", + "TRUNCATE TABLE BASE_LINES", + "TRUNCATE TABLE USERS", + + "ALTER TABLE DECISION_NODES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE DECISION_LINES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE BASE_NODES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE BASE_LINES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 1", + "SET REFERENTIAL_INTEGRITY TRUE" + }, + executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD +) public class BaseLineControllerTest { @Autowired private MockMvc mockMvc; @@ -46,17 +67,17 @@ public class BaseLineControllerTest { private Long userId; - @BeforeAll + @BeforeEach void initUser() { String uid = UUID.randomUUID().toString().substring(0, 8); User user = User.builder() .email("user_" + uid + "@test.local") - .role(Role.GUEST) + .role(Role.USER) .birthdayAt(LocalDateTime.now().minusYears(25)) .gender(Gender.M) .mbti(Mbti.INTJ) .beliefs("NONE") - .authProvider(AuthProvider.GUEST) + .authProvider(AuthProvider.LOCAL) .nickname("tester-" + uid) .username("name-" + uid) .build(); diff --git a/back/src/test/java/com/back/domain/node/controller/DecisionFlowControllerTest.java b/back/src/test/java/com/back/domain/node/controller/DecisionFlowControllerTest.java index 7ab1fb3..f2bd984 100644 --- a/back/src/test/java/com/back/domain/node/controller/DecisionFlowControllerTest.java +++ b/back/src/test/java/com/back/domain/node/controller/DecisionFlowControllerTest.java @@ -18,6 +18,8 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; import org.springframework.test.web.servlet.MockMvc; import java.time.LocalDateTime; @@ -33,6 +35,25 @@ @AutoConfigureMockMvc(addFilters = false) @TestInstance(TestInstance.Lifecycle.PER_CLASS) @DisplayName("Re:Life — DecisionFlowController from-base · next · cancel · complete 통합 테스트") +@SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED) +@Sql( + statements = { + "SET REFERENTIAL_INTEGRITY FALSE", + "TRUNCATE TABLE DECISION_NODES", + "TRUNCATE TABLE DECISION_LINES", + "TRUNCATE TABLE BASE_NODES", + "TRUNCATE TABLE BASE_LINES", + "TRUNCATE TABLE USERS", + + "ALTER TABLE DECISION_NODES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE DECISION_LINES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE BASE_NODES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE BASE_LINES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 1", + "SET REFERENTIAL_INTEGRITY TRUE" + }, + executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD +) public class DecisionFlowControllerTest { @Autowired private MockMvc mockMvc; @@ -41,17 +62,17 @@ public class DecisionFlowControllerTest { private Long userId; - @BeforeAll + @BeforeEach void initUser() { String uid = UUID.randomUUID().toString().substring(0, 8); User user = User.builder() .email("user_" + uid + "@test.local") - .role(Role.GUEST) + .role(Role.USER) .birthdayAt(LocalDateTime.now().minusYears(25)) .gender(Gender.M) .mbti(Mbti.INTJ) .beliefs("NONE") - .authProvider(AuthProvider.GUEST) + .authProvider(AuthProvider.LOCAL) .nickname("tester-" + uid) .username("name-" + uid) .build(); diff --git a/back/src/test/java/com/back/domain/node/controller/DecisionLineControllerTest.java b/back/src/test/java/com/back/domain/node/controller/DecisionLineControllerTest.java index f33093d..9afd9cc 100644 --- a/back/src/test/java/com/back/domain/node/controller/DecisionLineControllerTest.java +++ b/back/src/test/java/com/back/domain/node/controller/DecisionLineControllerTest.java @@ -23,6 +23,8 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; import org.springframework.test.web.servlet.MockMvc; import java.time.LocalDateTime; @@ -36,6 +38,25 @@ @AutoConfigureMockMvc(addFilters = false) @TestInstance(TestInstance.Lifecycle.PER_CLASS) @DisplayName("Re:Life — DecisionLine 조회(목록·상세) 통합 테스트") +@SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED) +@Sql( + statements = { + "SET REFERENTIAL_INTEGRITY FALSE", + "TRUNCATE TABLE DECISION_NODES", + "TRUNCATE TABLE DECISION_LINES", + "TRUNCATE TABLE BASE_NODES", + "TRUNCATE TABLE BASE_LINES", + "TRUNCATE TABLE USERS", + + "ALTER TABLE DECISION_NODES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE DECISION_LINES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE BASE_NODES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE BASE_LINES ALTER COLUMN ID RESTART WITH 1", + "ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 1", + "SET REFERENTIAL_INTEGRITY TRUE" + }, + executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD +) public class DecisionLineControllerTest { @Autowired private MockMvc mockMvc; @@ -44,17 +65,17 @@ public class DecisionLineControllerTest { private Long userId; - @BeforeAll + @BeforeEach void initUser() { String uid = UUID.randomUUID().toString().substring(0, 8); User user = User.builder() .email("user_" + uid + "@test.local") - .role(Role.GUEST) + .role(Role.USER) .birthdayAt(LocalDateTime.now().minusYears(25)) .gender(Gender.M) .mbti(Mbti.INTJ) .beliefs("NONE") - .authProvider(AuthProvider.GUEST) + .authProvider(AuthProvider.LOCAL) .nickname("tester-" + uid) .username("name-" + uid) .build(); @@ -96,12 +117,12 @@ void success_emptyListWhenNoLines() throws Exception { String uid2 = UUID.randomUUID().toString().substring(0, 8); Long newUserId = userRepository.save(User.builder() .email("user_" + uid2 + "@test.local") - .role(Role.GUEST) + .role(Role.USER) .birthdayAt(LocalDateTime.now().minusYears(23)) .gender(Gender.F) .mbti(Mbti.ENFP) .beliefs("NONE") - .authProvider(AuthProvider.GUEST) + .authProvider(AuthProvider.LOCAL) .nickname("tester2-" + uid2) .username("tester2-" + uid2) .build()) diff --git a/back/src/test/java/com/back/domain/post/controller/PostControllerTest.java b/back/src/test/java/com/back/domain/post/controller/PostControllerTest.java index 6e68e47..3a80733 100644 --- a/back/src/test/java/com/back/domain/post/controller/PostControllerTest.java +++ b/back/src/test/java/com/back/domain/post/controller/PostControllerTest.java @@ -25,8 +25,9 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.UUID; @@ -38,7 +39,21 @@ @ActiveProfiles("test") @SpringBootTest @AutoConfigureMockMvc(addFilters = false) -@Transactional +@SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED) +@Sql( + statements = { + "SET REFERENTIAL_INTEGRITY FALSE", + "TRUNCATE TABLE COMMENTS", + "TRUNCATE TABLE POST", + "TRUNCATE TABLE USERS", + + "ALTER TABLE COMMENTS ALTER COLUMN id RESTART WITH 1", + "ALTER TABLE POST ALTER COLUMN id RESTART WITH 1", + "ALTER TABLE USERS ALTER COLUMN id RESTART WITH 1", + "SET REFERENTIAL_INTEGRITY TRUE" + }, + executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD +) class PostControllerTest { @Autowired