728x90
반응형
SMALL

타 시스템 간에 데이터를 주고 받을 때 게이터 포맷에 대한 약속 필요

혼자 시스템을 개발하거나 내부 시스템 끼리는 "1-김태민-강사,2-아무개-학생 " 이라는 문자열을 만들어서 "-(하이픈)"을 파싱해서 순서대로 "1"은 일련번호, "김태민"은 이름, "강사"는 구분이라는 규칙과, ",(콤마)"는 리스트를 나타내는 구분자라는 규칙을 세울 수 있을 겁니다.

데이터를 내부 시스템에 전송할때 포맷에 대한 형태는 말로써 혹은 내부 문서로써 정의해 놓으면 되기 때문에 데이터 크기는 엄청 작아 질 수 있음

문제는 타 시스템들과의 연동을 할때입니다.

태그형식을 통해서 Key와 Value를 구분하고, 태그안에 태그를 넣어서 부모와 자식관계의 구조를 나타냅니다.

Object 일 경우 {} 로 감싸주고있고, Array일 경우 **[]**로 감싸주고 있어서 구분도 되고요.

Key도 아까 Xml처러 두번 들어가지 않음

**-(하이픈)**을 통해서 Array임을 알수있음

yaml 포맷은 이제 많은 곳에서 사용

YAML 파일이란?

YAML 파일은 유니코드 기반 데이터 직렬화 언어인 YAML(YAML Ain’t Markup Language) 언어로 구성됩니다. 구성 파일, 인터넷 메시징, 객체 지속성 등에 사용

간략한 역사

YAML은 2001년에 처음 제안되었으며 Clark Evans, Ingy dot Net 및 Oren Ben-Kiki에 의해 개발되었습니다. YAML은 처음에 마크업 언어로서의 목적을 나타내기 위해 “또 다른 마크업 언어"를 의미한다고 했습니다. 나중에 데이터 지향적인 목적을 나타내기 위해 “YAML Aint Markup Language"로 용도가 변경되었음

YAML 파일 형식

YAML 파일은 다음 데이터 유형으로 구성됩니다.

  • 스칼라: 스칼라는 문자열, 정수, 부울 등과 같은 값입니다.
  • 시퀀스: 시퀀스는 각 항목이 하이픈(-)으로 시작하는 목록입니다. 목록을 중첩할 수도 있습니다.
  • 매핑: 매핑은 값과 함께 키를 나열하는 기능을 제공합니다.

구문

  • 공백: 공백 들여쓰기는 중첩 및 전체 구조를 나타내는 데 사용됩니다.
이름: 존 스미스
연락하다:
집: 1012355532
사무실: 5002586256
주소:
거리: |
123 토네이도 골목
스위트 16
도시: 이스트 센터빌
상태: KS

  • 댓글: 댓글은 “#” 기호로 시작하여 작성됩니다.
# YAML 주석입니다.

  • 목록: 하이픈(-)은 각 구성원이 별도의 줄에 있는 목록 구성원을 나타내는 데 사용됩니다. 목록 멤버는 쉼표(,)로 구분된 멤버와 함께 대괄호([…])로 묶일 수도 있습니다.
  - A
  - B
  - C

[A,B,C]

  • 연관 배열: 연결 배열은 중괄호({…})로 둘러싸여 있습니다. 키와 값은 콜론(:)으로 구분하고 각 쌍은 쉼표(,)로 구분합니다.
  {name: John Smith, age: 20}

  • 문자열: 문자열은 큰따옴표(”) 또는 작은따옴표(’)를 사용하거나 사용하지 않고 작성할 수 있습니다.
샘플 문자열
"샘플 문자열"
'샘플 문자열'

  • 스칼라 블록 콘텐츠: 스칼라 콘텐츠는 다음을 사용하여 블록 표기법으로 작성할 수 있습니다.
    • |: All live breaks are significant.
    • >: Each line break is folded to space. It removes the leading whitespace for each line.
데이터: |
YAML
(YAML은 마크업 언어가 아닙니다)
데이터 직렬화 언어입니다

