diff --git a/build.gradle b/build.gradle index db752c13..95e78fa0 100644 --- a/build.gradle +++ b/build.gradle @@ -27,8 +27,9 @@ repositories { } dependencies { - // MONGO - implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' + + //Hypersistence Utils + implementation 'io.hypersistence:hypersistence-utils-hibernate-63:3.7.3' // REDIS implementation 'org.springframework.boot:spring-boot-starter-data-redis' diff --git a/docker-compose.yaml b/docker-compose.yaml index fc388427..a3c4cafb 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -5,12 +5,12 @@ services: env_file: - .env depends_on: - mongodb: - condition: service_started postgresql: condition: service_started redis: condition: service_started + elasticsearch: + condition: service_started environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} @@ -24,10 +24,9 @@ services: - SPRING_JPA_DDL_AUTO=${SPRING_JPA_DDL_AUTO} - # MongoDB 설정 - - MONGO_DB_URI=${MONGO_DB_URI} - - ELASTICSEARCH_URL=${ELASTICSEARCH_URL} + - ELASTIC_USERNAME=${ELASTIC_USERNAME} + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - REDIS_URL=${REDIS_URL} @@ -41,21 +40,6 @@ services: networks: - remedy-network - mongodb: - image: mongo:8.0 - container_name: mongodb - ports: - - "27017:27017" - command: [--auth] - volumes: - - mongodb_data:/data/db - environment: - - MONGO_INITDB_ROOT_USERNAME=${MONGO_USER} - - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD} - - MONGO_INITDB_DATABASE=${MONGO_DB} - networks: - - remedy-network - postgresql: image: postgres:17 container_name: postgresql @@ -78,14 +62,29 @@ services: networks: - remedy-network + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 + container_name: elasticsearch + environment: + - discovery.type=single-node + - xpack.security.enabled=true + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + ports: + - "9200:9200" + - "9300:9300" + volumes: + - elasticsearch_data:/usr/share/elasticsearch/data + networks: + - remedy-network + networks: remedy-network: driver: bridge volumes: - mongodb_data: - driver: local postgresql_data: driver: local redis_data: driver: local + elasticsearch_data: + driver: local diff --git a/src/main/java/org/example/remedy/domain/comment/application/service/CommentService.java b/src/main/java/org/example/remedy/domain/comment/application/service/CommentService.java index 2471d4c1..9e52df09 100644 --- a/src/main/java/org/example/remedy/domain/comment/application/service/CommentService.java +++ b/src/main/java/org/example/remedy/domain/comment/application/service/CommentService.java @@ -30,7 +30,8 @@ public class CommentService { @Transactional public void createComment(String content, User user, String droppingId) { - Dropping dropping = droppingRepository.findById(droppingId) + Long droppingIdValue = parseDroppingId(droppingId); + Dropping dropping = droppingRepository.findById(droppingIdValue) .orElseThrow(() -> DroppingNotFoundException.EXCEPTION); Comment comment = CommentMapper.toEntity(content, user, droppingId); @@ -63,7 +64,8 @@ public List getCommentsByDropping(String droppingId) { List comments = commentRepository.findAllByDroppingIdDesc(droppingId); - if (comments.isEmpty() && !droppingRepository.existsById(droppingId)) { + Long droppingIdValue = parseDroppingId(droppingId); + if (comments.isEmpty() && !droppingRepository.existsById(droppingIdValue)) { throw DroppingNotFoundException.EXCEPTION; } @@ -105,10 +107,19 @@ private void validateCommentOwnership(Long userId, Comment comment) { @Transactional(readOnly = true) public long countByDroppingId(String droppingId) { - if (!droppingRepository.existsById(droppingId)) { + Long droppingIdValue = parseDroppingId(droppingId); + if (!droppingRepository.existsById(droppingIdValue)) { throw DroppingNotFoundException.EXCEPTION; } return commentRepository.countByDroppingId(droppingId); } + + private Long parseDroppingId(String droppingId) { + try { + return Long.valueOf(droppingId); + } catch (NumberFormatException ex) { + throw DroppingNotFoundException.EXCEPTION; + } + } } diff --git a/src/main/java/org/example/remedy/domain/dropping/application/dto/request/DroppingCreateRequest.java b/src/main/java/org/example/remedy/domain/dropping/application/dto/request/DroppingCreateRequest.java index 39392d08..e635e190 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/dto/request/DroppingCreateRequest.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/dto/request/DroppingCreateRequest.java @@ -19,7 +19,7 @@ public record DroppingCreateRequest( List options, //PLAYLIST - String playlistId, + Long playlistId, String playlistName, List songIds, diff --git a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/DroppingResponse.java b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/DroppingResponse.java index 9f320ae7..752dda3e 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/DroppingResponse.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/DroppingResponse.java @@ -5,7 +5,7 @@ public interface DroppingResponse { DroppingType type(); - String droppingId(); + Long droppingId(); Long userId(); Double latitude(); Double longitude(); diff --git a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/MusicDroppingResponse.java b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/MusicDroppingResponse.java index 28552e73..08b8d2e0 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/MusicDroppingResponse.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/MusicDroppingResponse.java @@ -3,7 +3,7 @@ import java.time.LocalDateTime; public record MusicDroppingResponse( - String droppingId, + Long droppingId, String songId, Long userId, String username, diff --git a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/MusicDroppingSearchResponse.java b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/MusicDroppingSearchResponse.java index 0cb8deda..b8731fee 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/MusicDroppingSearchResponse.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/MusicDroppingSearchResponse.java @@ -4,7 +4,7 @@ public record MusicDroppingSearchResponse( DroppingType type, - String droppingId, + Long droppingId, Long userId, String songId, String title, diff --git a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/PlaylistDroppingResponse.java b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/PlaylistDroppingResponse.java index 654159b3..73278e84 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/PlaylistDroppingResponse.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/PlaylistDroppingResponse.java @@ -4,7 +4,7 @@ import java.util.List; public record PlaylistDroppingResponse( - String droppingId, + Long droppingId, Long userId, String playlistName, List songs, diff --git a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/PlaylistDroppingSearchResponse.java b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/PlaylistDroppingSearchResponse.java index 4e01c324..0b4eee5a 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/PlaylistDroppingSearchResponse.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/PlaylistDroppingSearchResponse.java @@ -6,7 +6,7 @@ public record PlaylistDroppingSearchResponse( DroppingType type, - String droppingId, + Long droppingId, Long userId, String playlistName, List songIds, diff --git a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/VoteDroppingResponse.java b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/VoteDroppingResponse.java index f9bcfbd6..4eb46366 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/VoteDroppingResponse.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/VoteDroppingResponse.java @@ -4,7 +4,7 @@ import java.util.List; public record VoteDroppingResponse( - String droppingId, + Long droppingId, Long userId, String topic, List options, diff --git a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/VoteDroppingSearchResponse.java b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/VoteDroppingSearchResponse.java index 946fd5a3..89fe22a9 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/dto/response/VoteDroppingSearchResponse.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/dto/response/VoteDroppingSearchResponse.java @@ -6,7 +6,7 @@ public record VoteDroppingSearchResponse( DroppingType type, - String droppingId, + Long droppingId, Long userId, String topic, List options, diff --git a/src/main/java/org/example/remedy/domain/dropping/application/mapper/DroppingMapper.java b/src/main/java/org/example/remedy/domain/dropping/application/mapper/DroppingMapper.java index d02f0e87..aa667d39 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/mapper/DroppingMapper.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/mapper/DroppingMapper.java @@ -26,7 +26,7 @@ public static DroppingSearchListResponse toDroppingSearchListResponse( public static MusicDroppingResponse toMusicDroppingResponse( Dropping dropping, String songId, String username, String albumImageUrl) { return new MusicDroppingResponse( - dropping.getDroppingId(), + dropping.getId(), songId, dropping.getUserId(), username, @@ -42,7 +42,7 @@ public static MusicDroppingSearchResponse toMusicDroppingSearchResponse( return new MusicDroppingSearchResponse( DroppingType.MUSIC, - dropping.getDroppingId(), + dropping.getId(), dropping.getUserId(), payload.getSongId(), song.getTitle(), @@ -61,7 +61,7 @@ public static VoteDroppingSearchResponse toVoteDroppingSearchResponse(Dropping d return new VoteDroppingSearchResponse( DroppingType.VOTE, - dropping.getDroppingId(), + dropping.getId(), dropping.getUserId(), payload.getTopic(), List.copyOf(payload.getOptionVotes().keySet()), @@ -78,7 +78,7 @@ public static PlaylistDroppingSearchResponse toPlaylistDroppingSearchResponse(Dr return new PlaylistDroppingSearchResponse( DroppingType.PLAYLIST, - dropping.getDroppingId(), + dropping.getId(), dropping.getUserId(), payload.getPlaylistName(), payload.getSongIds(), @@ -119,7 +119,7 @@ public static VoteDroppingResponse toVoteDroppingResponse( VoteCalculator.calculate(payload, currentUserId, songFinder); return new VoteDroppingResponse( - dropping.getDroppingId(), + dropping.getId(), dropping.getUserId(), payload.getTopic(), calc.options(), @@ -172,7 +172,7 @@ public static PlaylistDroppingResponse toPlaylistDroppingResponse( .toList(); return new PlaylistDroppingResponse( - dropping.getDroppingId(), + dropping.getId(), dropping.getUserId(), payload.getPlaylistName(), songs, diff --git a/src/main/java/org/example/remedy/domain/dropping/application/service/DroppingService.java b/src/main/java/org/example/remedy/domain/dropping/application/service/DroppingService.java index 67d3053c..20e89977 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/service/DroppingService.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/service/DroppingService.java @@ -38,7 +38,7 @@ public DroppingSearchListResponse searchDroppings(Long userId, double longitude, return DroppingMapper.toDroppingSearchListResponse(droppings); } - public Dropping getDroppingEntity(String droppingId) { + public Dropping getDroppingEntity(Long droppingId) { return droppingRepository.findById(droppingId) .orElseThrow(() -> DroppingNotFoundException.EXCEPTION); } @@ -63,7 +63,7 @@ private DroppingResponse convertToResponse(Dropping dropping, Long userId) { } @Transactional - public void deleteDropping(String droppingId, Long userId) { + public void deleteDropping(Long droppingId, Long userId) { Dropping dropping = getDroppingEntity(droppingId); if (!dropping.getUserId().equals(userId)) { diff --git a/src/main/java/org/example/remedy/domain/dropping/application/service/DroppingServiceFacade.java b/src/main/java/org/example/remedy/domain/dropping/application/service/DroppingServiceFacade.java index 6b4914d6..045d780a 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/service/DroppingServiceFacade.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/service/DroppingServiceFacade.java @@ -30,7 +30,7 @@ public DroppingSearchListResponse searchDroppings(Long userId, double longitude, return droppingQueryService.searchDroppings(userId, longitude, latitude, distance); } - public Object getDropping(String droppingId, Long userId) { + public Object getDropping(Long droppingId, Long userId) { Dropping dropping = droppingQueryService.getDroppingEntity(droppingId); return switch (dropping.getDroppingType()) { @@ -44,7 +44,7 @@ public DroppingSearchListResponse getUserDroppings(Long userId) { return droppingQueryService.getUserDroppings(userId); } - public void deleteDropping(String droppingId, Long userId) { + public void deleteDropping(Long droppingId, Long userId) { droppingQueryService.deleteDropping(droppingId, userId); } @@ -52,11 +52,11 @@ public void cleanupExpiredDroppings() { droppingQueryService.cleanupExpiredDroppings(); } - public void vote(String droppingId, Long userId, String songId) { + public void vote(Long droppingId, Long userId, String songId) { voteDroppingService.vote(droppingId, userId, songId); } - public void cancelVote(String droppingId, Long userId) { + public void cancelVote(Long droppingId, Long userId) { voteDroppingService.cancelVote(droppingId, userId); } } diff --git a/src/main/java/org/example/remedy/domain/dropping/application/service/MusicDroppingService.java b/src/main/java/org/example/remedy/domain/dropping/application/service/MusicDroppingService.java index a396a1e8..19714934 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/service/MusicDroppingService.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/service/MusicDroppingService.java @@ -40,7 +40,7 @@ public void createDropping(AuthDetails authDetails, DroppingCreateRequest reques publishDroppingCreatedEvent(authDetails.getUserId(), payload.getSongId()); } - public MusicDroppingResponse getMusicDropping(String droppingId) { + public MusicDroppingResponse getMusicDropping(Long droppingId) { Dropping dropping = droppingRepository.findById(droppingId) .orElseThrow(() -> DroppingNotFoundException.EXCEPTION); diff --git a/src/main/java/org/example/remedy/domain/dropping/application/service/PlaylistDroppingService.java b/src/main/java/org/example/remedy/domain/dropping/application/service/PlaylistDroppingService.java index 939ceff6..676ec803 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/service/PlaylistDroppingService.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/service/PlaylistDroppingService.java @@ -33,7 +33,7 @@ public class PlaylistDroppingService { public void createPlaylistDropping(AuthDetails authDetails, DroppingCreateRequest request) { PlaylistDroppingPayload payload; - if (request.playlistId() != null && !request.playlistId().isBlank()) { + if (request.playlistId() != null) { Playlist playlist = playlistRepository.findById(request.playlistId()) .orElseThrow(() -> PlaylistNotFoundException.EXCEPTION); @@ -54,7 +54,7 @@ public void createPlaylistDropping(AuthDetails authDetails, DroppingCreateReques droppingRepository.createDropping(dropping); } - public PlaylistDroppingResponse getPlaylistDropping(String droppingId) { + public PlaylistDroppingResponse getPlaylistDropping(Long droppingId) { Dropping dropping = droppingRepository.findById(droppingId) .orElseThrow(() -> DroppingNotFoundException.EXCEPTION); return DroppingMapper.toPlaylistDroppingResponse( diff --git a/src/main/java/org/example/remedy/domain/dropping/application/service/VoteDroppingService.java b/src/main/java/org/example/remedy/domain/dropping/application/service/VoteDroppingService.java index b6244c0a..c2b26903 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/service/VoteDroppingService.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/service/VoteDroppingService.java @@ -33,7 +33,7 @@ public void createVoteDropping(AuthDetails authDetails, DroppingCreateRequest re } @Transactional - public void vote(String droppingId, Long userId, String songId) { + public void vote(Long droppingId, Long userId, String songId) { Dropping dropping = droppingRepository.findById(droppingId) .orElseThrow(() -> DroppingNotFoundException.EXCEPTION); dropping.vote(userId, songId); @@ -41,14 +41,14 @@ public void vote(String droppingId, Long userId, String songId) { } @Transactional - public void cancelVote(String droppingId, Long userId) { + public void cancelVote(Long droppingId, Long userId) { Dropping dropping = droppingRepository.findById(droppingId) .orElseThrow(() -> DroppingNotFoundException.EXCEPTION); dropping.cancelVote(userId); droppingRepository.save(dropping); } - public VoteDroppingResponse getVoteDropping(String droppingId, Long userId) { + public VoteDroppingResponse getVoteDropping(Long droppingId, Long userId) { Dropping dropping = droppingRepository.findById(droppingId) .orElseThrow(() -> DroppingNotFoundException.EXCEPTION); return DroppingMapper.toVoteDroppingResponse( diff --git a/src/main/java/org/example/remedy/domain/dropping/application/validation/DroppingTypeValidator.java b/src/main/java/org/example/remedy/domain/dropping/application/validation/DroppingTypeValidator.java index f6186a0b..0f8d405f 100644 --- a/src/main/java/org/example/remedy/domain/dropping/application/validation/DroppingTypeValidator.java +++ b/src/main/java/org/example/remedy/domain/dropping/application/validation/DroppingTypeValidator.java @@ -127,7 +127,7 @@ private boolean validatePlaylistType(DroppingCreateRequest request, ConstraintVa boolean isValid = true; // playlistId와 (playlistName + songIds) 중 하나만 있어야 함 - boolean hasPlaylistId = request.playlistId() != null && !request.playlistId().isBlank(); + boolean hasPlaylistId = request.playlistId() != null; boolean hasNewPlaylist = (request.playlistName() != null && !request.playlistName().isBlank()) || (request.songIds() != null && !request.songIds().isEmpty()); diff --git a/src/main/java/org/example/remedy/domain/dropping/domain/Dropping.java b/src/main/java/org/example/remedy/domain/dropping/domain/Dropping.java index 4df2f9a1..217285a1 100644 --- a/src/main/java/org/example/remedy/domain/dropping/domain/Dropping.java +++ b/src/main/java/org/example/remedy/domain/dropping/domain/Dropping.java @@ -1,47 +1,59 @@ package org.example.remedy.domain.dropping.domain; +import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; +import jakarta.persistence.*; +import lombok.AccessLevel; import lombok.Getter; +import lombok.NoArgsConstructor; import org.example.remedy.domain.dropping.application.exception.InvalidDroppingTypeException; -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.geo.GeoJsonPoint; -import org.springframework.data.mongodb.core.index.GeoSpatialIndexType; -import org.springframework.data.mongodb.core.index.GeoSpatialIndexed; -import org.springframework.data.mongodb.core.mapping.Document; +import org.hibernate.annotations.Type; import java.time.LocalDateTime; +@Entity +@Table(name = "droppings") @Getter -@Document(collection = "droppings") +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Dropping { @Id - private String droppingId; + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "dropping_id") + private Long id; + @Enumerated(EnumType.STRING) + @Column(name = "dropping_type", nullable = false) private DroppingType droppingType; + @Type(JsonBinaryType.class) + @Column(name = "payload", columnDefinition = "jsonb") private Payload payload; + @Column(name = "user_id", nullable = false) private Long userId; private String content; + @Column(nullable = false) private Double latitude; + @Column(nullable = false) private Double longitude; + @Column(nullable = false) private String address; + @Column(nullable = false) private LocalDateTime expiryDate; + @Column(nullable = false, updatable = false) private LocalDateTime createdAt; + @Column(nullable = false) private boolean isDeleted = false; - @GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE) - private GeoJsonPoint location; - - protected Dropping() {} - - public Dropping(DroppingType droppingType, Payload payload, Long userId, String content, Double latitude, Double longitude, String address, LocalDateTime expiryDate, LocalDateTime createdAt, boolean isDeleted) { + public Dropping(DroppingType droppingType, Payload payload, Long userId, + String content, Double latitude, Double longitude, + String address, LocalDateTime expiryDate, LocalDateTime createdAt, boolean isDeleted) { this.droppingType = droppingType; this.payload = payload; this.userId = userId; @@ -50,9 +62,8 @@ public Dropping(DroppingType droppingType, Payload payload, Long userId, String this.longitude = longitude; this.address = address; this.expiryDate = expiryDate; - this.createdAt = createdAt; + this.createdAt = createdAt != null ? createdAt : LocalDateTime.now(); this.isDeleted = isDeleted; - this.location = new GeoJsonPoint(longitude, latitude); } private VoteDroppingPayload asVotePayload() { @@ -93,7 +104,7 @@ public boolean isActive() { return !isDeleted && !isExpired(); } - public boolean isMyDropping(Long userId) { - return this.userId.equals(userId); - } + public boolean isMyDropping(Long userId) { + return this.userId.equals(userId); + } } diff --git a/src/main/java/org/example/remedy/domain/dropping/presentation/DroppingController.java b/src/main/java/org/example/remedy/domain/dropping/presentation/DroppingController.java index fa0ac2cf..270d6418 100644 --- a/src/main/java/org/example/remedy/domain/dropping/presentation/DroppingController.java +++ b/src/main/java/org/example/remedy/domain/dropping/presentation/DroppingController.java @@ -28,7 +28,7 @@ public ResponseEntity createDropping( @GetMapping("/{dropping-id}") public ResponseEntity getDropping( - @PathVariable(name = "dropping-id") String id, + @PathVariable(name = "dropping-id") Long id, @AuthenticationPrincipal AuthDetails authDetails) { Object response = droppingService.getDropping(id, authDetails.getUserId()); return ResponseEntity.ok(response); @@ -47,7 +47,7 @@ public DroppingSearchListResponse searchDroppings( @DeleteMapping("/{dropping-id}") public ResponseEntity deleteDropping( - @PathVariable(name = "dropping-id") String id, + @PathVariable(name = "dropping-id") Long id, @AuthenticationPrincipal AuthDetails authDetails) { droppingService.deleteDropping(id, authDetails.getUserId()); return ResponseEntity.noContent().build(); @@ -55,7 +55,7 @@ public ResponseEntity deleteDropping( @PostMapping("/{dropping-id}/vote") public ResponseEntity vote( - @PathVariable(name = "dropping-id") String id, + @PathVariable(name = "dropping-id") Long id, @AuthenticationPrincipal AuthDetails authDetails, @Valid @RequestBody VoteRequest request) { droppingService.vote(id, authDetails.getUserId(), request.songId()); @@ -64,7 +64,7 @@ public ResponseEntity vote( @DeleteMapping("/{dropping-id}/vote") public ResponseEntity cancelVote( - @PathVariable(name = "dropping-id") String id, + @PathVariable(name = "dropping-id") Long id, @AuthenticationPrincipal AuthDetails authDetails) { droppingService.cancelVote(id, authDetails.getUserId()); return ResponseEntity.noContent().build(); diff --git a/src/main/java/org/example/remedy/domain/dropping/repository/DroppingPersistenceRepository.java b/src/main/java/org/example/remedy/domain/dropping/repository/DroppingPersistenceRepository.java index 6f0b7e2a..f3e852d6 100644 --- a/src/main/java/org/example/remedy/domain/dropping/repository/DroppingPersistenceRepository.java +++ b/src/main/java/org/example/remedy/domain/dropping/repository/DroppingPersistenceRepository.java @@ -2,17 +2,18 @@ import org.example.remedy.domain.dropping.domain.Dropping; import org.springframework.data.domain.Sort; -import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.data.mongodb.repository.Query; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; import java.util.List; @Repository -public interface DroppingPersistenceRepository extends MongoRepository { +public interface DroppingPersistenceRepository extends JpaRepository { List findByUserId(Long userId, Sort sort); - @Query("{ 'expiryDate': { '$lt': ?0 }, 'isDeleted': false }") - List findExpiredAndNotDeletedDroppings(LocalDateTime now); + @Query("SELECT d FROM Dropping d WHERE d.expiryDate < :now AND d.isDeleted = false") + List findExpiredAndNotDeletedDroppings(@Param("now") LocalDateTime now); } diff --git a/src/main/java/org/example/remedy/domain/dropping/repository/DroppingRepository.java b/src/main/java/org/example/remedy/domain/dropping/repository/DroppingRepository.java index 69822376..c489fa74 100644 --- a/src/main/java/org/example/remedy/domain/dropping/repository/DroppingRepository.java +++ b/src/main/java/org/example/remedy/domain/dropping/repository/DroppingRepository.java @@ -12,11 +12,11 @@ public interface DroppingRepository { void createDropping(Dropping dropping); List findActiveDroppingsWithinRadius(double longitude, double latitude, double distance); - Optional findById(String id); + Optional findById(Long id); List findByUserId(Long userId, Sort sort); List findExpiredAndNotDeletedDroppings(LocalDateTime now); - void deleteById(String id); + void deleteById(Long id); void save(Dropping dropping); @@ -24,5 +24,5 @@ public interface DroppingRepository { void saveAll(List droppings); - boolean existsById(String id); + boolean existsById(Long id); } diff --git a/src/main/java/org/example/remedy/domain/dropping/repository/DroppingRepositoryImpl.java b/src/main/java/org/example/remedy/domain/dropping/repository/DroppingRepositoryImpl.java index b676f47f..588a9156 100644 --- a/src/main/java/org/example/remedy/domain/dropping/repository/DroppingRepositoryImpl.java +++ b/src/main/java/org/example/remedy/domain/dropping/repository/DroppingRepositoryImpl.java @@ -1,18 +1,11 @@ package org.example.remedy.domain.dropping.repository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import lombok.RequiredArgsConstructor; import org.example.remedy.domain.dropping.application.exception.DroppingAlreadyExistsException; import org.example.remedy.domain.dropping.domain.Dropping; import org.springframework.data.domain.Sort; -import org.springframework.data.geo.Distance; -import org.springframework.data.geo.Metrics; -import org.springframework.data.geo.Point; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.aggregation.Aggregation; -import org.springframework.data.mongodb.core.aggregation.AggregationResults; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.NearQuery; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; @@ -24,31 +17,33 @@ public class DroppingRepositoryImpl implements DroppingRepository { private final DroppingPersistenceRepository repository; - private final MongoTemplate mongoTemplate; - private final double DROPPING_CONSTRAINT_DISTANCE = 0.001; + + @PersistenceContext + private EntityManager entityManager; + + private static final double DROPPING_CONSTRAINT_DISTANCE = 0.001; public void createDropping(Dropping dropping) { - AggregationResults results = findDroppingsByAroundRadius( - dropping.getLocation().getX(), - dropping.getLocation().getY(), - DROPPING_CONSTRAINT_DISTANCE - ); - - if (!results.getMappedResults().isEmpty()){ - throw DroppingAlreadyExistsException.EXCEPTION; + List nearbyDroppings = findDroppingsByAroundRadius( + dropping.getLongitude(), + dropping.getLatitude(), + DROPPING_CONSTRAINT_DISTANCE + ); + + if (!nearbyDroppings.isEmpty()) { + throw DroppingAlreadyExistsException.EXCEPTION; } - mongoTemplate.insert(dropping); + repository.save(dropping); } @Override public List findActiveDroppingsWithinRadius(double longitude, double latitude, double distance) { - AggregationResults results = findDroppingsByAroundRadius(longitude, latitude, distance); - return results.getMappedResults(); + return findDroppingsByAroundRadius(longitude, latitude, distance); } @Override - public Optional findById(String id) { + public Optional findById(Long id) { return repository.findById(id); } @@ -69,7 +64,7 @@ public void softDelete(Dropping dropping) { } @Override - public void deleteById(String id) { + public void deleteById(Long id) { repository.deleteById(id); } @@ -84,25 +79,40 @@ public void saveAll(List droppings) { } @Override - public boolean existsById(String id) { + public boolean existsById(Long id) { return repository.existsById(id); } - private AggregationResults findDroppingsByAroundRadius(double longitude, double latitude, double distance) { - Point location = new Point(longitude, latitude); - Distance radius = new Distance(distance, Metrics.KILOMETERS); - - NearQuery nearQuery = NearQuery.near(location) - .maxDistance(radius) - .spherical(true) - .query(Query.query(Criteria.where("isDeleted").is(false) - .and("expiryDate").gt(LocalDateTime.now()))); - - Aggregation agg = Aggregation.newAggregation( - Aggregation.geoNear(nearQuery, "distance"), - Aggregation.project("userId", "droppingType", "payload", "content", "location", "distance", "latitude", "longitude", "address", "expiryDate", "createdAt", "isDeleted") - ); - - return mongoTemplate.aggregate(agg, "droppings", Dropping.class); + /** + * 하버사인 공식을 사용한 위치 기반 검색 + * PostgreSQL의 경우 PostGIS 확장을 사용하면 더 효율적이지만, + * 기본 SQL로도 구현 가능 + */ + private List findDroppingsByAroundRadius(double longitude, double latitude, double distance) { + // 대략적인 위도/경도 범위 계산 (1도 ≈ 111km) + double latOffset = distance / 111.0; + double lonOffset = distance / (111.0 * Math.cos(Math.toRadians(latitude))); + + double minLat = latitude - latOffset; + double maxLat = latitude + latOffset; + double minLon = longitude - lonOffset; + double maxLon = longitude + lonOffset; + + // JPQL을 사용한 범위 검색 + String jpql = """ + SELECT d FROM Dropping d + WHERE d.isDeleted = false + AND d.expiryDate > :now + AND d.latitude BETWEEN :minLat AND :maxLat + AND d.longitude BETWEEN :minLon AND :maxLon + """; + + return entityManager.createQuery(jpql, Dropping.class) + .setParameter("now", LocalDateTime.now()) + .setParameter("minLat", minLat) + .setParameter("maxLat", maxLat) + .setParameter("minLon", minLon) + .setParameter("maxLon", maxLon) + .getResultList(); } } diff --git a/src/main/java/org/example/remedy/domain/like/application/dto/request/LikeRequest.java b/src/main/java/org/example/remedy/domain/like/application/dto/request/LikeRequest.java index d8d83026..1158e3cf 100644 --- a/src/main/java/org/example/remedy/domain/like/application/dto/request/LikeRequest.java +++ b/src/main/java/org/example/remedy/domain/like/application/dto/request/LikeRequest.java @@ -1,7 +1,7 @@ package org.example.remedy.domain.like.application.dto.request; -import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; public record LikeRequest( - @NotBlank String droppingId + @NotNull Long droppingId ){} \ No newline at end of file diff --git a/src/main/java/org/example/remedy/domain/like/application/dto/response/MusicLikeDroppingResponse.java b/src/main/java/org/example/remedy/domain/like/application/dto/response/MusicLikeDroppingResponse.java index b8c8d548..e7d22a94 100644 --- a/src/main/java/org/example/remedy/domain/like/application/dto/response/MusicLikeDroppingResponse.java +++ b/src/main/java/org/example/remedy/domain/like/application/dto/response/MusicLikeDroppingResponse.java @@ -3,7 +3,7 @@ import org.example.remedy.domain.dropping.domain.DroppingType; public record MusicLikeDroppingResponse( - String droppingId, + Long droppingId, DroppingType droppingType, String title, String artist, diff --git a/src/main/java/org/example/remedy/domain/like/application/dto/response/PlaylistLikeDroppingResponse.java b/src/main/java/org/example/remedy/domain/like/application/dto/response/PlaylistLikeDroppingResponse.java index b841cc2f..146e1ae9 100644 --- a/src/main/java/org/example/remedy/domain/like/application/dto/response/PlaylistLikeDroppingResponse.java +++ b/src/main/java/org/example/remedy/domain/like/application/dto/response/PlaylistLikeDroppingResponse.java @@ -3,7 +3,7 @@ import org.example.remedy.domain.dropping.domain.DroppingType; public record PlaylistLikeDroppingResponse( - String droppingId, + Long droppingId, DroppingType droppingType, String playlistName, String imageUrl, diff --git a/src/main/java/org/example/remedy/domain/like/application/dto/response/VoteLikeDroppingResponse.java b/src/main/java/org/example/remedy/domain/like/application/dto/response/VoteLikeDroppingResponse.java index 74a44854..1878c104 100644 --- a/src/main/java/org/example/remedy/domain/like/application/dto/response/VoteLikeDroppingResponse.java +++ b/src/main/java/org/example/remedy/domain/like/application/dto/response/VoteLikeDroppingResponse.java @@ -3,7 +3,7 @@ import org.example.remedy.domain.dropping.domain.DroppingType; public record VoteLikeDroppingResponse( - String droppingId, + Long droppingId, DroppingType droppingType, String topic, String imageUrl, diff --git a/src/main/java/org/example/remedy/domain/like/application/event/LikeCreatedEvent.java b/src/main/java/org/example/remedy/domain/like/application/event/LikeCreatedEvent.java index f491d449..f4aa6533 100644 --- a/src/main/java/org/example/remedy/domain/like/application/event/LikeCreatedEvent.java +++ b/src/main/java/org/example/remedy/domain/like/application/event/LikeCreatedEvent.java @@ -33,5 +33,5 @@ public class LikeCreatedEvent { /** * 좋아요가 눌린 Dropping ID */ - private String droppingId; + private Long droppingId; } diff --git a/src/main/java/org/example/remedy/domain/like/application/mapper/LikeMapper.java b/src/main/java/org/example/remedy/domain/like/application/mapper/LikeMapper.java index 386bd681..83d13d2b 100644 --- a/src/main/java/org/example/remedy/domain/like/application/mapper/LikeMapper.java +++ b/src/main/java/org/example/remedy/domain/like/application/mapper/LikeMapper.java @@ -12,14 +12,14 @@ import org.example.remedy.domain.user.domain.User; public class LikeMapper { - public static Like toEntity(User user, String droppingId) { + public static Like toEntity(User user, Long droppingId) { return new Like(user, droppingId); } public static Optional toMusicLikeResponse(Dropping dropping, Song song) { return Optional.of( new MusicLikeDroppingResponse( - dropping.getDroppingId(), + dropping.getId(), dropping.getDroppingType(), song.getTitle(), song.getArtist(), @@ -32,7 +32,7 @@ public static Optional toVoteLikeResponse(Dropping dro String imageUrl = song != null ? song.getAlbumImagePath() : null; return Optional.of( new VoteLikeDroppingResponse( - dropping.getDroppingId(), + dropping.getId(), dropping.getDroppingType(), payload.getTopic(), imageUrl, @@ -44,7 +44,7 @@ public static Optional toPlaylistLikeResponse(Drop String imageUrl = song != null ? song.getAlbumImagePath() : null; return Optional.of( new PlaylistLikeDroppingResponse( - dropping.getDroppingId(), + dropping.getId(), dropping.getDroppingType(), payload.getPlaylistName(), imageUrl, diff --git a/src/main/java/org/example/remedy/domain/like/application/service/LikeService.java b/src/main/java/org/example/remedy/domain/like/application/service/LikeService.java index 18fe3dc7..9f17a03f 100644 --- a/src/main/java/org/example/remedy/domain/like/application/service/LikeService.java +++ b/src/main/java/org/example/remedy/domain/like/application/service/LikeService.java @@ -33,7 +33,7 @@ public class LikeService { private final GlobalEventPublisher eventPublisher; @Transactional - public boolean toggleLike(User user, String droppingId) { + public boolean toggleLike(User user, Long droppingId) { Dropping dropping = droppingRepository.findById(droppingId) .orElseThrow(() -> DroppingNotFoundException.EXCEPTION); @@ -54,7 +54,7 @@ public boolean toggleLike(User user, String droppingId) { } - private void publishLikeCreatedEvent(User liker, Dropping dropping, String droppingId) { + private void publishLikeCreatedEvent(User liker, Dropping dropping, Long droppingId) { // 자기 자신의 Dropping에 좋아요를 누른 경우 알림을 보내지 않음 if (liker.getUserId().equals(dropping.getUserId())) { return; @@ -78,7 +78,7 @@ public long getLikeCountByUser(User user) { } @Transactional(readOnly = true) - public long getLikeCountByDropping(String droppingId) { + public long getLikeCountByDropping(Long droppingId) { if (!droppingRepository.existsById(droppingId)) { throw DroppingNotFoundException.EXCEPTION; @@ -98,7 +98,7 @@ public LikeDroppingListResponse getLikeDroppingsDetailByUser(User user) { return new LikeDroppingListResponse(droppings); } - private Optional convertToLikeDroppingResponse(String droppingId) { + private Optional convertToLikeDroppingResponse(Long droppingId) { return droppingRepository.findById(droppingId) .filter(Dropping::isActive) .flatMap(this::createLikeResponse); diff --git a/src/main/java/org/example/remedy/domain/like/domain/Like.java b/src/main/java/org/example/remedy/domain/like/domain/Like.java index 193c2760..ea47e97d 100644 --- a/src/main/java/org/example/remedy/domain/like/domain/Like.java +++ b/src/main/java/org/example/remedy/domain/like/domain/Like.java @@ -18,11 +18,11 @@ public class Like { private User user; @Column(name = "dropping_id", nullable = false) - private String droppingId; + private Long droppingId; protected Like() {} - public Like(User user, String droppingId) { + public Like(User user, Long droppingId) { this.user = user; this.droppingId = droppingId; } diff --git a/src/main/java/org/example/remedy/domain/like/presentation/LikeController.java b/src/main/java/org/example/remedy/domain/like/presentation/LikeController.java index 1ba44e36..6ab19e7b 100644 --- a/src/main/java/org/example/remedy/domain/like/presentation/LikeController.java +++ b/src/main/java/org/example/remedy/domain/like/presentation/LikeController.java @@ -38,7 +38,7 @@ public ResponseEntity getLikeCountByUser( } @GetMapping("/count/dropping/{droppingId}") - public ResponseEntity getLikeCountByDropping(@PathVariable String droppingId) { + public ResponseEntity getLikeCountByDropping(@PathVariable Long droppingId) { long count = likeService.getLikeCountByDropping(droppingId); return ResponseEntity.ok(new LikeCountResponse(count)); diff --git a/src/main/java/org/example/remedy/domain/like/repository/LikePersistenceRepository.java b/src/main/java/org/example/remedy/domain/like/repository/LikePersistenceRepository.java index febc763e..7b07543d 100644 --- a/src/main/java/org/example/remedy/domain/like/repository/LikePersistenceRepository.java +++ b/src/main/java/org/example/remedy/domain/like/repository/LikePersistenceRepository.java @@ -10,11 +10,11 @@ @Repository public interface LikePersistenceRepository extends JpaRepository { - Optional findByUserAndDroppingId(User user, String droppingId); + Optional findByUserAndDroppingId(User user, Long droppingId); long countByUser(User user); - long countByDroppingId(String droppingId); + long countByDroppingId(Long droppingId); List findByUser(User user); diff --git a/src/main/java/org/example/remedy/domain/like/repository/LikeRepository.java b/src/main/java/org/example/remedy/domain/like/repository/LikeRepository.java index fb9c2ead..a1159601 100644 --- a/src/main/java/org/example/remedy/domain/like/repository/LikeRepository.java +++ b/src/main/java/org/example/remedy/domain/like/repository/LikeRepository.java @@ -8,9 +8,9 @@ public interface LikeRepository { - Optional findByUserAndDroppingId(User user, String droppingId); + Optional findByUserAndDroppingId(User user, Long droppingId); long countByUser(User user); - long countByDroppingId(String droppingId); + long countByDroppingId(Long droppingId); void save(Like like); void delete(Like like); List findByUser(User user); diff --git a/src/main/java/org/example/remedy/domain/like/repository/LikeRepositoryImpl.java b/src/main/java/org/example/remedy/domain/like/repository/LikeRepositoryImpl.java index aa222c56..65864e1d 100644 --- a/src/main/java/org/example/remedy/domain/like/repository/LikeRepositoryImpl.java +++ b/src/main/java/org/example/remedy/domain/like/repository/LikeRepositoryImpl.java @@ -15,7 +15,7 @@ public class LikeRepositoryImpl implements LikeRepository { private final LikePersistenceRepository likePersistenceRepository; @Override - public Optional findByUserAndDroppingId(User user, String droppingId) { + public Optional findByUserAndDroppingId(User user, Long droppingId) { return likePersistenceRepository.findByUserAndDroppingId(user, droppingId); } @@ -25,7 +25,7 @@ public long countByUser(User user) { } @Override - public long countByDroppingId(String droppingId) { + public long countByDroppingId(Long droppingId) { return likePersistenceRepository.countByDroppingId(droppingId); } diff --git a/src/main/java/org/example/remedy/domain/playlist/application/dto/response/PlaylistDetailResponse.java b/src/main/java/org/example/remedy/domain/playlist/application/dto/response/PlaylistDetailResponse.java index a06034a0..3447fd66 100644 --- a/src/main/java/org/example/remedy/domain/playlist/application/dto/response/PlaylistDetailResponse.java +++ b/src/main/java/org/example/remedy/domain/playlist/application/dto/response/PlaylistDetailResponse.java @@ -5,7 +5,7 @@ import java.util.List; public record PlaylistDetailResponse( - String id, + Long id, String name, List songs ) { diff --git a/src/main/java/org/example/remedy/domain/playlist/application/dto/response/PlaylistResponse.java b/src/main/java/org/example/remedy/domain/playlist/application/dto/response/PlaylistResponse.java index 921db7e0..1145db0f 100644 --- a/src/main/java/org/example/remedy/domain/playlist/application/dto/response/PlaylistResponse.java +++ b/src/main/java/org/example/remedy/domain/playlist/application/dto/response/PlaylistResponse.java @@ -1,7 +1,7 @@ package org.example.remedy.domain.playlist.application.dto.response; public record PlaylistResponse( - String id, + Long id, String name, String albumImageUrl ) { diff --git a/src/main/java/org/example/remedy/domain/playlist/application/service/PlaylistService.java b/src/main/java/org/example/remedy/domain/playlist/application/service/PlaylistService.java index 4b1e7cd1..a044eaa3 100644 --- a/src/main/java/org/example/remedy/domain/playlist/application/service/PlaylistService.java +++ b/src/main/java/org/example/remedy/domain/playlist/application/service/PlaylistService.java @@ -48,7 +48,7 @@ public void createPlaylist(Long userId, PlaylistCreateRequest request) { playlistRepository.save(playlist); } - public PlaylistDetailResponse getPlaylist(String playlistId) { + public PlaylistDetailResponse getPlaylist(Long playlistId) { Playlist playlist = playlistRepository.findById(playlistId) .orElseThrow(() -> PlaylistNotFoundException.EXCEPTION); @@ -92,7 +92,7 @@ private PlaylistResponse createPlaylistResponse(Playlist playlist, Map PlaylistNotFoundException.EXCEPTION); @@ -102,7 +102,7 @@ public void updatePlaylist(String playlistId, Long userId, PlaylistUpdateRequest playlistRepository.save(playlist); } - public void deletePlaylist(String playlistId, Long userId) { + public void deletePlaylist(Long playlistId, Long userId) { Playlist playlist = playlistRepository.findById(playlistId) .orElseThrow(() -> PlaylistNotFoundException.EXCEPTION); @@ -111,7 +111,7 @@ public void deletePlaylist(String playlistId, Long userId) { playlistRepository.delete(playlist); } - public void addSongToPlaylist(String playlistId, Long userId, PlaylistSongAddRequest request) { + public void addSongToPlaylist(Long playlistId, Long userId, PlaylistSongAddRequest request) { Playlist playlist = playlistRepository.findById(playlistId) .orElseThrow(() -> PlaylistNotFoundException.EXCEPTION); @@ -141,7 +141,7 @@ private void validateNoDuplicateSongs(Playlist playlist, List songIds) { } } - public void removeSongFromPlaylist(String playlistId, String songId, Long userId) { + public void removeSongFromPlaylist(Long playlistId, String songId, Long userId) { Playlist playlist = playlistRepository.findById(playlistId) .orElseThrow(() -> PlaylistNotFoundException.EXCEPTION); diff --git a/src/main/java/org/example/remedy/domain/playlist/domain/Playlist.java b/src/main/java/org/example/remedy/domain/playlist/domain/Playlist.java index 1fb8ff57..3f2bbe8d 100644 --- a/src/main/java/org/example/remedy/domain/playlist/domain/Playlist.java +++ b/src/main/java/org/example/remedy/domain/playlist/domain/Playlist.java @@ -1,25 +1,33 @@ package org.example.remedy.domain.playlist.domain; +import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; +import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; +import org.hibernate.annotations.Type; import java.util.ArrayList; import java.util.List; -@Document(collection = "playlists") +@Entity +@Table(name = "playlists") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Playlist { @Id - private String id; + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "playlist_id") + private Long id; + @Column(nullable = false) private String name; + @Type(JsonBinaryType.class) + @Column(name = "song_ids", columnDefinition = "jsonb") private List songIds; + @Column(name = "user_id", nullable = false) private Long userId; public Playlist(String name, Long userId) { diff --git a/src/main/java/org/example/remedy/domain/playlist/presentation/PlaylistController.java b/src/main/java/org/example/remedy/domain/playlist/presentation/PlaylistController.java index 91f2ba15..7ad87681 100644 --- a/src/main/java/org/example/remedy/domain/playlist/presentation/PlaylistController.java +++ b/src/main/java/org/example/remedy/domain/playlist/presentation/PlaylistController.java @@ -31,7 +31,7 @@ public ResponseEntity createPlaylist( @GetMapping("/{playlist-id}") public ResponseEntity getPlaylist( - @PathVariable(name = "playlist-id") String playlistId) { + @PathVariable(name = "playlist-id") Long playlistId) { PlaylistDetailResponse response = playlistService.getPlaylist(playlistId); return ResponseEntity.ok(response); } @@ -45,7 +45,7 @@ public ResponseEntity getMyPlaylists( @PutMapping("/{playlist-id}") public ResponseEntity updatePlaylist( - @PathVariable(name = "playlist-id") String playlistId, + @PathVariable(name = "playlist-id") Long playlistId, @AuthenticationPrincipal AuthDetails authDetails, @Valid @RequestBody PlaylistUpdateRequest request) { playlistService.updatePlaylist(playlistId, authDetails.getUserId(), request); @@ -54,7 +54,7 @@ public ResponseEntity updatePlaylist( @DeleteMapping("/{playlist-id}") public ResponseEntity deletePlaylist( - @PathVariable(name = "playlist-id") String playlistId, + @PathVariable(name = "playlist-id") Long playlistId, @AuthenticationPrincipal AuthDetails authDetails) { playlistService.deletePlaylist(playlistId, authDetails.getUserId()); return ResponseEntity.noContent().build(); @@ -62,7 +62,7 @@ public ResponseEntity deletePlaylist( @PostMapping("/{playlist-id}/songs") public ResponseEntity addSongToPlaylist( - @PathVariable(name = "playlist-id") String playlistId, + @PathVariable(name = "playlist-id") Long playlistId, @AuthenticationPrincipal AuthDetails authDetails, @Valid @RequestBody PlaylistSongAddRequest request) { playlistService.addSongToPlaylist(playlistId, authDetails.getUserId(), request); @@ -71,7 +71,7 @@ public ResponseEntity addSongToPlaylist( @DeleteMapping("/{playlist-id}/songs/{song-id}") public ResponseEntity removeSongFromPlaylist( - @PathVariable(name = "playlist-id") String playlistId, + @PathVariable(name = "playlist-id") Long playlistId, @PathVariable(name = "song-id") String songId, @AuthenticationPrincipal AuthDetails authDetails) { playlistService.removeSongFromPlaylist(playlistId, songId, authDetails.getUserId()); diff --git a/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistPersistenceRepository.java b/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistPersistenceRepository.java index 2b54d03f..de2a87f8 100644 --- a/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistPersistenceRepository.java +++ b/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistPersistenceRepository.java @@ -1,12 +1,12 @@ package org.example.remedy.domain.playlist.repository; import org.example.remedy.domain.playlist.domain.Playlist; -import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; @Repository -public interface PlaylistPersistenceRepository extends MongoRepository { +public interface PlaylistPersistenceRepository extends JpaRepository { List findByUserId(Long userId); } \ No newline at end of file diff --git a/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistRepository.java b/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistRepository.java index 397e350c..cdcb3e10 100644 --- a/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistRepository.java +++ b/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistRepository.java @@ -8,7 +8,7 @@ public interface PlaylistRepository { Playlist save(Playlist playlist); - Optional findById(String id); + Optional findById(Long id); List findByUserId(Long userId); diff --git a/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistRepositoryImpl.java b/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistRepositoryImpl.java index 99b853ea..24b324b6 100644 --- a/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistRepositoryImpl.java +++ b/src/main/java/org/example/remedy/domain/playlist/repository/PlaylistRepositoryImpl.java @@ -19,7 +19,7 @@ public Playlist save(Playlist playlist) { } @Override - public Optional findById(String id) { + public Optional findById(Long id) { return playlistPersistenceRepository.findById(id); } diff --git a/src/main/java/org/example/remedy/global/config/MongoConfig.java b/src/main/java/org/example/remedy/global/config/MongoConfig.java deleted file mode 100644 index 28689428..00000000 --- a/src/main/java/org/example/remedy/global/config/MongoConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.example.remedy.global.config; - -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoClients; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.mongodb.core.MongoTemplate; - -@Configuration -public class MongoConfig { - @Value("${spring.data.mongodb.uri}") - private String mongoUri; - - @Bean - public MongoClient mongoClient() { - return MongoClients.create(mongoUri); - } - - @Bean - public MongoTemplate mongoTemplate() { - return new MongoTemplate(mongoClient(), "remedy"); - } -} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b2e8b2a3..da450f8d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -6,9 +6,11 @@ spring: hibernate: ddl-auto: ${SPRING_JPA_DDL_AUTO} show-sql: true + open-in-view: false properties: hibernate: + dialect: org.hibernate.dialect.PostgreSQLDialect format_sql: true default_batch_fetch_size: 500 @@ -19,10 +21,6 @@ spring: driver-class-name: org.postgresql.Driver data: - mongodb: - uri: ${MONGO_DB_URI} - auto-index-creation: true - redis: url: ${REDIS_URL}