개발/기술
-
JAVA - 다중상속을 허용하지 않는 이유는 뭘까?개발/기술 2023. 2. 24. 12:59
최근 면접에서 "Java가 다중상속을 허용하지 않는 이유는 뭘까요?" 라는 질문을 받았다. 상속은 오직 클래스 하나만 가능하다는 문법만 알았지 그 이유에 대해서 깊게 고민해보지는 않았다. "인터페이스는 다중으로 구현할 수 있는데, 상속만 이렇게 막은 이유가 있을까요?" 라는 추가질문이 이어지자 제대로 답변도 못하고 '정말 그렇네... 왜그렇게 만들었을까...?' 라는 생각이 면접을 마치고 집에 와서도 머릿속을 멤돌았다. java class 는 암시적으로 object 클래스를 상속하고 있다. 대부분의 클래스에서 기본으로 포함된 함수 toString(), hashCode(), equals() 가 object 로부터 상속받은 함수들이다. 클래스 상속 관계에선 위 함수들은 어떻게 처리될까? public clas..
-
Kubernetes Object개발/기술 2022. 2. 22. 21:30
Object Kubernetes 상에서 말하는 Object 는 Kubernetes 시스템 상에서 영속성을 지니고 있는 엔티티(Entity) 말한다. Kubernetes는 이 Entity를 이용해 클러스터의 상태를 나타낸다. Object가 나타내는 것은 컨테이너화돼 동작하는 애플리케이션이 무엇인지 애플리케이션이 사용하는 리소스는 어떤 것이 있는지 애플리케이션과 관련된 정책은 무엇인지 에 대한 것이다. 처음에는 Object라는 개념이 와닿지 않을 수 있는데 Kubernetes 가 하는 역할이 무엇인지 알아가다 보면 당연히 필요한 개념이라고 익히게된다. Object를 생성하면 Kubernetes는 지속적으로 동작하며 오브젝트가 존재하고 명세한 대로 동작하도록한다. 개발자는 오브젝트를 생성/변경/삭제 해서 시스..
-
Container & Docker개발/기술 2022. 2. 15. 20:00
Container 컨테이너에 설명하기에 앞서 컨테이너 기술이 만들어진 이유를 소개하는게 좋을 것 같다. 우리가 사용하는 컴퓨터에는 여러개의 애플리케이션이 돌아가고 있다. 그리고 대부분의 애플리케이션은 OS에 설치된 라이브러리를 이용해 실행된다. Spring Boot의 경우 JAVA를 참조하고 C 언어로 이뤄진 게임의 경우 GCC 컴파일러를 이용해 실행하게 될 것 이다. 모든 앱이 사용하는 라이브러리가 겹치지 않으면 상관 없다. 그런데 실행하는 앱 별로 필요한 라이브러리 버전이 다른 경우가 종종 있다. 어떤 앱은 Java8에서 실행해야 하는데 새로 배포하는 앱은 Java11 에서 실행되는 환경이 있다면? 일시적으로 링크를 따로 걸어서 해결 할 수 있지만 같은 로컬 환경에 두개의 라이브러리 버전을 관리하는 ..
-
cypher개발/기술 2022. 2. 14. 20:00
cypher는 Graph Database 인 Neo4j 에서 Query를 작성할 때 사용할 수 있는 언어다. 처음 보면 생소하지만 사용하다보면 SQL 과 흡사한 점이 많아 금방 배울 수 있다. 노드와 관계 그리고 속성을 정의하는 쿼리라는 점에 주목해서 보자. 다음 문장을 나타내는 관계를 만든다고 해보자 Mike writes Neo4j Son reads Neo4j Mike likes Son CREATE 문장에서 각 주어와 목적어는 관계상에서 Node로 표현할 수 있으며 각각의 Node는 Label로 묶어 줄 수 있다. Mike와 Son은 User라는 라벨로 표현하고 Neo4j 은 Book 라벨로 표한하자. 각 Node를 Cypher를 이용하면 아래의 쿼리로 세개의 노드를 생성할 수 있다. create(:U..
-
Graph Database - neo4j개발/기술 2022. 1. 24. 20:00
일반적인 관계형 데이터베이스에서 Entity 사이의 관계를 표현할 때 JOIN 함수를 사용한다. 그런데 JOIN 함수를 사용하는 작업은 성능상에 단점이 있을 뿐만 아니라다소 엄격한 스키마를 따라야해 유연하지 못하다. 그래서 일반적인 SQL 데이터베이스는 관계형 데이터베이스임에도 불구하고 관계를 잘 표현하지 못하는 단점이 있다. 이런 문제점을 해결하고자 Graph 데이터베이스에서는 데이터를 더 유연하게 저장하는 방법을 제공한다. JOIN 과 같은 작업은 존재하지 않으며 모든 데이터는 Node와 Relation으로 표현되고 탐색(traverse)에 최적화됐다. Neo4J Neo4J는 오픈소스로 운영되는 Graph Database 이며 ACID compliant 하다. AuraDB 를 이용해 제공되고 있어 ..
-
log4j 이슈 살펴보기개발/기술 2021. 12. 13. 23:42
12월 09일 부터 오늘까지(12월 13일) Log4J라는 라이브러리가 전세계 개발자 커뮤니티를 떠들석하게 만들었다. Log4J는 자바 서버 프로그래밍을 해본 사람이라면 디버깅 용도로 한 번쯤 사용하는 라이브러리인데 특정 버전에서 이 라이브러리를 사용하면 원격에서 자바 프로그램을 실행 할 수 있는 심각한 결함이 있었다. 로그만 찍어주는 별 것 아닌 라이브러리가 어쩌다 이런 취약점이 생겼고 얼마나 문제가 심각한 것인지 이번 포스트를 통해서 정리해보려고 한다. JNDI 취약점이 발생한 원리를 다루기 전에 먼저 JNDI 라이브러리에 대해서 알아보자. JNDI 는 Java Naming and Directory Interface의 약자로 클라이언트가 서버상의 데이터나 객체를 lookup 할 수 있는 Java AP..
-
AOT(Ahead Of Time) Compiler개발/기술 2021. 11. 26. 20:30
JIT 컴파일러가 바이트코드를 런타임에 기계어로 바꾼다면 AOT는 실행 전에 바이트코드를 기계어로 바꾸는 컴파일러다. 실행 전에 모두 기계어로 변환되기 때문에 JIT 컴파일러가 런타임에 컴파일 하기 때문에 발생하는 성능 이슈가 생기지 않고 거의 네이티브의 성능을 낼 수 있게 된다. AOT 컴파일러가 JIT 컴파일러의 정반대의 원리기 때문에 JIT 컴파일러의 장점은 AOT 컴파일러의 단점이된다. AOT 컴파일러를 사용하면 실행 전에 전체 파일을 빌드해야 하기 때문에 빌드 속도가 느려진다. 설치할 때도 JIT 컴파일러를 사용하는 경우 바이트 코드만 받으면 되는 반면 AOT 컴파일러를 사용하면 기계어로 번역하는 작업까지 포함되기 때문에 느리다. 그리고 JIT 컴파일러의 장점이었던 Hot Reload 기능도 사..
-
JIT(Just In Time) Compilation개발/기술 2021. 11. 26. 20:10
기존 정적 컴파일 방식에서는 실행 전 소스 코드를 모두 기계어로 번역해야 했다면 JIT 컴파일러는 코드를 런타임에 기계어로 번역한다. 인터프리터도 런타임에 소스코드를 기계어로 변환해서 비슷하다고 볼 수 있으나 JIT 가 컴파일 하는 대상은 소스 코드가 아니라 최적화를 한번 거친 바이트 코드다. 바이트코드는 기계어는 아니지만 JVM 같은 가상 머신에서 쉽게 기계어로 변환할 수 있는 코드이며 이 과정이 실시간으로 일어나기 때문에 JIT(Jut In Time) 이라고 부른다. Java 개발자가 빌드해서 만든 바이너리는 기계어로 된 파일이 아니라 JVM에서 돌릴 수 있는 바이트 코드 덩어리다. 이 바이트 코드 덩어리가 JVM에 올라가면 내부 JIT 컴파일러에서 바이트 코드를 기계어로 변역해서 실행하게 된다. J..