์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ORM
- JPQL
- ์น ์ดํ๋ฆฌ์ผ์ด์
- Parser
- ์น ์ดํ๋ฆฌ์ผ์ด์ ์๋ฒ
- WAS
- ๋ฐฑ์ค
- C++
- ๋๋ฉ์ธ
- nginx
- apache
- n-gram
- ๊น์ํ
- jpa
- springboot
- H2
- ์น ์๋ฒ
- S3
- ์ด๋ฏธ์ง ์ ๋ก๋
- Full Text Search
- index
- SpirngBoot
- 2630๋ฒ
- Tomcat
- Today
- Total
enginner_s2eojeong
Jackson ๋งคํ ์ค๋ฅ: JSON ํ๋์ Java ํ๋ ๋ถ์ผ์น ๋ฌธ์ ํด๊ฒฐํ๊ธฐ (feat. ๋ชจ๋ธ api ์ฐ๊ฒฐ) ๋ณธ๋ฌธ
Jackson ๋งคํ ์ค๋ฅ: JSON ํ๋์ Java ํ๋ ๋ถ์ผ์น ๋ฌธ์ ํด๊ฒฐํ๊ธฐ (feat. ๋ชจ๋ธ api ์ฐ๊ฒฐ)
_danchu 2025. 2. 21. 02:23Recipe-Recommender Model
๐กGoal : ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ๋ฑ๋กํ ์๋ ๋ฅด๊ธฐ ์ ๋ณด์ ์ ํธ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก '์ค๋์ ์ถ์ฒ ๋ ์ํผ'๋ฅผ ์ ๊ณต
JSON ์์ฒญ: user_id
JSON ์๋ต: recipe_id
๋ฌธ์
๋ฐ์ดํฐ/ai ํ์์ ์ ๋ฌ๋ฐ์ input, output ๊ฐ์ ๋ฐํ์ผ๋ก ๋ชจ๋ธ api์ user_id๋ฅผ ๋๊ธฐ๊ณ , recipe_id๋ฅผ ๋ฐ์์ค๋ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
๊ทผ๋ฐ Postman์ผ๋ก GET localhost:8080/api/recipes/recommend ์์ฒญ์ ๋ณด๋๋๋ json ํ๋๊ฐ ์ผ์นํ์ง ์๋๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
RestTemplate์ ๊ธฐ๋ณธ์ ์ผ๋ก Jackson์ ์ฌ์ฉํดMap<String, Object>๋ฅผ JSON์ผ๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์ {"user_id": "146"} ๊ฐ์ JSON ํํ๋ก ๋ชจ๋ธ API์ ์ ์ก๋๋ค.
์๋ต ๋ฐ์ดํฐ ๋ํ Map<String, Object> ํํ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ API๊ฐ JSON ์๋ต์ ๋ฐํํ๋ฉด, response.getBody()๊ฐ ์ด๋ฅผ {"recipe_id": 112}์ ๊ฐ์ JSON ํ์์ผ๋ก ์ ๋ฌ๋๋ค.
๋ฐ์ดํฐ/ai ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋๋ช ์ ๋ฐํ์ผ๋ก ์ค๊ณ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ Java ๊ฐ์ฒด์ ํ๋๋ช ์ด ๋ค๋ฅด๋ค๋๊ฑธ ์ผ๋์ ๋๊ณ ๊ฐ์ ์ ๋ฌํ ๋์ ๋ฐ์ ๋ ๋ชจ๋ ์ ๋งคํ์ ํด๋จ๋๋ฐ๋ ์๊พธ ๋งคํ๋์ง ์๋๋ค๋ ์๋ฌ๊ฐ ๋ ์ ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณด์๋ค.
Map<String, Object> requestPayload = Map.of("user_id", userId);
try {
ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
recipeRecommendApiUrl,
HttpMethod.POST,
new HttpEntity<>(requestPayload),
new ParameterizedTypeReference<>() {
}
);
log.info("Calling AI model with userId: {}", userId);
Map<String, Object> responseBody = response.getBody();
if (!responseBody.containsKey("recipe_id")) {
log.error("AI ๋ชจ๋ธ ์๋ต์ recipeId๊ฐ ์์ต๋๋ค.");
return new RecipeRecommendResponseDTO(null, null, null);
}
.
.
.
// ์ถ์ฒ ๋ ์ํผ ๋ฐํ
return new RecipeRecommendResponseDTO(
recipe.getId(),
recipe.getImagePath(),
recipe.getRecipeName());
} catch (HttpClientErrorException e){
log.error("AI ๋ชจ๋ธ API ํธ์ถ ์คํจ: {}", e.getStatusCode());
return new RecipeRecommendResponseDTO(null, null, null);
}
์ผ๋จ ๋ก๊ทธ๋ฅผ ํตํด userId๋ ๋ชจ๋ธ์ ์ ์ ๋ฌ๋๊ณ ์๋ ๊ฒ์ ํ์ธํ๋ค.
Calling AI model with userId: 146
recipe_id๊ฐ ๋๊ฐ์ด์๋ค๋ฉด ์ถ๋ ฅ๋์ด์ผ ํ "AI ๋ชจ๋ธ ์๋ต์ recipeId๊ฐ ์์ต๋๋ค."๋ ์ถ๋ ฅ๋์ง ์์๊ฑธ ๋ณด์ recipe_id ๊ฐ์ ์์ง๋ง ์ ๋๋ก ๋งคํ์ด ๋์ง์์์์ ์ ์ ์์๋ค. ๋ค์์ผ๋ก ์์ฌํด๋ณธ๊ฑด ๊ทธ ์๋์ ์์นํ ์ต์ข ์๋ต๊ฐ์ธ RecipeRecommendResponseDTO์๋ค.
๊ฐ์ ๋ด์ ๋ฐํํ๋ RecipeRecommendResponseDTO์์๋ ์ฌ์ ํ ํ๋๋ช ์ recipeId๋ก ์ฌ์ฉํ๊ณ ์์ด์ ๋ฐ์ํ ๋ฌธ์ ์๋ค..!
์ด ๋๋ฌธ์ JSON ํ๋๋ช (recipe_id)๊ณผ DTO ํ๋๋ช (recipeId)์ด ์ผ์นํ์ง ์์์ Jackson์ด ์๋์ผ๋ก ๋งคํํ์ง ๋ชปํ ๊ฒ์ด๋ค.

ํด๊ฒฐ ๋ฐฉ๋ฒ
@JsonProperty๋ฅผ ์ฌ์ฉํด์ JSON ํ๋๋ช ์ Java ํ๋์ ๋ช ์์ ์ผ๋ก ๋งคํํด์ฃผ๋ฉด ๋๋ค.

์ง์ ์ด์ ์ค๋์ ์ถ์ฒ ๋ ์ํผ๊ฐ ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค :)
