본문 바로가기

Development48

선택도가 높은게 좋을까? DB 인덱스 설계 시 '선택도'가 헷갈리는 이유 목차 서론 최근 작성했던 '주니어 백엔드 개발자가 반드시 알아야 할 실무 지식'을 읽고 떠오른 내 생각들 글을 다시 읽어보고 있었다. 내가 작성한 내용 중 다음과 같은 내용이 있다.보통 DB에서 인덱스 걸 때, 선택도가 높은 칼럼을 선택하라고 한다. 예를들어서 ‘성별’ 칼럼에 인덱스를 거는건 딱히 의미 없다. 책에서는 실무적으론 도움이 되는 경우도 있다고 얘기해줘서 좋았다. 예를들어 status 같은게 있고, ‘대기중’, ‘처리중’, ‘완료’ 이런 상태값을 가지는 경우 ‘완료’가 대부분이니 이론적으론 선택도가 낮아도 완료가 아닌 상태를 뽑는데는 인덱스 걸기 좋다는 얘기였다. 근데 이 ‘선택도 (selectivity)’ 라는 단어가 뭔가 어색하고 생소하다고 느껴졌다. 그래서 따로 정리도 해둘겸 나만.. 2025. 7. 7.
내가 사내 기술 공유를 어렵게 만든게 아닐까? 최근 올라온 향로님의 '개발자 되기 좋은 성향' 글을 봤다. 전반적인 내용도 좋았지만, 내가 가장 꽂힌 문장은 아래와 같다.…. '이 정도 내용을 가지고 전사 발표를 해?' 와 같은 분위기에 그 누구도 기술 공유를 하고 싶어하지 않았다. …. 글의 해당 문단을 정리하면 “모두가 지식이 많아지고 기준치가 너무 높아지면 오히려 ‘이미 다 아는 내용을 굳이?’ 느낌으로 기술 공유가 역설적으로 사라질 수 있다”는 내용이다. 물론 내가 지식이 많다는 얘긴 아니다. 다만 모두가 공부를 열심히 하면 무조건 이득이라 생각했는데, 저런 식으로 생각할 수 있다는 점이 신선했다. 그리고 나도 어렴풋이 느끼고 있던 점이었는데, 블로그에 글을 쓸 때나 세미나를 할 때 ‘이건 어차피 다 아는거 같은데 굳이?’, ‘이 정도 내.. 2025. 7. 2.
Spring AI 정식릴리즈 맛보기 (바보 ChatGPT 서비스) 기존 Spring AI의 경우, SNAPSHOT 단계여서 maven 저장소를 별도로 설정해야했다.2일전에 Spring AI 1.0 GA Released 라고 정식으로 릴리즈되서 한번 장난으로 사용해봤다.(관련 문서 : Spring AI 1.0 GA Released) Spring AI 1.0 GA 맛볼려면, 다음 문서를 참고하면 된다. (Spring AI 1.0 reference) gradle을 아래처럼 작성한 후 사용하면 된다....repositories { mavenCentral()}// 이젠 GA 릴리즈라서 mavenCentral 만 있으면 된다!...implementation 'org.springframework.ai:spring-ai-starter-model-openai' // openai를.. 2025. 5. 23.
벌써 스프링부트 4.0 이라니! 스프링 3.0이 2022년 말쯤 나왔다. 당시 아래처럼 3.0 관련된 글을 썼었다. 그리고 아직 스냅샷이긴 하지만 4.0이 Spring Initializr에 나왔다. 아직 릴리즈 노트는 작성을 다 안한 것 같다. 일단 최소 지원 자바 버전 변경이 'None' 이라 되있긴하다. 뭔가 스프링부트 3.0은 스프링이 6.0대로 바뀌면서 그거에 맞춰 3.0으로 대규모 업그레이드된 느낌이었는데, 이번 4.0에선 어떤 변화를 보여줄지 기대된다. 3.0도 초기에 나왔을 때 바로 프로젝트에도 적용해본 기억이 있어서, 이번 4.0도 스냅샷 벗어나면 바로 한번 테스트삼아 써봐야겠다. 근데 뭔가 스프링부트 2.0이 엄청 길게 유지됬다고 생각했는데, 찾아보니 2.0은 2018년이고 3.0이 2022년말이었다. 대충 4.0.. 2025. 5. 20.
자바, 스프링부트 가상스레드 도입과 관련한 짧은 개인 정리 특정 주제에 대해 짧게 생각 정리해둘 때 보통 notion을 사용했습니다.최근 블로그에 그냥 부담없이 쓰고싶을때 쓰기로 마음을 바꿨으니, 평소 노션에 적는 형태를 블로그에 적어놔도 괜찮을 것 같아서 한번 적어봅니다. 이하 자바 및 스프링부트에서의 가상스레드 사용에 대해 검색해보며 개인적으로 이런식으로 도입하면 좋겠네 싶은 부분을 생각의 흐름대로 적어봤습니다. 가상스레드 자체에 대한 설명은 적지 않았습니다. 여러 글을 읽으며 제가 정리한 생각을 적어둔거라 사실과 다를 수 있습니다. 1. 애초에 트래픽이 별로 없으면 굳이 사용할 필요 없어보임2. IO 연산이 많은 경우만 고려(네트워크 IO, 디스크 IO 등), pooling 방식으론 사용 지양3. IO 연산이 많은 구간에 넣을 때, 논블로킹 IO로 처.. 2025. 5. 15.
한글 초성검색 날로먹으려다 실패한 후기 발단은 이랬다. 최근 DDD책으로 유명한 최범균 작가(?)님의 신간 '주니어 백엔드 개발자가 반드시 알아야 할 실무 지식' 책이 2025-04-28 발매되었다. 그 책을 읽다가 다음과 같은 부분이 있었다. 타입이 다른 칼럼 조인 시의 주의점에 대해 적어둔 부분이다. 여기서, utf8mb4와 utf8mb4_unicode_ci 로 굳이 바꾸신 이유가 궁금해져서 찾다보니, 다음과 같은 사항을 알 수 있었다."MySQL 8.0.1 이후 default 콜레이션이 'utf8mb4_0900_ai_ci' 로 변경되었는데, 이게 한글 등의 특정 문자열 검색 처리에 문제가 있다"는 얘기였다. 우선 사실 확인을 위해 MySQL 8.0.41을 로컬에 설치해봤고, default가 utf8mb4_0900_ai_ci 가 맞음.. 2025. 5. 8.
Git 기본 이해 - 기본 명령어의 이해, 충돌 해결, github 목차   최근 git 기초에 대한 세미나 한 자료를 기반으로 글을 작성했습니다. 이 글의 목적은 아래와 같습니다.1. 기본적인 git 명령어를 이해해서 IDE가 달라지더라도 동일하게 사용할 수 있도록 하는 것2. 현재 git을 사용해 개발중인 상황에서 충돌 등이 발생했을 때, 현재 상황을 머리속으로 그려볼 수 있도록 이해하는 것   각 ppt 하단 부가 설명은 리눅스에서 CLI 환경에서 git을 사용했습니다. 이하 리눅스 명령어는 아셔야 이해할 수 있을 것 같습니다.ls : 현재 폴더내에 파일 뭐 있는지 확인vi : 그냥 메모장 같은거 실행해서 txt 파일 편집했다고 보시면 됩니다.cat : txt 파일 내용 확인했다고 보시면 됩니다.   알아두면 좋을만한 기본 명령어 외 세부적인 옵션들은 작성하지 않았.. 2024. 5. 22.
대강 살펴보는 자바부터 스프링부트까지의 역사 (자바, CGI, Servlet, DispatherServlet, JSP, Thymeleaf, J2EE, EJB, POJO, Hibernate, JPA, Spring Data JPA, Spring, Spring Boot) 사내 세미나로 진행한 내용을 발표 스크립트와 함께 작성한 내용 입니다. 많은 내용들을 축약하다보니 다소 정확하지 않은 내용이 포함되어 있을 수 있습니다. 설명의 흐름을 위해 연도 상관 없이 넣은 설명들이 있습니다. 보통 이런 애들은 연도를 따로 쓰지 않았습니다. 1991년 제임스 고슬링이 만들었습니다. 당시 썬 마이크로시스템즈 다녔고, 2010년에 오라클에 썬마이크로시스템즈가 인수 합병되었습니다. 그래서 요즘 오라클 사이트 들어가서 jdk 받거나 하게 된 겁니다. PHP, ASP, 펄 스크립트, C, 파이썬 등으로 CGI를 구현할 수 있습니다. 자바로도 구현 가능합니다. 일종의 스펙이므로 언어 무관하게 구현 가능합니다. 다만 단점은 요청 마다 새로운 프로세스를 생성하고, DB connection을 새로 .. 2024. 4. 18.
스프링(부트)에서 final이 아닌 필드(인스턴스 변수, 클래스 변수)가 있으면 안됩니다. 목차 이 내용은 당연한 것 같으면서도 은근히 코드리뷰할 때나 얘기할 때 한번씩 보이는 것 같아서 글로 적어보게 되었다. 개인 생각을 적은것이니 다른 의견 혹은 틀린 부분이 있으면 알려주세요. 제목을 좀 더 구체적으로 적은 이 글의 결론은 다음과 같다. 결론 스프링 혹은 스프링부트로 만든 프로젝트에서 @Component, @Controller, @Service, @Repository 와 같이 스프링 컨테이너에 등록되는 클래스에 Bean 주입 이외 용도의 필드(인스턴스 변수, 클래스 변수)가 있으면 안됩니다. 혹시 들어가야 한다면 final이어야 합니다. final 이더라도 그게 객체라면 불변임이 보장되는게 좋습니다. 물론 POJO로 된 도메인 계층 등 스프링 컨테이너에 안들어가는 애들은 상관없습니다. PO.. 2024. 4. 4.
자바 Integer 캐싱에 대해 (Java IntegerCache, Autoboxing) 간단한 자바 문제를 만들어달라는 요청을 받았다. 장난을 섞어서 이전에 알고리즘 문제를 풀 때 이슈가 있었던 상황을 문제로 만들었다. (이하의 코드 결과는 자바 실행 시의 옵션이나 구현에 따라 달라질 수 있다. 아무런 옵션을 넣지 않고, 이하의 코드만 실행한 경우를 가정한다.) Integer a = 100; Integer b = 100; Integer c = 200; Integer d = 200; System.out.println(a == b); System.out.println(c == d); 어찌보면 당연해보이는 문제지만, 은근 주변에 시켜보면 답이 많이 다르게 나올꺼다. 1. 객체끼리의 주소값 비교이므로 false, false 라는 답변 -> 훌륭하다. 2. 에이 당연히 true, true지 -> 좀.. 2024. 2. 27.