-
[대규모 시스템 설계 기초] ch1. 사용자 수에 따른 규모 확장성
본문은 '가상 면접 사례로 배우는 대규모 시스템 설계 기초’를 읽고 정리한 내용을 기반으로 작성된 글입니다. [단일 서버] ☑️ 단일 서버 구성에서의 사용자 요청 처리 흐름 사용자는 도메인 이름(api.site.com)을 통해 웹사이트에 접속함 이 접속을 위해서는 도메인 이름을 DNS(Domain Name Service)에 질의하여 IP주로 변환하는 과정 필요 DNS는 보통 제 3사업자(third party) ↔ 우리 시스템의 일부는 아님 DNS 조회 결과로 IP주소 반환 (15.123 …) 해당 IP주소로 HTTP(HyperText Transfer Protocol) 요청이 전달됨 요청을 받은 웹 서버는 HTML페이지나 JSON형태의 응답 반환 [데이터베이스] 사용자가 늘면 서버 하나로는 충분하지 않아서..
-
[Spring/fairer] 반복 기능 api 개발 - 조회
반복 기능 구현 방법을 설계하고, 나는 조회 api를 담당했다. 반복기능 구현 전 집안일 api 에서도 조회를 담당했는데, 굉장히 비효율적으로 구현했던 전적이 있어서 이번에는 개선해 보고자 도전했는데 … fromDate ~ toDate에 속한 집안일을 조회하려면 반복 종류에 따라서 ONCE (반복x) scheduled_date가 조회 범위 안에 속하는지 확인 DAILY (매일 반복) scheduled_date ~ end_date가 조회 범위와 겹치는 구간이 있는지 확인 repeat_exception 테이블에 조회할 날짜가 등록되어 있는지 확인 WEEKLY (요일 반복) scheduled_date ~ end_date가 조회 범위와 겹치는 구간이 있는지 확인 (repeat_pattern에 저장된 요일 == ..
-
[Spring/fairer] 반복 기능 api 설계
반복 기능은 fairer를 개발하며 가장 신경써야할 부분이 많았던 기능이다. 일/주/월 단위로 반복되는 집안일을 관리해야하고, 수정&삭제를 할 때에도 반복 일정 모두 삭제/오늘 일정만 삭제/ 앞으로 예정된 집안일만 삭제 등 선택지가 많았다. 반복기능을 어떻게 개발할 것인지 설계하는 데에만 몇 주를 사용했던 것으로 기억한다. 4명의 의견이 모두 달랐어서 신기했고, 배울점도 많았던 기능이다. 의견1 새로운 테이블을 추가하지 않고, 기존 housework 테이블에 주기 칼럼만 추가 생성 : 기존 집안일 생성과 동일, 주기 칼럼에 주기만 추가하여 생성 조회 : 해당 날짜에 포함되는 집안일(반복x) 조회 반복되는 집안일 중 반복 요일이 같고, 시작 날짜~종료 날짜 안에 해당 날짜가 포함된 집안일 조회 수정 : 집..
-
어떻게 알고리즘 문제 하나에 코드가 151줄?
https://school.programmers.co.kr/learn/courses/30/lessons/84021 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 프로그래머스 Lv3. 퍼즐 조각 채우기작년에 풀다말았던 문제를 다시 풀어보았다.왜 풀다 말았는지 알 것 같다.요약하자면 table에 놓인 조각들을 game_board에 딱 맞게 최대한 많이 테트리스하면 되는 문제이다.하지만 테트리스는 조각을 돌려가며 끼울 수 있다는 점~ 어떻게 풀지?불규칙한 조각들을 하나씩 돌리는 것 보단 고정된 game_board를 돌리는게 나아보인다.퍼즐조각을 끼웠을 때, 인접한 칸이 비어있으면 안되므로 특정 조각이 들어갈..
-
[대규모 시스템 설계 기초] ch1. 사용자 수에 따른 규모 확장성
본문은 '가상 면접 사례로 배우는 대규모 시스템 설계 기초’를 읽고 정리한 내용을 기반으로 작성된 글입니다. [단일 서버] ☑️ 단일 서버 구성에서의 사용자 요청 처리 흐름 사용자는 도메인 이름(api.site.com)을 통해 웹사이트에 접속함 이 접속을 위해서는 도메인 이름을 DNS(Domain Name Service)에 질의하여 IP주로 변환하는 과정 필요 DNS는 보통 제 3사업자(third party) ↔ 우리 시스템의 일부는 아님 DNS 조회 결과로 IP주소 반환 (15.123 …) 해당 IP주소로 HTTP(HyperText Transfer Protocol) 요청이 전달됨 요청을 받은 웹 서버는 HTML페이지나 JSON형태의 응답 반환 [데이터베이스] 사용자가 늘면 서버 하나로는 충분하지 않아서..
-
[Spring/fairer] 반복 기능 api 개발 - 조회
반복 기능 구현 방법을 설계하고, 나는 조회 api를 담당했다. 반복기능 구현 전 집안일 api 에서도 조회를 담당했는데, 굉장히 비효율적으로 구현했던 전적이 있어서 이번에는 개선해 보고자 도전했는데 … fromDate ~ toDate에 속한 집안일을 조회하려면 반복 종류에 따라서 ONCE (반복x) scheduled_date가 조회 범위 안에 속하는지 확인 DAILY (매일 반복) scheduled_date ~ end_date가 조회 범위와 겹치는 구간이 있는지 확인 repeat_exception 테이블에 조회할 날짜가 등록되어 있는지 확인 WEEKLY (요일 반복) scheduled_date ~ end_date가 조회 범위와 겹치는 구간이 있는지 확인 (repeat_pattern에 저장된 요일 == ..
-
[Spring/fairer] 반복 기능 api 설계
반복 기능은 fairer를 개발하며 가장 신경써야할 부분이 많았던 기능이다. 일/주/월 단위로 반복되는 집안일을 관리해야하고, 수정&삭제를 할 때에도 반복 일정 모두 삭제/오늘 일정만 삭제/ 앞으로 예정된 집안일만 삭제 등 선택지가 많았다. 반복기능을 어떻게 개발할 것인지 설계하는 데에만 몇 주를 사용했던 것으로 기억한다. 4명의 의견이 모두 달랐어서 신기했고, 배울점도 많았던 기능이다. 의견1 새로운 테이블을 추가하지 않고, 기존 housework 테이블에 주기 칼럼만 추가 생성 : 기존 집안일 생성과 동일, 주기 칼럼에 주기만 추가하여 생성 조회 : 해당 날짜에 포함되는 집안일(반복x) 조회 반복되는 집안일 중 반복 요일이 같고, 시작 날짜~종료 날짜 안에 해당 날짜가 포함된 집안일 조회 수정 : 집..
-
[TIL/adone] 2022-08-25~26 dto 디렉토리 구조 변경, @Embeddable
1. dto 디렉토리 대규모 수정 서비스에 estimate(견적)에 관련된 기능이 가장 많은데, dto 구조가 필요 이상으로 복잡하고 가독성이 떨어진다 생각이 들었다. 합칠 수 있는 dto는 합치고, request/response 위주로 분리했다. 매우 헷갈리고.. 오래 걸렸지만 훨씬 깔끔해진 것 같아 뿌듯하다. 2. 유저가 디자인한 간판 생성 api 😇 save the transient instance before flushing : FK 로 사용되는 컬럼값이 없는 상태에서 데이터를 넣으려하면 발생하는 에러이다. → 나는 진짜로 데이터가 없어서 발생했는데, 연관 관계 매핑해줄 때 사용하는 @ManyToOne, @OneToOne, @OneToMany 어노테이션에 cascade옵션을 변경하면 해결 할 수 ..
-
[TIL/adone] 2022-08-23~24 API 설계, @Builder.Default, Swagger 설정
1. 보안그룹 설정, RDS 연결, 탄력적 IP 할당 RDS 보안그룹의 인바운드 규칙을 추가하여, RDS를 생성한 IP주소 외에서도 접근 가능하도록 바꿔주었다. 3306 포트의 IPv4, IPv6 규칙을 추가해주어야 한다. 탄력적 IP도 할당해주었다. 2. 기능명세 + 코드 파악 하나의 화면에서 여러개의 API를 호출하는데, 각각 다른 controller에서 호출하는 것 보다는 하나의 controller로 묶는 것이 좋아보인다. member_role은 하나의 칼럼으로 처리하는 것이 편할 것 같다. 도메인 디렉토리가 estimate → requestEstimate → SignboardInfo로 구성되어 있는데, 간판 객체는 그냥 별도의 디렉토리로 분리하는게 나을 것 같다. service 로직에서 다른 도메..
-
[Spring/Data JPA] 인터페이스 기능
😊 순수 JPA 기반 레포지토리 만들기 ▪ 순수 jpa 기반 레포지토리 @Repository public class MemberJpaRepository { @PersistenceContext private EntityManager em; public Member save(Member member) { em.persist(member); return member; } public void delete(Member member) { em.remove(member); } public List findAll() { return em.createQuery("select m from Member m", Member.class) .getResultList(); } public Optional findById(Long..
-
[Java] 백준 #1463 1로 만들기
https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 정수 X에 사용할 수 있는 연산 세 가지를 적절히 사용해서 정수 N을 1로 만든다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 연산 사용 횟수의 최솟값 구하기 💡 알고리즘 다이나믹 프로그래밍 💡 접근 RGB거리처럼 모든 케이스의 계산횟수가 동일한 문제가 아니므로, 배열만으로는 해결하기 어려울 것 같다. → 재귀함수를 작성하고, 전역변수를 통해 최솟값을 관리하자. 💡 코드 package DP; import java.io.BufferedReader; imp..
-
[Algorithm/Java] 다이나믹 프로그래밍 복습
DP문제 해결 과정 = 규칙을 찾아 점화식 세우기 큰 문제를 작은 문제로 나눌 수 있다. 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다. 처음엔 감이 안잡히므로.. 그냥 몇문제 답을 보고 시작하는게 효율적이다. 💡 ex1. RGB거리 https://www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 주어진 비용으로 N개의 집을 빨, 초, 파로 칠하는데 N번 집은 N-1, N+1번 집과 색이 같으면 안된다 집을 칠하는 최소..
-
[Java] 백준 #10825 국영수
https://www.acmicpc.net/problem/10825 10825번: 국영수 첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1 www.acmicpc.net 학생 N명의 국, 영, 수 점수 학생 성적 정렬하기 국어 점수 감소하는 순서 국어 점수 같으면 → 영어 점수 증가 국어, 영어 같으면 → 수학 점수 감소 모두 같으면 이름 사전순 증가 (모든 대문자는 소문자 앞에) 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다. 💡 알고리즘 정렬 💡 접근 객체를 정렬하는 기준을 만들기 위해 자바에서 제공하는 Comparat..
-
[Java] 백준 #1158 요세푸스 문제
https://www.acmicpc.net/problem/1158 1158번: 요세푸스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net 1번부터 N번까지 N명의 사람이 원을 이루며 앉아있음 양의정수 K → 순서대로 K번째 사람 제거 → N명이 제거될 때까지 (N, K) 요세푸스 순열 구하기 💡 알고리즘 자료구조, 큐 💡 접근 처음에 중간에 원소가 나가면 인덱스도 하나씩 줄어들어야 하겠구나 라는 잘못된 생각을 해서 큐를 생각해내지 못했다. (규칙만 추가하며 산으로 가던 코드) int idx = K - 1; LinkedList res = new LinkedList(); while(list.size() > 0){ res.add..
-
[Spring/Data JPA] 프로젝트 환경설정
🌝 프로젝트 환경설정 preference → Build and run IntelliJ IDEA로 변경하기 enable annotation option 체크 🌝 h2 데이터베이스 설치 spring.io 들어가서 h2 database와 spring version 일치하는지 확인 chmod 755 h2.bat 권한주고 ./h2.bat /datajpa.mv.db 파일 생성 확인 → jdbc:h2:tcp://localhost//datajpa 이렇게 접속! 🌝 스프링 데이터 JPA와 DB 설정, 동작확인 Member entity, MemberJpaRpository 작성 @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id;..
-
[TIL/fairer] 2022-05-14 jpa로직 구현
😊 Today I Learned 집안일 전체 조회 API - jwt token 적용 집안일 전체 조회 API를 개발할 때, 날짜를 받아와서 해당 날짜에 해당하는 집안일을 리턴하도록 했었다. 로그인 기능이 구현되고, jwt가 추가되면서 토큰을 통해 memberId를 받아와서 날짜 + memberId까지 조인해서 가져와야 했다. jwt는 나중에 수정하더라도 memberId까지 받아서 가져오도록 설계했어야 했는데, 지금까지 날짜만 받아 모든 유저의 집안일을 가져오도록 구현하고 있었다는게 충격이었다. 이정도로 기본적인 부분도 놓치고 있었다니..😇 HouseWorkController 수정 전 @GetMapping(value = "") public ResponseEntity getHouseWork(@RequestP..
-
[Java] 백준 #1780 종이의 개수
https://www.acmicpc.net/problem/1780 1780번: 종이의 개수 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수 www.acmicpc.net N x N 행렬 종이 → 각각 -1, 0, 1 중 하나 저장 규칙에 따라 적절한 크기로 종이 자르기 종이가 모두 같은 수 → 그대로 사용 모두 같은 수 x → 같은 크기의 종이 9개로 자르고 각각의 잘린 종이에 대하여 1번 과정 반복 이와같이 종이를 잘랐을 때 -1, 0, 1로만 채워진 종이의 개수 각각 구하기 N은 3^k꼴, 1 ≤ N ≤ 3^7 💡 알고리즘 분할 정복, 재귀 💡 접근..
-
[Algorithm/Python] BFS/DFS 이해하기
💡 DFS(Depth First Search) : 깊이 우선 탐색 → 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘 미로에 갇혔을 때, 가던 길이 막히면 가장 최근에 있었던 갈림길로 되돌아간다 → 스택 연상 가능 ** 스택에 지나온 경로를 저장하자 ** 탐색 시작 노드를 스택에 push → 방문 처리 스택이 공백이 아니면 하나의 위치를 꺼냄 → 현재 위치 → 방문 처리 꺼낸 현재 위치가 출구 → 탐색 성공 출구가 아니다 → 상하좌우 이웃한 방들을 살펴봄 → 갈 수 있는 모든 방들을 스택에 push → 반복 O(N)의 시간이 소요되고, DFS는 스택을 사용하는 알고리즘 → 실제 구현은 재귀 함수를 이용했을 때 매우 간결하게 구현할 수 있다. [구현] graph = [[], [2, 3, 8], [1, ..
-
[Python] 백준 #18111 마인크래프트
18111번: 마인크래프트 (acmicpc.net) 18111번: 마인크래프트 팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게 www.acmicpc.net 땅의 높이를 모두 동일하게 만드는 ‘땅 고르기’ 작업 세로N, 가로M 크기의 집터, 맨 왼쪽 위의 좌표 (0, 0) 좌표 (i, j)의 가장 위에 있는 블록 → 인벤토리 : 1초 인벤토리 → 좌표 (i, j)의 가장 위에 있는 블록 위에 놓음 : 2초 0 ≤ 땅의 높이 ≤ 256 땅을 고르는 데 걸리는 최소시간의 (시간, 높이) 출력 (높이가 가장 높은 답) 💡 알고리즘 구현, 브루트포스 알고리즘 💡 접근 처음..
-
[Spring] 스프링 Bean과 의존관계 - 컴포넌트 스캔 & 자동 의존관계 vs 스프링 Bean 직접 등록
Spring Bean이란? → Class와 new를 통해 생성된 객체가 아닌, Spring에 의하여 생성되고 관리되는 자바 객체 의존관계란? 예를 들어, Controller와 view template가 필요한 상황 → memberController 생성해야함 → memberService를 통해 회원가입을 하고, data를 조회해야함 ↔ 의존관계가 있다! 🌳 컴포넌트 스캔과 자동 의존관계 설정 1. MemberController 생성, 의존관계 추가 @Controller public class MemberController { private final MemberService memberService; @Autowired public MemberController(MemberService memberSer..
-
[Python] 백준 #10989 수 정렬하기 3
10989번: 수 정렬하기 3 (acmicpc.net) 10989번: 수 정렬하기 3 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다. www.acmicpc.net N개의 수 오름차순 정렬 N의 범위 (1 ≤ N ≤ 10,000,000), 최대 10,000개 정렬 💡 알고리즘 정렬 💡 접근 퀵 정렬을 사용한 재귀함수로 풀면.. 계속 수정해봐도 메모리 초과가 뜬다. 스터디 자료를 복습하면서, 계수 정렬을 이용해보았다. [계수 정렬] 특정 조건이 부합할 때만 사용할 수 있지만, 매우 빠른 알고리즘 데이터가 양의 정수, 데이터 개수가 N, 데이터의 최대값이 K일 때, 최악의 경우에도 O(N + ..
-
[Python] 백준 #11866 요세푸스 문제 0
11866번: 요세푸스 문제 0 (acmicpc.net) 11866번: 요세푸스 문제 0 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000) www.acmicpc.net N명의 사람이 원을 이루며 앉아있음 K번째 사람을 제거 → N명의 사람이 모두 제거될 때까지 계속 제거 원에서 사람들이 제거되는 순서 ↔ (N,K)-요세푸스 순열 💡 알고리즘 구현, 자료구조, 큐 💡 접근 [Python] 백준 #1966 프린터 큐 (tistory.com) 풀다가 이 문제가 생각나서 deque으로 수월하게 해결하였다. → while문으로 카운트를 세면서 조건을 확인하고, 맞다면 result에 저장하고 pop 아니라면 맨 뒤로 보내고 pop 💡 코드 from collection..
-
[Python] 백준 #7568 덩치
7568번: 덩치 (acmicpc.net) 7568번: 덩치 우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩 www.acmicpc.net 💡 알고리즘 구현, 브루트포스 알고리즘 💡 접근 방법 덩치 (x kg, y cm) A, B의 덩치 (x, y) (p, q) 덩치가 더 크려면 x > p, y > q 덩치 등수 : 자신보다 큰 덩치 사람의 수 + 1 같은 덩치 등수 여러명도 가능 2등이 3명 → 3, 4등 없음 N명의 몸무게, 키를 읽어서 각 사람의 덩치 등수 계산하여 출력 “덩치 등수 : 자신보다 큰 덩치 사람의 수 + 1” 조건에 집중해서..