데이터: ?
YAML(YAML은 마크업 언어가 아님)
데이터 직렬화 언어입니다

  • 여러 문서: 여러 문서는 단일 스트림에서 세 개의 하이픈(—)으로 구분됩니다. 하이픈은 문서의 시작을 나타냅니다. 하이픈은 문서 내용에서 지시문을 구분하는 데에도 사용됩니다. 문서의 끝은 세 개의 점(…)으로 표시됩니다.
  ---
문서 1
  ---
문서 2
...

  • 유형: 값의 유형을 지정하기 위해 이중 느낌표(!!)를 사용합니다.
a: !!플로트 123
b: !!str 123

  • 태그: 메모에 태그를 지정하려면 앰퍼샌드(&)를 사용하고 해당 노드를 참조하려면 별표(*)를 사용합니다.
이름: 존 스미스
청구처: &id01
거리: |
123 토네이도 골목
스위트 16
도시: 이스트 센터빌
상태: KS

배송처: *id01

  • 지시문: YAML 문서는 스트림의 지시문 앞에 올 수 있습니다. 지시문은 퍼센트 기호(%)로 시작하고 그 뒤에 이름과 공백으로 구분된 매개변수가 옵니다.
%YAML 1.2
  ---
문서 내용

YAML 파일 예

여기에서 docker yaml 파일 예시를 볼 수 있습니다.

topology:
database_node_name: docker_controller
docker_controller_node_name: docker_controller
self_service_portal_node_name: docker_controller
kvm_compute_node_names: kvm_compute1
docker_compute_node_names: docker_compute1

YAML 대 JSON

기본적으로 JSON과 YAML은 모두 사람이 읽을 수 있는 데이터 교환 형식을 제공하도록 개발되었습니다. YAML은 JSON 형식의 상위 집합으로 구현됩니다. YAML 파서를 사용하여 JSON을 파싱할 수 있음을 의미합니다. 비록 이 이론의 실제적인 구현이 조금 까다롭긴 하지만. 따라서 YAML과 JSON 간의 몇 가지 기본적인 차이점은 다음과 같습니다.

YAML JSON

직렬화된 데이터를 파싱하는 복잡하고 시간 소모적인 프로세스 단순한 디자인으로 JSON 직렬화된 데이터를 빠르고 쉽게 파싱
커뮤니티 지원 감소 더 큰 커뮤니티 지원 및 인기
댓글 지원 댓글을 지원하지 않습니다
다른 데이터 객체의 참조를 사용하는 기능 개체 참조로 복잡한 구조를 직렬화할 수 없음
계층 구조는 이중 공백 문자를 사용하여 표시됩니다. 탭 문자는 허용되지 않습니다 객체와 배열은 중괄호와 대괄호로 표시됩니다.
문자열 따옴표는 선택 사항이지만 작은 따옴표와 큰 따옴표를 지원합니다. 문자열은 큰 따옴표로 묶어야 합니다.
루트 노드는 유효한 데이터 유형 중 하나일 수 있습니다. 루트 노드는 배열 또는 개체여야 합니다.

 

이해 할 수 있도록 도움을 준 곳

https://www.inflearn.com/questions/16184/yaml파일-이란-무엇인가요

 

yaml파일 이란 무엇인가요 - 인프런 | 질문 & 답변

안녕하세요 강사님 너무 질문이 많아서 죄송합니다. yaml파일 이라는 단어를 요 근래 많이 듣고 있는데 정확인 무슨 파일인가요 검색해 보지도 않고 무조건 질문을 드리는것 같아서 죄송하지만

www.inflearn.com

 

728x90
반응형
LIST

'개발 > Spring' 카테고리의 다른 글

웹소캣 - 채팅 기본 구현 (테스트 코드 연습)  (0) 2023.04.09
웹소켓 알림 메세지 - session  (0) 2023.04.09
WebSock 구현  (0) 2023.03.07
JWT 장점과 단점  (0) 2023.02.15
인증 vs 인가  (0) 2023.02.14
728x90
반응형
SMALL
package com.test.sbp.config;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.*;
import org.springframework.web.socket.server.HandshakeInterceptor;

