便宜模型和贵模型到底差在哪儿?一份关于Claude与GPT分级体系的深度梳理
掘金
今年openai和anthropic两家公司轮番更新模型,两家各有一系列的便宜模型和贵模型,其差别到底在哪里? 💰 先看硬数据:Fable 5 到底比 Sonnet 5 强多少 第三方评测机构FACT
Score: 57.37Confidence: 54%
View offerLoading the catalog…
THE AI OPPORTUNITY INDEX
Find your next AI tool. Explore free access, trials, and credits — all in one place.
掘金
今年openai和anthropic两家公司轮番更新模型,两家各有一系列的便宜模型和贵模型,其差别到底在哪里? 💰 先看硬数据:Fable 5 到底比 Sonnet 5 强多少 第三方评测机构FACT
Score: 57.37Confidence: 54%
View offer掘金
**安全回收**:被淘汰的图片不直接 `recycle()`,而是由 GC 在无人引用后释放,避免误回收仍显示在 **两级缓存**:可配合 `DiskLruCache` 实现内存 + 磁盘二级缓存。
Score: 57.36Confidence: 54%
View offer人人都是产品经理
市面上的陪伴 AI 越来越懂情绪,却也容易变成一面熟悉的镜子。Heyyyyy 走的是反方向:角色会记得你、会反驳你,关系处理不好还可能离开。作者拆解了它的匹配机制与角色设定,也讲了这种「不那么听话」的设计到底想解决什么问题。 AI角色的恋爱互动小说。 现在的陪伴AI越来越懂情绪了。 当用户倾诉糟糕的一天,它能够优先接纳情绪;谈及亲密关系里的矛盾时,输出的语言也会更温和克制。 AI对用户的了解越深,也会越容易顺着对方的情绪延伸对话。当对话里充斥孤独、失落或是痛苦这类感受时,它很少给出直接的反对意见。 虽然对话类产品中,用户需要帮助时,一个随时回应、愿意理解自己的对象很容易让交流继续下去,但陪伴型关系会衍生出新的问题。 假如另一边永远在线,冷落几天也不会改变任何东西,用户说错一句话以后依然能够无缝接着聊,那么角色记得再多,最后也很容易变成一面越来越熟悉自己的镜子。 人与人相处时并没有这样的确定性。对方会有自己的判断,也有不想回应的时候。 Heyyyy最近就在做这样一件有点反常的事,这里的AI角色会记得用户,也会反驳用户,关系处理得不好时还可能离开。 该公司成员包括A Thinking Ape两名原始创始人以及姚振旺。A Thinking Ape长期做带有强社交属性的移动产品,姚振旺早年曾在科大讯飞工作,且是早期自然人股东。 Heyyyy最很像一个由AI角色组成的约会模拟器,打开产品后,用户会先看到不同的人物卡片。 角色拥有各自的职业、性格和设定,用户可以继续滑动寻找感兴趣的人,也可以直接点爱心,喜欢之后会进入匹配,匹配成功才逐渐进入聊天。 除此之外,还会主动提醒有其他角色对你感兴趣,用户可以决定接受这次匹配,新的关系也会随之进入聊天列表。 当然,它也支持角色库的分类选择。除了使用平台已经提供的角色,用户还可以自己创建人物,补充角色设定。 进入聊天后,角色会显示在线状态,也会主动发消息。聊天时并不依赖预设选项,用户直接输入自己想说的话,角色会延续人物性格回应,也会记住此前交流里出现过的信息。 对方并不会一直附和,某些话题里会表达自己的判断,关系处理得不好时也可能出现冷淡和中断。 聊天过程中,角色有时会主动提出发一张照片,照片里的内容并不局限于人物正脸,也可能是正在吃饭或者某个日常时刻。 人物形象会尽量保持一致,让后续收到的图片还能对应到同一个角色。用户也可以发送自己的照片,让角色围绕现实生活里的内容继续回应。 此外,关系聊到一定阶段后,角色会主动提出约会。日常开放聊天会暂时切换成一个连续的情境。 一次约会里会出现多个场景,每个场景先描述两个人当下所处的环境和正在发生的事情,用户可以选择已有反应,也可以自己写下一步准备怎么做。 新的场景会根据前面的互动继续推进,等整段约会结束,系统还会给出一次结果和评分。 这里没有传统小说那种连续阅读的大段文字,叙事感主要来自事件推进。 用户平时和角色自由交流,关系发展到某个节点以后进入一次可参与的约会,约会结束又回到日常聊天。 一次次互动慢慢累积,角色和用户之间才会出现一条属于自己的关系线。 约会结束后还有一个奖励,用户可以上传自己的照片,和刚刚约会的虚拟角色生成一张Couple Selfie,这项图片生成功能由fal.ai提供处理。 值得一提的是,Heyyyy还会做另一件很有意思的事情,用户和不同角色交流的同时,系统也会逐渐形成对用户自己的判断。 随着等级提升,产品会陆续解锁不同的人格分析。比如用户在聊天里怎么回应,在约会里怎么选择,遇到关系变化时又会采取什么动作,这些互动最后会变成关于用户自身的一些反馈。 本色、灵魂、爱心和主动程度等项目会随着进度逐渐出现,于是关系里形成了一种双向观察。用户在挑选和了解角色,产品也在长期互动里整理用户留下来的行为线索。 也正因为如此,不太听话并不只指一句简单的反驳。角色可能聊着聊着不定时的就下线了。遇到这种情况,用户需要长达八小时的等待才可以继续对话。 不过这种做法也带来了明确的付费设计,想立刻继续关系时,钻石可以缩短等待。照片、约会以及其他关系事件同样可以和虚拟货币发生联系。 过去两年,亚洲市场的AI陪伴产品也在慢慢形成各自的关系设计,其中女性向产品对关系进度的处理已经越来越成熟。 韩国TainAI在2023年推出LoveyDovey,官方会用网文式恋爱来描述这类体验。 刚认识时只是普通聊天,交流继续以后可以进入暧昧、恋人甚至婚姻等不同状态,照片和日常分享也被纳入互动。 关系推进和消费紧密连在一起,聊天、内容解锁以及更多互动都可以继续消耗虚拟货币。 女性向内容的付费意愿也比想象中更强,LoveyDovey累计下载约120万次时,一度成为亚洲收入最高的AI聊天娱乐应用。 它没有依赖特别庞大的用户规模,关系进度和持续生成的恋爱内容已经足以支撑很高的消费。 面向日本市场的Meowster则把陪伴对象做成拥有独立性格的AI猫。 并且为不同猫设置了活泼、毒舌、冷淡和治愈等气质,不保证每一次都给出安慰或赞同,有时还会选择沉默。 这也是猫类陪伴和恋爱角色之间很有意思的区别。猫不理人时,用户很容易把它理解成一种性格。 Heyyyy面对的是恋爱角色,它需要借助更多关系事件让这种自主性成立,约会、照片和在线状态也因此有了更明确的位置。 而团队的经历也自然的促成了这套设计。Wilkins Chung和Kenshi Arasaki都是A Thinking Ape的原始创始人。 A Thinking Ape参加过YC Winter 2008,早期做过聊天平台,之后长期开发带有强社交属性的移动游戏。 2020年Embracer宣布收购这家公司时,官方披露其旗下游戏累计创造约1.9亿美元收入,账户数量超过3000万。 A Thinking Ape最有代表性的产品之一是Party in My Dorm。这款大学生活角色扮演产品在2010年发布,用户以女性为主。 姚振旺本科就读于中国科学技术大学自动化系,早期在科大讯飞担任软件工程师和项目经理,也曾进入摩托罗拉。他曾持有讯飞有限的早期自然人股份,之后完成转让。 离开国内以后,他在Simon Fraser University完成机器人方向的硕士和博士,后来加入A Thinking Ape,经历工程负责人和增长负责人等岗位。 A Thinking Ape长期强调social core,产品需要让用户在虚拟身份和社区关系里持续互动。Party in My Dorm又长期面对女性用户,角色关系、社交节奏以及虚拟消费本来就是团队熟悉的问题。 AI让这类产品多了一个新的可能,关系另一边不需要一直由真人玩家承担,一个角色也可以持续生成自己的回应和故事。 官方把Heyyyy称作互动小说,这里的故事没有预先写好的完整路线。故事存在于持续发生的交流里,某些节点被做成更明确的互动剧情。 如果用户每天打开应用,只是换一个角色继续说话,角色数量再多也很容易回到同一种体验。 Heyyyy加入匹配,让相遇本身变成一次事件。 一个随时在线、永远理解你、永远不会离开的对象很适合做助手。恋爱模拟里的另一边如果也完全遵循这套逻辑,人物很快就会失去质感与分量。 给角色增加了一些等待,也允许互动产生不那么舒服的结果。 当AI越来越擅长理解人的时候,陪伴接下来需要处理的也许不只是怎样记住更多,它还需要决定什么时候保留自己的判断。 Heyyyy目前给出的答案很简单:让AI多一点自己的时间,也多一点自己的脾气。 作者:虾蛄AI 公众号:虾蛄AI 本文由 @虾蛄AI 原创发布于人人都是产品经理。未经作者许可,禁止转载 题图来自作者提供
Score: 57.3Confidence: 54%
View offer爱范儿
最卷一夜! #欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。
Score: 55.11Confidence: 54%
View offervelog
목표를 채운 날이 총 며칠인지와, 며칠 연속으로 채웠는지는 다른 질문이에요. 이번에는 기록이 중간에 끊기는 상황까지 생각하면서 가장 긴 연속 기록을 구해 볼게요. 이 글은 직접 만든 연습 문제예요. 코드업이나 프로그래머스의 문제 원문·테스트 데이터를 옮긴 글이 아니며, 해당 플랫폼의 채점 결과도 아닙니다. 하루 기록을 하나씩 넘겨 봐요 날짜순으로 정리된 하루 공부 시간 minutes 와 목표 시간 target 이 주어져요. 목표 이상 공부한 날이 가장 길게 이어진 기간을 정수로 반환하면 됩니다. 공부 시간은 0 이상의 정수, 목표는 양의 정수라고 가정해요. 리스트의 원소 하나가 하루이며, 빠진 날짜는 없어요. 빈 리스트의 답은 0이에요. minutes = [30, 45, 10, 60, 30, 40, 0] target = 30 처음 이틀을 달성한 뒤 하루 목표를 못 채우고, 다시 사흘을 달성했어요. 따라서 답은 3 이에요. 달성한 날의 총합인 5 와 구분해야 해요. 현재 기록과 최고 기록을 따로 둬요 def longest_streak(minutes, target): current = 0 best = 0 for minute in minutes: if minute >= target: current += 1 best = max(best, current) else: current = 0 return best current 는 지금까지 이어지고 있는 기록이에요. 목표를 못 채운 날을 만나면 0으로 돌아가요. 반면 best 는 이미 달성했던 가장 긴 기록이에요. 오늘 기록이 끊겨도 과거의 최고 기록까지 사라지면 안 되니 그대로 남겨 둡니다. 예제에서 두 변수는 다음처럼 바뀌어요. 공부 시간 current best 30 1 1 45 2 2 10 0 2 60 1 2 30 2 2 40 3 3 0 0 3 마지막 날이 0분이어도 답은 3이에요. 그래서 마지막에 반환할 값은 current 가 아니라 best 예요. 끝까지 이어지는 경우도 확인해요 assert longest_streak([], 30) == 0 assert longest_streak([10, 20], 30) == 0 assert longest_streak([30], 30) == 1 assert longest_streak([30, 40, 50], 30) == 3 assert longest_streak([30, 30, 0, 30], 30) == 2 assert longest_streak([30, 45, 10, 60, 30, 40, 0], 30) == 3 목표와 정확히 같은 날도 포함하므로 비교는 >= 예요. 최고 기록을 달성할 때마다 갱신해서 마지막 날까지 계속 달성한 경우도 놓치지 않아요. 리스트를 한 번 읽으므로 시간 복잡도는 O(n), 추가 공간은 O(1)이에요. 원본 리스트는 바꾸지 않습니다. 비슷한 반복문이라도 무엇을 기억할지에 따라 결과가 달라져요. 이번 문제에서는 지금 이어지는 기록과 지금까지의 최고 기록 을 나눠 두는 게 핵심이에요.
Score: 54.4Confidence: 49%
View offervelog
문제 https://swexpertacademy.com/main/solvingProblem/solvingProblem.do 전체코드 import java.io.*; import java.util.*; class Solution { private static int calMax(int[] honeys, int c) { int max=0; for (int i = 0; i < (1<< honeys.length); i++) { int sum=0; int profit=0; for (int j = 0; j < honeys.length; j++) { if ((i & 1<< j) !=0 ) { sum += honeys[j]; profit+= honeys[j]*honeys[j]; } } if (sum <= c) max= Math.max(max, profit); } return max; } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int t = Integer.parseInt(br.readLine()); StringTokenizer st; StringBuilder sb= new StringBuilder(); for (int test_case = 1; test_case <= t; test_case++) { st = new StringTokenizer(br.readLine()); int answer = Integer.MIN_VALUE; int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); int C = Integer.parseInt(st.nextToken()); int[][] honeys = new int[N][N]; // 시작점에서 M 크기만큼 int[][] dp = new int[N][N-M+1]; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < N; j++) honeys[i][j] = Integer.parseInt(st.nextToken()); } // 합 미리 넣어놓기 for (int i = 0; i < N; i++) { for (int j = 0; j <= N - M; j++) { int tmp= 0; for (int k = 0; k < M; k++) { tmp += honeys[i][j+k]; } if (tmp <= C) { for (int k = 0; k < M; k++) dp[i][j] += (honeys[i][j+k])*(honeys[i][j+k]); } else { int[] arr= new int[M]; for (int k = 0; k < M; k++) arr[k]= honeys[i][j+k]; // c를 넘지 않는 최대 수집 수익 dp[i][j]= calMax(arr,C); } } } for (int i = 0; i < N ; i++) { for (int j = 0; j <= N-M ; j++) { int first= dp[i][j]; // 같은 행일 때 int second; for (int l = j+M; l <= N-M; l++) { second= dp[i][l]; answer= Math.max(answer, first+ second); } // 다른 행일 때 for (int k = i+1; k < N; k++) { for (int l = 0; l <= N-M; l++) { second= dp[k][l]; answer= Math.max(answer, first+ second); } } } } sb.append("#").append(test_case).append(" ").append(answer).append("\n"); } bw.write(sb.toString()); bw.flush(); bw.close(); br.close(); } } 풀이 1. 모든 점에 대하여 크기가 M인 벌꿀통에 담기 일꾼은 가로로 연속된 M개의 벌통을 선택해야 한다. 그래서 각 행 i에서 시작점 j는 0부터 N-M까지만 가능하다. 두 일꾼의 조합을 따질 때 같은 구간의 수익을 계속 다시 계산하면 비효율적이기 때문에 시작점 (i, j)에서 M칸을 선택했을 때 얻을 수 있는 최대 수익을 먼저 전부 계산해 dp[i][j]에 저장했다. // dp[i][j] : (i, j)에서 시작하는 M칸 벌통에서 얻을 수 있는 최대 수익 int[][] dp = new int[N][N-M+1]; 점화식이 있는 DP라기보다는 메모이제이션을 사용하며 한 번 계산한 값을 저장해두고 재사용한다. 이렇게 해두면 매번 크기 M만큼의 벌꿀 합을 계산하지 않고 배열 값을 꺼내 더하기만 하면 된다. 2. C를 고려해 채취 가능한 벌꿀양과 이익 계산하기 선택한 M칸의 꿀을 모두 채취할 수 있는지는 꿀의 합이 C 이하인지에 따라 달라진다. 1. M칸의 합이 C 이하인 경우 전부 채취할 수 있으므로 각 칸 꿀 양의 제곱을 모두 더하면 된다. if (tmp <= C) { for (int k = 0; k < M; k++) dp[i][j] += honeys[i][j+k] * honeys[i][j+k]; } 2. M칸의 합이 C를 초과하는 경우 일부 벌통만 골라야 하는데 큰 값부터 고르는 그리디 방식은 성립하지 않는다. 예를 들어 C=10 꿀이 [6, 5, 5]라면 6을 먼저 고르면 수익이 36이지만 5와 5를 고르면 25+25=50으로 더 크다. 그래서 부분집합을 전부 탐색해야한다. M은 최대 5이므로 부분집합은 최대 25 = 32개로 충분히 작기에 비트마스크로 각 부분집합을 표현하고 합이 C 이하인 경우 중 제곱합의 최댓값을 구했다. private static int calMax(int[] honeys, int c) { int max = 0; for (int i = 0; i < (1 << honeys.length); i++) { // 모든 부분집합 int sum = 0, profit = 0; for (int j = 0; j < honeys.length; j++) { if ((i & (1 << j)) != 0) { // j번째 벌통 선택 sum += honeys[j]; profit += honeys[j] * honeys[j]; } } if (sum <= c) max = Math.max(max, profit); // C 이하일 때만 갱신 } return max; } 사실 calMax는 전체를 고르는 경우(비트가 모두 1)도 포함하므로 경우 1까지 처리할 수 있다. 합이 C 이하일 때 바로 계산하는 분기는 불필요한 부분집합 탐색을 줄이기 위한 최적화입니다. 3. 두 채집자의 벌꿀통 선택해서 최대 구하기 두 일꾼이 고른 벌통은 겹치면 안 됩니다. 첫 번째 일꾼의 시작점을 (i, j)로 고정했을 때 두 번째 일꾼이 선택할 수 있는 위치는 두 가지입니다. 같은 행일 때에는 첫 번째 일꾼이 j ~ j+M-1을 쓰므로, 두 번째 일꾼은 j+M부터 시작해야 겹치지 않습니다. for (int l = j + M; l <= N - M; l++) { answer = Math.max(answer, first + dp[i][l]); } 다른 행일 때는 행이 다르면 절대 겹치지 않으므로 아래 행의 모든 시작점이 가능하다. for (int k = i + 1; k < N; k++) { for (int l = 0; l <= N - M; l++) { answer = Math.max(answer, first + dp[k][l]); } } 두 경우 모두 두 번째 일꾼을 첫 번째 일꾼보다 뒤쪽(같은 행의 오른쪽, 또는 아래 행) 에서만 찾는데 이렇게 하면 (A, B)와 (B, A) 같은 중복 조합을 자연스럽게 제거할 수 있다. 시간 복잡도 N ≤ 10, M ≤ 5 기준으로 메모리제이션은 칸 수 N2 × 부분집합 2M × M이라 약 100 × 32 × 5 수준이고 조합 탐색은 시작점 쌍이므로 최대 (N2)2 ≈ 104 메모리제이션 덕분에 조합 탐색 단계에서는 덧셈과 비교만 하므로 매우 빠르게 동작한다.
velog
📌 ERP란? ERP(Enterprise Resource Planning, 전사적 자원 관리) 는 기업의 인사, 재무, 회계, 구매, 생산, 물류, 판매 등 핵심 업무를 하나의 통합된 시스템 에서 관리하는 소프트웨어입니다. 여기서 "자원"은 사람(인력), 돈(자금), 물건(자재·재고), 설비 등 기업이 가진 모든 것을 말해요. 부서마다 따로 놀던 장부를 하나의 DB, 하나의 시스템 으로 묶은 것 이라고 보면 이해하기 쉽습니다. 🤔 ERP 이전에는? ERP 이전에는 부서마다 각자의 시스템(혹은 엑셀, 종이 장부)을 썼습니다. 영업팀은 주문을 받고 구매팀은 따로 자재를 사고 생산팀은 따로 계획을 짜고 회계팀은 월말에 모든 부서 자료를 모아서 다시 입력 이러다 보니 문제가 생깁니다. 같은 데이터를 여러 번 입력 (그리고 서로 숫자가 안 맞음) 다른 부서 상황을 실시간으로 알 수 없음 경영진이 전체 현황을 보려면 며칠씩 취합 해야 함 📜 ERP의 발전 과정 시기 단계 내용 1960~70년대 MRP (Material Requirements Planning) 생산에 필요한 자재 소요량 계산 1980년대 MRP II (Manufacturing Resource Planning) 자재 + 생산 능력, 인력, 자금까지 확장 1990년대 ERP 제조를 넘어 전사 업무 전체 를 통합 2000년대~ ERP II / 확장형 ERP CRM, SCM 등 외부·협력사까지 연결 2010년대~ 클라우드 ERP SaaS 형태, 인메모리 DB, 실시간 분석 🧩 ERP의 핵심 특징 통합 데이터베이스 — 모든 모듈이 하나의 DB를 공유. 한 번 입력하면 전사에 반영 실시간 처리 — 영업이 주문을 입력하면 재고, 생산, 회계에 바로 영향 모듈 구조 — 회계, 인사, 구매 등 기능별 모듈을 필요에 따라 조합 Best Practice 내장 — 글로벌 선진 기업들의 표준 업무 프로세스를 패키지에 녹여둠 파라미터 설정 방식 — 코딩보다는 설정(Configuration) 으로 회사에 맞춤 ERP 도입은 "시스템을 회사에 맞추는 것"이 아니라 "회사 프로세스를 표준에 맞추는 것" 이라는 말이 나오는 이유이기도 합니다. 🔁 ERP로 보는 업무 흐름 예시 Order to Cash (주문 → 수금) 고객 주문 → 재고 확인 → 출하 → 청구서 발행 → 매출채권 → 수금 (SD) (MM) (SD) (SD) (FI) (FI) Procure to Pay (구매 → 지급) 구매 요청 → 구매 발주 → 입고 → 송장 검증 → 매입채무 → 대금 지급 (MM) (MM) (MM) (MM) (FI) (FI) ⚠️ Procure to Pay도 줄여서 P2P라고 부르는데, EAI에서 말하는 Point-to-Point와는 전혀 다른 개념입니다. 📦 데이터 종류 마스터 데이터 (Master Data) — 잘 안 바뀌는 기준 정보 예) 고객, 거래처(벤더), 자재, 계정과목, 사원 정보 트랜잭션 데이터 (Transaction Data) — 업무가 일어날 때마다 생기는 데이터 예) 주문, 발주, 입고, 전표, 급여 지급 연계 업무에서도 이 둘은 성격이 다르게 다뤄집니다. 마스터 데이터는 기준 정보 동기화 , 트랜잭션 데이터는 건별 실시간/배치 전송 이 주로 이루어집니다. 🏢 대표적인 ERP 솔루션 구분 솔루션 글로벌 SAP (S/4HANA), Oracle (Fusion Cloud ERP, E-Business Suite, JD Edwards, NetSuite), Microsoft Dynamics 365, Infor 국내 더존 , 영림원 등 (중견·중소기업 중심) 대기업, 특히 글로벌 사업을 하는 제조·유통 그룹사에서는 SAP 비중이 압도적으로 높습니다. 🟦 SAP란? SAP 는 독일 발도르프에 본사를 둔 기업용 소프트웨어 회사이자, 그 회사의 ERP 제품을 부르는 이름이기도 합니다. 1972년 전직 IBM 엔지니어들이 설립 사명은 독일어 Systeme, Anwendungen und Produkte in der Datenverarbeitung (데이터 처리 시스템, 애플리케이션 및 제품)의 약자 전 세계 ERP 시장 점유율 최상위권 현업에서 "SAP 쓴다"고 하면 대부분 SAP ERP 시스템을 쓴다 는 의미입니다. 📜 SAP ERP 버전 흐름 버전 시기 특징 R/1 1970년대 최초의 실시간(Real-time) 회계 시스템 R/2 1979년~ 메인프레임 기반 R/3 1992년~ 클라이언트-서버 3계층 구조로 전 세계 확산 ECC (ERP Central Component) 2000년대 R/3의 후속, 현재도 많은 기업이 운영 중 S/4HANA 2015년~ 인메모리 DB SAP HANA 전용, 차세대 ERP 💡 R/3의 R은 Real-time , 3은 3계층(Presentation / Application / Database) 을 의미합니다. 현재 많은 기업이 ECC → S/4HANA 전환 을 진행 중인데, SAP가 ECC의 표준 유지보수 종료 시점을 정해두었기 때문입니다. (흔히 2027년 종료, 연장 시 2030년까지로 알려져 있음) 그래서 요즘 SAP 쪽 프로젝트에서는 S/4HANA 마이그레이션 이 큰 화두입니다. 🧩 SAP 주요 모듈 재무/관리회계 모듈 이름 내용 FI Financial Accounting 재무회계 — 전표, 총계정원장, 채권·채무, 결산 CO Controlling 관리회계 — 원가, 손익, 예산 관리 로지스틱스 모듈 이름 내용 SD Sales & Distribution 영업/판매 — 견적, 주문, 출하, 청구 MM Materials Management 자재/구매 — 구매 요청, 발주, 입고, 재고 PP Production Planning 생산 계획 — BOM, 생산 오더, MRP QM Quality Management 품질 관리 PM Plant Maintenance 설비 보전 WM / EWM (Extended) Warehouse Management 창고 관리 PS Project System 프로젝트 관리 인사 모듈 이름 내용 HR / HCM Human Capital Management 인사, 급여, 근태 (클라우드 쪽은 SuccessFactors로 이동하는 추세) 🛠️ SAP 기술 용어 ABAP — SAP 전용 프로그래밍 언어. SAP 개발자 = 대부분 ABAP 개발자 T-code (Transaction Code) — SAP 화면으로 바로 이동하는 단축 코드 예) VA01 판매 오더 생성, ME21N 구매 발주 생성, SE38 ABAP 에디터 SAP GUI — 전통적인 SAP 클라이언트 프로그램 SAP Fiori — 웹/모바일 기반의 최신 UI SAP HANA — SAP의 인메모리 컬럼형 데이터베이스. S/4HANA의 기반 Basis — SAP 시스템의 설치, 운영, 권한, 성능 등을 담당하는 인프라 영역 Add-on / CBO — 표준 기능으로 부족한 부분을 추가 개발한 프로그램 (국내에선 CBO 개발이라는 표현도 자주 씀) RISE with SAP — SAP의 클라우드 전환 패키지 서비스 🏗️ SAP 구축 프로젝트는 어떻게 진행될까? As-Is 분석 — 현재 업무 프로세스 파악 Fit-Gap 분석 — SAP 표준 기능으로 되는 것(Fit)과 안 되는 것(Gap) 구분 To-Be 설계 — 표준 프로세스 + 추가 개발 범위 결정 구현 — 설정(Configuration) + ABAP 개발 + 인터페이스 개발 테스트 — 단위 → 통합 → 사용자 테스트 데이터 이관 & 오픈 — 기존 데이터 마이그레이션 후 가동 (Go-Live) SAP의 공식 구축 방법론으로는 예전의 ASAP , 현재의 SAP Activate 가 있습니다. 🔗 ERP와 EAI는 왜 붙어 다닐까? ERP가 "전사 통합"이라고 해도, 현실에서는 ERP 혼자 모든 걸 하지 않습니다. ERP 주변에는 항상 이런 시스템들이 붙어 있어요. 생산 현장의 MES 고객 관리 CRM 그룹웨어, 전자결재 인사/근태 시스템 전자세금계산서 , 은행 펌뱅킹 , 물류사 등 대외 기관 그리고 SAP 도입 이전부터 있던 레거시 시스템들 이 시스템들과 ERP 사이의 데이터 흐름을 담당하는 게 바로 EAI 입니다. 그래서 SAP 구축 프로젝트에는 거의 항상 인터페이스(연계) 개발 파트 가 따로 존재합니다. 🔌 SAP 연계 기술 기술 방식 설명 RFC (Remote Function Call) 동기 / 비동기 SAP 함수를 외부에서 원격으로 호출. SAP 연계의 가장 기본 BAPI (Business API) 동기 SAP가 표준으로 제공하는 비즈니스 객체 단위 API (RFC로 호출 가능한 함수) IDoc (Intermediate Document) 비동기 SAP의 표준 전자 문서 포맷 . 주문, 송장, 마스터 데이터 등을 문서 단위로 주고받음 ALE (Application Link Enabling) 비동기 IDoc 기반으로 SAP ↔ SAP / 외부 시스템 간 데이터 분배 Web Service (SOAP) 동기 / 비동기 표준 웹 서비스 방식 OData 동기 REST 기반. SAP Gateway를 통해 제공, Fiori 앱의 기반 File / DB 배치 파일 교환이나 중간 테이블을 통한 연계 RFC의 종류 sRFC (Synchronous) — 동기 호출 aRFC (Asynchronous) — 비동기 호출 tRFC (Transactional) — 한 번만 실행되도록 보장 qRFC (Queued) — 순서까지 보장 SAP 자체 통합 솔루션 SAP PI / PO (Process Integration / Process Orchestration) — 온프레미스 통합 미들웨어 SAP Integration Suite (Cloud Integration, 구 CPI) — SAP BTP 위의 클라우드 통합 서비스 외부 EAI 솔루션에서 SAP 붙이기 TIBCO, webMethods, MuleSoft 등 대부분의 EAI 솔루션은 SAP 전용 어댑터/플러그인 을 제공합니다. 내부적으로는 SAP가 제공하는 커넥터 라이브러리( SAP JCo — Java Connector 등)를 통해 RFC/BAPI를 호출하거나 IDoc을 송수신하는 방식이 일반적입니다. [외부 시스템] ⇄ [EAI 솔루션 + SAP 어댑터] ⇄ (RFC / BAPI / IDoc) ⇄ [SAP ERP] 📝 한 줄 정리 ERP = 기업 자원을 하나의 DB로 통합 관리하는 시스템 SAP = 그 ERP 시장의 대표 주자 EAI = 그 ERP와 나머지 세상을 이어주는 다리
velog
리스트를 출력하다 보면 값 옆에 번호도 붙이고 싶을 때가 있어요. 공부할 주제를 1번, 2번, 3번으로 보여 주는 식이죠. 이럴 때 쓰기 좋은 함수가 enumerate() 예요. 번호를 직접 늘리지 않아도 돼요 topics = ["변수", "조건문", "반복문"] for index, topic in enumerate(topics): print(index, topic) 출력은 다음과 같아요. 0 변수 1 조건문 2 반복문 enumerate() 는 반복할 때마다 번호와 값을 한 쌍으로 건네줘요. 기본 번호는 0부터 시작하므로, 이 예제에서는 리스트 인덱스와 같아요. 번호만 필요하다면 range() 를 쓰면 되고, 값만 필요하다면 for topic in topics 로 충분해요. 둘 다 필요할 때 enumerate() 를 떠올리면 됩니다. 사람에게 보여 줄 번호라면 1부터 시작해요 for number, topic in enumerate(topics, start=1): print(f"{number}. {topic}") 1. 변수 2. 조건문 3. 반복문 start=1 은 붙여 주는 번호의 시작값을 바꿔요. 리스트 자체의 인덱스를 바꾸는 것은 아니에요. 그래서 이 반복문 안에서 topics[number] 로 값을 꺼내면 의도와 달라져요. 첫 번째 반복에서 이미 두 번째 원소를 가리키고, 마지막에는 범위를 벗어나요. 옆에서 함께 받은 topic 을 사용하면 됩니다. 조건에 맞는 항목만 골라도 원래 번호는 남아요 minutes = [20, 45, 30, 10] for day, minute in enumerate(minutes, start=1): if minute >= 30: print(f"{day}일차: {minute}분") 2일차: 45분 3일차: 30분 목표를 채운 날만 출력하지만 번호가 1, 2로 다시 매겨지지는 않아요. 원래 기록을 순서대로 돌면서 번호를 붙였기 때문이에요. 달성한 날을 1번부터 다시 세고 싶다면 필터링한 결과에 번호를 붙여야 해요. 빈 리스트라면 반복문 본문은 한 번도 실행되지 않아요. 별도 예외 처리 없이 자연스럽게 끝납니다. 번호가 원래 위치인지, 화면에 보여 줄 순번인지 를 정해 두면 변수 이름도 고르기 쉬워요. 인덱스에는 index , 표시용 번호에는 number 처럼 역할을 드러내 두려고 해요. 참고: Python 공식 문서 — enumerate
Score: 54.4Confidence: 49%
View offervelog
포춘 비즈니스 인사이트(Fortune Business Insights)에 따르면, 전 세계 수의학 참조 실험실 시장 규모는 2025년 46억 7천만 달러였으며, 2026년 49억 2천만 달러에서 2034년 78억 7천만 달러로 성장하여 예측 기간 동안 연평균 6.1%의 성장률을 보일 것으로 예상됩니다. 북미는 2025년 기준 43.89%의 시장 점유율로 전 세계 수의학 참조 실험실 시장을 주도했습니다. 반려동물 소유 증가, 동물 건강에 대한 인식 제고, 그리고 수의사들이 정확한 질병 진단 및 치료 계획 수립을 위해 첨단 진단 서비스에 대한 의존도가 높아짐에 따라 수의학 전문 검사실 시장의 수요가 증가하고 있습니다. 수의학 전문 검사실은 반려동물, 가축 및 기타 동물에 대한 전문적인 검사 및 진단 지원을 제공합니다. 예방적 수의학, 전염병 감시 및 실험실 기반 진단에 대한 중요성이 커지면서 수의학 전문 검사실 시장의 성장을 견인하고 있습니다. 자세한 내용은 계속 읽어보세요. https://www.fortunebusinessinsights.com/industry-reports/veterinary-reference-laboratories-market-100687 시장 세분화 수의학 전문 검사실 시장은 동물 종류, 검사 유형 및 최종 사용자를 기준으로 세분화할 수 있습니다. 동물 종류별로는 반려동물, 가축 및 기타 동물 범주로 나뉩니다. 반려동물은 예방 관리, 질병 진단 및 전반적인 동물 건강 관리에 중점을 둔 수의 서비스를 찾는 보호자가 증가함에 따라 중요한 응용 분야입니다. 가축 검사 또한 동물 건강 모니터링, 전염병 식별 및 가축 관리 지원에 중요합니다. 검사 유형별로는 임상 화학, 혈액학, 면역 진단, 분자 진단, 미생물학, 병리학, 독성학 및 기타 전문 검사 서비스가 포함됩니다. 분자 진단은 전염병 및 기타 질환의 진단을 지원하는 능력 때문에 주목받고 있습니다. 임상 화학과 혈액학은 일상적인 수의학 진단의 중요한 구성 요소로 남아 있으며, 병리학과 미생물학은 복잡한 사례에 대한 추가적인 진단 정보를 제공합니다. 수의학 전문 검사실 시장은 최종 사용자별로 동물병원 및 진료소, 수의학 연구기관, 진단센터, 동물보건 회사, 기타 사용자로 세분화될 수 있습니다. 동물병원 및 진료소는 자체 시설에서 제공할 수 없는 전문 검사를 위해 전문 검사실에 의존하기 때문에 주요 수요처입니다. 연구기관과 동물보건 단체 또한 연구, 감시 및 질병 조사를 위해 전문 검사실 서비스를 이용합니다. 주요 인물 IDEXX Laboratories, Inc. 앤텍 진단 조에티스 주식회사 마스 주식회사 찰스 리버 연구소 VCA 동물병원 네오젠 주식회사 SYNLAB 그룹 유로핀스 사이언티픽 헤스카 코퍼레이션 시장 성장 수의학 전문 검사실 시장은 동물 건강에 대한 인식 증가와 조기 질병 발견의 중요성에 대한 인식 제고에 힘입어 성장하고 있습니다. 반려동물 소유주들은 수의 진료에 대한 투자 의지가 높아지고 있으며, 수의사들은 임상적 의사결정을 지원하기 위해 실험실 기반 진단 방법을 도입하고 있습니다. 이러한 추세는 전문 검사실 서비스 이용 증가를 촉진하고 있습니다. 반려동물 개체 수 증가는 수의학 전문 검사실 시장 성장을 뒷받침하는 또 다른 중요한 요인입니다. 반려동물이 가정의 구성원으로 여겨지면서 예방적 건강 관리, 정기 검진, 질병 관리 및 전문 치료에 대한 관심이 높아지고 있습니다. 수의학 전문 검사실은 수의사들이 다양한 건강 상태를 진단하고 관리하는 데 도움이 되는 진단 정보를 제공함으로써 이러한 활동을 지원합니다. 동물에서 감염성 및 만성 질환의 유병률 증가 또한 검사 수요 증가에 기여하고 있습니다. 수의학 전문 검사실은 병원체 식별, 질병 진행 상황 모니터링, 적절한 치료 결정 지원에 도움이 되는 전문적인 진단 기능을 제공할 수 있습니다. 질병 감시는 가축 및 기타 동물 개체군에 특히 중요한데, 동물 건강은 식량 생산 및 공중 보건에 영향을 미칠 수 있기 때문입니다. 기술 발전은 수의학 전문 검사실 시장의 성장을 더욱 촉진하고 있습니다. 분자 진단, 고급 병리학, 면역 진단, 유전자 검사 및 자동화된 실험실 시스템은 수의학 검사 서비스의 범위와 효율성을 향상시키고 있습니다. 검사실들은 정확하고 시의적절한 진단 정보를 제공하기 위해 첨단 기술을 점점 더 많이 도입하고 있습니다. 디지털 기술의 통합이 확대됨에 따라 추가적인 기회가 창출되고 있습니다. 디지털 실험실 시스템, 전자 보고, 자동화된 워크플로우 및 데이터 관리 기술은 전문 검사실과 수의사 간의 소통을 개선할 수 있습니다. 이러한 기능은 검사 과정을 간소화하고 진단 정보에 대한 접근성을 높이는 데 도움이 될 수 있습니다. 수의학 의료비 지출 증가 또한 시장 성장을 뒷받침하고 있습니다. 동물병원과 동물병원은 진단 역량을 확장하고 있으며, 전문 검사를 위해 외부 전문 검사실을 점점 더 많이 이용하고 있습니다. 수의학이 더욱 고도화됨에 따라 검사실 서비스에 대한 수요는 기본적인 진단 절차를 넘어 전문 검사 및 질병 연구로 확대되고 있습니다. 제약 요인 수의 진단검사 전문 연구소 시장은 첨단 진단 장비와 전문 실험실 인프라 구축에 따른 높은 비용으로 인해 어려움을 겪고 있습니다. 정교한 검사 시설을 구축하고 유지하려면 장비, 숙련된 인력, 품질 시스템 및 실험실 운영에 대한 투자가 필요합니다. 이러한 요구 사항은 소규모 진단 서비스 제공업체에게 진입 장벽이 될 수 있습니다. 숙련된 수의학 실험실 전문가 부족 또한 시장 발전에 영향을 미칠 수 있습니다. 첨단 검사 절차에는 실험실 과학, 수의 진단, 분자 생물학, 병리학 및 관련 분야에 대한 전문 지식을 갖춘 숙련된 인력이 필요합니다. 따라서 전문 분야에서 운영되는 연구소는 자격을 갖춘 전문가를 채용하고 유지하는 데 어려움을 겪을 수 있습니다. 규제 요건 또한 수의 진단검사 전문 연구소 시장에 영향을 미치는 요인입니다. 연구소는 검사 절차, 품질 관리, 검체 처리, 데이터 관리 및 보고와 관련된 적용 가능한 표준을 준수해야 합니다. 규제 요건은 운영의 복잡성을 증가시키고 품질 시스템에 대한 지속적인 투자를 요구할 수 있습니다. 검체 운송 및 처리 또한 어려움을 야기할 수 있습니다. 수의 진단검사 전문 연구소는 광범위한 지역에 걸쳐 있는 동물병원과 동물병원으로부터 검체를 접수하는 경우가 많습니다. 검체 채취, 운송 및 처리 과정에서 적절한 검체 상태를 유지하는 것은 신뢰할 수 있는 검사 결과를 얻는 데 중요합니다. 동물 소유주의 비용 민감도 또한 수요에 영향을 미칠 수 있습니다. 수의 진단에 대한 인식이 높아지고 있지만, 전문 검사 비용은 첨단 실험실 서비스 이용 여부에 대한 결정에 걸림돌이 될 수 있습니다. 따라서 수의사와 실험실은 진단 역량과 경제성 및 접근성 사이에서 균형을 맞춰야 합니다. 지역 분석 북미는 높은 반려동물 보유율, 잘 구축된 수의 의료 인프라, 선진 진단 기술, 그리고 동물 건강에 대한 높은 인식에 힘입어 수의학 전문 검사실 시장의 주요 지역으로 자리매김하고 있습니다. 이 지역은 동물병원, 진료소, 진단 검사실, 그리고 동물 건강 관련 기업들의 네트워크가 잘 발달되어 있어 전문 검사 서비스에 대한 수요를 충족시키고 있습니다. 유럽은 동물 복지, 예방 수의학, 질병 감시, 그리고 첨단 진단 기술에 대한 관심이 증가함에 따라 수의학 전문 검사실 시장의 중요한 시장입니다. 이 지역은 잘 구축된 수의 의료 시스템과 탄탄한 연구 환경을 갖추고 있어 전문 검사실 도입을 적극적으로 지원하고 있습니다. 아시아 태평양 지역은 반려동물 보유율 증가, 수의 의료 인프라 발달, 그리고 동물 건강에 대한 인식 확대로 인해 수의학 전문 검사실 시장의 성장 기회를 제공하고 있습니다. 도시화의 진행과 반려동물에 대한 인식 변화는 수의 서비스 수요를 촉진하고 있습니다. 가축 건강 관리 및 전염병 모니터링 또한 검사실 검사의 필요성을 증가시키는 요인입니다. 라틴 아메리카는 상당한 규모의 축산업과 증가하는 수의 의료 서비스 수요로 인해 시장 개발 기회를 제공합니다. 수의학 전문 검사실은 질병 진단, 가축 건강 모니터링 및 수의학 연구를 지원합니다. 동물 건강 인프라에 대한 투자 증가는 전문 검사실 서비스 도입을 더욱 촉진할 수 있습니다. 중동 및 아프리카 지역 또한 수의 의료 인프라 확장과 동물 건강에 대한 인식 제고와 관련된 기회를 목격하고 있습니다. 가축 관리, 반려동물 관리 및 질병 감시는 검사실 기반 진단에 대한 수요 증가에 기여할 수 있습니다. 수의 서비스 및 검사실 역량의 향상은 향후 시장 발전을 뒷받침할 것입니다. 전반적으로 수의학 전문 검사실 시장은 반려동물 소유 증가, 동물 건강에 대한 인식 제고, 예방적 수의학 진료 수요 증가, 동물 질병 유병률 증가, 진단 기술 발전 및 수의 의료 인프라 확장에 의해 형성되고 있습니다. 전문 검사실은 정확한 진단, 질병 모니터링, 치료 계획 수립 및 광범위한 동물 건강 관리를 지원하는 전문 검사 기능을 제공함으로써 수의 전문가에게 점점 더 중요한 파트너가 되고 있습니다. 일본 시장을 이끄는 요인은 무엇일까요? 최신 수의학 참조 실험실 시장 분석 정보를 확인하세요. https://www.fortunebusinessinsights.com/jp/%E6%A5%AD%E7%95%8C-%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88/%E7%8D%A3%E5%8C%BB%E5%9F%BA%E6%BA%96%E7%A0%94%E7%A9%B6%E6%89%80%E5%B8%82%E5%A0%B4-100687
velog
개발 메모를 복습하면서 .env 와 .gitignore 의 역할을 함께 정리해 봅니다. 둘 다 이름 앞에 점이 있어서 비슷해 보이지만, 하는 일은 달라요. 파일 이름 앞에 점만 붙이면 될까요? .env 는 환경 설정을 적어 두는 파일 이름으로 자주 쓰여요. 이름이 .env 라는 이유만으로 Git이 자동으로 제외해 주지는 않아요. 비밀값을 담았다면 파일 이름만 믿으면 안 되겠죠. 프로젝트 루트의 .gitignore 에 아래처럼 적을 수 있어요. .env .venv/ __pycache__/ 이 예제에서는 .env 파일, .venv 디렉터리, Python이 만드는 __pycache__ 디렉터리를 무시하도록 지정했어요. 실제로 어떤 파일을 제외할지는 프로젝트에 맞춰 정하면 됩니다. 여기서 기억할 점은 이미 Git이 추적하는 파일에는 이 규칙만 추가해도 효과가 없다는 것 이에요. .gitignore 는 과거 커밋을 지우는 기능도 아니에요. 먼저 추적 중인지 살펴봐요 다음 명령은 프로젝트 저장소 안에서 실행해요. git ls-files -- .env .env 가 출력된다면 Git이 이미 추적하고 있는 상태예요. 아직 추적하지 않는 파일에 어떤 무시 규칙이 적용되는지 알고 싶다면 다음 명령을 사용할 수 있어요. git check-ignore -v .env 규칙과 파일 경로가 출력되면 어느 설정에서 제외했는지 확인할 수 있어요. 출력이 없을 때는 파일이 이미 추적 중인 상황인지도 함께 살펴봐야 해요. 추적을 멈추는 것과 기록을 지우는 것은 달라요 이미 추적 중인 .env 를 다음 커밋부터 제외하려면, 무시 규칙을 추가한 뒤 아래 명령을 사용할 수 있어요. git rm --cached -- .env git status --cached 를 붙이면 작업 폴더의 파일은 남기고 Git의 추적 대상에서 제거해요. 변경 내용을 확인한 뒤 커밋해야 저장소에도 반영됩니다. 다만 이 작업으로 예전 커밋의 내용까지 사라지지는 않아요. 실제 키가 공개됐다면 파일만 지우고 끝낼 게 아니라, 해당 서비스에서 키를 폐기하고 새로 발급해야 합니다. 이번 복습에서 남겨 둘 문장은 간단해요. 파일 이름, 무시 규칙, 기존 추적 여부를 따로 확인하자. 이 세 가지를 구분하면 “적어 뒀는데 왜 계속 보이지?”라는 상황을 이해하기 쉬워져요. 참고: Git 공식 문서 — gitignore
Score: 54.4Confidence: 49%
View offervelog
HTML CSS 자바 스크립트 --> DOM (랜더링) 내용 줄거리 꾸밈, 스타일링 동작 인터랙션 HTML, CSS, JS에 화면을 읽혀서 그림을 그려내는 과정 rel = "stylesheet" href = "./style.css" a;active { background-color: blue; color: white; } .movie { font-size: 1.5rem; } { background-color: #000088; color: rgba(255, 255, 0, 0.4); } [class="movie"]{ border:3px solid red; }
Score: 54.4Confidence: 49%
View offervelog
강의 1~4강 내용을 요약하고, 따로 알아두면 좋을 내용을 덧붙인 정리입니다. 1. Redis를 쓰는 이유: Disk vs Memory RDB가 느려지는 지점 MySQL, PostgreSQL 같은 RDB는 데이터를 디스크(SSD/HDD) 에 저장한다. 장점: 전원이 꺼져도 데이터가 남고(영속성), 용량 대비 저렴하다. 단점: 읽기/쓰기마다 Disk I/O 가 발생하고, 트래픽이 늘면 대부분 여기서 병목이 생긴다. 속도 차이 (대략적인 수치) 저장 위치 조회 시간 L1 Cache ~0.5 ns RAM ~100 ns SSD 100 150 μs HDD 5 10 ms RAM은 SSD보다 약 1,000배 이상 빠르다. 트래픽이 늘 때 DB 서버 사양만 올리는 것(Scale-up)은 비용 효율이 나쁘다. Redis는 데이터를 메모리에 두는 In-Memory 데이터 구조 저장소 여서 디스크 접근을 줄이고 응답을 빠르게 만든다. ✍️ 추가로 기억할 점 위 수치는 저장 매체 자체 의 차이다. 애플리케이션에서 Redis를 호출하면 네트워크 왕복(보통 수백 μs ~ 1ms 안팎) 이 붙기 때문에, 체감 차이가 1,000배까지 나지는 않는다. 그래도 DB 쿼리(인덱스 탐색, 락, 디스크 읽기)에 비하면 훨씬 빠르고 DB 부하를 줄인다 는 효과가 더 크다. Redis가 빠른 이유는 메모리뿐이 아니다. 명령을 싱글 스레드로 처리 해서 락 경쟁과 컨텍스트 스위칭이 없고, I/O 멀티플렉싱으로 많은 연결을 동시에 받는다. (6.0부터 네트워크 I/O는 멀티스레드 옵션이 있지만 명령 실행은 여전히 싱글 스레드) 그래서 KEYS * , 큰 컬렉션 전체 조회 같은 O(N) 명령 하나가 전체를 막을 수 있다. 운영에서는 SCAN 을 사용한다. 2. 로컬 캐시 vs 글로벌 캐시(Redis) 모든 데이터를 Redis에 넣으면 안 될까? 비용 : RAM은 디스크보다 훨씬 비싸다. 휘발성 : 메모리는 전원이 꺼지면 사라진다. 백업 기능이 있어도 영구 보관은 디스크 기반 RDB가 유리하다. 로컬 캐시 애플리케이션 내부 메모리( HashMap , ConcurrentHashMap 등)에 데이터를 담는 방식이다. 네트워크를 타지 않아서 가장 빠르다. 대신 서버가 꺼지면 사라지고, 해당 서버에서만 볼 수 있다. 분산 환경에서 생기는 문제: 데이터 부정합 서버가 여러 대(Scale-out)일 때 로컬 캐시만 쓰면 이런 일이 생긴다. 1번 서버가 "홍길동"을 로컬 캐시에 저장한다. 이름 수정 요청이 2번 서버로 가서 DB는 "고길동"으로 바뀐다. 다음 조회가 1번 서버로 가면 캐시에 남은 옛 값 "홍길동" 을 보여준다. → 요청이 어느 서버로 가느냐에 따라 데이터가 달라 보인다. Redis = 모든 서버가 함께 보는 중앙 저장소 어느 서버가 수정하든 하나의 저장소 를 보므로 정합성을 맞추기 쉽다. 캐시/세션을 서버 밖에 두니 서버를 Stateless 하게 만들 수 있어 확장이 쉬워진다. 구분 로컬 캐시 글로벌 캐시(Redis) 속도 가장 빠름 (네트워크 X) 빠름 (네트워크 O) 일관성 서버 간 공유 불가 모든 서버가 같은 데이터 적합한 데이터 변경 적은 데이터(국가코드, 설정값) 공유·자주 바뀌는 데이터(세션, 재고, 이벤트) ✍️ 추가로 기억할 점 실무에서는 둘 중 하나만 고르기보다 2단계 캐시(Local → Redis → DB) 를 쓰는 경우도 많다. (Java에서는 Caffeine + Redis 조합이 흔함). 이때 로컬 캐시 무효화는 Redis Pub/Sub 등으로 서버들에 알려준다. Spring에서는 spring-session-data-redis 로 세션을 Redis에 두면 Sticky Session 없이 서버를 늘릴 수 있다. HashMap 을 캐시로 쓸 때는 만료(TTL)와 최대 크기 제한이 없어서 메모리가 계속 늘 수 있다. 직접 구현하기보다는 캐시 라이브러리를 쓰는 편이 안전하다. 3. Redis의 위치: RDB와 함께 쓰는 하이브리드 구조 역할 분담 RDB : 신뢰성이 우선. 최종적으로 정확하다고 보는 원본 저장소(Source of Truth) Redis : 속도가 우선. 자주 쓰는 데이터의 임시 보관소 + 빠른 연산소 Redis는 RDB를 대체하지 않고 보완 한다. Cache-Aside (Look-aside) — 가장 많이 쓰는 읽기 전략 애플리케이션이 먼저 Redis를 조회한다. Cache Hit → 바로 반환한다. Cache Miss → DB에서 조회한다. 조회한 값을 Redis에 저장한 뒤 응답한다. Client → Web Server → Redis (Hit이면 바로 반환) ↘ DB (Miss일 때 조회 후 Redis에 저장) 쓰기 전략 Write-Through : 쓸 때 Redis와 DB를 함께 갱신한다. 최신 상태를 유지하지만 쓰기가 느려진다. Write-Back (Write-Behind) : Redis에 먼저 쓰고, 나중에 DB에 모아서 반영한다. 쓰기 성능은 좋지만 반영 전에 Redis가 죽으면 유실 될 수 있다. (조회수, 좋아요 집계, 로그 등에 사용) 왜 섞어 쓰는가 유실 위험 : 중요한 데이터는 RDB에 남아 있어야 한다. 비용 효율 : 자주 쓰는 일부 데이터만 RAM에 두고 나머지는 디스크에 둔다. (파레토 법칙) ✍️ 추가로 기억할 점 TTL은 거의 필수다. 만료 시간 없이 캐싱하면 DB와 값이 어긋난 채로 계속 남을 수 있다. 수정 시에는 캐시를 갱신하기보다 삭제(Evict)하는 편이 안전한 경우가 많다. 두 요청이 동시에 갱신하면 순서가 꼬여 옛 값이 남을 수 있기 때문이다. (DB 수정 → 캐시 삭제 → 다음 조회 때 다시 채움) Cache Stampede (Thundering Herd) : 인기 키가 만료되는 순간 많은 요청이 동시에 DB로 몰리는 현상이다. 락, 만료 전 미리 갱신, TTL에 랜덤값(jitter) 추가 등으로 완화한다. Cache Penetration : DB에도 없는 키를 계속 조회하면 매번 DB로 간다. "없음" 결과도 짧은 TTL로 캐싱하는 방법이 있다. 메모리가 가득 차면? maxmemory 와 maxmemory-policy 로 동작을 정한다. 캐시 용도라면 보통 allkeys-lru 나 allkeys-lfu 를 쓴다. 기본값 noeviction 은 가득 차면 쓰기가 에러 난다. 용어 주의 : Redis의 영속성 옵션인 RDB(스냅샷 파일) 와 관계형 DB를 뜻하는 RDB 는 다른 개념이다. Redis 영속성은 RDB(주기적 스냅샷) 와 AOF(명령 로그 기록) 두 가지다. 4. 글로벌 기업의 Redis 활용 사례 서비스 문제 Redis 활용 주로 쓰는 자료구조 Twitter(X) 팔로워 수천만 명의 타임라인을 즉시 보여줘야 함 유저별 타임라인을 미리 만들어 저장 List Netflix 이어보기·추천을 빠르게 보여줘야 함 시청 기록, 찜 목록 등 개인화 데이터 캐싱 Hash, Set 등 쿠팡 등 이커머스 선착순 이벤트에 요청이 몰리면 DB 락 병목 DB 부하 차단 + 원자적 연산 으로 재고 처리 String( DECR ), Lua 온라인 게임 실시간 순위를 매번 ORDER BY 로 계산하면 부하 점수 기반 정렬 저장 Sorted Set Redis를 많이 쓰는 3대 영역 Caching : 반복 조회를 빠르게 Real-time Stats : 순위, 조회수, 재고 같은 실시간 계산 Session Management : 여러 서버가 인증 정보를 공유 ✍️ 추가로 기억할 점 Twitter의 타임라인 방식은 Fan-out on Write 다. 글을 쓸 때 팔로워 타임라인에 미리 넣어둔다. 다만 팔로워가 너무 많은 계정은 쓰기 비용이 커서, 이런 계정은 읽을 때 합치는 방식(Fan-out on Read) 을 섞는다. 선착순 재고가 Redis에서 안전한 이유 : 명령이 싱글 스레드로 하나씩 실행되므로 DECR , INCR 하나하나는 원자적이다. 하지만 "조회 후 차감"처럼 명령 여러 개를 이어 붙이면 원자성이 깨진다. 이 경우 Lua 스크립트 나 MULTI/EXEC 로 묶어야 한다. Sorted Set 순위 조회 ( ZRANK , ZREVRANK )는 O(log N)이다. 데이터가 많아도 빠른 이유가 여기에 있다. 분산 락이 필요하면 SET key value NX PX <ms> 나 Redisson 같은 라이브러리를 쓴다. 라이선스 이슈 : 2024년 Redis가 라이선스를 변경하면서 Linux Foundation 쪽에서 Valkey 라는 포크가 나왔다. 이후 Redis 8에서 AGPL 옵션이 추가됐다. AWS ElastiCache 등 클라우드 서비스를 고를 때 한 번쯤 확인할 만하다. 📌 한 줄 요약 디스크는 안전하지만 느리고, 메모리는 빠르지만 비싸고 휘발성이다. 서버가 여러 대라면 로컬 캐시만으로는 데이터가 어긋나므로 중앙 저장소로 Redis 를 둔다. Redis는 RDB를 대체하지 않고, Cache-Aside 로 앞단에서 DB 부하를 막는다. 캐싱할 때는 TTL, 무효화 방식, Stampede, 메모리 정책 을 함께 설계해야 한다.
Score: 54.4Confidence: 49%
Score: 54.4Confidence: 49%
Score: 54.4Confidence: 49%
Score: 54.4Confidence: 49%