전체 글167 Kotlin Coroutine 과 Java Virtual thread 최근 Java 21 에서 Virtual thread 가 정식 출시되어 많은 관심을 받고 있는데요. 문득 Virtual thread 가 Kotlin Coroutine 을 대체하는 양상이 나오지 않을까 하는 생각이 들었습니다. 그래서 이 둘을 비교하며, 각각 어떤 문제를 해결하기 위해 나온 기술들이고 어떤 특징들이 있는지 살펴보고자 합니다. 1. 서론 Kotlin coroutine(코루틴)과 Java Virtual threads(가상 스레드)는 '컴퓨팅 자원을 더 효율적으로 사용하기 위한 경량 스레드 기술' 입니다. 컴퓨터의 발전 과정에서 우리는 자원을 효율적으로 사용하기 위해, 가용 자원의 유휴시간을 줄이기 위해 노력해왔는데요. CPU Scheduling 이 그 대표적인 사례이죠. 코루틴과 .. 2024. 3. 17. TDD는 RED → GREEN → YELLOW가 전부는 아니다 지금 까지는 TDD가 '테스트, 구현, 리팩토링 순서로 진행하는 개발 방법'이라는 정도로만 이해하고 있었는데요. 최근 테스트 주도 개발을 읽으며 이게 전부가 아니라는 사실을 배웠습니다. 그래서 이번 글에서는 제가 배운점들을 공유드리려고 합니다. TDD의 정의 TDD란 무엇일까요? 많은 글과 책 등에서 TDD에 대해 정의했는데요. 위키 먼저, 위키에서는 다음과 같이 정의하고 있습니다. Test-driven development (TDD) is a software development process relying on software requirements being converted to test cases before software is fully developed, and tracking all so.. 2024. 1. 13. 테스트는 안정감을 줄 수 있는가? 저는 실무에서 테스트 코드를 작성하고있고, 안정적인 유지보수를 위해서는 당연히 해야한다고 생각합니다. 하지만 스스로를 되돌아보니 테스트란 뭔지, 왜 해야하는지를 그저 어렴풋이만 알고있다는걸 깨달았습니다. 그래서 테스트의 본질에 대해 고민해보고, 테스트의 장점과 그게 정말인지에 대해 생각해봤습니다. 학습해 나가는 중에 정리한 내용이라 혹여나 잘못된 내용이 있다면, 피드백 주시면 감사하겠습니다. 테스트는 뭘까? 여러 글과 책에서 말하는 테스트의 정의를 제 나름대로 요약해보면 다음과 같습니다. 시스템등이 예상한대로 동작하는지 확인하는 행위 이러한 맥락에서 볼때 세상의 모든 개발자들은 테스트를 하고있습니다. 시스템 전체를 로드해서 사용하며 확인 시스템의 일부분을 로드해서 사용하며 확인 테스트 코드를 통해 확인 .. 2023. 12. 10. AWS Copilot으로 컨테이너 서비스 환경 구성하기 최근 회사에서 신규 프로젝트의 컨테이너 기반 서비스 환경을 AWS Copilot을 이용해 1~2일 만에 구축했습니다. 그래서 이번 글에서는 AWS Copilot이 무엇인지, 어떤 특징이 있고, 어떻게 사용할 수 있는지 공유드리려고 합니다. 1. AWS Copilot 이란? 많은 분들이 'Copilot' 이라고 하면, Github의 Copilot을 먼저 떠올리시는데요. 하지만 AWS Copilot은 컨테이너 기반 서비스 환경을 간편하게 빌드, 배포, 운영할 수 있게 해주는 도구입니다. 위 그림은 Copilot에서 제공하는 리소스들을 도식화한 그림입니다. 여기서 app은 하위의 env, pipeline, service들을 묶는 범주입니다. 그리고 실제 인프라로 프로비저닝되는 대상이 env, p.. 2023. 5. 21. [Effective Java] 아이템 84. 프로그램의 동작을 스레드 스케줄러에 기대지 말라 0. 들어가며 이 아이템은 스레드 스케줄러에게 의존적인 코드를 작성하지 말라는 내용입니다. 아래에서 조금 더 자세히 알아보겠습니다. 1. 스레드 스케줄링 스레드 스케줄링은 간단히 말해서, 스레드를 어떤 기준에 따라 순서대로 실행시키는행위 입니다. 기본적으로는 운영체제가 이런 작업을 모두 처리하는데요. Java의 경우 JVM이 이를 대신 처리합니다. 1.1 JVM의 스레드 스케줄링 JVM의 스레드는 User-level-thread(ULT) 이고 실제 실행시에는 Kernal-level-thread(KLT)와 매핑됩니다. User-level-thread : 사용자(프로그램)이 구현한 Thread Kernel-level-thread : 운영체제(Kernel)에 구현된 Thread 하지만 KLT는 한정적이기 때문.. 2023. 4. 4. [Effective Java] 아이템 76 : 가능한 한 실패 원자적으로 만들라 0. 들어가며 이 아이템이 말하는 바는 짧고 명확해서, 아이템 이름만 봐도 명확하게 보입니다. 저는 “가능한 한 실패 원자적으로 만들라” 라고 핵심 키워드를 꼽았습니다. 가능한 : 반드시 해야한다는건 아니지만, 실패 원자적 : 실패 상황에도 정상적인 흐름으로 흘러가게 하라. 그런데 실패 원자적이라는 말이 확 와닿지는 않는데요. 이를 책에서는 다음과 같이 말합니다. 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 어떻게 원자적으로 만들 수 있는지, 해야하는 상황과 아닌 상황은 어떻게 구분하는지 아래에서 알아보겠습니다. 1. 실패 원자적으로 만드는 방법 1.1 불변 사실, 불변객체인 경우에는 실패원자적으로 만들기가 쉽습니다. 왜냐하면, 불변 객체인 경우에는 상태를 변경할때 새.. 2023. 3. 27. [Effective Java] 아이템 71 : 필요 없는 검사 예외 사용은 피하라 0. 들어가며 저를 포함한 많은 자바 개발자들은 Checked Exception이 try-catch 구문이나 throw 를 강제하기 때문에 좋아하지 않는데요. 그래서 요즘은 거의 Checked Exception은 사용하지 않고, 불가피하게 사용하게 되는경우는 RuntimeException으로 변환해서 다루는 경우도 많은 것 같습니다. 게다가 Checked Exception을 던지는 메서드는 Stream에서 직접 사용할 수 없어서 더욱 기피하게되는데요. 하지만 이런 Checked Exception도 제대로 활용한다면 API와 프로그램의 질을 올릴 수 있다고 합니다. 1. 제대로 활용할 수 있는 경우 Checked Exception을 제대로 활용할 수 있는 경우는 다음과 같습니다. 외부에서 API를 정상적으.. 2023. 3. 26. [Effective Java] 아이템 55 : 옵셔널 반환은 신중히 하라 0. 들어가며 Java 8 이전에는 값을 반환할 수 있을 수도 없을 수도 있는 경우에 정말 애매했습니다. 개발자가 선택할 수 있는건 null 반환, 예외 발생 두 가지 중 하나였는데요. null을 반환하는 경우에는 호출하는 쪽에서 null 방어코드를 추가해줘야합니다. 만약 빠트리게되면 어디선가 NullPointerException이 발생하죠. 그리고 예외를 발생시키더라도 StackTrace 전체를 추적하기 때문에 비용도 만만치 않다고 합니다. 하지만 이 문제는 Java 8에서 Optional이라는 클래스가 등장하며 해소되었죠. 1. Optional Java 8 부터 Optional이 등장하며 값을 반환할 수 있을 수도 없을 수도 있는 경우를 대응할 수 있게 되었습니다. 값이 있는 경우에는 해당 객체를 담.. 2023. 3. 25. 부족한 시간을 어떻게 극복할 수 있을까? 0. 시간이 부족해.. 저는 아직 취업준비 후 얼마 되지 않아서 그런지 뭐든 깊게 꼼꼼하게 하려는 버릇이 들었습니다. 그런데 취업 후 회사를 다니면서 이전과 똑같이 공부하려니 그게 잘 되지 않았는데요. 취업 준비중일때는 잠자는 시간 7시간을 제외한 17시간 모두 다 제가 활용할 수 있는 시간이었습니다. 그래서 제가 원하는 만큼 시간을 쏟아부으며 뭔가 할 수 있었죠. 하지만 회사를 다니며 소모되는 시간이 많이 늘었죠 출근 준비(0.5~1) 출퇴근시간(1) 근무(9) 퇴근 후 집 정리(1) 이걸 다 합하면 하면 11~12시간 정도는 못쓰게 되었습니다. 그래서 17시간 중 5시간만 사용할 수 있는데요. 하지만 취업하고 나서 해야할 일들은 늘면 늘었지, 줄지는 않았습니다. 1. 우선순위 먼저 생각난건 우선순위를.. 2023. 3. 25. [Effective Java] 아이템 51 : 메서드 시그니처를 신중히 설계하라(feat. 팀 컨벤션) 0. 들어가며 이번 아이템을 살짝 훑어보면, 좋은 메서드를 만들기 위한 규칙을 설명합니다. 먼저 규칙들을 설명하기에 앞서, 규칙들을 왜 제안하는지 생각해봤습니다. 일관성 없는 메서드명 메서드가 너무 많아서 뭘 써야할 지 모르는 상황 매개변수가 너무 많아서 헷갈리는 상황 대표적으로 이런 경우들로 생각해볼 수 있고, 아마 다들 한번쯤은 겪어보셨을 것이라 생각합니다. 이제 필자가 어떤 규칙들을 제안하고, 그 규칙들을 지키면 위와 같은 상황을 해결할 수 있는지 살펴보겠습니다. 1. 메서드 시그니처 규칙 필자가 제안한 메서드 시그니처 규칙은 다음과 같습니다. 메서드 이름을 신중히 짓자 표준 명명 규칙(아이템68)을 따르자 같은 패키지 속의 다른 이름들과 일관되게 짓자 개발자 커뮤니티에서 널리 받아들여지는 이름을 .. 2023. 2. 21. [Effective Java] 아이템 46 : 스트림에서는 부작용 없는 함수를 사용하라 0. 들어가며 스트림에서 '부작용 없는 함수'를 사용하라는 말은 무슨 뜻 일까요? '부작용' 이라고 번역된 단어는 원서는 'Side effect' 입니다. 즉, 이 함수의 인해 '다른곳에 영향을 끼치지 않는 함수'를 스트림에서 사용해야 한다는 뜻이 됩니다. 1. 순수함수 다른곳에 영향을 끼치지 않는 함수를 함수형 프로그래밍에서는 '순수 함수'라고 하는데요. 이는 조금 바꿔서 말하면 '같은 입력이 주어지면, 항상 같은 결과를 내는 함수'라고 생각할 수 있습니다. 이를 코드로 한번 살펴볼텐데요. 먼저 순수함수가 아닌 예를 먼저 살펴봅시다. class Something { private static int num = 1; p.. 2023. 2. 10. [Effective Java] 아이템 40 : @Override 애너테이션을 일관되게 사용하라 예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 보통 IDE 에서 재정의 기능을 사용하면 자동으로 @Override 어노테이션을 붙여줍니다. 그래서 저는 @Override 에 대해 깊게 고민해본적이 없는데요. 이번 아이템은 개발도구가 도와주지 않다고 가정하고 자세히 알아보겠습니다. 1. @Override 를 붙이지 않는다면 @Override 어노테이션의 가장 중요한 역할은 해당 메서드가 정확하게 오버라이드하고 있는지 확인해주는 것 입니다. class Something { private final int num; public Something(int num) { ... } // equals, hashCode 는 문제없다고 가정 public boolean equals(Something obj) { .... 2023. 2. 7. 조금 늦은 2022년 회고 + 취업 후기 이번 글은 한해동안 일어난 일들과 느낀 감정들을 회고하는 글이기 때문에 평어체로 작성한다. 0. 나에게 2022년은 어떤 의미인가 2022년은 내 인생에서 가장 의미있는 시간 중 하나가 될 것 같다. 즐겁기도 했고, 힘들기도 했고, 짜증나기도 했고, 때때로 성취감도 느꼈다. 이 덕분에 2022년 1월의 나와 현재의 나를 비교해보면 기술적, 정신적으로 많이 성장했다고 느낀다. (유치원생이 초등학생이 되었는데 '나는 다 컸다'라고 생각하는것 일 수도 있지만 말이다..ㅋㅋ) 1. 코드스쿼드 2021년 12월 협업을 중요시 한다는 철학을 가진 교육기관을 찾아 헤맸다. 그러던 중 코드스쿼드와 인연이 되어 6개월간의 과정을 시작하게 됐다. 처음에는 그저 의욕이 앞서서 내 스스로에 대한 이해가 부족한 .. 2023. 1. 30. [Effective Java] 아이템 33 : 타입 안전 이종 컨테이너를 고려하라(feat. ApplicationContext of Spring) 0. 들어가며 33번은 타입 안전 이종 컨테이너에 대한 이야기를 하는 아이템입니다. 이 단어를 하나 하나 분해하여 의미를 파악해보겠습니다. 타입 안전 : 제네릭을 이용하여 타입 안정성을 꾀함 이종(異種) : 다른 종류 컨테이너 : 무언가를 담는 개체(그릇, 용기, 화물 컨테이너 등) 이를 합쳐서 생각해보면 다음과 같습니다. 타입 안전 이종 컨테이너 : 제네릭을 이용하여 타입 안정을 꾀하지만, 여러 타입을 담을 수 있는 개체 의미를 알았으니 더 자세한 내용은 아래에서 알아보겠습니다. 1. 타입 안전 이종 컨테이너(비한정적 타입 토큰) 먼저 책에서 타입 이종 컨테이너를 설명하기위해 제시한 코드를 살펴봤습니다. public class Favorites { private Map 를 받는데요. 이를 책에서는 타입.. 2023. 1. 28. [MySQL] 복합 인덱스와 커버링 인덱스 MySQL 에서 복합 인덱스를 걸었을 때 실제로 인덱스를 타는건 어떤 상황에 탈까? 1. 테이블 & 인덱스 mysql> desc review; +----------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+-------+ | id | bigint | NO | PRI | NULL | | | review_content | varchar(255) | YES | | NULL | | | seq | bigint | YES | MUL | NULL | | | store_id | bi.. 2023. 1. 26. [Effective Java] 아이템 23 : 태그 달린 클래스보다는 클래스 계층구조를 활용하라 예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 이번 아이템은 상속을 활용해야하는 이유에 대한 내용을 담고있습니다. 아래에서 천천히 알아보겠습니다. 1. 태그 달린 클래스 아이템의 제목에서도 그렇고, 책에서도 태그 달린 클래스 라는 말이 자주 등장하는데요. 그 의미가 궁금해졌습니다. 1.1 태그란? 저는 태그란 클래스를 더 세분화 시키기 위한 필드/상태라고 이해했습니다. 특정 클래스에 이런 상태를 붙여서 더 세분화된 것이 태그 달린 클래스인 것이죠. 제가 친구들에게 “얼음이 녹으면?” 이라는 질문을 합니다. 그러면 친구들은 다음과 같이 대답합니다. 문과 친구 : “얼음이 녹으면 봄이 온다는 거지” 이과 친구 : “물이 되지” 그러면 저는 친구라는 클래스에 질문을 했지만, 문과인지 이과인지에 따라 다.. 2023. 1. 10. 삶의 지도 보호되어 있는 글 입니다. 2023. 1. 8. [Effective Java] 아이템 17. 변경 가능성을 최소화하라 예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 이번 아이템은 불변 클래스(Immutable Class) 에 대한 내용입니다. 클래스를 불변으로 만들기 위한 규칙과 장단점 등에 대해 알아볼 예정입니다. 1. 불변 클래스 불변 클래스란 말 그대로 내부의 값을 수정할 수 없는 클래스를 의미합니다. 생성된 시점에 상태가 확정되어, 소멸되기 전까지 달라지지 않습니다. 이렇게 불변 클래스로 만들면 설계, 구현, 사용이 쉬워지며 오류 발생 여지도 줄어들게 됩니다. 이 대표적인 예가 바로 java.util.Date 와 java.time.LocalDate 입니다. java.time 패키지 TMI(Joda time) Java 8 릴리즈 전까지 사용되던 Date 는 가변 클래스입니다. 이 때문에 위에서 말한 여러 문.. 2023. 1. 4. [Effective Java] 아이템 10. equals는 일반 규약을 지켜 재정의하라 예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 equals 메서드는 두 개체가 같은지 확인하는데 사용됩니다. Java 에서 두 개체가 같은지 확인하는 기준은 동일성 과 동등성 두가지로 나누어집니다. 0.1 동일성 동일성 : 두 개 이상의 사상(事象)이나 사물이 서로 같은 성질. 동일성이란 두 개체가 완전히 같은지를 나타내는 성질입니다. 위 그림의 refVar2 와 refVar3 는 지역변수로서는 개별적으로 존재하지만, 같은 객체2를 가리킵니다. 즉, refVar2 == refVar3 이 성립하며 이는 두 변수 refVar2, refVar3 은 동일하다고 표현할 수 있습니다. 0.2 동등성 동등성 : 가치, 등급 따위가 서로 똑같음. 동등성이란 두 개체가 논리적으로 같은지를 나타내는 성질입니다. S.. 2022. 12. 28. [Effective Java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 이번 아이템은 싱글턴 패턴을 안정적으로 구현하기 위한 방법들에 대한 내용입니다. 각각의 방법들을 예제 코드와 함께 알아보겠습니다. 1. 싱글턴이란? 싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. (Effective java 책 23p) '오직 하나만 생성할 수 있다' 라는 말은 '인스턴스가 하나만 존재해야 한다' 라고 해석할 수도 있습니다. 즉, 싱글톤 구현을 위해서는 Java 의 런타임 환경인 JVM 에서 단 하나의 인스턴스만 생성되도록 구현해야 한다고 생각할 수 있습니다. 1.1 싱글턴의 특징 1. 메모리 절약 모든 객체는 생성되면 JVM 의 heap 메모리에 저장됩니다. 그러나.. 2022. 12. 14. [MySQL] R-Tree Index 와 공간 탐색 MySQL 8.0 기준으로 작성한 글입니다. 이 글에서는 MySQL 의 R-Tree 에 대한 개념만 정리합니다. 1. R-Tree R-Tree 는 점, 선, 면(다각형)과 같은 다차원 정보를 효율적으로 저장하기 위한 트리 형태의 자료구조 입니다. 보통 지도에서 좌표, 거리, 지역의 윤곽선 등을 저장하여 해당 개체를 더 빠르게 쿼리하는 목적으로 사용됩니다. (예를 들면 "현재 위치로부터 1km 이내의 식당들 검색") 1.1 MBR : 최소 경계 사각형 R-Tree 의 핵심은 MBR(최소 경계 사각형) 입니다. MBR 은 Minimun bounding rectangle 로 특정 도형을 감싸는 최소 크기의 사각형을 의미합니다. 하나의 도형뿐만 아니라 근처의 도형도 함께 감싸는 저장방식을 통해 도형의 포함 관계.. 2022. 11. 15. 이전 1 2 3 4 ··· 8 다음 반응형