import java.util.Map;

//@Configuration
//@EnableWebSocketMessageBroker //STOMP를 사용하기 위한 어노테이션           //@EnableWebSocket : 기본적인 웹소켓 사용을 위한 어노테이션
//public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
//
//    @Override   //TODO:property 분리
//    public void configureMessageBroker(MessageBrokerRegistry registry) {
//        registry.setApplicationDestinationPrefixes("/pub") //서버에서 클라이언트로부터의 메서지를 받을 api의 prefix설정, 아래topic러는 곳에 구독하면, 실제경로는 "topic/pub"
//                .enableStompBrokerRelay("/topic") //SimpleBroker의 기능과 외부 message broker(RabbitMQ, ActiveMQ 등)에 메시지를 전달하는 기능을 가지고 있다.
//                .setRelayHost("localhost")                 // 여기부터 외부브로커인 RabbitMQ를 사용하기위한 설정.
//                .setVirtualHost("/")
//                .setRelayPort(61613)
//                .setClientLogin("guest")
//                .setClientPasscode("guest");
//    }
//
//    @Override
//    public void registerStompEndpoints(StompEndpointRegistry registry) {
//        registry.addEndpoint("/ws")     //엔드포인트는 /ws
//                .setAllowedOrigins("*");
//    }
//}
@RequiredArgsConstructor
@Configuration
@EnableWebSocket
public class WebSockConfig implements WebSocketConfigurer {
    private final WebSocketHandler webSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler, "ws/chat").setAllowedOrigins("*");
    }
}
package com.test.sbp;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.test.sbp.dto.ChatMessage;
import com.test.sbp.dto.ChatRoom;
import com.test.sbp.service.ChatService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

@Slf4j
@RequiredArgsConstructor
@Component
public class WebSocketHandler extends TextWebSocketHandler {
    private final ObjectMapper objectMapper;
    private final ChatService chatService;

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        log.info("{}", payload);
        ChatMessage chatMessage = objectMapper.readValue(payload, ChatMessage.class);

        ChatRoom chatRoom = chatService.findRoomById(chatMessage.getRoomId());
        chatRoom.handlerActions(session, chatMessage, chatService);
    }
}
package com.test.sbp.dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ChatMessage {
    // 메시지 타입 : 입장, 채팅
    public enum MessageType {
        ENTER, TALK
    }
    private MessageType type; // 메시지 타입
    private String roomId; // 방번호
    private String sender; // 메시지 보낸사람
    private String message; // 메시지
}
package com.test.sbp.dto;

import com.test.sbp.service.ChatService;
import lombok.Builder;
import lombok.Getter;
import org.springframework.web.socket.WebSocketSession;

import java.util.HashSet;
import java.util.Set;

@Getter
public class ChatRoom {
    private String roomId;
    private String name;
    private Set<WebSocketSession> sessions = new HashSet<>();

    @Builder
    public ChatRoom(String roomId, String name) {
        this.roomId = roomId;
        this.name = name;
    }

    public void handlerActions(WebSocketSession session, ChatMessage chatMessage, ChatService chatService) {
        if (chatMessage.getType().equals(ChatMessage.MessageType.ENTER)) {
            sessions.add(session);
            chatMessage.setMessage(chatMessage.getSender() + "님이 입장했습니다.");
        }
        sendMessage(chatMessage, chatService);

    }

    private <T> void sendMessage(T message, ChatService chatService) {
        sessions.parallelStream()
                .forEach(session -> chatService.sendMessage(session, message));
    }
}
package com.test.sbp.controller;

import com.test.sbp.dto.ChatRoom;
import com.test.sbp.service.ChatService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequiredArgsConstructor
@RestController
@RequestMapping("/chat")
public class ChatController {
    private final ChatService chatService;

    @PostMapping
    public ChatRoom createRoom(@RequestBody String name) {
        return chatService.createRoom(name);
    }

