분류 전체보기 359

Spring - Bean은 어디에 저장되나?

스프링 공식 문서를 읽다가 Spring Bean은 어떤 자료구조에 저장되어 있고 어떤 과정으로 찾아서 의존을 주입하는 지가 궁금해졌다. 해당 부분을 찾아가면서 알게된 결과에 대해 다룬다. 아래에서 말하는 Bean은 싱글톤 빈임을 가정한다. 들어가기 전에 Spring의 경우 템플릿 메서드 패턴과 전략 패턴을 충분히 활용해서 수 많은 인터페이스에 책임을 위임하고 있고 구현체도 아주 많다. 그러다보니 자세히 다루면 양이 너무 방대해지는 문제가 있어서 어디까지 다룰 것인가에 대한 고민이 있었다. 너무 Deep한 문제는 다루지 않고 내용을 다루기에 이해가 필요한 부분까지만 다룰 것이니 겁먹지 마시고 봐주시면 좋겠다! getBean() 아래를 보면 ApplicationContext의 refresh()가 수행되면 i..

Server/Spring 2023.10.09

Java - switch 대신 Enum을 검토해보자!

아래 내용은 Effective Java 내용에 기반한다. 상수 대신 Enum 아래 코드를 보자. public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; 이 코드의 영향은 어떤 것이 있을까..? 상수의 값이 바뀌면 반드시 다시 컴파일해야 한다. 추적이 어렵다. (0, 1, 2로 저장되니까) 추적이 어렵다는 이..

Language/Java 2023.10.05

분산 시스템 설계 - 유튜브 설계해보기!

요즘 너무 설계 내용만 포스팅해서 유튜브 설계 내용은 포스팅하지 않겠다고 생각했는데.. 유튜브 설계 내용이 생각외로 되게 재밌어서 또 포스팅하게 됬다! 이번 포스팅은 가상 면접 사례로 배우는 대규모 시스템 설계 기초에 기반한 내용이다. 개략적 설계 유튜브 시스템은 언뜻 보기에는 간단해 보일 수 있지만 실제로는 굉장히 복잡하다. 아래는 유튜브에 대한 통계 자료이다. MAU: 21억 매일 재생되는 비디오 수: 50억 5천만 명의 창작자 모바일 인터넷 트래픽 가운데 37%를 점유 2019년 기준 연간 광고 수입이 150억 달러 80개 언어로 이용 가능 기본적으로 유튜브는 단순히 비디오를 생성하고 보는 것 이외에도 댓글, 공유, 좋아요, 재생목록, 채널, 구독 등과 같은 다양한 기능을 제공한다. 해당 기능들을 ..

DB 인덱스에 대한 오해 (컬럼 1개 vs 2개!)

어느 날 신입 분이 나한테 찾아와서 물었다. '메일 조회를 할 때 권한이 없으면 404가 아니라 401 또는 403이 나와야 하는 것 아닌가요?' (인덱스 얘기한대놓고 무슨 권한 얘기인지..) 나도 쌩신입때 선배분께 동일한 질문을 했었다. 인덱스 오해 아래 코드는 비즈니스에서 Mail을 조회하기 위해 사용되던 코드이다. mailRepository.findByUserIdAndId(userId, id) .orElseThrow(() -> new EntityNotFoundException("Mail", id)); 여기서 내가 생각한 문제는 3가지가 있다. 쿼리에 비즈니스 로직이 들어간다. 가독성이 나빠지고 객체지향적인 설계가 불가능해진다. 프로그래밍 초식의 쿼리에서 로직 빼기 부분을 참고하자. 자신의 소유가 아..

Database/SQL 2023.09.16

잘못된 학습 하지않기! (feat. UncheckedException)

자바에서 CheckedException과 UncheckedException의 차이를 아는가? 구글에 CheckedException의 UncheckedException의 차이에 대해서 검색해봤다. 상위 7~8개 정도의 블로그 모두 동일한 표가 있었다. 여기서 의아한 점이 UncheckedException은 예외가 발생 시 트랜잭션이 롤백된다는 것이다. 나는 이 부분이 잘못된 학습의 폐해라고 말하고 싶다. 트랜잭션 UncheckedException이 발생하면 트랜잭션이 롤백된다고 한다. 트랜잭션은 MessageQueue 트랜잭션도 있고 DB 트랜잭션도 있고 다른 의미의 트랜잭션도 있을 수 있다. 그래서 트랜잭션을 롤백한다는 것은 말이 안된다. 데이터베이스 트랜잭션 만약 데이터베이스 트랜잭션이라고 가정했을 때..

Etc./개발 일기 2023.09.15

SNS 분산 시스템 - 검색어 자동 완성 시스템 설계하기!

