Skip to content

Commit 62146fb

Browse files
committed
Merge branch 'refs/heads/develop'
2 parents 69c403c + 08767ff commit 62146fb

7 files changed

Lines changed: 53 additions & 27 deletions

File tree

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ dependencies {
4646

4747
// Elastic Search
4848
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
49+
implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.17.13'
50+
implementation 'org.elasticsearch:elasticsearch:7.17.13'
51+
implementation 'org.elasticsearch:elasticsearch-core:7.17.13'
4952

5053
//QueryDSL
5154
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'

src/main/java/inu/codin/codin/CodinLectureApiApplication.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.cloud.openfeign.EnableFeignClients;
6+
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
7+
68

7-
@EnableFeignClients
89
@SpringBootApplication
10+
@EnableFeignClients
11+
@EnableElasticsearchRepositories
912
public class CodinLectureApiApplication {
1013

1114
public static void main(String[] args) {

src/main/java/inu/codin/codin/domain/elasticsearch/convertor/LectureDocumentConverter.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ public LectureDocument convertToDocument(Lecture lecture) {
1414
.id(lecture.getId())
1515
.lectureNm(lecture.getLectureNm())
1616
.grade(lecture.getGrade())
17-
.department(lecture.getDepartment().name())
17+
.department(lecture.getDepartment() != null ? lecture.getDepartment().name() : null)
1818
.starRating(lecture.getStarRating())
1919
.likes((long) lecture.getLikes())
2020
.hits((long) lecture.getHits())
2121
.professor(lecture.getProfessor())
22-
.type(lecture.getType().name())
22+
.type(lecture.getType() != null ? lecture.getType().name() : null)
2323
.lectureType(lecture.getLectureType())
24-
.evaluation(lecture.getEvaluation().name())
24+
.evaluation(lecture.getEvaluation() != null ? lecture.getEvaluation().name() : null)
2525
.preCourses(lecture.getPreCourse() != null ? List.of(lecture.getPreCourse()) : List.of())
26-
.tags(lecture.getTags().stream()
26+
.tags(lecture.getTags() != null ? lecture.getTags().stream()
2727
.map(tag -> tag.getTag().getTagName())
28-
.toList())
29-
.semesters(lecture.getSemester().stream()
28+
.toList() : List.of())
29+
.semesters(lecture.getSemester() != null ? lecture.getSemester().stream()
3030
.map(ls -> ls.getSemester().getString())
31-
.toList())
31+
.toList() : List.of())
3232
.build();
3333
}
3434
}

src/main/java/inu/codin/codin/domain/elasticsearch/document/LectureDocument.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package inu.codin.codin.domain.elasticsearch.document;
22

3-
import lombok.*;
3+
import lombok.AccessLevel;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
47
import org.springframework.data.annotation.Id;
58
import org.springframework.data.elasticsearch.annotations.Document;
69
import org.springframework.data.elasticsearch.annotations.Field;

src/main/java/inu/codin/codin/domain/elasticsearch/indexer/LectureStartupIndexer.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import org.springframework.data.domain.Page;
1414
import org.springframework.data.domain.PageRequest;
1515
import org.springframework.data.domain.Pageable;
16+
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
17+
import org.springframework.data.elasticsearch.core.IndexOperations;
1618
import org.springframework.stereotype.Component;
1719
import org.springframework.transaction.annotation.Transactional;
1820

@@ -25,8 +27,8 @@ public class LectureStartupIndexer {
2527

2628
private final LectureElasticRepository lectureElasticRepository;
2729
private final LectureRepository lectureRepository;
28-
2930
private final LectureDocumentConverter lectureDocumentConverter;
31+
private final ElasticsearchOperations elasticsearchOperations; // 추가
3032

3133
private final int CHUNK_SIZE = 100;
3234

@@ -42,6 +44,15 @@ public void onApplicationEvent(ApplicationReadyEvent event) {
4244
return;
4345
}
4446

47+
// 인덱스 존재 여부 확인 및 생성
48+
IndexOperations indexOps = elasticsearchOperations.indexOps(LectureDocument.class);
49+
if (!indexOps.exists()) {
50+
log.info("ElasticSearch lectures 인덱스가 존재하지 않아 직접 생성합니다.");
51+
indexOps.create();
52+
indexOps.putMapping(indexOps.createMapping(LectureDocument.class));
53+
log.info("ElasticSearch lectures 인덱스 및 매핑 생성 완료.");
54+
}
55+
4556
long existingCount = lectureElasticRepository.count();
4657
if (existingCount > 0) {
4758
log.info("ElasticSearch 인덱스가 이미 존재합니다 ({}개), 전체 재인덱싱을 진행합니다.", existingCount);
@@ -51,25 +62,28 @@ public void onApplicationEvent(ApplicationReadyEvent event) {
5162
}
5263

5364
log.info("Starting ElasticSearch Indexing, Lecture Data");
54-
Pageable pageable = PageRequest.of(0, CHUNK_SIZE);
55-
Page<Lecture> page;
65+
int pageNumber = 0;
5666
int totalProcessed = 0;
67+
List<Lecture> lectures;
5768

5869
do {
59-
page = lectureRepository.findAllPaged(pageable);
60-
List<LectureDocument> documents = page.getContent().stream()
61-
.map(lectureDocumentConverter::convertToDocument)
62-
.toList();
70+
Pageable pageable = PageRequest.of(pageNumber, CHUNK_SIZE);
71+
lectures = lectureRepository.findAllPaged(pageable);
6372

64-
lectureElasticRepository.saveAll(documents);
65-
totalProcessed += documents.size();
73+
if (!lectures.isEmpty()) {
74+
List<LectureDocument> documents = lectures.stream()
75+
.map(lectureDocumentConverter::convertToDocument)
76+
.toList();
6677

67-
log.info("[indexAllLectures] Indexed Lecture: {}, Total: {})", documents.size(), totalProcessed);
68-
pageable = page.nextPageable();
69-
} while (page.hasNext());
78+
lectureElasticRepository.saveAll(documents);
79+
totalProcessed += documents.size();
7080

71-
log.info("ElasticSearch 인덱싱 성공. Total Indexed: {}", totalProcessed);
72-
}
81+
log.info("[indexAllLectures] Indexed Lecture: {}, Total: {}", documents.size(), totalProcessed);
82+
}
7383

84+
pageNumber++;
85+
} while (lectures.size() == CHUNK_SIZE);
7486

87+
log.info("ElasticSearch 인덱싱 성공. Total Indexed: {}", totalProcessed);
88+
}
7589
}