    @GetMapping
    public List<ChatRoom> findAllRoom() {
        return chatService.findAllRoom();
    }
}
package com.test.sbp.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.test.sbp.dto.ChatRoom;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.*;

@Slf4j
@RequiredArgsConstructor
@Service
public class ChatService {
    private final ObjectMapper objectMapper;
    private Map<String, ChatRoom> chatRooms;

    @PostConstruct
    private void init() {
        chatRooms = new LinkedHashMap<>();
    }

    public List<ChatRoom> findAllRoom() {
        return new ArrayList<>(chatRooms.values());
    }

    public ChatRoom findRoomById(String roomId) {
        return chatRooms.get(roomId);
    }

    public ChatRoom createRoom(String name) {
        String randomId = UUID.randomUUID().toString();
        ChatRoom chatRoom = ChatRoom.builder()
                .roomId(randomId)
                .name(name)
                .build();
        chatRooms.put(randomId, chatRoom);
        return chatRoom;
    }

    public <T> void sendMessage(WebSocketSession session, T message) {
        try{
            session.sendMessage(new TextMessage(objectMapper.writeValueAsString(message)));
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
    }
}
728x90
반응형
LIST

'개발 > Spring' 카테고리의 다른 글

웹소켓 알림 메세지 - session  (0) 2023.04.09
yml 파일이란 ?  (0) 2023.03.12
JWT 장점과 단점  (0) 2023.02.15
인증 vs 인가  (0) 2023.02.14
ORM, JPA, Spring Data JPA  (0) 2023.02.13
728x90
반응형
SMALL

단일원칙을 지키지 않았지만... 설명하기 위해 억지로 만들었습니다..

class 포켓몬 {
// 레드는 오박사님께 함께 여행을 할 포켓몬 1마리를 선물 받기로 했는데, 선택하려고 한다.
	static final int 피카츄 = 0;
	static final int 파이리 = 1;
	static final int 꼬북이 = 2;

 // 레드는 태초마을에서 어느 마을로 여행을 갈 것인가?
	static final int 상록시티 =0;
	static final int 회색시티 =1;
	static final int 블루시티 =2;

final int 포켓몬kind;
final int 마을;
}

https://www.pokemonkorea.co.kr/pokedex

 

:::포켓몬 도감

포켓몬 도감:::

www.pokemonkorea.co.kr

포켓몬과 도시를 임의로 넣엇지만, 사실상 포켓몬 도감을 보면 공식적으로 1009마리가 들어있다.

이 많은 포켓몬을 다 하나하나 적어서 할 수 없기 때문에 아래 와 같이 열거형으로 사용한다.

class 포켓몬 {
// 레드는 오박사님께 함께 여행을 할 포켓몬 1마리를 선물 받기로 했는데, 선택하려고 한다.
	enum 포켓몬kind {피카츄, 파이리, 꼬북이} // 열거형 kind 정의 
// 피카츄, 파이리, 꼬북이 => 상수명
 // 레드는 태초마을에서 어느 마을로 여행을 갈 것인가?
	enum 마을 {상록시티, 회색시티, 블루시티} // 열거형 마을 정의

	final 포켓몬Kind 포켓몬kind;
  final 마을(대문자) 마을(소문자);
}
//열거형에 멤버 추가하기
//레드는 여행을 하던 중 새로운 포켓몬을 만났다.
	enum 포켓몬kind {피카츄, 피존튜, 꼬북이, 이브이) // 열거형 kind 정의 
// 열거형에 추상 메서드 추가하기
// 레드는 여행을 하기 위해 걸어가다 힘이 들어 운송수단을 알아볼려고 합니다.
// 피존튜나 타고 가거라
// 버스는 100원, 기차는 150원 배는 100원 피존튜는 0원
emun Transportation {
	버스Bus(100), 기차TRAIN(150), 배SHIP(100), 피존튜(0);
	
	private final int BASIC_FARE;
	
	private Transportation(int basicFare){
			BASIC_FARE = basicFare;
	}
	int fare() { // 운송 요금을 반환
		return BASTC_FARE;
	}
}
728x90
반응형
LIST

+ Recent posts