최신 글
-
[Java, Spring] 버전 선택 가이드 2024 (Java 21)
https://kghworks.tistory.com/137 [JAVA, SPRING] 버전 선택 가이드 2023Java와 Spring을 선택함에 있어 Java version과 Spring version은 매우 중요합니다. 특히 Java 8부터 소개된 lamda, stream, Java 11의 var 타입추론 등은 같은 Java여도 버전에 따라 꽤 다른 가독성, 문법을 보여주기kghworks.tistory.com 2023년 버전으로 자바 버전 채택 가이드를 포스팅을 한 지 1년이 채 안 돼 조회수가 1만이 넘었다;; 내 티스토리의 명실상부 효자 포스팅이 아닐 수 없어 2024 버전으로 다시 작성해보려 한다. 미리 쓰는 결론 : JDK 17 쓰자Spring Framework로 개발하는 경우 : JDK17..
2024.04.27
-
[algorithm] 정렬 3. 우선순위 큐 (Priority Queues)
2024.02.04 - [Programming/Algorithm] - [algorithm] 정렬 2. 퀵 정렬 [algorithm] 정렬 2. 퀵 정렬 https://kghworks.tistory.com/175 [알고리즘] 정렬 1. 병합 정렬 목차 병합정렬 하향식 병합 정렬 (top-down) 상향식 병합 정렬 (bottom-up) 병합 정렬은 점근적으로 볼 때 최적의 비교 기반 정렬 알고리즘이다 kghworks.tistory.com 이어지는 포스팅이다. 목차 우선순위 큐 (Priority Queues) 기초적인 구현 힙 (Heap) 힙 알고리즘 구현하기 힙을 이용한 알고리즘 1 : 인덱스 기반 우선순위 큐 힙을 이용한 알고리즘 2 : 힙 정렬 큐 (Queue)는 FIFO (First-in-first-..
2024.04.19
-
[Database] 빅 데이터 (Big Data) 1장 - Big Data Storage System
전통적인 application은 관계형 데이터베이스 (RDBMS)를 기반으로 구축할 수 있었다. 그러나 현대 application은 관계형 데이터베이스 구조에 딱 맞는 데이터만을 다루지 않는다. 더 이상 데이터는 하나의 엔터프라이즈로부터 생산되지 않는다. 즉 빅데이터가 나타났으며 이 빅데이터를 다루기 위한 여러 데이터베이스 시스템 종류들이 등장한다. 따라서 빅 데이터를 정의, 분류하고 그에 따른 적절한 데이터베이스 시스템들을 훑어본다. 전체적인 흐름은 데이터베이스 시스템 (Abraham Silberschatz , Henry F. Korth , S. Sudarshan 저)의 10장 Big Data을 따른다. 목차 빅 데이터 (Big Data) 이전의 데이터 빅 데이터 쿼리 (Query) 빅 데이터 저장소 ..
2024.04.13
-
[Intellij] java.lang.NoSuchFieldError: FILE_HASHING_STRATEGY
Intellij 2024.1 이 릴리즈 되었다. 그리고 업그레이드하자마자 코틀린 빌드 시 아래 에러를 마주했고, 하는 수 없이 2023.6으로 롤백했다. 빨리 다음 버전에 패치해 줬음 한다. 의심 가는 원인은 kotlin 버전이다. 1.6 이하 (포함)에서 빌드 시 버그가 있는 느낌이다. Kotlin: connecting to daemon Kotlin: compiling [my.module] Kotlin: kotlinc-jvm 1.6.21 (JRE 11.0.22+7-LTS) Kotlin: [Internal Error] java.lang.NoSuchFieldError: FILE_HASHING_STRATEGY at org.jetbrains.kotlin.jps.targets.KotlinJvmModuleBuil..
2024.04.12
-
[Git] 로컬의 프로젝트별로 git config를 적용하고 싶을 때
로컬의 프로젝트별로 git config를 적용하고 싶을 때 cd .. git config -l ## git config (global) cd git config -l --local ## git config (특정 프로젝트) git config --local user.name "Your Name" git config --local user.email "Your Email" git config -l --local ## 바뀌었는지 확인 (아래에서)
2024.03.08
-
[Tip] IntelliJ에서 Java 코드 Kotlin으로 자동 변환하기 Java-to-Kotlin converter
인텔리제이는 자바 코드를 코틀린으로 자동으로 변환해주는 기능을 지원하고 있다. 정확히는 .java 파일을 .kt 파일로 변환해주는 것. 완벽히 변환하지는 않지만 초반에 코틀린이 어색하거나 할때 유용하게 사용 가능할 듯? 자바 파일 > 오른쪽 마우스 > Convert Java File to Kotlin File
2024.03.07
-
[Intellij] 코드 복사 text만 하는 방법 (copy as plain text)
문제 Intellij에서 코드를 복사해서 다른 곳에 붙여 넣을 때 코드 블록채로 복사되어 툴에 따라 코드블록이 생성되면서 붙여 넣어질 때가 있음 해결 방법 1. 오른쪽 마우스 > Copy as Plain Text (임시방편) 이렇게 하면 복사할 때마다 해줘야함. 방법 2. Copy as rich text 설정 해제 아래 그림처럼 기본적으로 Copy as rich text 설정을 체크 해제해서 기본적으로 복사 시 텍스트만 복사하도록 설정할 수 있음
2024.03.06
-
[algorithm] 정렬 2. 퀵 정렬
https://kghworks.tistory.com/175 [알고리즘] 정렬 1. 병합 정렬 목차 병합정렬 하향식 병합 정렬 (top-down) 상향식 병합 정렬 (bottom-up) 병합 정렬은 점근적으로 볼 때 최적의 비교 기반 정렬 알고리즘이다 병합정렬 병합 (merge)은 정렬 대상을 2개의 배열로 쪼갠 kghworks.tistory.com 이어지는 포스팅이다. 목차 퀵 정렬 퀵 정렬 성능 특성 퀵 정렬 알고리즘 개선 퀵 정렬 퀵 정렬은 가장 널리 사용되는 정렬 알고리즘이다. 구현이 쉽고, 다양한 형태의 input이 가능하다. 응용상황에서 다른 정렬 알고리즘들보다 (병합, 선택, 삽입 정렬) 빠르고, 추가적인 메모리 사용을 하지 않는 in-place sorting인 장점이 있다. 그러나 부주의한 ..
2024.02.04
-
[Git] rebase + squash로 커밋 합치기
PR (MR) 요청하기 전에 커밋을 깔끔하게 만드는 습관을 갖자 분기한 브랜치에서 작업하다가 PR (혹은 MR)을 날리려면 지저분한 커밋이력이 문제다. 아래는 main 브랜치에서 분기해서 feat/login 브랜치에서 3개의 커밋을 만들고 merge 하기 직전의 모습이다. 리뷰어에게 보기도 편하고, 브랜치 이력도 깔끔히 관리하기 위해 3개의 커밋을 하나로 합쳐서 merge 요청을 보낼 수 있다. 1. git rebase로 HEAD부터 n개의 커밋을 합치기 $ git rebase -i HEAD~3 pick 8a338ed 레이아웃 작업 1차 완료 pick 07fef02 레이아웃 작업 완료 pick ab0dbba 테스트 작성 완료 # Rebase 7457bdf..ab0dbba onto 7457bdf (3 co..
2024.01.24
Programming
-
[Java] JDK 21 Virtual Threads 톺아보기
목차 OS 스레드와 Java Platform Thread Java Virtual Thread Virtual Thread 사용해 보기 Virtual Thread 효율적으로 사용하기 Java 21에 새롭게 추가된 Virtual Thread에 대해 알아본다. 먼저, 가상 스레드를 일목요연하게 정리해 주신 카카오 안정수(James.star)님께 감사드린다. 아래 링크를 통해 영상을 볼 수 있다. https://youtu.be/vQP6Rs-ywlQ 추가로 Oracle에서 제공한 Virtual Thread 문서를 참고하여 가상 스레드를 정리해 보았다. 예시코드는 모두 아래 깃헙에서 볼 수 있다. https://github.com/gihyeon6394/hello-java-virtualthread GitHub - gi..
2024.01.04
-
[Java, Spring] 버전 선택 가이드 2024 (Java 21)
https://kghworks.tistory.com/137 [JAVA, SPRING] 버전 선택 가이드 2023Java와 Spring을 선택함에 있어 Java version과 Spring version은 매우 중요합니다. 특히 Java 8부터 소개된 lamda, stream, Java 11의 var 타입추론 등은 같은 Java여도 버전에 따라 꽤 다른 가독성, 문법을 보여주기kghworks.tistory.com 2023년 버전으로 자바 버전 채택 가이드를 포스팅을 한 지 1년이 채 안 돼 조회수가 1만이 넘었다;; 내 티스토리의 명실상부 효자 포스팅이 아닐 수 없어 2024 버전으로 다시 작성해보려 한다. 미리 쓰는 결론 : JDK 17 쓰자Spring Framework로 개발하는 경우 : JDK17..
2024.04.27
-
[JPA] JPA와 @Transactional
@Transactional은 Spring AOP를 기반으로 동작하는 프락시이기 때문에 AOP에 대한 이해가 없다면 먼저 이해한 뒤 보길 바란다. 아래 두 포스팅을 참고해도 좋다. 2023.12.02 - [Programming/JAVA] - [Java] AOP 1편 - 핵심 기술 Proxy, Dynamic proxy, Factory bean [Java] AOP 핵심 기술 - Proxy, Dynamic proxy, Factory bean 목차 AOP란 프락시(Proxy)의 정의, 프락시 패턴 다이내믹 프락시 다이내믹 프락시 예제 한계 스프링의 ProxyFactoryBean : 어드바이저 Spring 3대 기술 (DI, PSA, AOP) 중 하나인 AOP는 프락시 기반으로 동작한 kghworks.tistory..
2023.12.03
-
[Spring] AOP 2편 - Spring의 AOP과 @Transactional
2023.12.02 - [Programming/JAVA] - [Java] AOP 핵심 기술 - Proxy, Dynamic proxy, Factory bean [Java] AOP 핵심 기술 - Proxy, Dynamic proxy, Factory bean 목차 AOP란 프락시(Proxy)의 정의, 프락시 패턴 다이내믹 프락시 다이내믹 프락시 예제 한계 스프링의 ProxyFactoryBean : 어드바이저 Spring 3대 기술 (DI, PSA, AOP) 중 하나인 AOP는 프락시 기반으로 동작한 kghworks.tistory.com 이전 포스팅에서 이어진다. 이번 포스팅에서는 트랜잭션을 스프링 AOP를 사용해 구현해 본다. 스프링이 제공하는 어노테이션 @Transactional을 사용해 더 직관적이고 간단..
2023.12.03
-
[Message Brokers] Streaming data와 Pub / Sub system
목차 Streaming Data Streaming Data를 쿼리하는 방법 Algebraic Operations Publish / Subscribe system [참고] 트위터의 데이터 처리 방식 Streaming Data : 지속적인 데이터 흐름 웹 서비스에서의 데이터는 주로 데이터베이스 시스템에서 관리된다. Relational Database Management System (RDBMS, 관계형 데이터베이스)가 대표적이다. 데이터베이스에 저장된 데이터를 불러오기 위해 많은 client들이 질의 (query)하는데 이 질의를 지속적으로 (혹은 주기적으로) 해야 하는 데이터들이 있다. 예를 들면, SNS 게시글은 데이터가 추가될 때마다 엄청난 질의가 들어올 것이다. 호날두가 인스타그램에 글을 올리면 해당..
2023.11.25
-
[Java] JPA N+1 원리 이해하기
목차 N+1 문제 정의 N+1 원인 1. 연관관계의 주인이 누구인가 N+1 원인 2. JPQL은 연관객체의 fetchType을 모른다 N+1 해결방법 정리 참고 포스팅에는 아주 간단히 아래 2개의 테이블을 사용한다. @Entity @Table(name = "team") public class Team { @Id private String id; private String name; @OneToMany(mappedBy = "team", fetch = FetchType.LAZY) private List members = new ArrayList(); // 생략 } @Entity @Table(name = "member") public class Member { @Id private String id; priv..
2023.11.14
-
[클라우드] 가상화 - 클라우드 컴퓨팅의 핵심 기술
목차 가상화란 가상화 구성요소 가상화 방식 가상화란? 컴퓨터 분야에서 가상이란 말이 붙으면 logical의 동의어로 물리적으로 실체가 있지 않은 무언가를 뜻한다. 가상화는 컴퓨터를 하나의 인스턴스(머신)의 개념으로 간주하여 물리적인 컴퓨터를 인스턴스(머신) 수준으로 가상화한 것을 말한다. 즉 IT 리소스를 논리적으로 분할하는 기술이다. 왜 가상화를 하나? 컴퓨터를 인스턴스로 가상화하여 하나의 컴퓨터 (Host)에서 1개 이상의 가상 컴퓨터를 논리적으로 운용할 수 있기 때문이다. 가상화를 통해 하나의 물리적 하드웨어에 여러 개의 컴퓨터 (인스턴스, 머신)를 운용할 수 있다. 가상화는 굳이 클라우드 컴퓨팅 기술을 사용하지 않더라도 가능하다. 가상화를 할 수 있는 프로그램을 Host 컴퓨터에 설치한다면 해당 ..
2023.10.25
-
[Database] 인덱스 (Index) 1장 : 필요성과 기본 컨셉
특정 DBMS에 대한 인덱스 구조가 아닌 데이터베이스 시스템 자체에 대한 인덱스에 대해 정리한다. 기본 개념, 종류와 메커니즘에 대해 말하겠다. 전체적인 흐름은 데이터베이스 시스템 (Abraham Silberschatz , Henry F. Korth , S. Sudarshan 저)의 14장 Indexing을 따른다. 1개 이상의 DBMS에서 인덱스를 생성해봤고, 인덱스에 대한 이해가 어느 정도 있다면 더 수월하게 포스팅을 읽어나갈 수 있을 것이다. 첫 번째 포스팅으로 데이터베이스에서 인덱스의 필요성과 기본 콘셉트를 정리한다. 목차 인덱스의 필요성 좋은 인덱스를 판별하는 기준 search key 인덱스 생성하기 인덱스의 필요성 데이터베이스의 인덱스를 책의 색인에 비유하곤 한다. 책의 색인 데이터베이스 인덱..
2023.10.12
-
[개발일지] 채번(採番) 개발하기
채번(採番)이란 번호를 딴다는 의미로 번호표의 목적으로 DBMS에서 PK 혹은 고윳값을 부여할 때 사용하는 용어다. 일본말이라고 함. 채번되는 값이 업무적으로 의미 있는 값이건, 단순 고윳값이건 각각의 목적이 충분히 존재한다. 나의 경우 고객에게 노출하는 값은 아니었지만 고윳값을 가지면서 SELECT도 가능해야 했다. (이건 이후에 후술) 웹서비스에서 채번 하는 업무는 꽤 있다. (계좌번호, 자동차 번호판 등) 단순히 sequence (ORACLE), auto_increment (MYSQL) 등 사용해 채번 할 수 있지만 그 이상의 요구사항이 존재한다. 채번 결과가 어떤 포맷을 유지해야 한다던지 등..(계좌번호, 자동차 번호판 등) 이번 포스팅에서는 채번 프로세스를 어떻게 개발하게 되었는지 과정과 결과를..
2023.10.05
-
[Java] Java 8 사용하기 : 람다와 스트림으로 리팩터링
목차 람다로 대체할 수 있는 코드 method reference로 한번 더 리팩터링 Streams를 활용한 declarative programming 람다와 OOP 디자인 패턴 https://kghworks.tistory.com/140 [Java] Java 8 사용하기 : 가독성과 유연성, 람다와 Streams API 목차 Java 8로 향상되는 가독성과 유연성 익명 클래스 -> 람다 표현식 람다 표현식 -> 메서드 참조 명령적 데이터 가공 -> Streams API 함수형 인터페이스 Java 8 이상의 버전을 사용하면서 legacy를 Java 8 kghworks.tistory.com 앞선 포스팅에서 Java 8이 제공하는 람다와 스트림에 대한 유용함을 간단히 알아보았다. 이번에는 기존 코드들을 람다로 ..
2023.09.23
-
[Java] Java 8 사용하기 : Optional로 Null 지혜롭게 다루기
목차 Null을 다루는 방식 (Java 8 이전) Java 8에 추가된 Optional 유용한 case와 기타 API Java 8에 추가된 주요 기능 중 개인적으로 손에 꼽는 것은 Streams와 Optional이다. Optional은 java.util 패키지에 Java 8부터 추가된 클래스로 클래스명 그대로 Optional 한 값을 다룰 때 유용하게 사용할 수 있는 클래스이다. 포스팅을 간단히 요약하면 Optional을 사용해 아래와 같이 코드를 개선해 볼 수 있게 된다. // Java 8 이전 if(idol != null) { Leader leader = idol.getLeader(); if(leader != null) { Car car = member.getCar(); if(car != null) ..
2023.09.03
-
JWT (JSON Web Token) 도입기 - JWT는 만능해결사인가
목차 JWT 토큰을 도입한 계기 JWT의 문제점 앞으로의 개선방향 실무에서 JWT를 도입했던 일화를 소개합니다. JWT의 개념, 소스 구현 등은 구글링 하면 예제들과 함께 자세히 나오니 해당 레퍼런스들을 참고하시기 바랍니다. JWT 토큰을 도입한 계기 별도의 세션저장소 (ex. Redis)를 두지 않은 경우 세션은 WAS에 부하를 줍니다. 일반적으로 이 문제에 직면한 뒤 세션 저장소를 별도 구축하거나 JWT 도입을 고민하는데요. 그러나 제가 실질적으로 실무에서 JWT를 도입하게 된 계기는 이원화된 서버의 세션 정합성 문제였습니다. 제가 맡은 레거시는 서버 부하 분산을 위해 was를 2대 이상으로 세팅하였으나, 실제 세션 데이터는 클러스터 혹은 별도의 세션 저장소 구축은 되어있지 않았습니다. 따라서 제가 ..
2023.03.02