전체 글(206)
-
99클럽 코테 스터디 2일차 TIL: [백준] 2179. 비슷한 단어
https://www.acmicpc.net/problem/2179 반복문을 통해 단순히 구현하면 되는 문제이다. 단순한 문제 같지만 헤맸다. substring()을 통해 두 문자열을 비교하면 메모리 초과가 난다. 따라서 charAt으로 각 자리를 비교하면 된다. 그리고 비교 결과 다르면 반복문을 빠져나오면 된다.접두사 길이가 가장 긴 두 개 이상의 문자열을 set이나 list에 저장하려고 했으나, 굳이 할 필요 없다. 어차피 문자열들 중 가장 먼저 입력된 문자열 2개를 출력해야 하는데, sameCount와 sameCountMax가 같은 경우에 값을 갱신하지 않고 sameCount > sameCountMax인 경우에만 값을 갱신하면 자연스럽게 가장 먼저 입력된 문자열 2개만 출력할 수 있다.import j..
2024.05.21 -
반정규화를 통한 성능 향상
개요이 글은 프로젝트에서 진행했던 게시글 페이징 조회시 성능 향상 과정에 대한 글이다.문제 상황게시글 페이징 조회 시 게시글 데이터 뿐만 아니라 게시글의 좋아요, 댓글, 북마크 수까지 함께 반환해야 한다. 따라서 게시글과 연관된 좋아요, 댓글, 북마크 엔티티까지 함께 조회하면서 N+1 문제가 발생했다. 10만 건의 데이터 중 좋아요 수가 많은 100 건을 페이징 조회하는 테스트를 진행했다. 테스트 결과는 다음과 같다.6.7 TPSN+1 문제 발생좋아요 순 조회 시 게시글 테이블을 풀스캔해결 과정1. 페치 조인가장 대표적인 N+1 문제 해결 방안으로 페치 조인이 있다. 그러나 컬렉션 페치 조인은 주의할 점이 있다. 바로 페이징 처리가 offset, limit 등의 키워드를 통해 DB에서 이뤄지지 않고, 모..
2024.05.21 -
MySQL에서 의도치 않게 조회시 레코드에 S락을 거는 문제
지난 번 프로젝트에서도 그렇고 이번 프로젝트에서도 동시성을 테스트하는 상황에서 데드락이 발생했다. 데드락 발생 원인을 알고자 InnoDB 로그를 살펴보니, 의도치 않게 조회시 레코드에 S락을 걸면서 데드락이 발생한 것이었다. 이에 대해 더 자세히 알아보자.MySQL이 락을 거는 방식결론부터 말하자면 MySQL은 외래키 제약이 테이블에 정의되어 있으면 레코드 삽입, 수정, 삭제시에 해당 참조 레코드에 S락을 건다. 공식 문서에서는 다음과 같이 말한다.If a FOREIGN KEY constraint is defined on a table, any insert, update, or delete that requires the constraint condition to be checked sets shared..
2024.05.21 -
99클럽 코테 스터디 1일차 TIL: [프로그래머스] 베스트앨범
https://school.programmers.co.kr/learn/courses/30/lessons/42579 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr정렬 조건에 주의해야 하며, 그 외로는 해시를 사용하여 단순히 구현만 하면 되는 문제이다. 그런데 이렇게도 생각하고 저렇게도 생각해야 해서 간단한듯 좀 지저분하게 코드를 짠 거 같다.. 좀 더 효율적으로 풀 수 있는 방법이 생각나면 수정해야겠다. 그리고 항상 동적으로 배열 길이가 정해질 때, List에 값을 먼저 채운 후 list.size() 만큼의 크기의 배열을 선언하여 리스트 값을 배열로 옮기는 작..
2024.05.20 -
멀티 스레드 환경에서 @Transactional을 사용할 때 주의할 점
이 글에서 소개하는 내용은 동시성 환경을 테스트하기 위한 테스트 코드를 작성하던 중에 만난 문제이다. 문제우선 다음과 같이 동시성 환경을 테스트하기 위한 테스트 코드를 작성했다. 게시글인 post 엔티티를 save() 한 후10개의 스레드에서 해당 엔티티를 조회해와서 좋아요를 등록한다.@Transactional@SpringBootTestclass PostServiceTest { @Autowired private PostService postService; @Autowired private PostRepository postRepository; @Test @DisplayName("좋아요 등록 성공-한 사람이 동시에 여러번 좋아요를 눌러도 중복 저장되지 않아야 한다.") void ..
2024.05.20 -
테스트 코드에서 @Transactional이 적용되지 않는 문제
상황 설명ScheduleService에 대한 테스트 코드를 작성하던 중에 다음 에러가 발생했다. Exception in thread "pool-5-thread-6" org.springframework.dao.InvalidDataAccessApiUsageException: Query requires transaction be in progress, but no transaction is known to be in progressCaused by: jakarta.persistence.TransactionRequiredException: Query requires transaction be in progress, but no transaction is known to be in progress찾아보니 트랜잭션..
2024.05.14