전체 글
-
[알고리즘] LCS(최장 공통 부분수열) 실전 활용기알고리즘 2025. 2. 17. 00:01
회사 프로젝트에서 텍스트 A에서 텍스트 B로 바뀌었을 때 추가된 부분과 삭제된 부분을 추출해야 했습니다.바로 든 생각은 두 문자열을 순회하면서 비교하면 안 될까였는데 이 방식은 문제가 있었습니다.LCS 알고리즘이 뭔지부터 이 알고리즘을 이용하여 어떻게 추가된 부분과 삭제된 부분을 추출했는지 알아보겠습니다.문자열 순회 비교의 문제점앞에서부터 다른 부분의 인덱스와 뒤에서부터 다른 부분의 인덱스를 찾아서 문자열을 잘라내는 방식인 경우입니다.public class StringDiffFinder { public static String findDifference(String before, String after) { int minLen = Math.min(before.length(), after..
-
JPA N+1 문제와 해결 방법디버그 2025. 1. 30. 23:54
※주의 - 틀린 정보가 있을 수 있습니다.문제 상황회사에서 책이나 예제 코드에서만 보던 N + 1 문제를 겪었습니다.관련 모든 엔티티가 조회 시 필요하였기에 하나의 엔티티에 일대다 연관 관계가 여러 개 존재하고 FetchType.EAGER로 설정되어 있었습니다.N + 1 문제란?JPA(Java Persistence API)를 사용할 때 연관 관계가 있는 엔티티를 조회하면, 예상보다 더 많은 쿼리(N + 1개)가 실행되는 문제가 발생할 수 있습니다.그래서 연관된 모든 엔티티가 조회되었고 새롭게 추가된 연관 관계 필드에 대한 조회와 개선이 필요했습니다.시도한 방법엔티티에 엔티티 그래프를 선언하고 JPA 레포지토리의 특정 쿼리에서 엔티티 그래프를 설정하여 모든 관련된 엔티티 조회해 오도록 수정default_b..
-
쿼리 개선일지 - 조인 순서 문제SQL 2024. 9. 8. 11:26
문제 상황캡슐을 페이징해서 가져오는 엔드포인트에서 쿼리가 실행되고 결과 값을 받는데 오래 걸리는 부분을 발견했습니다. 문제 분석SELECT c.capsule_id, cs.image_url AS capsule_skin_image_url, c.due_date, g.group_id AS group_id, g.group_name, g.group_profile_url, m.nickname, m.profile_url, c.created_at, c.point, c.full_road_address_name, c.road_name, c.title, c.content, GROUP_CONCAT(DISTINCT i.image_url) AS ima..
-
일상 - 멘토링을 받으며일상 2024. 8. 18. 19:23
인프런에서 취업 준비와 면접 관련된 멘토링을 받았다.배운점1. 취업 준비는 멘탈 싸움2. 서두르면 안됨3. 많은 면접 꿀팁과 준비 방법4. 멘토님의 화법과 인성하지만 멘토님의 화법과 인성에서 더 배울 점이 있다고 느꼈다.같이 일해보고 싶고 배워보고 싶달까...나긋나긋고 존중하는 말투로 팩트를 전달해주시니 팩트폭격을 당해도 기분이 나쁘지 않다.이력서에서 기술적인 부분은 좀 더 추가해줬으면 한다여기서 끝나지 않는다항상 논리적인 근거가 포함된 왜 그렇게 해야 하는지가 붙어있다.개발자를 뽑으니까 이력서에 기술적인 부분을 강조해야 한다.또, 면접관이 물어볼 질문을 내가 좁힐 수 있다.당연하다고 생각할 수 있지만 내 일상에서는 왜는 많이 고려되지 않았다.1. 왜 나는 이 회사를 가고 싶어하지?2. 왜 나는 이 기술..
-
디버그 일지 - QueryDSL에서 빈 컬렉션에 대한 IN 쿼리디버그 2024. 8. 8. 17:29
※주의 - 틀린 정보가 있을 수 있습니다.문제 상황QueryDSL 사용 시 빈 컬렉션에 대해서 IN 쿼리를 작성하면 SELECT 목록의 표현식이 GROUP BY 절에 없고 GROUP BY 칼럼에 함수적으로 종속하지 않고 집계되지 않는 칼럼이 있다고 오류가 발생했습니다. 또, WHERE IN() 쿼리가 WHERE 1=2 이런 조건으로 변경되어서 쿼리가 실행됐습니다.시도한 방법QueryDSL로부터 생성된 쿼리 확인QueryDSL 쿼리 생성 방식 디버깅MySQL에서 실행 플랜 확인해결 과정원인 파악1. QueryDSL로부터 생성된 쿼리 확인WHERE 1=2를 추가한 적이 없는데 IN쿼리가 자꾸 아래와 같이 나왔습니다.select c1_0.`capsule_id`, c2_0.`image_url`, ..
-
자바 - 자바 스레드는 사용자 수준 스레드? 커널 수준 스레드?JAVA 2024. 7. 20. 16:32
※주의 - 틀린 정보가 있을 수 있습니다. 사용자 수준 스레드와 커널 수준 스레드의 차이에 관해서 공부하는데 그렇다면 도대체 이들의 차이가 무엇인지 궁금했습니다.또, 그렇다면 자바의 스레드는 사용자 수준 스레드인지 커널 수준 스레드인지 알아보고 싶었습니다.사용자 수준 스레드 vs 커널 수준 스레드 특징장점단점사용자 수준 스레드사용자 애플리케이션에서 생성, 관리되는 스레드OS 수준에서 컨텍스트 스위칭, 모드 전환이 없다매핑된 커널 수준 스레드가 블락되면 모든 사용자 스레드가 블락됨.커널 수준 스레드OS의 커널에서 생성, 관리되는 스레드다중 코어의 이점을 활용할 수 있다, 안정적이다컨텍스트 스위칭으로 인한 부하 증가자바의 스레드는?아래 두 개의 StackOverflow 답변과 Claude의 답변을 참조했습니..
-
자바 - Primitive vs WrapperJAVA 2024. 7. 17. 12:12
※주의 - 틀린 정보가 있을 수 있습니다. 자바의 기본형과 그 기본형을 감싼 래퍼를 비교해보려고 합니다.Primitive특징 크기(byte)기본값byte10short20int40long80Lfloat40.0fdouble80.0dboolean1falsechar2'\u0000’ 기본값은 타입에 따라 다름리터럴이라고 불림(메모리에 값으로 고정되기 때문)사용전에 정의되어야 함래퍼 타입의 객체를 원시 타입에 할당하면 자동 언박싱됨장점래퍼 타입보다 빠르게 접근할 수 있음래퍼 타입에 비해 메모리를 차지하는 크기가 작음많은 연산이 필요한 경우 래퍼 타입보다 메모리 효율적임래퍼 타입보다 빠름null을 허용하지 않음단점컬렉션에 사용할 수 없음타입에 대한 중복된 동작을 메서드화 할 수 없음값이 없음인 null을 나타낼 수 ..
-
프로젝트 뒤돌아보기 8 - 이름 규칙의 중요성프로젝트 - ARchive 2024. 6. 9. 17:27
※주의 - 프로젝트를 하고 나서 느낀 개인적인 의견이 담긴 글이니 정확한 정보가 아닐 수도 있습니다. 이번에는 더 자세하고 명확한 이름 규칙에 관해서 얘기해보려 합니다.프로젝트를 진행하니 클래스명, 변수명, 메서드명 등 다양한 이름들이 불규칙적으로 변했습니다. 그래서 어떤 부분들을 놓쳤고 앞으로는 어떻게 하면 좋을지 얘기해보려 합니다.이름 규칙을 정하자클래스솔직히 설계 시 고려해야 할 부분이 많을 줄 몰랐습니다.겪어보면서 배우면 된다는 생각으로 프로젝트를 하루 빨리 구현하려고 키보드부터 타자부터 친 저 자신을 반성합니다...사이드 프로젝트이기에 문제를 직접 느껴보고 수정하는 방향도 나름 좋더군요. (수정을 많이 한 것 같습니다)아무튼 문제는 바로 너무 역할이 명확한 객체(컨트롤러, 서비스, 레포지토리 ..