Skip to content

Commit c3e1e68

Browse files
committed
CourseRepository를 MongoTemplate을 통해 직접 구현 (#484)
1 parent 1d18be9 commit c3e1e68

File tree

2 files changed

+73
-20
lines changed

2 files changed

+73
-20
lines changed
Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,17 @@
11
package coursepick.coursepick.domain;
22

3-
import com.mongodb.client.model.geojson.Point;
4-
import com.mongodb.client.model.geojson.Position;
5-
import org.springframework.data.mongodb.repository.MongoRepository;
6-
import org.springframework.data.mongodb.repository.Query;
7-
83
import java.util.List;
4+
import java.util.Optional;
95

10-
public interface CourseRepository extends MongoRepository<Course, String> {
6+
public interface CourseRepository {
117

12-
@Query("""
13-
{
14-
'segments': {
15-
$near: {
16-
$geometry: ?0,
17-
$maxDistance: ?1
18-
}
19-
}
20-
}
21-
""")
22-
List<Course> findAllHasDistanceWithin(Point target, double radius);
8+
void saveAll(Iterable<? extends Course> courses);
239

24-
default List<Course> findAllHasDistanceWithin(Coordinate target, Meter distance) {
25-
return findAllHasDistanceWithin(new Point(new Position(target.longitude(), target.latitude())), distance.value());
26-
}
10+
List<Course> findAllHasDistanceWithin(Coordinate target, Meter distance);
2711

2812
List<Course> findByIdIn(List<String> ids);
2913

14+
Optional<Course> findById(String id);
15+
3016
boolean existsByName(CourseName courseName);
3117
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package coursepick.coursepick.infrastructure;
2+
3+
import coursepick.coursepick.domain.*;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.data.geo.Point;
6+
import org.springframework.data.mongodb.core.MongoTemplate;
7+
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
8+
import org.springframework.data.mongodb.core.query.Criteria;
9+
import org.springframework.data.mongodb.core.query.Query;
10+
import org.springframework.stereotype.Repository;
11+
12+
import java.util.List;
13+
import java.util.Optional;
14+
import java.util.stream.StreamSupport;
15+
16+
@Repository
17+
@RequiredArgsConstructor
18+
public class CourseRepositoryMongoTemplateImpl implements CourseRepository {
19+
20+
private final MongoTemplate mongoTemplate;
21+
22+
@Override
23+
public void saveAll(Iterable<? extends Course> courses) {
24+
/*
25+
배치 삽입을 통해 성능을 높일 수 있다. 단, 현재 새벽2시에만 호출되는 메서드라, 크게 필요해보이지는 않는다.
26+
또한, 현재 메모리 문제가 더 크므로 일단은 넘긴다. 필요한 경우 아래 코드를 참고할 것
27+
BulkOperations ops = mongoTemplate.bulkOps(BulkMode.UNORDERED, Course.class);
28+
ops.insert(courses);
29+
ops.execute();
30+
*/
31+
List<? extends Course> listCourses = StreamSupport.stream(courses.spliterator(), false)
32+
.toList();
33+
mongoTemplate.insertAll(listCourses);
34+
}
35+
36+
@Override
37+
public List<Course> findAllHasDistanceWithin(Coordinate target, Meter distance) {
38+
if (target == null || distance == null) return List.of();
39+
40+
Point center = new GeoJsonPoint(target.longitude(), target.latitude());
41+
Query query = Query.query(Criteria.where("segments").near(center).maxDistance(distance.value()));
42+
return mongoTemplate.find(query, Course.class);
43+
}
44+
45+
@Override
46+
public List<Course> findByIdIn(List<String> ids) {
47+
if (ids == null || ids.isEmpty()) return List.of();
48+
49+
Query query = Query.query(Criteria.where("_id").in(ids));
50+
return mongoTemplate.find(query, Course.class);
51+
}
52+
53+
@Override
54+
public Optional<Course> findById(String id) {
55+
if (id == null) return Optional.empty();
56+
57+
return Optional.ofNullable(mongoTemplate.findById(id, Course.class));
58+
}
59+
60+
@Override
61+
public boolean existsByName(CourseName courseName) {
62+
if (courseName == null) return false;
63+
64+
Query query = Query.query(Criteria.where("name").is(courseName.value()));
65+
return mongoTemplate.exists(query, Course.class);
66+
}
67+
}

0 commit comments

Comments
 (0)