전체 글 400

대규모 시스템 설계 공부 004

study004 tags: Tag(가상 면접 사례로 배우는 대규모 시스템 설계 기초) 처리율 제한 장치의 설계 처리율 제한 장치 네트워크에서 처리율 제한 장치란 클라이언트 또는 서비스가 보내는 트래픽의 처리율을 제어하기 위한 장치이다. HTTP를 예로 들면 이 장치는 특정 기간 내에 전송되는 클라리언트의 요청 횟수를 제한한다. API요청 횟수가 제한 장치에 정의된 임계치(threshold)를 넘어서면 추가로 도달한 모든 호출은 처리가 중단된다. 예를 들면 사용자는 초당 2회 이상 새 글을 올릴 수 없다. 같은 IP주소로는 하루에 10개 이상의 계정을 생성할 수 없다. 같은 디바이스로는 주당 5회 이상 리워드를 요청할 수 없다. 이런 처리율 제한 장치를 설계하는 방법에 관해 알아본다.. 그리고 그 전에 이..

대규모 시스템 설계 공부 003

시스템 설계 면접 공략법 일단 시스템 설계 면접은 면접에서 실제 서버에서 쓰이는 만큼 복잡하고 어려운 설계를 요구하지 않는다. 설계 기술을 시연하고, 그 과정에서 결정들에 대한 방어 능력을 보이고, 면접관의 피드백을 건설적인 방법으로 처리할 자질이 있음을 보이는 자리이다. 따라서 해당 시스템 설계 면접에서 면접관이 찾고자 하는 것은 기술적 측면의 평가 지원자가 협력에 적합한 사람인지 평가 압박이 심한 상황도 잘 헤쳐나갈 자질이 있는지, 모호한 문제를 건설적으로 해결할 능력이 있는지 평가 좋은 질문을 던질 능력이 있는지 평가 이라고 한다. 또 한가지 중요한 것은 설계의 순수성(purity)에 집착한 나머지 타협적 결정(tradeoff)를 도외시하고 과도한 엔지니어링(over-engineering)을 하게 ..

Soft Delete와 Hard Delete의 차이와 @SQLDelete

DB의 삭제 구현 방법은 두가지가 있다. Soft Delete 데이터를 실제로 삭제하지 않고, 삭제 flag를 변경하는 방법이다. Hard Delete 실제로 데이터를 삭제하는 방법이다. 실제로 서비스를 구현할 때에는 Soft Delete를 자주 사용한다. 하지만 Spring Data JPA에서 이 Soft Delete를 구현할 때에는 주의해야 할 점이 다수 있다. 만약에 한꺼번에 많은 데이터를 삭제하는 경우가 생긴다면 어떨까?? 이러한 Bulk연산에서 Soft Delete를 사용할 때에 여러 번의 쿼링이 진행되게 될 것이다. 이를 해결하기 위해서 @SQLDelete어노테이션과 JPA에서 제공하는 deleteAllInBatch를 사용할 수 있다. @SQLDelete JPA에서 기본으로 삭제는 Hard D..

대규모 시스템 설계 공부 002

