๋ถ์ : ์์ฆ์ ๋์์ผ๋ฉด ๊ฐ๋ฐ๋ ๋ชปํ๋ค.
[Dalmuri] Java๋ก Google Cloud Nature Language API ํธ์ถํด์ ๊ฐ์ ๋ค์ด์ด๋ฆฌ ๋ง๋ค๊ธฐ
๐ฅตAPI ์ฐ๊ฒฐ ํ๊ธฐ : ์ฝ๋ ์ง๋๊ฒ๋ณด๋ค ์ด๊ธฐ ์ธํ ์ด ํจ์ฌ ๋ ์ด๋ ต๋ค.. ์ฌ๋ฝ๋ค๊ธฐ๋ณด๋จ ๋ฐฉ๋ฒ๋ ๋ง๊ณ ์ฝ์ด์ผ ํ๋ ๊ณต์ ๋ฌธ์๋ ๋ง์์, ์ ์ ๋ด๊ฐ ์ํ๊ฑฐ๋ ํ์ํ ์ ๋ณด๋ฅผ ์ฐพ๋๋ฐ ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ ๊ฒ
janudev.tistory.com
์ง์ง ๋๋ฝ๊ณ ์น์ฌํ ์ธ์์ด๋ค... ๊ฑฐ๋ ๋ฑ ์ด ๊ฐ๋ฐ์๋ค์ ๊ฐ๋ฐ ์ด๋ป๊ฒ ํ๋ผ๊ณ ๋งจ๋ ๊ณผ๊ธํ๋ น ํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค. ๋ ํด๋ก๋ ์ฝ๋๋ ๋์๊น์์ ๊ทธ๋ฅ ์ผ๋ฏผ์ด+ํด๋ก๋ ๊ณ ๋ฌธํ๊ณ ์๋๋ฐ...์ธํ ๋ฆฌ์ ์ด 1๋ ์น ์๊ธ๋ ๋ํ๊ต ๊ณ์ ์ผ๋ก 40ํผ ํ ์ธ๋ฐ๋๊ฒ๋ ๋๋ ๋จ๋ฉด์ ๊ฒฐ์ ํ๊ณ ์๋๋ฐ... ๊ทธ๋ฆฌ๊ณ ๊ฒ์๊ธ ์์ฑ ๊ธฐ์ค์ผ๋ก ํ์จ๋ ์ฅ๋์๋๊ฒ ๋์์ ๊ฐ๊ฒฉ ๋์ฌ๋์๊ฑฐ๋ค...


๊ธฐ์กด ๊ฒ์๊ธ ๋ณด๋ฉด ์๊ฒ ์ง๋ง ์๋ ๋งก๊น API๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๋ถ์์ ํ๊ณ ์ถ์๋ค... ์๋? ๊ณต์ง๋๊น.
๊ทผ๋ฐ ๊ทธ ํ์ด๋ฐ์ API๊ฐ ๊ณ ์ฅ๋์ ๋ฌธ์๋ฅผ ๋๋ ธ๊ณ ๋ค๋ฅธ ๋์ฒดํ์ด ์์๊น ๊ฒ์ํ๋ค๊ฐ Google ์์ฐ์ด ๋ถ์ API๋ฅผ ์๊ฒ ๋์๊ณ ... ๊ทธ๊ฑธ ํ์ฉํ๋ ค๊ณ ๐ถ๊ณ ์ ํ๋ฉด์ Google colud์ ๋ด ํ๋ก์ ํธ ์์ฑํ๊ณ .. ๊ถํ ์ค์ ํ๊ณ .. pom.xml์ ์์กด์ฑ ์ถ๊ฐํ๊ณ ์ด์ฉ๊ตฌ ์ ์ฉ๊ตฌ ํ๊ฑด๋ฐ...
์ด์ ๊ณผ๊ธ๋์ ๋ ๋ด๊ณ ์ฌ์ฉํ๋๋ค!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

