diff --git a/src/main/java/com/sosaw/sosaw/domain/basicsound/entity/BasicSound.java b/src/main/java/com/sosaw/sosaw/domain/basicsound/entity/BasicSound.java new file mode 100644 index 0000000..3fdbed0 --- /dev/null +++ b/src/main/java/com/sosaw/sosaw/domain/basicsound/entity/BasicSound.java @@ -0,0 +1,26 @@ +package com.sosaw.sosaw.domain.basicsound.entity; + +import com.sosaw.sosaw.domain.basicsound.entity.enums.BasicSoundType; +import com.sosaw.sosaw.domain.soundsetting.entity.SoundSetting; +import com.sosaw.sosaw.domain.user.entity.User; +import com.sosaw.sosaw.global.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "Basic_Sound") +public class BasicSound extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="basic_id") + private Long id; // pk + + @Enumerated(EnumType.STRING) + @Column(name = "sound_type", nullable = false, length = 30) + private BasicSoundType soundType; // 기본음 소리 종류를 구분하기 위함 +} diff --git a/src/main/java/com/sosaw/sosaw/domain/basicsound/entity/enums/BasicSoundType.java b/src/main/java/com/sosaw/sosaw/domain/basicsound/entity/enums/BasicSoundType.java new file mode 100644 index 0000000..8000a87 --- /dev/null +++ b/src/main/java/com/sosaw/sosaw/domain/basicsound/entity/enums/BasicSoundType.java @@ -0,0 +1,16 @@ +package com.sosaw.sosaw.domain.basicsound.entity.enums; + +public enum BasicSoundType { + DOG_BARK, // 강아지 짓는 소리 + CAT_MEOW, // 고양이 소리 + HUMAN_LAUGH, // 사람 웃는 소리 + BABY_CRY, // 아기 우는 소리 + PHONE_RING, // 전화벨 소리 + DOORBELL, // 초인종 소리 + DOOR_OPEN_CLOSE, // 문 여닫는 소리 + KNOCK, // 노크 소리 + FIRE_ALARM, // 화재 경보기 소리 + MICROWAVE, // 전자레인지 소리 + CAR_HORN, // 경적 소리 + SIREN // 비상 경보음 소리 +} diff --git a/src/main/java/com/sosaw/sosaw/domain/basicsound/repository/BasicSoundRepository.java b/src/main/java/com/sosaw/sosaw/domain/basicsound/repository/BasicSoundRepository.java new file mode 100644 index 0000000..7592f5d --- /dev/null +++ b/src/main/java/com/sosaw/sosaw/domain/basicsound/repository/BasicSoundRepository.java @@ -0,0 +1,10 @@ +package com.sosaw.sosaw.domain.basicsound.repository; + +import com.sosaw.sosaw.domain.basicsound.entity.BasicSound; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface BasicSoundRepository extends JpaRepository { + +} diff --git a/src/main/java/com/sosaw/sosaw/domain/customsound/service/CustomSoundServiceImpl.java b/src/main/java/com/sosaw/sosaw/domain/customsound/service/CustomSoundServiceImpl.java index bda2fdc..716ac74 100644 --- a/src/main/java/com/sosaw/sosaw/domain/customsound/service/CustomSoundServiceImpl.java +++ b/src/main/java/com/sosaw/sosaw/domain/customsound/service/CustomSoundServiceImpl.java @@ -44,7 +44,7 @@ public void upload(SoundUploadReq req, User user) { CustomSound sound = CustomSound.toEntity(user, req, mfcc); // 커스텀 소리를 생성할때, SoundSetting 부분도 같이 생기게 함 - SoundSetting.createForCustom(sound); + SoundSetting.createForCustom(user,sound); customSoundRepository.save(sound); } diff --git a/src/main/java/com/sosaw/sosaw/domain/soundsetting/entity/SoundSetting.java b/src/main/java/com/sosaw/sosaw/domain/soundsetting/entity/SoundSetting.java index 1ccc533..808d074 100644 --- a/src/main/java/com/sosaw/sosaw/domain/soundsetting/entity/SoundSetting.java +++ b/src/main/java/com/sosaw/sosaw/domain/soundsetting/entity/SoundSetting.java @@ -1,7 +1,9 @@ package com.sosaw.sosaw.domain.soundsetting.entity; +import com.sosaw.sosaw.domain.basicsound.entity.BasicSound; import com.sosaw.sosaw.domain.customsound.entity.CustomSound; import com.sosaw.sosaw.domain.soundsetting.entity.enums.SoundKind; +import com.sosaw.sosaw.domain.user.entity.User; import com.sosaw.sosaw.global.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; @@ -19,6 +21,10 @@ public class SoundSetting extends BaseEntity { @Column(name="setting_id") private Long id; + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "user_id", nullable = false) + private User user; + // 알람 유무 @Column(name = "alarm_enabled", nullable = false) private boolean alarmEnabled=true; @@ -33,7 +39,9 @@ public class SoundSetting extends BaseEntity { private CustomSound customSound; // 기본 소리 (나중에 추가) - + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "basic_id") + private BasicSound basicSound; // 소리 타입 (커스텀 or 기본) @Enumerated(EnumType.STRING) @@ -42,26 +50,29 @@ public class SoundSetting extends BaseEntity { public void setCustomSound(CustomSound customSound) { this.customSound = customSound; - // 양방향 동기화 if (customSound != null && customSound.getSoundSetting() != this) { customSound.setSoundSetting(this); } + this.basicSound = null; + this.soundKind = SoundKind.CUSTOM; + } - // 커스텀 연관이면 KIND는 CUSTOM - if (this.soundKind == null || this.soundKind != SoundKind.CUSTOM) { - this.soundKind = SoundKind.CUSTOM; - } + public void setBasicSound(BasicSound basicSound) { + this.basicSound = basicSound; + this.customSound = null; + this.soundKind = SoundKind.DEFAULT; } + // 변경 메소드 public void changeAlarmEnabled(boolean enabled) { this.alarmEnabled = enabled; } - public void changeVibrationType(int vibrationLevel) { this.vibrationLevel = vibrationLevel; } - public static SoundSetting createForCustom(CustomSound customSound) { + public static SoundSetting createForCustom(User user, CustomSound customSound) { SoundSetting setting = SoundSetting.builder() + .user(user) .alarmEnabled(true) // 기본값 .vibrationLevel(1) // 기본값 .soundKind(SoundKind.CUSTOM) @@ -69,4 +80,15 @@ public static SoundSetting createForCustom(CustomSound customSound) { setting.setCustomSound(customSound); // 양방향 세팅 return setting; } + + public static SoundSetting createForBasic(User user, BasicSound basicSound) { + SoundSetting setting = SoundSetting.builder() + .user(user) + .alarmEnabled(true) + .vibrationLevel(1) + .soundKind(SoundKind.DEFAULT) + .build(); + setting.setBasicSound(basicSound); + return setting; + } } diff --git a/src/main/java/com/sosaw/sosaw/domain/soundsetting/repository/SoundSettingRepository.java b/src/main/java/com/sosaw/sosaw/domain/soundsetting/repository/SoundSettingRepository.java index 1de5a19..ad9058e 100644 --- a/src/main/java/com/sosaw/sosaw/domain/soundsetting/repository/SoundSettingRepository.java +++ b/src/main/java/com/sosaw/sosaw/domain/soundsetting/repository/SoundSettingRepository.java @@ -11,4 +11,8 @@ public interface SoundSettingRepository extends JpaRepository findByCustomSoundId(Long customId); + + Optional findByUserUserIdAndCustomSoundId(Long userId, Long customId); + Optional findByUserUserIdAndBasicSoundId(Long userId, Long basicId); + } diff --git a/src/main/java/com/sosaw/sosaw/domain/soundsetting/service/SoundSettingServiceImpl.java b/src/main/java/com/sosaw/sosaw/domain/soundsetting/service/SoundSettingServiceImpl.java index 7c212f3..1fa5828 100644 --- a/src/main/java/com/sosaw/sosaw/domain/soundsetting/service/SoundSettingServiceImpl.java +++ b/src/main/java/com/sosaw/sosaw/domain/soundsetting/service/SoundSettingServiceImpl.java @@ -1,5 +1,7 @@ package com.sosaw.sosaw.domain.soundsetting.service; +import com.sosaw.sosaw.domain.basicsound.entity.BasicSound; +import com.sosaw.sosaw.domain.basicsound.repository.BasicSoundRepository; import com.sosaw.sosaw.domain.customsound.exception.NotFoundSoundException; import com.sosaw.sosaw.domain.customsound.entity.CustomSound; import com.sosaw.sosaw.domain.customsound.repository.CustomSoundRepository; @@ -16,6 +18,7 @@ @RequiredArgsConstructor public class SoundSettingServiceImpl implements SoundSettingService { + private final BasicSoundRepository basicSoundRepository; private final CustomSoundRepository customSoundRepository; private final SoundSettingRepository soundSettingRepository; @@ -48,7 +51,7 @@ public void updateCustomAlarm(User user, SoundAlarmUpdateReq req) { // 2) 설정 조회 or 생성 SoundSetting setting = soundSettingRepository .findByCustomSoundId(customSound.getId()) - .orElseGet(() -> SoundSetting.createForCustom(customSound)); + .orElseGet(() -> SoundSetting.createForCustom(user, customSound)); // 3) 알람 유무 반영 setting.changeAlarmEnabled(req.isAlarmEnabled()); @@ -68,7 +71,7 @@ public void updateCustomVibration(User user, SoundVibrationUpdateReq req) { // 2) 설정 조회 or 생성 SoundSetting setting = soundSettingRepository .findByCustomSoundId(customSound.getId()) - .orElseGet(() -> SoundSetting.createForCustom(customSound)); + .orElseGet(() -> SoundSetting.createForCustom(user, customSound)); // 3) 진동 종류 반영 (1~5) setting.changeVibrationType(req.getVibrationType()); @@ -79,12 +82,38 @@ public void updateCustomVibration(User user, SoundVibrationUpdateReq req) { @Override public void updateDefaultAlarm(User user, SoundAlarmUpdateReq req) { - throw new UnsupportedOperationException("DEFAULT 사운드는 아직 미구현입니다."); + // 1) 기본 사운드 검증 + BasicSound basicSound = basicSoundRepository.findById(req.getSoundId()) + .orElseThrow(NotFoundSoundException::new); + + // 2) 설정 조회 or 생성 + SoundSetting setting = soundSettingRepository + .findByUserUserIdAndBasicSoundId(user.getUserId(), basicSound.getId()) + .orElseGet(() -> SoundSetting.createForBasic(user, basicSound)); + + // 3) 알람 반영 + setting.changeAlarmEnabled(req.isAlarmEnabled()); + + // 4) 저장 + soundSettingRepository.save(setting); } @Override public void updateDefaultVibration(User user, SoundVibrationUpdateReq req) { - throw new UnsupportedOperationException("DEFAULT 사운드는 아직 미구현입니다."); + // 1) 기본 사운드 검증 + BasicSound basicSound = basicSoundRepository.findById(req.getSoundId()) + .orElseThrow(NotFoundSoundException::new); + + // 2) 설정 조회 or 생성 + SoundSetting setting = soundSettingRepository + .findByUserUserIdAndBasicSoundId(user.getUserId(), basicSound.getId()) + .orElseGet(() -> SoundSetting.createForBasic(user, basicSound)); + + // 3) 진동 종류 반영 (1~5) + setting.changeVibrationType(req.getVibrationType()); + + // 4) 저장 + soundSettingRepository.save(setting); } } diff --git a/src/main/java/com/sosaw/sosaw/domain/user/service/UserServiceImpl.java b/src/main/java/com/sosaw/sosaw/domain/user/service/UserServiceImpl.java index 2b946f2..cdc5ce0 100644 --- a/src/main/java/com/sosaw/sosaw/domain/user/service/UserServiceImpl.java +++ b/src/main/java/com/sosaw/sosaw/domain/user/service/UserServiceImpl.java @@ -1,5 +1,9 @@ package com.sosaw.sosaw.domain.user.service; +import com.sosaw.sosaw.domain.basicsound.entity.BasicSound; +import com.sosaw.sosaw.domain.basicsound.repository.BasicSoundRepository; +import com.sosaw.sosaw.domain.soundsetting.entity.SoundSetting; +import com.sosaw.sosaw.domain.soundsetting.repository.SoundSettingRepository; import com.sosaw.sosaw.domain.user.entity.User; import com.sosaw.sosaw.domain.user.exception.PasswordMismatchException; import com.sosaw.sosaw.domain.user.exception.UserAlreadyExistException; @@ -14,11 +18,15 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @RequiredArgsConstructor @Service public class UserServiceImpl implements UserService { private final UserRepository userRepository; + private final BasicSoundRepository basicSoundRepository; + private final SoundSettingRepository soundSettingRepository; private final PasswordEncoder passwordEncoder; private final JwtTokenProvider jwtTokenProvider; @@ -39,6 +47,13 @@ public void signUp(SignUpReq signUpReq) { // Repository에 User 저장 userRepository.save(user); + + // 기본 사운드 세팅 생성 + List basics = basicSoundRepository.findAll(); + for (BasicSound basic : basics) { + SoundSetting setting = SoundSetting.createForBasic(user, basic); + soundSettingRepository.save(setting); + } } // 회원가입시, 아이디 중복 확인