src/main/java/inu/codin/codin/domain/lecture/repository/LectureRepository.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,15 @@ public interface LectureRepository extends JpaRepository<Lecture, Long> {
3535
LEFT JOIN FETCH l.schedule
3636
WHERE l.id IN :lectureIds
3737
""")
38-
Page<Lecture> findAllWithAssociationsByIds(List<Long> lectureIds);
38+
List<Lecture> findAllWithAssociationsByIds(List<Long> lectureIds);
3939

4040
@Query("""
4141
SELECT l FROM Lecture l
42+
LEFT JOIN FETCH l.tags
43+
LEFT JOIN FETCH l.reviews
44+
LEFT JOIN FETCH l.semester
4245
""")
43-
Page<Lecture> findAllPaged(Pageable pageable);
46+
List<Lecture> findAllPaged(Pageable pageable);
4447

4548

4649
@Query("""

src/main/java/inu/codin/codin/domain/lecture/repository/LectureSearchRepositoryImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ public Page<Lecture> searchLecturesAtPreview(String keyword, Department departme
4646
}
4747

4848
// JPA로 Lecture 엔티티 Fetch 조회
49-
Page<Lecture> lectures = lectureRepository.findAllWithAssociationsByIds(ids);
50-
log.info("[searchLecturesAtPreview] 강의 조회, size={} ", lectures.getTotalElements());
49+
List<Lecture> lectures = lectureRepository.findAllWithAssociationsByIds(ids);
50+
log.info("[searchLecturesAtPreview] 강의 조회, size={} ", lectures.size());
5151

5252
// ES 정렬 순서 유지하며 재정렬
5353
Map<Long, Lecture> lectureMap = lectures.stream()

0 commit comments

Comments
 (0)