๊ทธ๋ฅ ์ฌ๋ฌ๊ฐ์ง ๊ณต๋ถํ๋ค๊ณ ์ ์ ์น๋ฆฌํ๋ จ๋ค...
1. ๋งก๊น API๋?
๋ฐ์ดํ์ํํธ๋ผ๋ ํ์ฌ์์ ์ถ์ํ API ์๋น์ค์ธ๋ฐ, ๋ค์ํ ์ธ๊ณต์ง๋ฅ API๋ฅผ ์ฌ์ฉํ ์ ์๋ ์๋น์ค๋ผ๊ณ ํ๋ค. ์ค์ ๋ก ๊ฐ์ ๋ถ์ API ๋ง๊ณ ๋ ๋ค์ํ API๋ค์ด ์๋ค.

์ฌ์ง์ด ๋น์์ด ์ถ์ถ API ์ด๋ฐ๊ฒ๋ ์๋ค. ์ด๋ฐ๊ฑธ ๋ฌด๋ฃ๋ก ํ์ด์ฃผ๋๊ฒ ๋๋ฌด ๊ฐ์ฌํ ๋ฐ๋ฆ...
์๋ฒฝํ ๋ฌด๋ฃ๋ ์๋๊ณ , ํ๋ฌ์ 100ํ ์ด์์ ๋ง์ + a๋ก ๊ณผ๊ธ์ด ๋๋ค.

๊ทผ๋ฐ ํ์ ์ ์ฌ์ฉํ ๋๋ ๋ด ์น๊ตฌ๋ค์ด ๋งค์ผ๋งค์ผ ์ผ๊ธฐ๋ฅผ ์ธ ์ ๋๋ก ๋ถ์ง๋ฐํ์ง ์๊ธฐ ๋๋ฌธ์(ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ) ์์ฌํ๊ณ ๊ณผ๊ธ ๋ฒ์ ์ฌ์ฉํ ์ ์์๊ฑฐ๋ค. ์น๊ตฌ๋ค์ ๊ณ ๋ง์!
2. ๊ฐ๋ฐ ์์
๊ธฐ์กด์ Google ์์ฐ์ด ๋ถ์ API๋ฅผ ์น ๋ค ์ฃผ์์ฒ๋ฆฌํ๊ณ ๊ฑฐ๊ธฐ์ ์๋ก์ด ๋งก๊น API๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ controller, service๋ ์๋ก์ด ์์ฑ๋ ํ์๋ ์๋ค.
๋ค๋ง Google์์ ์์ฒด์ ์ผ๋ก ์์กด์ฑ์ ์ถ๊ฐ์์ผ์ ๊ฐ์ฒด๋ฅผ ๋ณธ์ธ๋ค์ด ์์ฑํด์คฌ๋๋ฐ(Sentiment, LanguageServiceClient์ ๊ฐ์ด)
๋งก๊น์ ๊ทธ๋ฐ๊ฑฐ ์์ด์ ๋ด๊ฐ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค.
(1) MatgimResponseDTO ๊ฐ์ฒด ์์ฑ

๋งก๊น API์์ ๋ค์๊ณผ ๊ฐ์ json ํ์์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ด๊ฒ๊ณผ ๋์ผํ ๊ตฌ์กฐ์ DTO๋ฅผ ๋ง๋ ๋ค.
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.*;
import java.util.List;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class MatgimResponseDTO {
private boolean success;
private Result result;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Result {
private DocumentScore documentScore;
private List<SentenceScore> sentenceScore;
}
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class DocumentScore {
private double score;
private double posScore;
private double negScore;
}
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class SentenceScore {
private String sentence;
private double score;
}
}

