Skip to content

Commit 67ae5ce

Browse files
committed
fix: getCocktailComments
1 parent a55a5b4 commit 67ae5ce

File tree

5 files changed

+218
-114
lines changed

5 files changed

+218
-114
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ dependencies {
4040
implementation("io.jsonwebtoken:jjwt-api:0.12.3")
4141
implementation("org.springframework.boot:spring-boot-starter-batch")
4242
testImplementation("org.springframework.batch:spring-batch-test")
43+
4344
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")
4445
runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")
4546
compileOnly("org.projectlombok:lombok")

src/main/java/com/back/domain/cocktail/comment/repository/CocktailCommentRepository.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,16 @@
1010
@Repository
1111
public interface CocktailCommentRepository extends JpaRepository<CocktailComment, Long> {
1212

13-
List<CocktailComment> findTop10ByCocktailIdOrderByIdDesc(Long cocktailId);
13+
List<CocktailComment> findTop10ByCocktailIdAndStatusOrderByIdDesc(
14+
Long cocktailId,
15+
CommentStatus status
16+
);
1417

15-
List<CocktailComment> findTop10ByCocktailIdAndIdLessThanOrderByIdDesc(Long cocktailId, Long lastId);
18+
List<CocktailComment> findTop10ByCocktailIdAndStatusAndIdLessThanOrderByIdDesc(
19+
Long cocktailId,
20+
CommentStatus status,
21+
Long lastId
22+
);
1623

1724
boolean existsByCocktailIdAndUserIdAndStatusNot(Long cocktailId, Long id, CommentStatus status);
1825
}

src/main/java/com/back/domain/cocktail/comment/service/CocktailCommentService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ public CocktailCommentResponseDto createCocktailComment(Long cocktailId, Cocktai
5555
@Transactional(readOnly = true)
5656
public List<CocktailCommentResponseDto> getCocktailComments(Long cocktailId, Long lastId) {
5757
if (lastId == null) {
58-
return cocktailCommentRepository.findTop10ByCocktailIdOrderByIdDesc(cocktailId)
58+
return cocktailCommentRepository.findTop10ByCocktailIdAndStatusOrderByIdDesc(cocktailId, CommentStatus.PUBLIC)
5959
.stream()
6060
.map(CocktailCommentResponseDto::new)
6161
.toList();
6262
} else {
63-
return cocktailCommentRepository.findTop10ByCocktailIdAndIdLessThanOrderByIdDesc(cocktailId, lastId)
63+
return cocktailCommentRepository.findTop10ByCocktailIdAndStatusAndIdLessThanOrderByIdDesc(cocktailId, CommentStatus.PUBLIC, lastId)
6464
.stream()
6565
.map(CocktailCommentResponseDto::new)
6666
.toList();
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.back.global.appConfig;
2+
3+
import com.back.global.standard.util.DecimalToFractionConverter;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.batch.core.Job;
6+
import org.springframework.batch.core.Step;
7+
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
8+
import org.springframework.batch.core.job.builder.JobBuilder;
9+
import org.springframework.batch.core.repository.JobRepository;
10+
import org.springframework.batch.core.step.builder.StepBuilder;
11+
import org.springframework.batch.item.ItemProcessor;
12+
import org.springframework.batch.item.file.FlatFileItemReader;
13+
import org.springframework.batch.item.file.FlatFileItemWriter;
14+
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
15+
import org.springframework.batch.item.file.builder.FlatFileItemWriterBuilder;
16+
import org.springframework.batch.item.file.mapping.PassThroughLineMapper;
17+
import org.springframework.batch.item.file.transform.PassThroughLineAggregator;
18+
import org.springframework.context.annotation.Bean;
19+
import org.springframework.context.annotation.Configuration;
20+
import org.springframework.core.io.FileSystemResource;
21+
import org.springframework.transaction.PlatformTransactionManager;
22+
23+
// DecimalToFractionConverter가 있다고 가정합니다.
24+
// import com.example.DecimalToFractionConverter;
25+
26+
@Configuration
27+
@EnableBatchProcessing
28+
@RequiredArgsConstructor
29+
public class CocktailBatchConfig {
30+
31+
private final JobRepository jobRepository;
32+
private final PlatformTransactionManager transactionManager;
33+
34+
private static final String INPUT_PATH = "src/main/resources/cocktails.csv";
35+
private static final String OUTPUT_PATH = "src/main/resources/cocktails_clean.csv";
36+
37+
// 1.Reader: CSV 파일 한 줄씩 읽기
38+
@Bean
39+
public FlatFileItemReader<String> reader() {
40+
return new FlatFileItemReaderBuilder<String>()
41+
.name("cocktailReader")
42+
.resource(new FileSystemResource(INPUT_PATH))
43+
.lineMapper(new PassThroughLineMapper())
44+
.build();
45+
}
46+
47+
// 2️⃣ Processor: ingredient 컬럼(6번째)만 DecimalToFractionConverter로 변환
48+
@Bean
49+
public ItemProcessor<String, String> processor() {
50+
return line -> {
51+
// CSV 한 줄을 안전하게 split
52+
String[] columns = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1);
53+
54+
// Header인지 확인: "ingredient"라는 컬럼 이름으로 간단 체크
55+
if (columns.length > 6 && !columns[6].equalsIgnoreCase("ingredient")) {
56+
// DecimalToFractionConverter는 별도로 구현되어 있어야 합니다.
57+
columns[6] = DecimalToFractionConverter.convert(columns[6]);
58+
}
59+
60+
// 다시 CSV 문자열로 합치기
61+
return String.join(",", columns);
62+
};
63+
}
64+
65+
// 3️⃣ Writer: 변환된 CSV 출력 (변화 없음)
66+
@Bean
67+
public FlatFileItemWriter<String> writer() {
68+
return new FlatFileItemWriterBuilder<String>()
69+
.name("cocktailWriter")
70+
.resource(new FileSystemResource(OUTPUT_PATH))
71+
.lineAggregator(new PassThroughLineAggregator<>())
72+
.build();
73+
}
74+
75+
// 4️⃣ Step: Chunk 단위 처리 (StepBuilderFactory 대체)
76+
@Bean
77+
public Step convertStep() {
78+
// StepBuilder를 직접 생성하고, jobRepository와 transactionManager를 주입합니다.
79+
return new StepBuilder("convertStep", jobRepository)
80+
// chunk 메서드에 transactionManager를 인수로 전달합니다.
81+
.<String, String>chunk(5, transactionManager)
82+
.reader(reader())
83+
.processor(processor())
84+
.writer(writer())
85+
.build();
86+
}
87+
88+
// 5️⃣ Job 정의 (JobBuilderFactory 대체)
89+
@Bean
90+
public Job convertJob() {
91+
// JobBuilder를 직접 생성하고, jobRepository를 주입합니다.
92+
return new JobBuilder("convertJob", jobRepository)
93+
.start(convertStep())
94+
.build();
95+
}
96+
}

0 commit comments

Comments
 (0)