본문 바로가기

기초 지식

(27)
[JPA] 낙관적 Lock, 비관적 Lock 개요 JPA에는 동시에 여러 사용자가 접근하여 데이터를 조작할 때 발생할 수 있는 문제를 다루기 위해 Lock을 지원하고 있습니다. 이 중에 낙관적 Lock(Optimistic Lock), 비관적 Lock(Pessimistic Lock)에 대해서 알아보려 합니다. 낙관적 Lock 낙관적이란 단어에서 알 수 있듯이 데이터 갱신 시 충돌이 발생하는 것을 막는 것이 아닌 충돌이 일어났을 때 처리하는 Lock입니다. @Entity class Book( @Id val bookId: String, val bookName: String, @Version val version: Int ) JPA에서는 위와 같이 Entity에 version 필드를 지정하여 사용합니다. version 값을 통해서 Entity의 변경사항을..
[Java] Virtual Thread(가상 쓰레드) Virtual Thread 2023년 9월에 릴리즈 예정인 Java 21부터 제공되는 기능으로써 기존의 스레드 이외에 추가되는 경량 쓰레드입니다. 기존의 스레드 VS 가상 스레드 기존 스레드 OS (Operating System)이 관리하고 스케쥴링 한다. 즉, 기존 Java에서 스레드를 사용하는 것은 OS의 스레드를 사용하는 방식이다. OS 커널 스레드를 새로 생성하는 것은 비용이 크다. 그래서 스레드 풀 (Thread Pool)을 사용했었다. OS에서 context switch가 될 경우 시간이 오래 걸리기 때문에 non-blocking I/O 방식 혹은 비동기 방식으로 사용해야 조금 더 효율적으로 스레드를 사용할 수 있다. 가상 스레드 JVM에 의해 관리되고 스케쥴링 된다. 가상 머신에 의해 관리되..
[Java 13 ~] Text Blocks Java Text Blocks java 13부터 제공되는 기능 중에 Text Blocks가 있습니다. 굉장히 유용한 기능이라고 보기는 어렵지만 이전에 html을 반환해주는 상황이거나 혹은 String을 여러 줄 작성해야 할 때 사용 가능한 기술입니다. 기능 여러줄의 String을 하나의 block에 작성할 수 있게 해 준다. 예시 public String textBlocks() { return """ """; } Text Block은 "(큰따옴표) 3개로 작성합니다. 내부에 원하는 Text를 작성하면 완성입니다. // Text Block안에 "(큰따옴표)는 escaping이 필요없습니다 public String textBlocks() { return """ "escape가 필요없다" """; } // f..
[DB] Transation Isolation Level Transaction 트랜잭션(Transaction)이란, 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위라고 할 수 있습니다. 여기서 단위라고 하다 보니 정해진 범위가 있을 것 같지만 사용자가 정할 수 있는 범위입니다. 따라서 아래의 트랜잭션의 4가지 특징을 지키는 선 안에서 수행이 되어야 성공적인 트랜잭션의 사용법이라고 할 수 있습니다. 원자성 (Atomicity) 일관성 (Consistency) 독립성 (Isolation) 지속성 (Durability) 하지만 개발을 하다 보면 효율적인 성능을 위해 굳이 다른 트랜잭션에서 데이터 참조를 막을 필요가 없을 수도 있습니다. 아니면, 절대로 참조가 되면 안 되게 설정해야 할 필요가 있겠죠. 그래서 이러한 점을 개발자가 어느 정도는 설정을 해주..
[IF KAKAO 2021] <카카오톡 서버의 스프링 공화국 탈출기> 정리 및 후기 https://if.kakao.com/session/49 이 글은 IF KAKAO 세션 내용을 정리 및 후기를 적은 글입니다. 단순히 추후에 쉽게 보기 위해서 적는 글이지 내용을 도용하려는 의도는 없습니다. 해당 세션을 우선 보는 것을 추천드립니다. 해당 세션은 기존의 많이 사용하는 Spring Framework의 장단점과 이를 벗어나 다른 프레임워크를 사용해보는 것이 세션의 주 내용이었습니다. 여기서 Spring의 대체재로 사용된 것이 Ktor입니다. Kotlin을 기반으로 한 프레임워크라고 하는데 이후에 추가적으로 사용해보고 정리가 필요하다고 느꼈습니다. Spring Framework의 장점 생태계가 잘 구성되어 있어 서버 개발 기간 단축 개발자 풀(Pool)이 넓어서 인력 추가 투입이 쉬움 프레임워..
[Java] Sealed Class Java 17의 release note를 보다 보면 Sealed Class가 정식으로 확정된 것으로 보입니다. JDK 15부터 프리뷰로 추가되었던 것 같은데 한 번도 써본 적이 없네요. ㅎㅎ 오늘 알아보도록 하겠습니다. Sealed Class Sealed Class, Interface는 간단하게 상속하거나(extends), 구현(implements)할 클래스를 지정해두고 해당 클래스들만 상속 혹은 구현을 허용하는 키워드입니다. public sealed interface CarBrand permits Hyundai, Kia{} public final class Hyundai implements CarBrand {} public non-sealed class Kia implements CarBrand {} ..
[Java] HashTable, ConcurrentHashMap에 대해서 HashTable vs HashMap Java를 사용하면서 HashMap은 많이 사용해봤지만 HashTable은 들어만 보고 거의 사용해본 적은 없는 것 같습니다. 하지만 DB나 여러 라이브러리에서 사용하고 있을 것으로 생각이 되어서 정리해보려 합니다. 우선은 ConcurrentHashMap을 알아보기 전에 HashMap과의 차이를 알아보겠습니다. HashTable은 HashMap과 매우 유사합니다. 아래에서 사용법을 알아볼텐데 메서드 명조차 거의 동일합니다. 가장 큰 차이점은 Thread-safe 여부입니다. HashTable 내부에서는 synchronized 키워드를 이용해 Thread-safe하도록 구현되어 있습니다. 이외에도 Key값에 Null을 허용하는지 여부와 에러를 발생시킬 수 있는 코드를 ..
[Kotlin] 코틀린과 자바의 차이 저는 Java를 주로 사용합니다. 그런데 취미로 Flutter를 이용해서 앱을 만들어보려고 하던 중 Java와 완전호환성을 가지고 있고 새로운 언어인 Kotlin에 관심이 가더라구요. 하지만 Java보다 어떤것이 더 나은지 아니면 차이점은 무엇인지 정도는 알고 써야 제가 익숙한 Java를 사용하지 않는 이점이 있을 것 같아서 찾아보고 정리하게 되었습니다. kotlin이란 Java Platform을 대상으로 하는 새로운 프로그래밍 언어로서 즉, JVM에서 돌아가는 언어이다. Jetbrains에서 만들었다. Kotiln의 철학 실용성 Kotlin은 다른 프로그래밍 언어가 채택한 검증된 해법과 기능을 사용하여 복잡도를 줄인 실용적인 언어를 지향하고 있습니다. 간결성 코드를 더 간단하고 간결하게 만들어 내용을 ..
[Java] this 키워드에 관해서 this 키워드 java를 사용하다보면 this.~~ 방식으로 사용하는 키워드를 보게 됩니다. 단순하게는 객체 자기 자신을 가르킨다라고 생각하면 되는데요. 사용하다가 약간의 헷갈리는 부분이 생겨서 정리하게 됐습니다. this 키워드의 역할 클래스가 인스턴스화 되었을 때 자기 자신의 메모리 주소를 담고 있는 키워드 인스턴스의 지역변수로 숨겨진 채로 존재한다 자신의 인스턴스 필드임을 명시하고자 할 때 사용한다 기본적인 사용법 public class Car { private String name; private int power; public Car(String name, int power) { this.name = name; this.power = power; } } 기본적으로 생성자에서 주로 사용하게 되는..
[Java] HashMap에서 잠시 헷갈렸던 부분! Java에서 Map을 종종 사용하게 됩니다. 근데 Map에 대한 로직을 보는데 헷갈리는 부분이 있더라고요. 제가 헷갈렸던 부분을 예시로 보고 정리해보았습니다. HashMap HashMap같은 경우에는 메모리 값에 기반한 해시 값을 이용해 값을 찾아오게 됩니다. 여기에 사용되는 해시값은 Object 클래스에 포함되는 hashCode() 메서드를 통해서 만들어지게 됩니다. 그리고 여기서 만들어지는 값으로 equals() 메서드를 통해서 Object끼리 비교하게 됩니다. 물론 equals와 hashCode는 모두 오버라이딩이 가능합니다. 그리고 변경 시에는 통일성을 위해 두 메서드 모두를 수정하는 것이 필수입니다. 사용하는 방식과 약간 헷갈렸던 사례에 대해서 예제를 통해 보겠습니다. 예시 class TestC..