์ฐธ๊ณ ๋ก
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
์ด๊ฑด Java๊ฐ์ฒด์ camelCase์ Json ๊ฐ์ฒด์ snake_case๋ฅผ ์๋ก ๋งคํ์์ผ์ฃผ๋ ์ค์ ์ด๋ค.
์ธ๋ถ์์ ๋ค์ด์ค๋ snake_caseํ์์ Json ๋ฐ์ดํฐ๋ฅผ Java์ caleCase๋ก ํ๋์ ์๋์ผ๋ก ๋งคํ(์ญ์ง๋ ฌํ)ํด์ค ์ ์๋ค.
ํ์ฌ ํด๋์ค๋
public class MatgimResponseDTO { // ์ต์์ ๋ถ๋ชจ ํด๋์ค
// ๋ด๋ถ ํด๋์ค
class Inner {} // โ static ์์
static class Inner2 {} // โ
static ์์
}
์ด๋ฐ ๊ตฌ์กฐ์ด๋ค.
- public class MatgimResponseDTO(์ต์์ ํด๋์ค) : ๋ถ๋ชจ ํด๋์ค๋ผ๋ ๊ฐ๋ ์ด ์์. ๋ ๋ฆฝ์ ์ธ ํ์ผ ๋จ์, ์ด๋์๋ new MatgimResopnseDTO()๋ก ๋ฐ๋ก ์์ฑํ ์ ์์.
- public class inner : MatgimResponseDTO๋ผ๋ '์ง' ์์์๋ง ์ด ์ ์๋ ํด๋์ค. ๋ฐ๋์ MatgimResponseDTO๊ฐ ๋จผ์ ์์ฑ๋์ด์ผ ํ๋ค. static์ด ์๋ ๋ด๋ถ ํด๋์ค์ผ ๋๋ง(=public class Inner์ผ๋๋ง) ์ธ๋ถ ํด๋์ค ๊ฐ์ฒด(MatgimResponseDTO)๊ฐ ์์ด์ผ ์์ฑํ ์ ์๋ค.
- public static class Result(๋ด๋ถ ํด๋์ค์ static์ด ์๋ ๊ฒฝ์ฐ) : ์ด๋ฆํ๋ MatgimResponseDTO.Result๋ฅผ ๋ฌ๊ณ ์์ง๋ง ์ค์ ๋ก new MatgimResponseDTO.Result()๋ก ํผ์ ํ์ด๋ ์ ์์
๊ทธ๋ ๋ค๋ฉด public class์ public static class์ ์ฐจ์ด๋?
- public class : ์ธ๋ถ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋จผ์ ์์ฑ๋์ผ๋ง ์กด์ฌํ ์ ์๋ ํด๋์ค. ๋จ ์ต์์ ํด๋์ค์ ๊ฒฝ์ฐ ์ธ๋ถ ํด๋์ค๋ผ๋ ๊ฐ๋ ๋ ์๋ค(ex. MatgimResponseDTO)
- public static class : public class ๋ด๋ถ์์๋ง ์ธ ์ ์๋ ์ ์ ํด๋์ค. ์ฌ๊ธฐ์ public Static class Result, public static class DocumentScore, public static class SentenceScore๊ฐ ์๋ค. ์ผ๋ฐ ํด๋์ค์ฒ๋ผ ํผ์ ์์ฑ ๊ฐ๋ฅํ๋ฉฐ ์ฃผ๋ก DTO ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ๋ ๊ถ์ฅ๋๋ค.
๐ "๋ด๋ถ ํด๋์ค์ผ ๋" static ์์ผ๋ฉด “๋ถ๋ชจ ์์ด๋ ๋ชป ํ์ด๋จ” → MatgimResponseDTO์์ ํด๋น ์์(์ ์ด์ ๋ด๋ถ ํด๋์ค๊ฐ ์๋๊ธฐ ๋๋ฌธ)
๐ static ์์ผ๋ฉด “ํผ์ ํ์ด๋ ์ ์์”
MatgimResponseDTO
โโโ Result
โโโ DocumentScore
โโโ SentenceScore
์ฌ๊ธฐ์ MatgimResponseDTO๋ ์ต์์ ํด๋์ค๋ก ๋ถ๋ชจ๊ฐ ์๋ค.
Result, DocumentScore, SentenceScore์ MatgimResponseDTO ์์ ํฌํจ๋ ๋ด๋ถ ํด๋์ค.
Result ๋ DocumentScore์ static์ผ๋ก ์ ์ธํด์ผ ํ๋ ์ด์ ๋
- ๋ ๋ฆฝ์ ์ธ์คํด์คํ : Jackson์ด JSON์ Java๊ฐ์ฒด๋ก ๋ฐ๊ฟ ๋, ์ธ๋ถ ํด๋์ค์ธ MatgimResponseDTO๋ฅผ ๋จผ์ ๋ง๋ค์ง ์๊ณ ๋ ๋ด๋ถ์ Result๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ด์ผ ํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ : static์ด ์๋๋ฉด ๋ด๋ถ ํด๋์ค ๊ฐ์ฒด๋ ์์ ์ ๊ฐ์ธ๊ณ ์๋ ์ธ๋ถ ํด๋์ค์ ์ ๋ณด๋ฅผ ํญ์ ๋ค๊ณ ์์ด์ผ ํ๋ค. DTO์ฒ๋ผ ๋จ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ฉ๋๋ผ๋ฉด ์ด๋ฐ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ง ์ด๋ํ๋ค.
- ๊ตฌ์กฐ์ ๊ทธ๋ฃนํ : ๊ด๋ จ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ(Result, Score)๋ฅผ ๋ฐ๋ก ๋ง๋ค์ง ์๊ณ ํ๋์ ํ์ผ ์์์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ฌถ์ด ๊ด๋ฆฌํ ์ ์์ด ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ค.
๋ฐ๋ผ์ static์ด ๋ถ์ง ์๋ ๋ด๋ถ ํด๋์ค๋ ๋ถ๋ชจ(์ธ๋ถ)๊ฐ ์์ด์ผ ํ์ด๋ ์ ์๋ ์์์ด๊ณ , static class๋ ๋ถ๋ชจ ์ง ์์ ์ด์ง๋ง ์๊ธฐ ์ฐจ์ ์ด์ ๋ฅผ ๋ฐ๋ก ๊ฐ์ง๊ณ ์๋ ๋ ๋ฆฝ๋ ์ฑ์ธ์ด๋ผ ๋ณผ ์ ์๋ค.
(2) WebClient ์ค์
์ค๋ฌด์์ RestTemplate๋ฅผ ์ด์ฉํด์ ์ธ๋ถ API์ ์ฐ๊ฒฐํ๋๊ฒ ํ์ค์ด์๋๋ฐ, ์์ฆ RestTemplate ์ฐ๋๊ฒ๋ ๊ตฌ์๋์ ์ด๋ผ ๊ถ์ฅ๋์ง ์๋๋ค๊ณ ํ๋ค. (๊ทธ๋์ ์ ๋ฐฐ๊ฐ ๋ฆฌํฉํ ๋ง ํ๋ค๊ฐ ๊ธฐ์กด ์ฝ๋ ๋ค ์ด์ํด์ ธ์ ๋กค๋ฐฑํ๊ฑด ์๋น๋ฐ)
๊ทธ๋์ ์ด์ฅ๋ถํฐ ๊ทธ๋ฅ RestTemplate๋ง๊ณ ์ข ๋ ์ข์๊ฒ ๋ญ๊ฐ ์์์ง ์๊ฐํ๋ค๊ฐ WebClient๋ผ๋๊ฑธ ๋ฐ๊ฒฌํ๋ค. WebClient๋ ๋น๋๊ธฐ ๋ฐ ๋น์ฐจ๋จ ํต์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ์ํ Http client๋ผ๊ณ ํ๋ค.
- ๋น๋๊ธฐ, ๋ ผ๋ธ๋กํน(Non-Blocking) ๋ฐฉ์ : WebClient๋ Reactive Stack์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. API์์ฒญ์ ๋ณด๋ธ ๋ค ์๋ต์ด ์ฌ ๋ ๊น์ง ์ค๋ ๋๊ฐ ๋๊ธฐ(Block)ํ์ง ์๊ณ ๋ค๋ฅธ ์ผ์ ํ ์ ์๋ค. ์ ์ ์์ ์ค๋ ๋๋ก ํจ์ฌ ๋ง์ ๋์ ์์ฒญ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ์ฒ๋ฆฌ๋์ด ํ๊ธฐ์ ์ผ๋ก ๋์ด๋๋ค.
- ์ฑ๊ธํค(Singleton)์ผ๋ก ๊ด๋ฆฌ๋๋ ์ฌ์ฌ์ฉ์ฑ : @Bean์ผ๋ก ๋ฑ๋กํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๊ฐ WebClient ๊ฐ์ฒด๋ฅผ ๋ฑ ํ๋๋ง ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ค. ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๊ณ ์ค์ ์ ๊ณต์ ํ ์ ์๋ค.
- ์ ์ฐํ ํ์ฅ์ฑ: ๋์ค์ ํ์์์ ์ค์ , ๋ก๊น ์ฉ ํํฐ, ํน์ API ์ ์ฉ ์ธ์ฆ ํค๋ ์ถ๊ฐ ๋ฑ๋ฑ์ builder์ ํ์ค๋ง ์ถ๊ฐํ๋ฉด ๋๋ค. ๋ํ ํ๋ฒ ๋น๋๋ WebClient๋ ์ํ๊ฐ ๋ณํ์ง ์์ผ๋ฏ๋ก ์ฌ๋ฌ ์ค๋ ๋์์ ๋์์ ์ฌ์ฉํด๋ ์์ ํ๋ค.
- ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์ : .retrieve().bodyToMono(MatgimResponseDTO.class) ์ด๊ฑฐ ํ์ค์ด๋ฉด API์๋ต์ธ snake_case๋ฅผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ camelCase๋ก ์๋ ๋ณํํด์ค๋ค.

