전체 글

80세까지 코딩하는 것이 목표인 개발자의 골방
· JPA
주 테이블에 외래키 주체 Entity(멤버)가 직접 FK를 관리하는 상태. 특징은 다음과 같다. 객체 지향 개발자가 선호한다. JPA 매핑이 편리하다. 주 테이블만 조회해도 연관 테이블의 데이터를 함께 확인할 수 있다. 단점으로는 외래키 값이 없으면 null을 허용한다. optional 설정으로 극복 가능(?) 일단 null을 허용하는 것이 DBA 입장에서 바라보았을 때 꽤나 치명적일 것이라고 영한님께서 말씀해주셨다. 그러면 애플리케이션 단에서 @NotNull 같은 Validation으로 null을 예방하면 되지 않을까? 라고 생각이 들었다.하지만 그렇다고 해서 DB 컬럼에 NOT NULL 제약이 생기는 것은 아니므로 여전히 잠재적인 위험이 있다고 보는 것 같다. 그리고 외래키에 UNIQUE 속성이 적용..
· JAVA
JVM의 메모리 사용 구조는 크게 Thread Memory 영역과 Shared Memory 영역으로 나뉜다고 볼 수 있다. Thread 영역 1. Stack Area Stack Area에는 Local Variable Array, Operand Stack, 프레임(Frame Data)이 저장된다. 1-1. Local Variable Array 메서드의 지역 변수들을 Array에 저장한다. 다음과 같은 코드가 있다고 하자. class Test { void hello(int a, double b, String s) { return; } } Local Variable Array는 다음 변수들을 저장한다. +-----------+ 0 | reference | this (hidden) +-----------+ 1 ..
· 리눅스
서버가 죽었다는 이야기를 듣고 후다닥 문제를 파악해보았다. 오늘 뭔 일이 있긴 했다. (알고보니 프론트엔드의 무한 렌더링 문제였다) 일단 서버를 다시 동작시키고 메모리 사용량을 확인해보았는데 메모리가 좀 부족해보였다. 워낙 사양이 낮은 t2.micro에 스프링 앱을 두 개나 돌리고 있으니 그럴만 했다. 여기에 사용자 요청이 조금만 들어오면 메모리가 부족해서 서버가 쉽게 다운 될 수 있으므로 swap 메모리를 확보해두기로 하였다. 사용 가능한 하드웨어 용량 확인 4GB 스왑 파일 생성 sudo dd if=/dev/zero of=/swapfile bs=128M count=32 # 128M x 32 권한 설정 sudo chmod 600 /swapfile 스왑 영역(파일)으로 지정 sudo mkswap /swa..
· JAVA
해싱의 기본 해시 함수 해시 함수는 입력한 Key를 해시 테이블에 적절한 index로 Mapping 해주는 함수를 말합니다. 해시 함수를 어떻게 구현하느냐에 따라서 해싱 성능이 좌지우지 될 수 있습니다. 굉장히 방대한 데이터를 저장해야 하고 충돌에 민감한 HashMap을 구현해야 한다면 당연히 해시 함수 최적화에 노력을 기울여야겠죠. 하지만 아무리 노력해도 해시 함수는 Pigeonhole principle에 의해서 해시 충돌이 발생할 수 밖에 없습니다. 해시 충돌 (Collision) 해시 충돌은 해시 값의 충돌을 의미합니다. 해시 함수를 통해서 Key 값을 해시 테이블에 맵핑하는데 만약에 해싱 결과가 똑같다면 어떻게 처리해야 할까요? Seperate Chaining Seperate Chaining은 C..
· JAVA
Java의 특징 Java는 객체 지향 언어이다. 객체 지향 프로그래밍(OOP: Object Oriented Programming)이라고도 한다. 함수적 스타일 코딩을 지원한다. 자바 8부터 지원하는 람다식을 사용하여 함수적 프로그래밍이 가능하다. JVM의 Garbage Collector를 실행시켜 동적으로 할당된 메모리들을 자동으로 관리한다. JVM 운영체제는 자바 프로그램을 바로 실행할 수 없는데, 그 이유는 자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 바이트 코드이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다. 이것이 JVM(Java Virtual Machine)이다. JVM은 자바 프로그램을 실행하는 가상 운영체제의 역할을 한다. 운영체제별로 프로그램을 관리하고 실행하..
· JPA
JPA의 표준 스펙에서는 fetch join 대상에 별칭을 줄 수 없다. 그런데 하이버네이트는 허용한다. 즉 fetch join 대상에 별칭을 사용할 수는 있으나 주의할 점이 있다. 주의할 점이라는 것은 조인하는 대상을 필터링하는 행위이다. 설정한 Entity의 관계 Parent(1) : Child(N) @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mapp..
· Spring
1. Line Coverage 코드의 각 라인이 테스트 코드에 의해 검증되었는지 확인하는 커버리지이다. 2. Branch Coverage 코드의 각 분기문이 테스트 코드에 의해 검증되었는지 확인하는 커버리지이다. 3. Condition Coverage 코드에 각 조건문의 내부 조건문이 테스트 코드에 의해 true/false 인 경우가 모두 검증되었는지 확인하는 커버리지이다. 4. Decision Coverage 코드에 모든 조건문이 테스트 코드에 의해 true/false 인 경우가 모두 검증되었는지 확인하는 커버리지이다. 5. 가장 많이 사용되는 것은 Line Coverage 라인 커버리지를 사용하면 모든 시나리오를 테스트할 수 있다는 보장은 없지만 모든 코드를 검증해 볼 수 있다는 장점이 있다. 따라서..
· 리눅스
운영체제는 기본적으로 프로그램에게 3개의 파일 디스크럽터를 할당한다. 파일 디스크럽터 설명 기본 값 0 표준 입력 키보드 1 표준 출력 모니터 2 표준 에러 모니터 표준 입력장치 변경 리눅스의 리다이렉트 연산자( 연산자를 사용하면 기본적으로 표준 출력이 리다이렉트 된다. 사실 > 연산자 앞에 파일 디스크럽터의 번호를 표기하는 것이 정석이지만 생략하게되면 1번이 기본으로 설정된다. cat [filename] 1> /dev/null # 이것이 정석 cat [filename] > /dev/null # 암묵적으로 표준 출력이 리다이렉트 된다 /dev/null로 출력을 리다이렉트하면 출력값이 버려진다. 2>&1은 뭘까? 끊어서 생각해보자. 2> 는 표준 에러의 출력을 리다이렉트 하겠다는 의미이다. 그리고 &1는 ..
· 리눅스
i-node i-node(아이노드)는 리눅스에서 파일에 빠르게 접근하기 위한 인덱스 개념입니다. i-node라는 이름도 index-node의 줄임말입니다. 아래는 i-node를 이용한 파일 시스템의 간략한 개념도라고 보시면 좋을 것 같습니다. 아이노드는 전통적인 유닉스 계열 파일 시스템에서 사용하는 자료구조이며 모든 파일과 디렉토리가 고유한 아이노드를 가지고 있습니다. 아이노드를 확인하는 방법은 ls의 -i 옵션을 사용하시면 됩니다. 제가 미리 만들어 둔 심볼릭 링크 파일(소프트 링크 파일)이 보이네요. 맨 왼쪽에 표기된 i-node가 다르다는 점 미리 알 수 있습니다. i-node가 가리키는 정보 아이노드는 인덱스의 역할도 하고 파일에 대한 정보(메타데이터)도 포함하고 있습니다. 아이노드가 가진 정보는..
@xftg77g
뇌장하드