1편 : https://developer-youn.tistory.com/124 jvm 조금씩 알아가기 1편 - jvm이란 2편 : https://developer-youn.tistory.com/125 jvm 조금씩 알아가기 2편 - 클래스 로더(class loader) 1편(https://developer-youn.tistory.com/124)을 보고 오시는걸 추천드립니다. 0. 목표 java를 개발하다 보면 종종 class loader developer-youn.tistory.com 3편 : https://developer-youn.tistory.com/126 jvm 조금씩 알아가기 3편 - 데이터 영역(Runtime Data Areas) 1편과 2편을 보고 읽으시는 것을 추천드립니다 1편 https:..
2편 : https://developer-youn.tistory.com/125 jvm 조금씩 알아가기 2편 - 클래스 로더(class loader) 1편(https://developer-youn.tistory.com/124)을 보고 오시는걸 추천드립니다. 0. 목표 java를 개발하다 보면 종종 class loader라는 단어를 콘솔에 찍힌 에러 등을 통해 본 적이 있을 수도 있다.(실은 대부분 봤을 developer-youn.tistory.com 3편 : https://developer-youn.tistory.com/126 jvm 조금씩 알아가기 3편 - 데이터 영역(Runtime Data Areas) 1편과 2편을 보고 읽으시는 것을 추천드립니다 1편 https://developer-youn.tist..
0. 이 글의 목적 BooleanExpression을 쓰는 게 best practice일 수 있지만 더 심플한 방법을 찾다 보니 가능한 방법을 찾아서 메모 겸 적어두고자 함 1. 상황 querydsl을 이용해 db에서 데이터를 가져오려고 하는데 where조건을 동적으로 해야할 일이 생김 e.g. //회사 로직을 제거하기 위해 최대한 단어를 추상화함 queryFactory .from(dataEntity) .groupBy(dataEntity.column1) .select( dataEntity.column1, dataEntity.column2.as("tmp"), dataEntity.column3 ) .where(dataEntity.column1.between( requestCondition.condition1..
0. 왜 이걸 파보기 시작했는가 Annotation을 잘 사용하고 있고 springboot나 lombok을 사용하는 경우 정말 빼놓을 수가 없습니다. 근데 이게 어떻게 동작하는지 갑자기 의문이 생겼습니다. @RestController public class HelloController { @GetMapping("/hello") public String hello(String name) { return "hello " + name; } } @Override는 그렇다 치고 스프링부트 다루다 보면 정말 다양한 어노테이션들을 보게 되는데 그거 진짜 어떻게 동작하는 걸까요 1. 아무튼 그래서 Annotation이란? https://docs.oracle.com/javase/tutorial/java/annotatio..
1. 환경설정 h2랑 maven 사용안하고 gradle과 mariadb로 진행하는 경우 아래처럼 설정 build.gradle implementation 'org.hibernate:hibernate-entitymanager:5.6.14.Final' implementation 'org.mariadb.jdbc:mariadb-java-client:2.7.3' persistence.xml hellojpa.Member show_sql : query가 콘솔에 보임 format_sql : 콘솔에 보이는 query를 포맷팅 해줌 use_sql_comments: 왜 이 query가 호출되었는지 적어줌 jpa특징 Table, Column annotation으로 명시없이 사용하면 클래스의 이름을 table로, 필드의 이름을 ..
언제 var을 사용하고 언제 타입 명시할까? 메소드 안에서 지역변수 선언 : var, dynamic(var이랑 dynamic이랑 같다고 보면 된다. dynamic타입은 계속 value의 타입이 변해도 괜찮다. 정말 필요할때만 사용하자.) 클래스 필드 정의 : 타입명시 타입체크 키워드 : is e.g. if(name is String){print(name.length);} null safety : 개발자가 null참조 못하도록 강제함. 기본적으로는 null을 넣지 못하게 되어있고(기본적으로 Nullable이 아니고) null을 허용하려면 코틀린과 동일하게 ? 를 넣어야한다. (String? name = "parker") 다만 이 상황에서는 개발자가 코드상으로 Null check를 해주어야 안전하다. 이를 ..
도커 - 이미지 - 이미지 인스턴스 - 컨테이너 이미지 생성하고 가져오는 법 - 이미 만들어진 이미지 카피하기 : 대표적으로 docker hub -- docker run으로 컨테이너를 수행하려고 하면 dockerfile(이미지)를 찾다가 없으면 docker hub로 가서 찾음 -- unable to find image 오류가 나도 docker hub에 있으면 괜찮음 - docker ps -a :: docker가 생성된 모든 컨테이너, 모든 프로세스가 표시됨 - docker run -it node :: 컨테이너를 수행하면서 해당 컨테이너의 쉘로 들어가 인터랙티브가 가능하게(커맨드 입력하거나 출력을 볼 수 있게) 해줌 dockerfile 작성 - FROM baseimage_name :: FROM node :..
우선 자바의 동작 과정을 다시 살펴보자 우선 소스코드가 컴파일을 통해 바이트코드로 변하고 이걸 jvm이 인터프리터를 통해 기계어(머신 코드)를 만들어서 사용한다. 이렇게 되면 아무튼 자바만 올라갈 수 있는 환경이면 다 돌아갈 수 있다.(WORA) 컴파일에서 바로 기계어를 만드는 c++, go, rust등에 비해 성능이 뒤쳐지게 된다. 컴파일 언어는 런타임 환경에서 준비된 기계어를 즉시 수행이 가능한데 코드 최적화도 진행해서 인터프리터 언어보단 빠르다. 문제는 빌드 환경이 c++ arch에 종속적임. 컴파일언어가 성능면에서 더 이득이라고 했는데 이 성능차이를 해결하기 위해 JVM에서는 JIT Compiler를 도입함. JIT Compiler는 바이트코드를 캐싱하고 있다가 런타임 환경에 맞춰 수행하고 반복된..
카카오 메시지는 일 평균 500k /tps 트래픽, 40M 의 평균 연결 세션 수, 6.5M /tps 의 최고 트래픽을 가지고 있다. 2011년 겁나 빠른 황소 프로젝트를 통해 패킷 경량화 및 통신 최적화, 푸시 시스템 구조 최적화, 백엔드 시스템 성능 개선을 함 11년 동안 잘 사용했음 client와 연결되는 곳은 c++로 하고 비즈니스 로직은 java로 했음 c++ 백엔드는 epoll기반 비동기 입출력, 쓰레드 별로 미리 할당한 메모리 버퍼 사용, 대당 500K이상 세션 관리 과연 이게 앞으로도 잘 돌아갈까? 커스텀은 진짜 하나 하나 다 성능을 끄집어냈지만 시간이 지날수록 유지보수가 힘들어진다. 양산은 어느정도 성능 저하는 있겠지만 유지보수가 짱좋음 현재 앞단에 있는 서버는 직접 개발한 코드로 인해 ..
https://if.kakao.com/2022/session/104 정리하고 보니 슬라이드랑 똑같네요. 그냥 슬라이드 보세요.. 1. 컨테이너 왜씀 서버 환경(OS독립)에 구애 받지 않고 여기에 애플리케이션이 구동에 필요한 모든걸 다 때려박고(올인원 패키지) 프로세스 주변 영향을 받지 않고 격리된 상태로 실행 가능. 그리고 해당 컨테이너가 구동하기 위한 자원을 할당하고 사용할 수 있도록 보장을 할 수 있다. 2. 컨테이너 사용 요건 리눅스 컨테이너는 리눅스 기술임. 근데 윈도우에서도 도커 쓰잖음? 그거는 도커가 백그라운드 프로세스로 리눅스 버츄얼 머신 돌려서 그럼. 런타임 컨테이너 관리 도구(도커 같은) 리눅스, 런타임은 필수이고 이 컨테이너들을 여러 개를 관리하기 위해 쿠버네티스 같은 자동화 도구를 사..