ํ๋์ ํ๋ก์ธ์ค ์์์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ '์์ ์คํ ๋จ์'
์ฝ๊ฒ ๋น์ ํ์๋ฉด "์ผ๊พผ"์ด๋ค. ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ (์๋ฒ)์ด๋ผ๋ ์๋น์์ ์๋์ ์ฃผ๋ฌธ์ ๋ฐ๊ณ ์๋ฆฌํด์ ์๋น๊น์ง ํ๋ ์ง์ ํ ๋ช ์ด ๊ณง ์ค๋ ๋ ํ๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- ์ค๋ ๋๊ฐ ๋ง์ผ๋ฉด? ์ผ๊พผ์ด ๋ง์ผ๋ ๋์์ ์ฌ๋ฌ ์๋์ ์๋ํ ์ ์์ง๋ง, ์ผ๊พผ๋ง๋ค ์๊ธ(๋ฉ๋ชจ๋ฆฌ ์ ์ )์ ์ค์ผ ํ๊ณ ๊ด๋ฆฌํ๊ธฐ๊ฐ ํ๋ค์ด์ง
- ์ค๋ ๋๊ฐ ์ ์ผ๋ฉด? ์๋ฒ๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๊ณ ๊ฐ๋ณ์ง๋ง, ์ผ๊พผ์ด ๋ชจ์๋ผ๋ฉด ์๋๋ค์ด ์ค์ ์์ ๊ธฐ๋ค๋ ค์ผํจ
โ Thread 1๊ฐ
โ Thread ์ฌ๋ฌ ๊ฐ
์์ฒญ2
์์ฒญ3
๋์์ ์ฒ๋ฆฌ๐ ๋น ๋ฆ
๊ทธ๋ผ ํ๋ก์ธ์ค(process)๋?
์์คํ ์์ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ

