MyBatis 일괄 INSERT, DELETE
- 여러 엔티티의 정보를 List 형태로 받아서 일괄적으로 DB에 INSERT 쿼리를 실행하려고한다.
- 관련된 내용을 정리해보려한다.
- 프론트
- 다음과 같이 배열 list에 각 object를 담아서 이 데이터를 POST 요청과 함께 보낸다.
- 그러면 백엔드에서 @RequestBody List<ModelVo> 형태로 데이터를 받을 수 있다.
- cf) DELETE 요청에는 requestbody 를 보내는게 권장되지 않는다. HTTP 프로토콜의 표준 사양에 따르면 DELETE 요청에 requestbody를 포함하지 않는 게 원칙이다. 보안/캐싱에 관한 문제가 있기 때문이다.
- 따라서, 선택 삭제 같은 기능을 구현하는 경우, URL에 "id=model3&id=model9" 와 같은 방식으로 이어 붙여서 백엔드로 요청을 보내도록 한다. 그러면 컨트롤러 메서드에서는 @RequestParam List<String> 를 통해 데이터를 전달 받을 수 있다.
<hide/>
const editModelList = () => {
let list = [];
for (let i = 0; i < state.model.list.length; ++i) {
let editForm = {
modelId: state.model.list[i].modelId,
modelNm: modelNm,
};
list[i] = editForm;
}
$axios
.post($apiUrls.model.createModelList, list, {
headers: { "Content-Type": "application/json" },
})
.then((res) => {
console.log(res);
alert("저장이 완료되었습니다.");
dialogEdit.value = false;
location.reload();
})
.catch((err) => {
console.log(err);
if (
err.response &&
err.response.status &&
(err.response.status === 422 || err.response.status === 400)
) {
alert(err.response.data.message);
} else {
alert("등록에 실패하였습니다.");
}
});
};
- MyBatis - INSERT
- PK를 생성하면서 동시에 INSERT 하려고 한다.
- def) seq_tb_common 는 시퀀스 라는 데이터베이스 오브젝트이다. 데이터베이스에서 테이블의 기본키를 생성하거나 유일한 식별자를 생성하는데 사용된다. 일반적으로 정수 값을 생성하고 고유하고 연속적인 값을 보장한다. 다음 값을 얻기 위해서는 'NEXTVAL'함수를 이용한다.
- 시퀀스는 스프링 JPA의 @GeneratedValue 와 유사한 기능이다.
- <insert>의 속성 parameterType에 Java의 List를 넣어준다.
- VALUES 안에는 forEach와 seperator를 이용해서 여러 개의 데이터를 ',' 로 구분하도록 지정해준다.
- collection="list"
- item="item" 은 반복문으로 하나씩 insert 해주는 각 데이터를 의미한다.
- 파라미터로 컬렉션이 아닌 하나의 데이터만 받는 경우는 forEach 코드가 필요없다.
- PK를 생성하면서 동시에 INSERT 하려고 한다.
<hide/>
<insert id="insertModelBatch" parameterType="java.util.List">
INSERT INTO tb_model (
model_id,
model_nm
)
VALUES
<foreach collection="list" item="item" separator=",">
(
CONCAT('MODEL', EXTRACT(EPOCH FROM now())::int, LPAD(CAST(NEXTVAL('seq_tb_common') AS varchar), 4, '0')),
#{item.modelNm}
</foreach>
</insert>
<hide/>
@Operation(summary="모델 등록 (Multi)")
@PostMapping("/api/models")
public ResponseEntity<Object> createModel(@RequestBody List<ModelVo> list){
List<String> result = service.createModelList(list);
return makeResponseEntity(result, HttpStatus.CREATED, "/api/models");
}
- MyBatis - DELETE
- 어느 DB 에서나 WHERE절 조건을 만족하는 모든 row에 대해서 DELETE 쿼리는 한 번만 실행되므로 batch 처리를 하기 위해 INSERT, UPDATE 처럼 <foreach>가 필수로 필요하지 않다.
- 아래의 쿼리는 모델 코드를 만족하는 모든 model을 한 번에 삭제한다.
<hide/>
<delete id="deleteModelBatch" parameterType="java.lang.String">
DELETE
FROM tb_model
WHERE model_cd = #{modelCd}
</delete>
유효성 검증 - Vue.js 3
- 회원 가입을 하거나 정보를 수정할 때, 필수적인 어떤 정보를 입력하지 않은 경우 API를 실행하지 못하도록 하는 방법을 알아보려고한다.
- HTML
- model: 저장할 대상인 정보의 변수
- model인 'state.editInfo'에 저장된 값이 'state.rules'를 만족하는지 아닌지 판단하기 위한 ref 형 변수가 바로 'ruleFormRef'이다.
- cf) state는 reactive를 이용한 반응형 데이터를 저장하는 변수명으로 주로 쓰인다.
<hide/>
<el-form
ref="ruleFormRef"
:model="state.editInfo"
:rules="state.rules"
...
/>
- SCRIPT
- state의 필드 중 하나인 rules에는 다음과 같이 필수로 입력해야 하는 값에 대한 규칙과 그에 대한 메시지를 만들 수 있다.
- required: 필수로 입력해야하는 필드인지 여부
- message: 규칙을 만족하지 않는 경우 띄울 메시지,
- ex) modelNm 필드가 비어있을 경우, 입력 칸 아래에 빨간색으로 '입력하세요' 라는 메시지를 띄운다.
<hide/>
const state = reactive({
editInfo; {},
rules: {
modelNm: [
{
required: true,
message: "입력하세요.",
trigger: "blur",
},
],
...
}
});
- validate()를 이용하면 해당 폼이 유효한지 검사해서 유효한지 여부를 의미하는 boolean 값을 매개변수 (valid)로 받을 수 있다.
- 아래의 editModel() 은 등록 버튼을 클릭할 때 실행되는 메서드이다.
- HTML 에서 <el-form> 태그 안에 넣어준 ref 형 변수에 대해 validate() 메서드를 실행할 수 있다.
- 그런데 위에서 설정한 rules의 어떤 조건을 만족하지 않은 경우, validate 안의 매개변수 valid가 false로 들어온다.
- 그래서 다음과 같이 alert 창을 띄울 수 있다.
<hide/>
const ruleFormRef = ref()
const EditModel = () => {
let ruleForm = ruleFormRef.value;
if (!ruleForm) return;
ruleForm.validate((valid) => {
if (!valid) {
alert("필수사항을 입력하십시오.");
return;
}
// 유효성 검증 완료 => axios POST 요청
}
사내에서 메타데이터 관련 업무를 맡게 되어서 관련 내용을 알아보려 한다.
주로 RDF, GraphQL 과 같은 내용이다.
Json LD (JavaScript Object Notation for Linked Data)
- Json을 사용해서 Linked data를 인코딩하는 방식이다.
- Json => Json LD 로 변환을 간소화하기 위해 쓰인다.
- 전통적인 Json 과 유사한 방식으로 데이터를 직렬화할 수 있다.
GraphQL(그래프큐엘)
- 페이스북에서 2015년 공개한 API를 위한 쿼리 언어이다. 클라이언트에게 요청한 만큼의 데이터를 제공하는데 우선 순위를 둔다.
- NoSQL에 속한다. 유연하고 스키마 기반으로 작동한다.
- 유연한 데이터 요청
SPARQL(SPARQL Protocol and RDF Query Language, 스파클)
- RDF(Resource Description Framework) 데이터를 검색하거나 조작할 수 있는 언어이다.
- RDF 는 주어, 술어, 목적어(트리플)로 데이터를 표현하는 데이터 모델로 웹 상의 데이터를 표현하고 연결하는데 사용된다.
- 자원에 대해 설명해주는 간단한 문장을 만드는 게 가능하다.
- RDF는 웹 상의 데이터를 표현하고 연결하는 방법으로 Semantic Web 기술이다.
- Semantic Web(시맨틱 웹, 의미론적인 웹): 인터넷 같은 분산환경에서 리소트(웹 문서, 파일, 서비스 등)에 대한 정보와 자원 사이의 관계-의미 정보(Semanteme)를 기계가 처리할 수 있는 온톨로지 형태로 표현하고 이를 컴퓨터가 처리하도록 하는 프레임워크이자 기술이다.
- 일반적으로 웹이라고 하면 문서들이 연결된 네트워크이지만 시맨틱 웹은 문서뿐만 아니라 문서들 사이의 의미적 관계를 표현한다.
- 이를 통해 검색 엔진이 더 정확한 결과를 제공하거나 데이터를 공유하고 연결하는데 큰 도움이 된다.
- Semantic Web의 목표: 웹을 하나의 거대한 지식 베이스로 만들어서 유용하게 활용하는 것
참고)
RDF: https://bitnine.tistory.com/46
Virtuoso(버투소)
- 오픈 소스 시반의 RDF 데이터베이스 및 SPARQL 쿼리엔진이다.
- SPARQL 쿼리를 처리하고 RDF 데이터를 효율적으로 저장하고 검색하는데 사용된다.
- RDF 데이터 뿐만 아니라 XML, Json, HTML 등 다양한 데이터 포맷을 지원한다.
(진행 예정)
- 다운로드
- 환경 변수 설정
- 관리자 권한으로 cmd 창 열기
- bin 폴더의 isql을 실행한다.
참고)
title
- con
- con
'개발 일지 > 주간 개발 일지' 카테고리의 다른 글
[09월 1주차] 캐시와 스프링 AOP, @Cacheable (0) | 2023.09.15 |
---|---|
[08월 4주] MyBatis(string_agg, unnest), element plus를 이용한 스위치 버튼 만들기 (0) | 2023.09.04 |
[07월 3주차] axios 요청으로 컬렉션 데이터 전달하기, PostgreSQL 배열(_VARCHAR) 필드 관리 방법 (0) | 2023.07.21 |
[07월 1주차] Mybatis 바인딩 에러 해결 및 PostgreSQL 배열 관련 메서드 (0) | 2023.07.10 |
[06월 5주차] 반응형 객체 만드는 방법(ref, reactive), Postman 에서 만든 API 공유하는 방법(export) (0) | 2023.07.01 |