Backend/JAVA

jsonํŒŒ์ผ ์ฝ๊ธฐ

dddzr 2025. 12. 18. 06:57

   

๐Ÿ“Œ 1. getResourceAsStream ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

private void loadRulesFromJson() {
        try (InputStream is = getClass().getClassLoader().getResourceAsStream("chatbot/rules.json")) {
            if (is == null) {
                throw new FileNotFoundException("rules.json ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
            }

            ObjectMapper mapper = new ObjectMapper();
            Map<String, List<ChatRuleDTO>> rawRules = mapper.readValue(is,
                new TypeReference<Map<String, List<ChatRuleDTO>>>() {});
}

 

๐Ÿ“Œ2. ClassPathResource ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

private void loadRulesFromJson() {
    try {
        ClassPathResource resource = new ClassPathResource("chatbot_rules.json");
        InputStream inputStream = resource.getInputStream();
        rulesNode = objectMapper.readTree(inputStream);
    } catch (IOException e) {
        throw new RuntimeException("์ฑ—๋ด‡ ๋ฃฐ JSON ํŒŒ์ผ์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.", e);
    }
}

 

 

 

๐Ÿ“Œ3. ๋ฐฉ๋ฒ• ๋น„๊ต

๋‘ ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋‘ JSON ํŒŒ์ผ์„ ์ฝ์–ด์„œ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋ชฉ์ ์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. 

 

โœ… 3-1. ๊ณตํ†ต์ 

  • classpath์— ์žˆ๋Š” JSON ํŒŒ์ผ์„ ์ฝ์Œ
  • ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ RuntimeException์œผ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ๋˜์ง
  • Jackson(ObjectMapper)๋ฅผ ์‚ฌ์šฉ

โœ… 3-2. ์ฐจ์ด์ 

ํ•ญ๋ชฉ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์‹ (getResourceAsStream) ๋‘ ๋ฒˆ์งธ ๋ฐฉ์‹ (ClassPathResource)
ํŒŒ์ผ ์ ‘๊ทผ ๋ฐฉ์‹ ClassLoader.getResourceAsStream() ์‚ฌ์šฉ Spring์˜ ClassPathResource ์‚ฌ์šฉ
ํ˜ธํ™˜์„ฑ ์ˆœ์ˆ˜ Java ๋ฐฉ์‹ (Spring ์˜์กด X) Spring ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กด
์ฝ๋Š” ๋Œ€์ƒ rules.json → Map<String, List<ChatRuleDTO>> ์œผ๋กœ ๋งคํ•‘ ํ›„ ๊ฐ€๊ณต chatbot_rules.json → JsonNode (๊ณ„์ธต ๊ตฌ์กฐ ์ ‘๊ทผ์šฉ)
ํŒŒ์‹ฑ ๋ชฉ์  DTO → ๋„๋ฉ”์ธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ ํ›„ ๋ฃฐ ๋งตํ•‘ (stateRules) JSON ๊ตฌ์กฐ ๊ทธ๋Œ€๋กœ ์œ ์ง€ (rulesNode)
ObjectMapper ์‚ฌ์šฉ ๋ฐฉ์‹ readValue(InputStream, TypeReference) readTree(InputStream)
์œ ์—ฐ์„ฑ ํƒ€์ž… ์•ˆ์ •์„ฑ ↑ (DTO ๊ตฌ์กฐ ์ •์˜๋จ) ๊ตฌ์กฐ ๋ณ€๊ฒฝ์— ์œ ์—ฐ (JsonNode๋Š” Key ๊ธฐ๋ฐ˜ ์ ‘๊ทผ)
์ถ”์ฒœ ์‚ฌ์šฉ์ฒ˜ ๊ตฌ์กฐ๊ฐ€ ๊ณ ์ •๋œ ๋ฃฐ ๊ฐ์ฒด ๋งคํ•‘ ๋ฃฐ์ด ๋™์ ์ด๊ฑฐ๋‚˜ ๊ตฌ์กฐ๊ฐ€ ์ž์ฃผ ๋ฐ”๋€” ๊ฐ€๋Šฅ์„ฑ ์žˆ์„ ๋•Œ

 

๐Ÿ“– ์˜ˆ์‹œ๋กœ ์ฐจ์ด ์„ค๋ช…

โœ… ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์‹

{
  "greeting": [
    {
      "condition": "hello",
      "response": "Hi!",
      "nextState": "askName"
    }
  ]
}

 

→ ๋ฐ”๋กœ ChatRuleDTO ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ → ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›€

 

โœ… ๋‘ ๋ฒˆ์งธ ๋ฐฉ์‹

{

  "greeting": {

    "buttons": ["Yes", "No"],

    "response": "Hi!",

    "nextState": "askName"

  }

}

 

→ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ JsonNode ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ

 

 

๐Ÿš€ ๊ฒฐ๋ก : ์–ด๋–ค ๊ฑธ ์จ์•ผ ํ• ๊นŒ?

์ƒํ™ฉ ์ถ”์ฒœ ๋ฐฉ์‹
๊ตฌ์กฐ๊ฐ€ ๊ณ ์ •๋œ ๋ฃฐ ๋ฐ์ดํ„ฐ, ์ž์ฃผ DTO๋กœ ์“ฐ๋Š” ๊ฒฝ์šฐ โœ… ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์‹
JSON ๊ตฌ์กฐ๊ฐ€ ์œ ๋™์ ์ด๊ณ , ํ‚ค๋‚˜ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๊ฒฝ์šฐ โœ… ๋‘ ๋ฒˆ์งธ ๋ฐฉ์‹

 

ํ•„์š”ํ•˜๋ฉด ๋‘ ๋ฐฉ์‹์„ ๋ณ‘ํ–‰ํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค!! ๐Ÿ˜Ž
์˜ˆ: ๋ฒ„ํŠผ, ์กฐ๊ฑด, ์ถ”๊ฐ€ ์†์„ฑ์€ JsonNode๋กœ ๋จผ์ € ํŒŒ์•… → DTO๋กœ ์ผ๋ถ€ ๋งคํ•‘