์ด์ ์ ์ต๊ทผ์ RestTemplate๊ฐ ์๋ WebClient๊ฐ ์ฌ์ฉ๋๋์ง ์ด์ ์๊ฒ ๋ค~
1๏ธโฃ pom.xml์ ์์กด์ฑ ์ถ๊ฐ
<!-- webClient -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2๏ธโฃ WebCientConfig ์์ฑํ๊ธฐ
@Configuration
public class WebClientConfig {
@Bean
public WebClient MatgimWebClient(){
return WebClient.builder()
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
}
- @Configuration : ์คํ๋ง์ด ์์๋ ๋ Configuration ์ด๋ ธํ ์ด์ ์ ์ฝ์ด์ ์ค์ ์ ์คํํจ. ์๋ฐ์ ์ผ๋ฐ ํด๋์ค๊ฐ ์๋ ์คํ๋ง ์์คํ ์ ์ค๊ณ๋ ์ญํ
- @Bean : ๋ค๋ฅธ ์๋น์ค ํด๋์ค์์ new WebClient()๋ฅผ ๋งค๋ฒ ํ ํ์ ์์ด ์คํ๋ง์ด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ค ์ด ๊ฐ์ฒด๋ฅผ "์ฃผ์ (@Autowired)"๋ฐ๋น ์ธ ์ ์์(์ฑ๊ธํค ํจํด)
- public WebClient MatgimWebClient() : ์์ฑ๋ ๊ฐ์ฒด์ ํ์ ์ WebClient, ์ด Bean์ ์ด๋ฆ์ MatgimWebClient
- WebClient.builder() : WebClient ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์กฐ๋ฆฝ ๋๊ตฌ(Builder)๋ฅผ ๊บผ๋ด๋ ๋จ๊ณ
- defaultHeader(HttpHeader.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) : ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ชจ๋ ์์ฒญ์ ๊ธฐ๋ณธ์ ์ผ๋ก JSON์์ ๋ช ์ํจ)
- build() : ์ค์ ์ ๋ง์น ์ต์ข ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ์คํ๋ง ์ปจํ ์ด๋์ ๋ณด๊ด๋จ
3๏ธโฃ API ํธ์ถํ๊ธฐ
String body = request.getText();
Map<String,String> bodyMap = new HashMap<>();
bodyMap.put("document", body);
MatgimResponseDTO result = webClient.post()
.uri(matgimUrl)
.header("Content-Type", "application/json")
.header("x-auth-token", matgimApiKey)
.bodyValue(bodyMap)
.retrieve()
.bodyToMono(MatgimResponseDTO.class)
.block();
์ด์ service๋จ์์ API ํธ์ถ๋ถ๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
- ์์ฒญ ๋ฐ์ดํฐ ์ค๋น
String body = request.getText(); // ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ์ผ๊ธฐ ๋ด์ฉ ๋ฑ์ ๊ฐ์ ธ์ด
Map<String, String> bodyMap = new HashMap<>();
bodyMap.put("document", body); // API๊ฐ ์ํ๋ {"document": "๋ด์ฉ"} ํ์์ผ๋ก ๋ง๋ฆ
- ํธ์ถ๋ถ ์์ฑ
MatgimResponseDTO result = webClient.post() // 1. POST ๋ฐฉ์
.uri(matgimUrl) // 2. ๋ชฉ์ ์ง ์ฃผ์(URL) ์ค์
.header("Content-Type", "application/json") // 3. JSON ๋ฐ์ดํฐ๋ผ๊ณ ์๋ฆผ
.header("x-auth-token", matgimApiKey) // 4. ์ธ์ฆ ํค๋ฅผ ํค๋์ ๋ด์
.bodyValue(bodyMap) // 5. ์ค๋นํ ๋ฐ์ดํฐ๋ฅผ ๋ชธ์ฒด(Body)์ ์ค์
.retrieve() // 6. ์ด์ ์์ฒญ์ ์จ
.bodyToMono(MatgimResponseDTO.class) // 7. ๋ฐ์ JSON์ ์๊น ๋ง๋ DTO ๊ฐ์ฒด๋ก ์๋ ๋ณํ
.block(); // 8. ๊ฒฐ๊ณผ๊ฐ ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆผ (๋๊ธฐ์ ์ฒ๋ฆฌ)
.block()์ ์๋ฏธ: ์๋ WebClient๋ ๋น๋๊ธฐ(Non-blocking)๋ก ๋์ํ์ง๋ง, ์ฌ๊ธฐ์ .block()์ ์ฐ๋ฉด ์๋ต์ด ์ฌ ๋๊น์ง ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ์ง ์๊ณ ๊ธฐ๋ค๋ฆฐ๋ค. ์๋๋ฉด
double score = result != null ? result.getResult().getDocumentScore().getScore() * 2.5 : 0;
score = Math.max(-1, Math.min(1, score));
double positive = result != null ? result.getResult().getDocumentScore().getPosScore() : 0;
double negative = result != null ? result.getResult().getDocumentScore().getNegScore() : 0;
double magnitude = (Math.abs(positive) + Math.abs(negative)) * 5;
response.setScore(score);
response.setMagnitude(magnitude);
return ResponseEntity.ok(response);
์ด ๋ก์ง ๋๋ฌธ์.. ๊ธฐ์กด์ google api์์ ๊ฐ์ ์ score๊ณผ magnitude๋ก ๋ถ๋ฆฌํด์ ๋ณด๋ด์คฌ๋๋ฐ, ๋งก๊น์ ๊ธ์ ์ ์ธ ๊ฐ์ , ๋ถ์ ์ ์ธ ๊ฐ์ ์ ์ ์๋ง ์๋ ค์ค๋ค. ๊ทธ๋์ ๊ทธ๊ฑธ score๊ณผ magnitude๋ก ๋ณํํ ๊ฐ์ธ์ ์ธ ๋ก์ง์ด๋ค... ์ด ๋ถ๋ถ์ ํ์๋ ์๋๋ค!

