본문 바로가기
320x100

Study/DATABASE & ORM5

[TypeORM] 트랜잭션(Transaction) 사용하기 트랜잭션(Transaction)이란? 트랜잭션은 하나의 논리적 작업을 완료하기 위해 데이터베이스를 변화시키는 일련의 행동들을 하나의 단위로 바라보는 것이다. 예를 들어 '게시판에서 유저가 탈퇴한다' 라는 하나의 논리적 작업을 완료하기 위해, 먼저 유저를 조회하는 작업과 해당 유저가 작성한 글, 댓글을 모두 삭제하는 작업, 그리고 그 유저데이터를 삭제하는 작업 이 세 일련의 행동을 하나의 유저탈퇴 트랜잭션으로 구성할 수 있는 것이다. 트랜잭션의 중요한 특징 중 하나는 이러한 작업들이 All or Nothing 즉 전부 완료되거나, 하나도 완료되지 않아야 한다는 점이다. 유저가 탈퇴하는 작업중 어느 하나에서 에러가 발생하여 유저탈퇴가 취소된다면, 작성한 글들이 전부 삭제되는 일은 일어나지 않아야 한다는 것이.. 2021. 12. 21.
[TypeORM] N+1 문제와 Eager and Lazy Relations N+1 문제 ORM을 사용하면서 항상 주의해야 할 문제점 중 하나가 N + 1 문제이다. N + 1 문제란, 어떤 테이블의 참조된 데이터를 가져오기 위해 해당 (테이블 조회(1) + 참조된 데이터 조회(N)) 회의 쿼리를 날리는 문제를 이야기한다. JPA에서 많이 언급되는데 JPA 에서만 국한된 이야기는 아니고 ORM을 잘못 사용한다면 어디서든 발생할 수 있는 문제이다. TypeORM을 예로 들어 설명해 본다. 아주 간단한 구조를 가지고 있는 두 테이블이 설정된 상황이다. author에는 5개의 row 가 들어가 있다. 만약 이러한 상황에서, 예를 들어 저자명과 해당 저자가 작성한 책들을 각각 리턴해야하는 getBooksAndAuthorName() 이라는 함수를 작성한다고 하면, 다음과 같이 작성하고 싶.. 2021. 12. 19.
[MySQL]페이징 기능 구현하기+Console UI에 적용 뉴렉처님의 JDBC 유튜브 강의를 듣던 중 문제가 발생했다. 뉴렉처님은 JDBC에서 연동하는 DB가 Oracle이다. 그러나 나는 어떠한 이유로 MySQL을 연동해서 사용하고 있었다. 이번 강의의 내용이 페이징을 위한 쿼리를 만드는 것인데, Oracle과 MySQL의 문법이 다르기도 하고, Oracle에서는 쿼리를 통해 검색한 결과에 자동으로 숫자를 부여해주는 ROWNUM 이 있지만, MySQL에는 그것이 존재하지 않는다. 그래서 따로 변수를 통해 구현해 주어야 한다.(사실 이 강의를 듣기 전까지는 database에서 변수를 사용할 수 있는지조차 몰랐다...) 변수선언 MySQL은 @변수명을 통해 변수선언이 가능하다고 한다. $변수명을 쓰던 PHP가 생각이 난다. SET @ROWNUM=0; OR SET .. 2020. 11. 28.
[MySQL]MySQL 기본적인 명령어 모음 MySQL의 다양한 명령어들을 기억하기 위해 글을 쓴다. SQL의 명령어는 크게 3가지로 나눌 수 있다. 각각 DDL (Data Definition Language) : 데이터 정의 언어 DML (Data Manipulation Language) : 데이터 조작 언어 DCL (Data Control Language) : 데이터 제어 언어 DDL 에서 가장 중요한 명령어는 CREATE 와 DROP 이라고 할 수 있다. 각각 테이블을 생성하고, 삭제하는 기능을 맡고 있다. CREATE 명령어를 먼저 살펴 보자면, CREATE TABLE 테이블명 ( 필드명 자료형 조건, 필드명 자료형 조건, 필드명 자료형 조건, .... ); 의 형태로 사용된다. EX) CREATE TABLE mytable ( id int .. 2020. 11. 26.