데이터가 추가될 수 있거나 여러 데이터를 컬럼으로 가져야 할 경우, nvarchar 타입으로 컬럼을 생성하여 json 형식으로 저장하는 것도 하나의 방법이라는 것을 알았다. 유연성이 필요하거나 데이터 구조가 자주 변경될 수 있는 경우에 큰 장점을 가진다고 한다.
간단하게 실습한 내용을 작성해 보겠다.
mssql에 간단한 테이블 하나 만들었다.

data_info 컬럼이 json 형식으로 가지고 있으면 될 것 같다.
db 관련 크레이트는 tiberius 사용하였다.
https://crates.io/crates/tiberius
#[derive(Serialize, Deserialize, Debug)]
struct Data {
mark_data: i32,
mark_color: i32,
}
Serialize, Deserialize derive를 구현하도록 하여 Insert 시 직렬화, Select 시 역직렬화를 할 수 있도록 하였다.
Data를 생성 후 직렬화 한다.- 직렬화한 데이터를 table에 insert한다.
- select을 통해서 데이터를 가져온 뒤, 역직렬화로
Data로 만들어 준다.
let data = Data { mark_data: 1, mark_color: 3 };
let json_data = serde_json::to_string(&data)?;
let result = client.execute(
"INSERT [TB_DATA] (data_info) VALUES (@p1)",
&[&json_data]
).await?;
if result.total() < 0 {
println!("영향 받은 라인이 없습니다. 실패!");
}
client 만드는 방법은 https://velog.io/@wang_ki/rust-tiberius-bulk-insert 여기 참고하면 된다.
ssms로 조회하였는데 정상적으로 값이 들어갔다.

let result = client.query(
"SELECT * from TB_DATA",
&[]
).await?;
let row = result.into_row().await?;
let row = row.unwrap();
let data_info: &str = row.get(1).unwrap();
let data = serde_json::from_str::<Data>(data_info)?;
println!("data: {:?}", data);
이번에는 SELECT을 통해서 row를 얻어온다. 특정 컬럼 값을 가져온 뒤, json 역직렬화를 통해 Data형식으로 파싱하여 화면에 찍어주었다.

db에서 json 형태로 컬럼의 값을 채운다는 방법을 알게 되었다. 현업에서 컬럼이 변경되면 로컬 db table이 아닌 main server도 반영이 되어야 하기 때문에 수정사항이 많아진다. 그러나 자주 변경되는 경우, 정확히 기획되지 않은 경우, 데이터 정보가 많이 필요한 경우, json을 사용하면 손쉽게 처리할 수 있을 것 같고 좋은 구조가 될 것 같다. 그러나 무분별하게 데이터를 늘리게 되면 json 특성상 불필요한 문자열까지 저장이 되기 때문에 이 부분이 어떻게 문제가 될 수 있는지는 생각을 해봐야 할 부분인 것 같다. 모든 것에는 트레이드오프가 있는 것 같다.