[์ฐธ๊ณ ๋ฌธํ]
https://m.blog.naver.com/seek316/223337685249
[Java] Spring Boot - WebClient ์ฌ์ฉํ๊ธฐ
WebClient๋? WebClient๋ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์์ HTTP ์์ฒญ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅ...
blog.naver.com
https://coding-factory.tistory.com/279
[Java] ์๋ฐ Thread(์ค๋ ๋) ์ฌ์ฉ๋ฒ & ์์
Thread๋? ํ๋์ ํ๋ก์ธ์ค ๋ด๋ถ์์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ ํ๋์ ์์ ๋จ์๋ฅผ ๋งํ๋ฉฐ, ์ธ๋ถ์ ์ผ๋ก๋ ์ด์์ฒด์ ์ ์ํด ๊ด๋ฆฌ๋๋ ํ๋์ ์์ ํน์ ํ์คํฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ค๋ ๋์ ํ์คํฌ(ํน์ ์
coding-factory.tistory.com
'ToyProjects๐งธ > Dalmuriโญ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Dalmuri] Supabase๋ก ๋๋ค ์ฃผ์ open API ๋ง๋ค๊ธฐ (0) | 2025.11.25 |
|---|---|
| [Dalmuri] Java๋ก Google Cloud Nature Language API ํธ์ถํด์ ๊ฐ์ ๋ค์ด์ด๋ฆฌ ๋ง๋ค๊ธฐ (0) | 2025.10.16 |
| ํ๋ก์ ํธ Dalmuri ๊ธฐํ ๋ฐ ์ค๊ณ (0) | 2025.08.16 |