분류 전체보기(118)
-
[java] HashMap 동작 과정, String의 해쉬 값
HashMap - HashTable과 다르게 쓰레드 동기화를 하지 않음(single-thread에서 유용) - 기본적으로 해쉬값을 반환하는 해쉬함스로써 hashCode()를 사용함 - hashCode()의 반환형은 int임 - int는 32비트(4Byte)이고 2^32개로 완벽한 해쉬값을 만들 수 없음(표현해야 할 key가 2^32개 보다 많을 경우) - HashMap은 O(1)을 보장하기 위해 random access가 가능하게 하려면 HashMap의 크기는 2^32개 여야 함 - 그래서 보통 2^32보다 작은 숫자 M을 이용해 해쉬값을 다음과 같이 다시 정의함 (int index = X.hashCode() % M) - 여기서 M은 2의 지수승 형태임. 즉, M이 2^a 형태라면 hashCode()의 ..
2022.01.11 -
<추천글>[DB] Index 종류와 카디널리티
Type Of Index single level index composite index multilevel index 1. Single Level Index - 인덱싱하는 컬럼이 1개인 경우에 해당함 - primary key에 걸면 Primary Index(기본 인덱스), 다른 컬럼에 걸면 Secondary Index(보조 인덱스) - SQL문에서 where = {key1} = {value1} 가 하나인 경우 equality search가 빠르다. - 메모리에 index table의 데이터 크기가 table보다 작음 - 카디널리티가 매우 낮은 컬럼이라면 인덱스를 지정하지 않는 것이 더 나을 수도 있음 [인덱스 정렬 타입] 1) Dense Index(밀집 인덱스) - 한 인덱스에 원하는 데이터가 바로 매칭..
2022.01.11 -
<추천글>[JPA] CascadeType.REMOVE vs orphanRemoval true
영속성 전이와 고아 객체는 다른 개념이다. CascadeType과 orphanRemoval은 각각 영속성 전이와 고아 객체 개념에 해당한다. 1. CascadeType.REMOVE - 부모 엔티티가 삭제될 때, 자식 엔티티도 함께 삭제되도록 한다. - 부모 엔티티에 설정한다. 따라서 양방향 연관관계일 경우에만 해당한다. - 부모를 삭제하는 것이 아닌 단순히 부모와 자식의 연관관계를 제거하는 연산에 대해서는 자식 엔티티를 삭제하지 않는다. 예를 들어 부모 엔티티에서 one-to-many로 Collection 형태의 자식 엔티티들을 가지고 있을 때, 해당 Collection에서 특정 자식 엔티티를 삭제하는 연산에 대해서는 delete 쿼리가 발생하지 않는다. 부모 엔티티가 삭제된 것이 아니기 때문이다. cf..
2022.01.10 -
[백준] 12919 시간복잡도 풀이
코드 /** * https://www.acmicpc.net/problem/12919 */ import java.io.*; public class Main { private static String S, T; private static final char A = 'A'; private static final char B = 'B'; public static void main(String[] args) throws IOException { init(); var result = solve(T); var bw = new BufferedWriter(new OutputStreamWriter(System.out)); bw.write(result ? "1" : "0"); bw.flush(); bw.close(); } ..
2022.01.05 -
<추천글>[JPA] 연관관계 핵심 정리 (JPA의 근본적인 문제)
양방향 연관관계 - 일반적으로 RDB는 방향이 존재하지 않음. 즉, 양방향이라는 개념 자체가 없음 - OneToMany를 사용하더라도 실질적으로 One 쪽의 DB에 컬럼이 생기지 않음 - 객체 단에서 편리함을 제공하기 위해 양방향 연관관계를 제공하는 것 - 따라서 JPA에서 양방향 연관관계를 사용할 경우 연관관계 주인을 정의해 줘야 함 - 연관관계의 주인인 Entity만 외래키의 값을 변경할 수 있고 상대방 Entity는 조회만 가능한 제약이 있음 - 양방향 연관관계를 설정하면 양쪽 모두에 참조 변수를 설정해 줘야 함(동기화 필요). - 이러한 불편함을 해결하고자 연관관계 편의메소드를 활용 - 일반적으로 연관관계 편의 메소드는 주인 엔티티에 정의함(주인이 아닌 쪽에 정의해도 됨) - 추후 유지보수나 확장..
2022.01.04 -
[JPA] Entity와 기본생성자, Proxy
Entity가 기본생성자를 필요로 하는 이유 - JPA는 DB 값을 자바 객체로 직렬화할 때 Reflection을 이용함 - Reflection이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 Java API - JPA에서는 자바 객체로 직렬화할 때 기본생성자를 통해 먼저 객체를 만들고나서, Reflection을 통해 필드 값을 주입함 - 따라서 Entity에는 기본생성자가 필요하고 기본생성자가 없다면 예외가 발생함(InstantiationException) Proxy - '상속'을 이용해 특정 객체를 한 번 감싸 이전, 이후에 특정 로직을 추가하도록 하는 개념 - JPA의 fetch 타입을 LAZY(지연로딩)으로 할 경우, Proxy로 해당 객체를 ..
2022.01.04 -
<추천글>[DB] DB Index 자료구조 B-Tree 기본개념
Balanced Tree - 한쪽으로 노드가 몰리는 Binary Search Tree의 단점을 보완하고자 등장 - DBMS에서 가장 범용적으로 사용되는 자료구조 - Binary Search Tree와 유사하지만 depth를 자동으로 잡아주기 때문에 탐색 시간복잡도가 O(logN)을 보장함 - 하지만 depth에 영향을 줄 수 있는 insert, delete 경우에 대해서는 성능이 좋지 않을 수 있음 - 결론적으로, 데이터를 얼마나 자주 삽입, 삭제할 것인가에 따라서 B-Tree Index를 활용할지 말지를 결정 - 즉, 갱신 빈도가 높은 테이블에 인덱스를 지정할 경우, 인덱스 재구성 발생 빈도가 높아진다는 점을 고려해야 함 B-Tree - 하나의 노드에 여러개의 값이 배치되는 구조의 트리 - 차수 M의 ..
2022.01.03 -
[OS] 데몬(daemon) 프로세스, nohup, &
데몬이란 - 사용자와 직접적으로 대화하지 않고, 백그라운드에서 오랫동안 돌면서 여러 작업을 하는 프로세스 - 데몬은 대개 부모 프로세스를 갖지 않으며, 즉 PPID(부모 프로세스 ID)가 1이며, 따라서 프로세스 트리에서 init 바로 아래에 위치함 - 데몬이 되는 방법은 일반적으로 자식 프로세스를 포크하고 자신을 죽이면서 init(PID=1)이 고아가 된 자식 프로세스를 자기 밑으로 데려가도록 하는 방식(fork off and die 방식) - 부모 프로세스는 fork호출 후 exit호출함으로써 자식 프로세스가 백그라운드에 남게 함 - 데몬 프로세스는 보통 네트워크 요청, 하드웨어 동작을 위한 용도로 사용되며 시스템이 시작될 때 데몬을 생성하는 경우가 많음 - 보통 프로세스 이름에 d가 붙는다 (htt..
2022.01.03 -
[CI/CD] GitHub Actions + AWS CodeDeploy
CI (Continuous Integration) 배포 이전까지의 단계인 공유 레포지토리(git, svn)에 빌드나 테스트, 병합 등으로 최종 릴리즈까지 통합하는 것을 자동화한다는 것을 의미한다. 코드의 변경사항이 많아지면 충돌의 가능성이 커지고 이에따라 변경사항을 주기적으로 빈번하게 머지할 중요성이 커졌다. 이에따라 최종 배포 전까지의 단계를 스크립트 파일을 통해 자동화하여 보다 빈번하게 머지할 수 있도록 하기 위해 등장한 것이 CI이다. 무엇보다 CI는 공유 레포지토리에 빈번하게 머지된 소스코드를 자동으로 빌드하고 테스트하며 이에 대한 이력을 쉽게 보여줘야 한다. 이로써 주기적으로 머지되는 소스코드의 충돌을 최소화하고 빌드와 테스트를 자동화하여 코드 결합을 빠르고 쉽게 이루어낼 수 있다. CD(Con..
2021.12.31 -
[java] Thread Synchronization (Monitor)
Race Condition - 멀티 쓰레드 환경에서 발생할 수 있는 상황 - shared resource에 대해서 2개 이상의 task들이 동시에(concurrent, parrallel 모두 해당) 접근을 시도할 경우 이들 간의 순서로 인해 결과 값에 영향을 줄 수 있는 상태를 의미 - 이로 인해 shared resource에 대한 연산에 대해서 일관성이 깨진 상태의 결괏값이 도출될 수 있음 The degree of multiprogramming : single-processor가 수용할 수 있는 최대 thread 개수 Mutual exclusion - Race Condition을 해결하기 위한 개념 - 한 시점에 하나의 task만이 shared resource에 접근할 수 있음 (상호 배제) - 단, ..
2021.12.28