일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스프링공부
- nestjs공부
- K8S
- JPA예제
- nestjs스터디
- 플러터 공부
- 스프링
- 스프링 공부
- 자바공부
- 코테준비
- DDD
- 카프카
- 플러터 개발
- 기술면접공부
- JPA 공부
- JPA공부
- Axon framework
- 기술공부
- JPA스터디
- 프로그래머스
- Kafka
- Flutter
- JPA
- 스프링부트공부
- 자료구조공부
- 코테공부
- querydsl
- nestjs
- 알고리즘공부
- 스프링부트
- Today
- Total
목록분류 전체보기 (715)
DevBoi
Map interface를 구현한 3가지 구현체들의 차이는 간략하게 아래와 같다. HashMap : 동기화를 지원하지 않는다 HashTable : 엄청 초반에 만들어졌고, 동기화를 지원한다. ConcurrentHashMap: 동기화를 지원하고 HashTable 보다 성능이 좋다 그러면 ConcurrentHashMap이 왜 성능이 더 좋은지 알아보자 HashTable은 empty체크나 사이즈 체크 등 주요메서드들에 전부 syncronized처리가 되어있고, 한개의 쓰레드만 사용가능하게끔 락을 걸어놨다 예) 예시로, hashTable에서 put을 한다고 가정해보자 HashTable에서는 전체 메소드에 쓰레드 락이 걸려있고 ConcurrentHashTable에는 put 메서드 내, 이미 데이터가 존재하여, 교..
이진 트리를 기반으로한 Map 컬렉션이다. 같은 Tree 구조로 이루어진 TreeSet과의 차이점은 TreeSet은 그냥 값만 저장한다면, TreeMap은 키와 값이 저장된 Map Entry를 저장한다는 것이다. 키는 저장과 동시에 자동 오름차순으로 정렬되고 숫자타입을 경우에는 값, 문자열 타입을 경우에는 유니코드로 정렬한다. 부모키값과 비교해서 키값이 낮은 것은 왼쪽에 저장하는 식이다. HashMap보다 성능이 떨어진다. TreeMap은 데이터를 저장할때 즉시 정렬하기에 추가,삭제가 HashMap보다 오래걸린다. 정렬된 상태로 Map을 유지해야하거나, 정렬된 데이터를 조회하는 범위검색이 필요한 경우 TreeMap을 사용하는 것이 좋다. 이진트리의 문제점을 보완한 레드블랙트리로 이루어져있다. 데이터가 들..
순서를 유지하는 해시맵 LinkedHashMap은 Java의 HashMap을 확장하는 클래스이다. HashMap은 해시함수를 통해, 인덱스를 매핑을 하고 해당 인덱스에 저장을 하는 구조로 이루어져있다. 따라서 순서를 보장하지 않는다 LinkedHashMap을 통하면 순서를 유지할 수 있다. 해당 유지할 수 있는 이유는, doubly linked list로 삽입한 값들을 관리하고, 삽입한 순서대로 값을 가져오고자 할때 사용할 수 있기 때문이다. head와 tail로 데이터들을 관리하고, 신규로 데이터가 들어오면 다음 노드를 이어붙여주는 방식으로 구현이 되어있다.
Java 에서 HashMap은 key-value 값으로 이루어져 있고, key를 사용하여, value 값을 얻어낸다. Key는 중복을 허용하지 않고, Value는 중복을 허용한다. HashMap의 내부구조는 배열로 되어있고, Key는 직접 내부의 인덱스가 될 수 있으며 이를 버킷이라고 한다. 인덱스를 구하기 위해서는, 해시함수를 사용하는데 Hashcode % M 으로 산출할 수 있으나, 동일한 key값이 발생할 수 있고, 이를 해시 충돌이라고 한다. 이를 방지하기 위해서는 Open Addressing 방식과 Separate Chaning 방식이 있고, 해시 맵은 후자를 사용한다. Separate Chaning(동일한 해시값이 있을 경우, LinkedList로 관리하고, 8개 이상인 경우 Tree로 변경하..
JPA에서 해당 PAGE 기능을 개발하려고하면, 해당 과 같이 사용하면 된다. 좀 더 자세히 공부를 해보도록 하자
낙관적 락 일단, 트랜잭션 충돌이 발생하지 않는다고 가정한다. DB가 제공하는 락을 사용하지 않고, JPA가 제공하는 Version 관리을 사용한다 트랜잭션을 커밋하기 전까지 충돌을 알수 없다. 낙관적락 이렇게 메소드에서 사용할 수 있다. 해당으로 사용하게 되면, 트랜잭션이 커밋될때, version을 업데이트하게 된다. @Version으로 명시된 컬럼이 증가하게되고, 해당 증가후에 트랜잭션이종료하게 된다. 만약에 다른 트랜잭션에서 어떤값을 수정하려고할때, 해당 버전에 대한 값을 확인후에, 버전이 같으면, 수정 다르면 예외를 발생시킨다. LockModeType 중에 OPTIMISTIC_FORCE_INCREMENT가 있다. 해당 방식일때는 조회만으로 version이 update된다. update 도 vers..
플러시 (Flush) -영속성 컨텍스트의 변경 내용을 DB에 반영하는 것을 말한다. -Transaction commit 이 일어날때 flush가 동작하는데, 이때 쓰기 지연 저장소에 쌓아놨던 insert, update,delete sql들이 DB에 날아간다. (영속성 컨텍스트를 비우는 건아니다) -영속성 컨텍스트의 변경사항들과 DB의 상태를 맞추는 작업이다. (영속성 컨텍스트의 변경 내용을 DB에 동기화한다.) 플러시 동작 과정 1. 변경을 감지한다 (Dirty checking ) 2. 수정된 Entity를 쓰기 지연 SQL 저장소에 등록한다. 3. 쓰기 지연 SQL 저장소의 Query를 DB에 전송한다. Flush 발생한다고 해서, commit 이 이루어지는 것은 아니고, Flush 이후에 commit..
격리성은 동시에 실행되는 트랜잭션이 서로에게 영향을 미치지 않도록 격리한다. 격리 수준에는 다음과 같다 * READ UNCOMMITED(커밋되지 않는 읽기) 트랜잭션 A가 특정 컬럼 데이터를 변경하고 있는 중에, 트랜잭션 B가 read하면, A가 변경한 데이터를 읽어온다. -문제 : dirty read, 트랜잭션 A가 특정 컬럼 데이터를 변경하고 rollback했을때 발생한다. * READ COMMITED(커밋된 읽기) 트랜잭션 A가 특정 컬럼 데이터를 변경하고 있는 중에, 트랜잭션 B가 read하면 트랜잭션 A가 변경하기 전 데이터를 읽어온다. 만약 트랜잭션 A가 데이터 변경후, 커밋하게되면 트랜잭션 B는 변경된 데이터를 읽어온다. -> 즉, 한트랜잭션 내에서 외부 요인의 데이터 변경 커밋이 반영되어 ..
JPA : java persistence api 약자, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. Hibernate : jpa의 구현체이다.
엔티티가 getter 와 setter를 가지고 있으면, Controller단이 아니라 어디서든 실수로 쉽게 속성이 변경될 수 있다. 또한 DB의 테이블 스키마와 같은 구조이기 때문에 테이블 설계가 노출된다. DTO를 이용하면 필요한 모든 값들을 하나의 DTO에 담아서 보내줄수 있으므로, 개인적으로 Front단에서 편하게 작업 가능 필요없는 속성은 굳이 보내지 않아도된다. 가장 중요한 부분 순환참조를 예방할 수 있다. JPA로 개발할때, 양방향 참조된 엔티티를 컨트롤러에서 응답으로 return하게 되면, 엔티티가 참조하고 있는 객체는 지연로딩되고, 로딩된 객체는 또 다시 본인이 참조하고있는 객체를 호출하면서 무할 루프에 빠질 수 있다. 정리 )DTO를 사용하면 아래와 같은 상황에서 유리하다 1. 실수로 속..