139 lines
6.2 KiB
Java
139 lines
6.2 KiB
Java
package sgis.surveysystem.service;
|
|
|
|
import sgis.surveysystem.domain.Survey;
|
|
import sgis.surveysystem.mapper.SurveyMapper;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.util.List;
|
|
import java.util.NoSuchElementException;
|
|
import java.util.Optional; // Optional 클래스 임포트
|
|
import java.util.UUID;
|
|
|
|
/**
|
|
* 설문(Survey) 관련 비즈니스 로직을 처리하는 서비스 클래스.
|
|
* MyBatis Mapper를 통해 데이터베이스와 상호작용합니다.
|
|
*/
|
|
@Service
|
|
@RequiredArgsConstructor // Lombok을 사용하여 final 필드를 인자로 받는 생성자를 자동 생성합니다. (의존성 주입)
|
|
@Transactional // 클래스 레벨에 트랜잭션 설정을 적용합니다.
|
|
public class SurveyService {
|
|
|
|
private final SurveyMapper surveyMapper;
|
|
|
|
/**
|
|
* 새로운 설문을 생성합니다.
|
|
* 설문 ID는 애플리케이션에서 UUID를 생성하여 할당합니다.
|
|
*
|
|
* @param surveyTitle 설문 제목
|
|
* @param surveyDescription 설문 상세 설명
|
|
* @param startDate 설문 시작 일시
|
|
* @param endDate 설문 종료 일시
|
|
* @return 생성된 Survey 객체
|
|
*/
|
|
public Survey createSurvey(String surveyTitle, String surveyDescription, LocalDateTime startDate, LocalDateTime endDate) {
|
|
// 애플리케이션에서 새로운 UUID를 생성하여 설문 ID로 사용합니다.
|
|
// 데이터베이스의 DEFAULT gen_random_uuid() 설정과 무관하게 동작합니다.
|
|
Survey survey = Survey.builder()
|
|
.surveyId(UUID.randomUUID())
|
|
.surveyTitle(surveyTitle)
|
|
.surveyDescription(surveyDescription)
|
|
.createdAt(LocalDateTime.now()) // 현재 시각으로 생성일 설정
|
|
.updatedAt(LocalDateTime.now()) // 현재 시각으로 수정일 설정
|
|
.isActive(true) // 기본적으로 활성화 상태로 설정
|
|
.startDate(startDate)
|
|
.endDate(endDate)
|
|
.build();
|
|
surveyMapper.insertSurvey(survey); // Mapper를 통해 데이터베이스에 설문 정보 삽입
|
|
return survey;
|
|
}
|
|
|
|
/**
|
|
* 모든 설문 목록을 조회합니다.
|
|
* 읽기 전용 트랜잭션으로 설정하여 성능을 최적화합니다.
|
|
*
|
|
* @return 모든 Survey 객체 리스트
|
|
*/
|
|
@Transactional(readOnly = true)
|
|
public List<Survey> getAllSurveys() {
|
|
return surveyMapper.findAllSurveys(); // Mapper를 통해 모든 설문 조회
|
|
}
|
|
|
|
/**
|
|
* 특정 ID의 설문을 조회합니다.
|
|
* 읽기 전용 트랜잭션으로 설정합니다.
|
|
*
|
|
* @param surveyId 설문 고유 ID
|
|
* @return 조회된 Survey 객체
|
|
* @throws NoSuchElementException 해당 ID의 설문이 데이터베이스에 없을 경우 발생
|
|
*/
|
|
@Transactional(readOnly = true)
|
|
public Survey getSurveyById(UUID surveyId) {
|
|
// Mapper에서 직접 Survey 객체를 반환하도록 변경했으므로, Optional.ofNullable()을 사용합니다.
|
|
return Optional.ofNullable(surveyMapper.findSurveyById(surveyId))
|
|
.orElseThrow(() -> new NoSuchElementException("Survey not found with ID: " + surveyId)); // 없을 경우 예외 발생
|
|
}
|
|
|
|
/**
|
|
* 설문 정보를 업데이트합니다.
|
|
* 업데이트 전에 해당 설문이 존재하는지 확인합니다.
|
|
*
|
|
* @param surveyId 업데이트할 설문의 고유 ID
|
|
* @param surveyTitle 새로운 설문 제목
|
|
* @param surveyDescription 새로운 설문 설명
|
|
* @param isActive 설문 활성화 여부
|
|
* @param startDate 새로운 설문 시작 일시
|
|
* @param endDate 새로운 설문 종료 일시
|
|
* @return 업데이트된 Survey 객체 (업데이트 후 다시 조회하여 최신 상태 반환)
|
|
* @throws NoSuchElementException 해당 ID의 설문이 없을 경우
|
|
*/
|
|
public Survey updateSurvey(UUID surveyId, String surveyTitle, String surveyDescription, Boolean isActive, LocalDateTime startDate, LocalDateTime endDate) {
|
|
// 업데이트할 설문이 존재하는지 먼저 확인합니다.
|
|
getSurveyById(surveyId);
|
|
|
|
// 업데이트할 필드들을 포함하는 Survey 객체를 생성합니다.
|
|
// MyBatis는 이 객체의 필드 값을 사용하여 SQL 쿼리의 파라미터를 채웁니다.
|
|
Survey survey = Survey.builder()
|
|
.surveyId(surveyId) // 업데이트 대상 설문 ID
|
|
.surveyTitle(surveyTitle)
|
|
.surveyDescription(surveyDescription)
|
|
.isActive(isActive)
|
|
.startDate(startDate)
|
|
.endDate(endDate)
|
|
.updatedAt(LocalDateTime.now()) // 업데이트 시각을 현재로 갱신
|
|
.build();
|
|
surveyMapper.updateSurvey(survey); // Mapper를 통해 설문 정보 업데이트
|
|
|
|
// 업데이트된 최신 정보를 데이터베이스에서 다시 조회하여 반환합니다.
|
|
return getSurveyById(surveyId);
|
|
}
|
|
|
|
/**
|
|
* 특정 ID의 설문을 삭제합니다.
|
|
* 삭제 전에 해당 설문이 존재하는지 확인합니다.
|
|
*
|
|
* @param surveyId 삭제할 설문의 고유 ID
|
|
* @throws NoSuchElementException 해당 ID의 설문이 없을 경우
|
|
*/
|
|
public void deleteSurvey(UUID surveyId) {
|
|
// 삭제할 설문이 존재하는지 먼저 확인합니다.
|
|
getSurveyById(surveyId);
|
|
surveyMapper.deleteSurvey(surveyId); // Mapper를 통해 설문 삭제
|
|
}
|
|
|
|
/**
|
|
* 특정 ID의 설문을 비활성화합니다.
|
|
* 비활성화 전에 해당 설문이 존재하는지 확인합니다.
|
|
*
|
|
* @param surveyId 비활성화할 설문의 고유 ID
|
|
* @return 비활성화된 Survey 객체 (업데이트 후 다시 조회하여 최신 상태 반환)
|
|
* @throws NoSuchElementException 해당 ID의 설문이 없을 경우
|
|
*/
|
|
public Survey deactivateSurvey(UUID surveyId) {
|
|
getSurveyById(surveyId); // 존재 여부 확인
|
|
surveyMapper.updateSurveyStatus(surveyId, false); // Mapper를 통해 설문 상태 업데이트
|
|
return getSurveyById(surveyId); // 업데이트된 상태로 반환
|
|
}
|
|
} |