본문 바로가기

전체 글

Mybatis에서 대량의 데이터를 넣을 때 bulk insert를 사용하자 개발을 하다보면 API 호출 시 1000건이상의 데이터를 삽입해야하는 상황이 있습니다. 1000건의 데이터를 insert하는데 걸리는 시간은 약 5초였으며 시간을 줄일 수 있는 방안을 생각해봤는데요. mybatis에서 대량의 데이터를 한번에 삽입할 수 있도록 insert foreach문(DBMS마다 지원하는 쿼리가 다름)을 지원하는 것을 알게 되었습니다. 수정 전 SQL insert into tb_receiver(receiver_key, token, user_id, amount, is_received, receiver_date) values(#{receiver_key}, #{token}, #{user_id}, #{amount}, #{is_received}, #{receiver_date}) 수정 후 SQL.. 더보기
멀티 스레드 환경에서 동일 데이터에 대해서 업데이트 시 고려해야 할 사항 어느 회사의 과제 코드리뷰 중 면접관으로부터 상황이 부여되어 해결책을 제시하라는 질문을 받았습니다. 문제사항 1. 두명의 사용자가 A라는 API를 동시에 호출할 경우가 발생할 수 있다. 2. A라는 API의 로직 중 데이터를 가져오는 SELECT 문까지 동시에 접근하였다. 3. 우연한 일치로 API 내에서 수정되어야 하는 데이터가 동일하다. 이럴경우 어떻게 해결하겠는가? 너무 많이 당황하고 해결책을 생각하지 못했다. 어떻게 이 문제를 해결해야 할지 생각해봤는데 간단히 해결할 수 있었다. 해결 1. SQL 변경 2. 정해진 횟수만큼 시도하여 모두 실패할 경우 예외발생 현재의 SQL문은 업데이트문으로써 업데이트문에 대한 조건만이 존재 업데이트문에 대한 조건을 상세히 하여 업데이트 셀렉트 구문으로 변경 수정된.. 더보기
@Service, @Controller, @Repository 과 @Component의 차이는? @Component를 구현한 @Service, @Repository, @Controller에 대해서 @Component의 차이는 무엇인지 왜 @Component만 사용하면 안되는지 의문점이 생겨 알아보았는데요. @Repository Spring에서 지원하지 않은 Exception을 Spring Exception으로 전환하기 위해서는 @Repository 애노테이션을 사용해야합니다. @Repository 애노테이션이 적용된 메소드에서 Exception이 발생할 경우 UnChecked Exception인 DataAccessException으로 전환시킨다고 합니다. ex) 선언적 트랜잭션을 적용한 메소드에서 DB관련된 오류가 발생해도 롤백이 가능한 이유 CheckedException, UnCheckedExce.. 더보기
MariaDB에서 사용하는 스토리지 엔진에 대해 알아보자 오늘은 MariaDB에서 사용하는 스토리지 엔진에 대해서 알아볼텐데요. 스토리지 엔진의 종류은 8가지이나 여기서는 MyISAM과 InnoDB만 다룰예정입니다. MariaDB에서 테이블을 생성할 때 기본적으로 적용되는 엔진이 InnoDB입니다. 그렇다면 각각의 스토리지 엔진에 대한 특징을 알아보겠습니다. MyISAM Table-Level Locking 트랜잭션과 ACID를 지원하지 않음 외래키 지원 X InnoDB Row-Level Locking 트랜잭션과 ACID를 지원 외래키 지원 MyISAM은 Table Level로 Locking하기 때문에 CRUD가 빈번한 서비스의 경우 적절하지 않으며 검색 위주의 서비스에 적절하다.(InnoDB에 비해 검색 속도가 빠름) 반면 InnoDB는 트랜잭션과 ACID를 .. 더보기
View란 무엇인가? View는 하나 또는 그 이상의 기본테이블로부터 만들어지는 가상의 테이블입니다. 기본테이블의 경우 물리적으로 데이터가 저장되는 반면 View는 뷰의 정의만 시스템 내에 저장되어있다가 실행시간에 테이블을 구축합니다. 뷰는 다음과 같은 특징을 가지고 있습니다. 데이터 검색의 경우 기본 테이블과 아무런 사용없이 사용가능합니다. 뷰에 대한 갱신(삽입, 삭제, 수정) 연산은 제약이 존재합니다. 뷰 생성 SQL CREATE VIEW 뷰이름 AS SELECT 문 WITH CHECK OPTION 뷰 제거 SQL DROP VIEW 뷰이름 {RESTRICT | CASCADE} 뷰의 제약조건 집계 함수(COUNT, SUM, AVG, MAX, MIN)가 관련되어 정의된 경우 DISTINCT, GROUP BY, HAVING이 .. 더보기
SOAP에 대해서 알아보자 Simple Object Access Protocol의 약자로 보안이나 메시지 전송 등에 있어서 많은 표준이 있기 때문에 많이 사용되고 있는 REST에 비해 복잡합니다. REST와 마찬가지로 HTTP를 이용하지만 HTTP뿐만 아니라 다른 프로토콜을 사용하여 통신할 수 있습니다. 다음은 SOAP에 대한 특징입니다. 자체적인 ACID 기준으로 가지고 있음 XML을 데이터 포맷으로 사용 WS-Security와 SSL을 지원 REST에 비해 상대적으로 더 많은 대역폭과 리소스가 필요 엄격한 통신규약을 갖고 있으며 모든 메시지는 보내기 전에 알려야함 다음은 SOAP에 통신과정입니다. Client -> 중계자 -> 중계자 -> Default Actor 1. Client에서 요청을 하면 중계자에서 처리할 것인 있는지.. 더보기
플랫폼 API 호출 시 발생하는 오류 CORS란 무엇인가? Cross Origin Resource Sharing의 약자로 HTTP 프로토콜의 헤더를 사용하여 하나의 출저 or 도메인에서 다른 출저 or 도메인의 리소스에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제 브라우저의 보안상의 이유로 스크립트의 CORS HTTP 요청을 제한 Web API(XMLHttpRequest) or Fetch API는 동일 출저 정책에 따라 다른 출저 리소스를 접근하기 위해서는 CORS 헤더를 포함한 응답을 받아야합니다. CORS 종류는 다음과 같습니다. simple requests preflight requests credential reqeusts non-credential reqeusts 1. simple requests GET, POST, HEAD Method .. 더보기
트랜잭션에서 사용되는 ACID란? 데이터베이스의 트랜잭션이 성공적으로 수행하는 것을 보장해야하는 성질들의 앞글자를 표현한 약어 원자성(Atomicity) 일련의 작업들이 하나의 작업과 같이 모두 성공처리하거나, 실패처리해야하는 성질 일관성(Consistency) 데이터베이스의 무결성제약을 위반하면 트랜잭션은 중단되는 성질 고립성(Isolation) 하나의 트랜잭션이 실행될 때, 다른 트랜잭션이 실행하는 것을 방지하는 성질 ex) 고립성이 없다면 Dirty Read, NonRepeatable Read, Pantom Read가 발생할 수 있습니다. 지속성(Durability) DBMS가 트랜잭션에 대한 응답을 사용자에게 응답해야할 때, 데이터베이스의 장애가 발생하더라도 트랜잭션에 대한 커밋은 보장되어야 하는 성질 DBMS는 지속성을 보장하기.. 더보기