시스템 용량이나 성능 요구사항을 개략적으로 추정하는 방법 이 개략적 규모 추정을 효과적으로 해내려면 규모 확장성을 표현하는 데 필요한 기본기에 능숙해야 한다. 2의 제곱수 데이터 양의 계산 결과를 얻으려면 볼륨의 단위를 2의 제곱수로 어떻게 표현하는지를 우선 알아야 한다. 이게 데이터 볼륨 단위들이다. 응답지연 값 2010년 공개된 통상적인 컴퓨터에서 연산들의 응답지연 값이다. 이 내용들을 분석하면 이런 결론이 나온다. 메모리는 빠르고, 디스크는 느리다. 디스크 탐색은 가능한 한 피할것. 단순한 압축 알고리즘은 빠르다. 인터넷으로 데이터를 보내기 전에 가능하면 압축하라. 데이터 센터는 보통 여러 지역에 분산되어 있고, 센터들 간에 데이터를 주고받는 데에는 시간이 걸린다. 가용성 관련 수치들 고가용성(hi..

대규모 시스템 설계 공부 001

사용자 수에 따른 시스템의 확장성에 관하여 알아본다. 단일 서버 모든 웹, 앱, DB, 캐시 등이 한개의 서버에서 실행되는 사례이다. 사용자가 도메인 이름을 통해 웹사이트 접속. 이 때 도메인 이름을 도메인 이름 서비스(DNS)에 질의하여 IP로 변환하는데, 이 DNS는 외부 서비스를 사용하게 되므로 해당 서비스의 일부는 아님. DNS조회를 통한 IP주소 반환 해당 주소로 HTTP요청 전달 요청 결과 반환 해당 사진에서 웹 브라우저 / 모바일 앱 의 두 종류 단말로부터 요청이 들어온다. 웹 브라우저 BE(자바, 파이썬 등) 과 FE(HTML, JS) 사용 모바일 앱 모바일 앱과 웹 서버간 통신을 위해서는 HTTP프로토콜 이용 반환 응답은 주로 JSON이 사용된다. DB 트래픽 처리 서버(웹계층)과 DB서..

OSIV와 성능 최적화

Open Session In View : 하이버네이트 Open EntityManager In View : JPA (관례상 OSIV라 한다.) OSIV ON Spring boot 어플리케이션을 처음 실행하면 다음과 같은 warn문구가 출력된다. 2022-03-15 11:23:35.504 WARN 11052 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to ..

[백준 14940번] 쉬운 최단거리 - java

문제 설명 1. 지도의 N과 M이 주어진다. 2. 가로세로(상하좌우)로 이동할 수 있고, 0은 못가는땅 1은 갈수있는땅 2는 목표지점이다. 3. 2에서 시작해서 도달 가능거리를 구한다. 4. 갈수있으면 도달까지 거리, 원래 갈수없으면 0, 원래 갈 수 있는데 못가면 -1을 출력한다. 풀이 과정 1. BFS로 풀어나간다. 2. 그냥 거리를 구하는것은 사실 간단하다. 기본적인 BFS를 사용해주면 된다. 3. 문제 설명의 4번과정에 관해서 조금 생각을 해주어야 한다. 그리고 내 풀이보다 분명히 더 효율적인 방법이 있겠지만, 이렇게 해도 시간복잡도에 크게 문제될 것은 없어서 진행해 주었다.(코테의 시간복잡도에서는 안걸릴 방법이기 때문) 4. 이를 생각하고 풀이과정을 도출해보자 A. 목표지점 2는 딱 한번 주어진..

알고리즘 공부 2022.04.19

[백준 12934번] 턴 게임 - java

문제 설명 1. 숫자 x와 y가 주어진다. 2. 턴은 1부터 시작하고, n번째 턴의 승리자는 n점을 얻는다. 3. x와 y에 대해 각각의 점수를 얻는것이 불가능하면 -1출력 4. 가능하면, x점수를 얻는 최소한의 승리횟수를 구하면 된다. 풀이 과정 1. 1, 2, 3, 4, 5, 6, ..... 의 점수를 얻는 방법은 (N*(N+1))/2 이다. 이것만 알면 간단하다. 2. 사실상 수학적 구현 문제이다. 3. 참고로 이거 숫자가 long형식이니까 주의하자. 4. 이를 생각하고 풀이과정을 도출해보자 A. x와 y의 합계점수에 대해, 여기 정확히 도달할 수 있어야 한다. 해당 숫자보다 작으면 그보다 큰 숫자로 (N*(N+1))/2을 시도하고, 만약 이게 x+y보다 크면 불가능할것이다. B. (N*(N+1))..

알고리즘 공부 2022.04.19

Intellij 꿀팁

프론트엔드 바로 적용 implementation 'org.springframework.boot:spring-boot-devtools' Test바로 만들기 ctrl + shift = T junit4 써서 하는게 나을듯 Test에서 사용할 TDD미리 정의하기 파일 -> 설정 -> 에디터 -> 라이브템플릿 아래 코드 적용후 변경 클릭 -> 적용할 위치 설정하기 @Test public void $NAME$() throws Exception { //given $END$ //when //then } -> given이 주어졌을 때 -> when을 하면 -> then이 된다!! extract에서 바로 변수 뽑아오기 -> 결과 적으면 알아서 변수 만들어주기 ctrl + alt + v 쿼리 확인하기 팁 logging.le..

기타 2022.04.17

보일러플레이트란 무엇일까?

보일러 플레이트란? 먼저 보일러 플레이트는 신문사업에서 나온 말인데, 본래 텍스트 인쇄판은 납같은 부드러운 것으로 찍었는데, 광고나 칼럼 등 한번 만들어놓고 계속해서 사용되는 내용에 관한 판은 계속해서 사용할 수 있도록 강철로 찍어서 출시했다. 그것을 Boilerplate라고 불렀고, 이는 한번 만들어두고 여러번 사용할 수 있도록 한 것이다. 우리는 한국인이니까 대충 금속활자같은걸 생각하면 될것같다. ㄱㄴㄷㄹㅁㅂㅅ 이런 자주 쓰이는것을 금속으로 만들어두면 계속 쓸수있는 느낌이다. 개발에서의 보일러 플레이트는? 예전에는 개발을 할 때에 Getter이나 Setter을 모든 변수에 대해 하나하나 세팅을 해주었다. 이런식으로 세팅하는것은 굉장히 귀찮고 솔직히 도움도 되지 않았다. 그리고 @Getter, @Set..