구글 검색 또는 아마존 웹 사이트 검색창에 단어를 입력하면 입력 중인 글자에 맞는 검색어가 자동으로 완성된다. 이런 기능은 검색어 자동완성(autocomplete)이라 부른다. 가장 많이 이용된 검색어 k개를 자동완성해서 출력하는 시스템을 설계해보자. 가정 먼저 요구사항을 분명히 해야 한다. 요구사항은 아래와 같다. 사용자가 입력하는 단어는 자동완성될 검색어의 첫 부분으로 한정한다. 자동완성 검색어는 5개가 표시된다. 검색 기준은 인기 순으로 한다. 맞춤법 검사 기능은 제공하지 않는다. 질의는 영어로 하지만 다국어 지원을 고려한다. 대문자나 특수문자는 처리하지 않는다. DAU 기준 천만 명의 사용자를 수용할 수 있어야 한다. 100ms 이내에 질의가 완료되어야 한다. 시스템의 일부에 장애가 발생하거나 예..

Java 21의 주요 패치 내용 살펴보기!

이번 포스팅에서는 Java 21이 2023년 9월(작성일 기준 이번달)에 출시한다. 개인적으로 Java 21의 패치 내용이 되게 인상깊은데 Java 21 버전의 변경사항에 대해 알아보자. SequencedCollection 기존에 List에서 첫 번째 요소와 마지막 요소를 구할 때는 아래와 같이 코드를 작성했다. String first = list.get(0); // 첫 번째 요소 String last = list.get(list.size() - 1) // 마지막 요소 이런 부분들 구현을 외부에 노출하므로 가독성이 많이 떨어진다. Java 21부터는 SequencedCollection이라는 인터페이스를 제공한다. public interface SequencedCollection extends Collec..

Language/Java 2023.09.10

AOP, Proxy 이해하기! (BeanNotOfRequiredTypeException이 왜 발생할까?)

문제 상황 실무에서 QueryDsl을 사용한 Repository의 테스트 코드에서 에러가 터졌다. 문제를 이해하고 해결한 과정이 인상깊어서 소개하고자 한다. 아래 프로젝트는 소개를 위해 만든 프로젝트의 패키지 구조이다. 우리가 익히 아는 JPA + QueryDsl을 사용할 때 사용하는 패키지 구조이다. QueryDsl을 사용하는 Repository는 아래와 같다. @Repository @RequiredArgsConstructor @Transactional(readOnly = true) public class MemberRepositoryImpl implements MemberRepositoryCustom { private final JPAQueryFactory queryFactory; @Override ..

Server/Spring 2023.09.10

SNS 분산 시스템 - 채팅 시스템 설계하기!

SNS 분산 아키텍처에서 사용할 채팅 시스템을 설계해보자. 아래는 현재 시장에서 널리 쓰이는 채팅 시스템의 나열이다. Whatsapp Facebook messenger Wechat Line Google Hangout Discord 여기서 Whatsapp, Wechat, Facebook Messenger는 1:1 채팅에 집중하고, Slack, Discord 등은 그룹 채팅과 낮은 Latency의 음성 채팅에 집중한다. 이렇게 채팅 시스템도 제각각 요구사항이 다르다. 요구사항을 확실히 해야 한다. 가정 이번에 설계할 시스템에서는 이해 관계자와의 합의 속에 아래의 가정을 했다고 하자. 1:1 채팅, 그룹 채팅을 모두 지원한다. 모바일 앱, 웹 앱을 모두 지원한다. DAU 기준 5천만 명을 처리할 수 있어야 한..

SNS 분산 시스템 - 알림 시스템 설계하기!

알림 시스템 설계 이번에는 SNS 아키텍처에서 사용할 알림 시스템을 설계해보자. 하루에 백만 건 이상의 알림을 처리하는 시스템을 구축하는 게 쉬운 과제는 아니다. 먼저 아래의 가정이 필요할 수 있다. 알림의 종류 (푸시 알림 / SMS / 이메일) 실시간 처리가 필요한 지 어떤 단말을 지원할 지 하루에 몇 건의 알림을 처리해야 하는 지 가정 이번 설계에서는 아래 요구사항을 가정한다. 푸시 알림, SMS 메시지, 이메일을 모두 지원한다. 연성 실시간(Soft Real-Time)을 보장한다. 알림은 가능한 빨리 전달한다. 시스템의 부하가 크다면 약간의 지연은 무방하다. 알림을 받지 않도록 설정할 수 있다. 하루에 1천만 건의 푸시 알림, 1백만 건의 SMS 메시지, 5백만 건의 이메일을 보낼 수 있어야 한다..