N+1 Problem N+1 문제란, 연관관계가 설정된 엔티티를 조회할 때 연관된 엔티티의 개수(N)만큼 추가적인 쿼리가 발생하는 문제를 말한다. Member와 Order, Delivery엔티티가 있다고 하자. Order는 주문정보를 담은 엔티티로, Member(회원)와 다대일 연관관계를 가지며, 배송정보를 담은 엔티티인 Delivery와는 일대일 연관관계를 갖는다. @Entity @Table(name="orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name="order_id") private Long id; @ManyToOne(..
스프링의 트랜잭션 스프링을 사용하면 @Transactional 어노테이션을 사용하여 선언적 트랜잭션 관리를 하게 된다. 이렇게 선언적 트랜잭션 관리 방식을 사용하게 되면 프록시 방식의 AOP가 동작한다. 그 전에 앞서 공부했던 스프링의 db 연동과정부터 차례로 살펴보면 다음과 같은 흐름을 가진다. 0. 트랜잭션을 시작하기 위해서는 db 커넥션이 필요하다. 1. 스프링 컨테이너에 등록된 트랜잭션 매니저는 datasource를 통해서 커넥션을 만든다. 2. 트랜잭션 매니저는 생성된 커넥션을 트랜잭션 동기화 매니저에 보관한다. (각각의 쓰레드마다 저장소를 부여하여 모든 쓰레드의 동기화가 이루어진다.) 3. Repository에서 보관된 커넥션을 획득하여 사용한다. 트랜잭션 매니저가 커넥션 획득과 반납을 담당한..
구체적인 상황은 다음과 같다. Admin 페이지에서 POST api 요청이 올때마다 db에서 기존 데이터들을 모두 제거한 후에 request body로 들어온 데이터들을 저장해주는 로직을 기대하고 다음과 같은 코드를 작성하였다. featureRepository.deleteAll() sectionRepository.deleteAll() //req로 들어온 데이터 저장 ... 하지만 클라이언트 qa중 500 server error가 발생한다는 말을 듣고 찾아보니 다음과 같은 로그가 남겨져 있는 것을 볼 수 있었다. 엔티티에서 unique값으로 설정해놓은 필드가 중복된다는 뜻이었다. 그런데 삽입된 데이터는 중복이 아예 없는데, 이상하다고 생각하면서 코드를 다시 보니깐 오류가 보였다. 기존 코드에서는 repos..
mysql에 이어 두 번째 데이터베이스 익히기 https://redis.io/ Redis Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker redis.io NoSQL '데이터베이스에는 관계형 데이터베이스(RDBMS) 이외에도 여러가지 형태의 데이터베이스가 존재한다' 라고 데이터베이스 전공수업때 배운 적이 있다. 지금까지 내가 써온 Mysql은 관계형 데이터베이스(RDBMS)의 대표적인 예시로, SQL이라고 불리는 쿼리에 의해 저장되며, 모든 데이터는 정해진(정적) 스키마에 맞추어 테이블 형태로 저장되며, 테이블은 열과 행으로 구성되어 관계를 표현..
1. 일대일 매핑에서 어느쪽을 연관관계의 주인으로 하는것이 맞는가? 반드시 다(N)쪽이 fk를 가져 연관관계의 주인이 되는 다대일 관계와 다르게, 일대일 매핑의 경우 어느쪽이 fk를 갖게 하여 주인으로 설정하든 기능적으로 문제가 없다. 어느쪽을 연관관계의 주인으로 설정하는 것이 좋을까? 일대일 매핑에서도 주 테이블(자주 접근하는 테이블)과 대상 테이블이 존재하는데, 일반적으로 주 테이블에 외래키가 있는 것이 좋다고 느꼈다. 내가 진행했던 프로젝트 중에, feature별로 고유 이름을 가지게 하고, 사용자들이 그 고유 이름을 기준으로 즐겨찾기를 등록하여 feature가 변경되거나 삭제되더라도 고유 이름에 대한 즐겨찾기는 유지되게 하는 요구사항이 있었다. @Entity @Table(name = "featur..
유니온 파인드 알고리즘 유니온 파인드 알고리즘은 그래프상에서 두 노드가 같은 그래프에 속하는지 판별하는 알고리즘이다. 다음과 같이 노드들이 존재할 경우, 유니온 파인드 알고리즘을 위해서는 노드를 나타내는 일차원 정수배열을 이용한다. 이 배열의 값은 노드가 속한 그래프의 정보이자, 대표 노드의 정보를 나타낸다. 당연히 배열의 초기값은 자기 자신으로 세팅한다. 연결된 노드가 없을 경우 자기 자신이 부모노드가 되기 때문이다. 초기화 처음에는 노드들 사이에 관계가 존재하지 않으므로 모든 노드는 자기 자신의 인덱스를 값으로 갖도록 초기화해준다. int[] parent = {1,2,3,4,5,6,7,8}; Union 두 노드가 같은 그룹에 속하도록 합쳐주는 함수이다. 가장 먼저 생각할 수 있는 방법은 한 노드의 값..
SQL 데이터베이스 시스템에서 자료를 처리하는 용도로 사용되는 언어. 목적에 따라서 DDL(데이터 정의어 - 테이블이나 관계 생성), DML(데이터 조작어 - 테이블의 데이터 CRUD), DCL(데이터 제어어 - 데이터의 사용 권한 관리)로 구분된다. DDL (데이터 정의어) 테이블을 구성하거나, 속성과 기본키(pk)/외래키(fk)를 정의하는 쿼리문을 말한다. 테이블을 생성하는 create문, 테이블 구조를 수정하는 alter문, 그리고 테이블을 삭제하는 drop문이 있다. CREATE : 테이블을 생성하기 위한 쿼리문. 속성명과 데이터타입을 명시해주고 뒤에 속성의 제약을 정의해줄 수 있다. 속성을 모두 정의하고 나서 pk와 fk를 정의해줄 수도 있고, 제약을 정의할 때 같이 정의해줄 수도 있다. ALT..
부분 배열의 합을 구하기 위해서 다양한 방법을 사용할 수 있다. 1차원 누적합 다음과 같은 배열이 있다고 하자. int[] arr = {1,2,3,4,5}; 두 번째부터 다섯 번째 원소까지의 합을 구하기 위해서는, for문을 이용해서 직접 구해줄 수 있다. for(i=1...5) rst+=arr[i] 그런데 만약 arr이 충분히 크다면, dp를 이용하여 누적합을 저장해두고 갖다 쓸 수 있다. 두번째~다섯번째 원소합 = (첫번째~다섯번째 원소 누적합) - (첫번째~첫번째 원소 누적합) var s5=0, s1=0 for(i=0...4까지) s5+=arr[i] for(i=0...0까지) s1+=arr[i] var arr[1]부터 arr[5]까지 합 = s5-s1 일반화하면 다음과 같은 식이 나온다. 따라서 누..
개요 잘못 설계된 데이터베이스는 삭제이상, 삽입이상, 수정이상 등의 문제를 일으킬 수 있다. 삭제이상: 튜플을 삭제했는데 유지되어야 하는 정보도 연쇄삭제되는 현상 삽입이상: NULL입력시 튜플 삽입이 거부되는 이상현상 수정이상: 튜플 수정시 데이터의 일부만 수정되어 데이터의 불일치현상이 나타나는 현상 - 삭제이상: 5번 튜플(안중근)의 정보 삭제시 AI융합학부의 정보가 같이 삭제된다. - 삽입이상: 글로벌미디어 학과에 대한 정보를 삽입하고 싶지만 학생명, 학번이 NULL값이라 삽입되지 않는다. - 수정이상: 소프트웨어학부의 과사무실 정보를 수정하기 위해 3번튜플의 과사무실 정보를 변경하면 3,4번튜플에 불일치가 발생한다. 이러한 이상현상은 테이블의 잘못된 설계로 인해 발생한다. 따라서 테이블의 구조를 수..
개요 사용자의 인증이 필요한 웹 사이트마다 로그인 기능을 별도로 필요로 한다면 민감한 정보에 대한 관리가 필요해지기 때문에 번거로울 수 있고, 보안에 취약해질 수 있다. 따라서 google이나 naver, kakao같은 외부 소셜 서비스를 기반으로 회원가입/로그인 할 수 있는 기능을 많이들 사용하고는 하는데, 이를 위해 접근 권한을 위임받은 것을 OAuth라고 한다. 물론 장점만 있는 것은 아니라서, OAuth를 사용하는 웹서버에서 회원정보를 추가로 활용하기 위해서는 사용자 정보를 외부 소셜 서비스 정보와 연동하는 서비스를 별도 구축해야 하기 때문에 구현에 번거로움이 있기는 하다. - Resource Owner: Client가 제공하는 서비스를 이용하면서, naver, kakao등의 플랫폼에 회원정보와 ..
1. 에러(Error)와 예외(Exception) 일반적으로 자바에서는 잡을 필요도 없고, 회복또한 불가능한 것을 에러(Error)라고 하며, 잡을 수 있고 회복이 가능한 것을 예외(Exception)이라고 부른다. 위 그림에서 나타나는 에러들을 보면 쉽게 이해할 수 있을 것이다. 예를 들어 OutOfMemoryError라는 에러는’ 메모리 부족’이라는 예상할 수 없고, 프로그램상으로 해결할 수도 없는 문제를 나타내고 있다. 아마 자연스럽게 느껴질텐데, 이러한 이유로 프로그램을 짤 때 주로 우리는 에러보다는 예외에 대해서 고려하게 된다. 2. 예외(Exception)의 종류 자바에서 모든 예외도 객체이므로 Object를 상속받으며, 최상위 예외는 Throwable클래스이다. Throwable 클래스는 E..
트랜잭션 트랜잭션이란 데이터베이스에서 하나의 공통된 목적을 위한 작업을 의미한다. 예를 들면, A에서 B로의 '송금'이라는 거래를 위해서는 A의 잔고에서 임의의 금액을 빼고, B의 잔고에 임의의 금액만큼을 더해주는 2가지 일이 한 가지 일처럼 실행되어야 한다. 두가지 일 중에서 하나의 작업이라도 누락된다면 문제가 발생할 수 있는데, 트랜잭션은 모든 하위 작업을 묶어서 모두 실행되거나, 모두 실행되지 않도록 만든다. 만약에 모든 작업이 성공하여 DB에 변화가 반영되었다면 해당 작업이 커밋(commit)되었다고 하고, 하나라도 실패해서 작업 이전으로 되돌아가는 것을 롤백(rollback)이라고 한다. 트랜잭션의 성질 트랜잭션은 ACID로 불리는 4가지 대표적인 성질을 갖는데, 각각 원자성, 일관성, 고립성,..