목록전체 글 (272)
DHistory
QuestionSpring @Transactional이 같은 클래스 내 메서드 호출 시 트랜잭션이 적용되지 않는 이유는 무엇인가요?이를 해결하는 방법과 각 방법의 트레이드 오프는 무엇인가요? Answer 1) @Transactional 동작 과정> @Transactional은 Spring AOP 프록시 기반으로 동작> @Transactional은 Proxy 객체 메서드 진입 시 시작> 같은 클래스 내 this.method()는 Proxy 객체가 아닌 원본 객체를 직접 호출> this.method() 에 선언된 @Transactional 동작 무시> 코드 작성 의도와 런타임 시 코드 수행 동작 차이 발생 class PaymentService { @Transactional public void ..
서론당시 회사의 업무 구조에서는 오퍼레이션팀이 엔지니어팀에 직접 기능 개발을 요청하거나 PM의 요청이 별도의 기획 리뷰 없이 바로 개발로 이어지는 경우가 많았습니다. 이로 인해 어떤 기능이 왜 만들어지는지에 대한 맥락이 공유되지 않았고 제품의 정책이나 방향성과 어긋나는 요구사항도 그대로 제품에 반영되는 문제가 반복되었습니다. 결과적으로 상반된 정책을 가진 기능들이 누적되며 제품의 정체성과 완성도는 점차 훼손되고 있었습니다.문제는 개인의 판단이 아니라 업무를 결정하고 검증하는 프로세스 자체에 있었습니다. 이러한 한계를 해결하기 위해 회사는 스쿼드 기반 조직으로 전환하며 PM / Product Lead Engineer(이하 PLE) 구조를 도입했고 저는 제품의 방향성과 기술적 실행을 함께 책임지는 PLE 역..
OverviewGarbage Collector는 사용하지 않는 자원의 메모리를 해제하여 프로그램 메모리를 확보합니다.GC(Garbage Collection)를 하게 되면 GC 관련 Thread을 제외한 모든 Thread를 멈춥니다.이를 Stop The World(STW) 라고 합니다. GC의 동작 과정Mark & Sweep Algorithm을 사용하여 어느 곳에서도 참조하고 있지 않는 객체를 GC 대상으로 선정하여 제거합니다. Mark: Root Space(Stack, Method Aread, Native Method Stack)에서 참조하는 객체를 마킹합니다.Sweep: 마킹되지 않은 객체를 Heap에서 제거합니다.Compact: 분산된 객체를 Heap의 시작 주소로 모아 메모리가 할당된 부분과 할당되..
개요대용량 데이터 검색을 진행함에 있어 ElasticSearch, MySQL FullText, MySQL Like의 성능을 비교를 했습니다.검색을 진행한 조건은 다음과 같습니다. 1. "abc" 로 시작하는 단어가 포함된 경우 → "def abcd gcf"2. "abc" 문자가 포함된 경우 → "def dabc gcf" Performance 비교는 hey를 활용하였습니다. Table Schema현재 데이터 건수는 275,684건이며 title에 index / fulltext 가 정의되어있습니다.Create Table: CREATE TABLE `post` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '(AI) ID', `title` varchar(100) COL..
개요SNS NewsFeed 조회 시 팔로잉 유저들의 최신 게시글을 조회해야합니다.팔로잉한 유저의 수가 1800명이고 각 유저들이 1000개씩 글을 작성했다고 가정합니다.게시글의 전체 데이터 개수는 1,800,000 건입니다. 팔로잉한 유저들의 게시글 중 최근 100개의 게시글을 조회를 진행해보겠습니다. 일반 쿼리 조회 구현 시 피드 목록 조회 시 비용이 비싼 쿼리를 조회해야합니다.(Post의 Dummy Data를 대규모 데이터로 넣기 위해선 시간이 오래 걸리므로 비싼 쿼리로 만들어 진행)@Service@RequiredArgsConstructorpublic class FeedService { private final PostRepository postRepository; private fina..