[{"data":1,"prerenderedAt":445},["ShallowReactive",2],{"post-document:\u002Fbackend\u002Fmsa\u002F2026\u002F08\u002F26\u002FMonolith\u002F":3},{"id":4,"title":5,"body":6,"categories":429,"date":432,"description":433,"extension":434,"image":435,"key_concepts":435,"last_modified_at":435,"legacyPath":436,"meta":437,"navigation":439,"part":435,"path":440,"published":439,"robots":435,"seo":441,"series":435,"stem":442,"strengths":435,"summary":435,"tags":443,"tradeoffs":435,"__hash__":444},"posts\u002Fposts\u002FBackend\u002FMSA\u002FMonolith.md","1. Monolith",{"type":7,"value":8,"toc":426},"minimark",[9,13,17,20,23,26,29,32,36,39,45,48,51,56,59,62,65,68,71,74,77,80,83,86,89,92,96,99,102,105,108,111,114,117,120,123,126,129,132,135,139,142,145,148,153,156,159,162,165,168,171,174,177,180,183,186,189,197,200,203,206,209,212,215,218,221,224,227,230,234,237,240,243,246,249,252,255,258,264,267,270,273,276,279,290,293,298,301,304,307,310,313,316,320,323,326,329,339,342,345,348,351,355,358,363,366,369,372,375,378,381,384,387,390,393,399,402,405,408,413,416,419,423],[10,11,5],"h1",{"id":12},"_1-monolith",[14,15,16],"p",{},"단어의 유래\nMonolith",[14,18,19],{},"mono = 하나\nlith = 돌",[14,21,22],{},"원래는 하나의 거대한 돌이라는 뜻",[14,24,25],{},"건축물의 거대한 단일 석재를 생각하면 된다.",[14,27,28],{},"소프트웨어에서는",[14,30,31],{},"여러 기능이 하나의 애플리케이션 안에 들어있고, 하나의 단위로 빌드, 배포되는 구조를 뜻한다.",[10,33,35],{"id":34},"_2-monolith의-핵심-철학","2. Monolith의 핵심 철학",[14,37,38],{},"사실 Monolith의 핵심 철학 자체가",[40,41,42],"blockquote",{},[14,43,44],{},"“다 때려 넣자”",[14,46,47],{},"이게 아니다.",[14,49,50],{},"좀 더 정확하게 말하자면,",[40,52,53],{},[14,54,55],{},"하나의 프로그램 안에서 기능들을 함께 관리하고 함께 배포한다.",[14,57,58],{},"이게 핵심 철학이다. (비빔밥처럼 막 쓰가는게 아님)",[14,60,61],{},"쇼핑몰 Backend",[14,63,64],{},"┌─────────────────────────────┐\n│      Spring Boot App        │\n│                             │\n│ User                        │\n│ Product                     │\n│ Order                       │\n│ Payment                     │\n│ Recommend                   │\n│                             │\n└─────────────────────────────┘\n↓\nDB",[14,66,67],{},"아 물론",[14,69,70],{},"코드가 패키지별로 잘 분리되어 있을 수 있다.",[14,72,73],{},"com.shop\n├─ user\n├─ product\n├─ order\n├─ payment\n└─ recommend",[14,75,76],{},"결국은",[14,78,79],{},"하나의 JAR",[14,81,82],{},"하나의 Application",[14,84,85],{},"하나의 배포",[14,87,88],{},"라면",[14,90,91],{},"일반적으로 Monolith라고 한다.",[10,93,95],{"id":94},"_3-그러면-왜-monolith를-쓰는가","3. 그러면 왜 Monolith를 쓰는가?",[14,97,98],{},"가장 큰 이유는 단순함",[14,100,101],{},"예를 들어 쇼핑몰을 처음 만든다고 치자",[14,103,104],{},"MSA라면 처음부터",[14,106,107],{},"User Service\nProduct Service\nOrder Service\nPayment Service",[14,109,110],{},"를 각각 만들어야 한다.",[14,112,113],{},"다만",[14,115,116],{},"서비스 통신\n서비스 검색\n인증\n네트워크\nDocker\n로그 수집\nKafka\n분산 트랜잭션\n배포\nMonitoring",[14,118,119],{},"까지 고민해야 한다.",[14,121,122],{},"반면 Monolith는:",[14,124,125],{},"Frontend -> Spring Boot -> Database",[14,127,128],{},"정도로 할 수 있다.",[14,130,131],{},"즉 금방 개발 할 수 있다는 것이다.",[14,133,134],{},"그래서 초기 개발이 아주 빠르다.",[10,136,138],{"id":137},"_4-그러면-monolith는-어떻게-설계하는가","4. 그러면 Monolith는 어떻게 설계하는가?",[14,140,141],{},"Monolith는 대충 설계해도 되는거 아닌가..?",[14,143,144],{},"라는 굉장히 중요한 오해를 할 수 있음",[14,146,147],{},"실제로는 설계를 잘 해야 하낟.",[40,149,150],{},[14,151,152],{},"Monolith라고 구조 없이 만들면 안 된다.",[14,154,155],{},"좋은 Monolith는 내부적으로 책임을 분리",[14,157,158],{},"Application",[14,160,161],{},"User Domain\n├─ UserController\n├─ UserService\n└─ UserRepository",[14,163,164],{},"Order Domain\n├─ OrderController\n├─ OrderService\n└─ OrderRepository",[14,166,167],{},"Payment Domain\n├─ PaymentController\n├─ PaymentService\n└─ PaymentRepository",[14,169,170],{},"모놀리식의 핵심 철학은",[14,172,173],{},"물리적으로는 하나",[14,175,176],{},"논리적으로는 여러 책임",[14,178,179],{},"다만 문제는 프로젝트 규모가 커지기 시작하면서",[14,181,182],{},"서로가 서로를 참조하기 시작하게 되는 것",[14,184,185],{},"OrderService\n↓\nUserRepository\n↓\nPaymentService\n↓\nProductRepository\n↓\nOrderRepository\n↓\nUserService",[14,187,188],{},"서로 막 참조하기 시작하게 된다.",[190,191,193],"ol",{"start":192},5,[194,195,196],"li",{},"프로젝트가 커지면 Monolith에서 무슨 문제가 생기는가?",[14,198,199],{},"Coupling(결합도)",[14,201,202],{},"처음에는 이런 구조였다고 치자,\nUser\nOrder\nPayment\nProduct",[14,204,205],{},"각 기능이 자기 책임만 가지고 있으면 별 문제가 없지만,\n아시다시피.. 개발을 하다보면 다른 영역의 개체를 건드리기 시작한다.",[14,207,208],{},"OrderService\n├─ UserRepository\n├─ ProductRepository\n└─ PaymentService",[14,210,211],{},"PaymentService\n├─ OrderRepository\n└─ UserRepository",[14,213,214],{},"이렇게 서로가 서로를 참조하게 되고,",[14,216,217],{},"User\n↕\nOrder\n↕\nPayment\n↕\nProduct",[14,219,220],{},"처럼 서로 얽히는 문제가 발생한다.",[14,222,223],{},"(Spaghetti Code라고 들어봤을 터다)",[14,225,226],{},"하지만 중요한 점은,",[14,228,229],{},"이것은 Monolith이기 때문에 반드시 발생하는 문제가 아니다.\n이는 하나의 애플리케이션 내부에서 모듈 간 경계를 제대로 관리하지 않았기 때문에 발생하는 문제이다.",[10,231,233],{"id":232},"_6-그렇다면-결합도가-높아지면-왜-문제가-되는-것일까","6. 그렇다면 결합도가 높아지면 왜 문제가 되는 것일까?",[14,235,236],{},"위의 상황을 예시로 OrderService를 수정했다고 쳐보자.",[14,238,239],{},"그런데 Order가",[14,241,242],{},"Order\n-> payment\n-> User\n-> Product",[14,244,245],{},"와 강하게 연결되어 있는 경우에는",[14,247,248],{},"Order 하나를 변경했는데 Payment까지 영향을 받을 수 있다.",[14,250,251],{},"작은 변경\n↓\n영향 범위 증가\n↓\n테스트 범위 증가\n↓\n배포 위험 증가",[14,253,254],{},"내가 변경한 것이 어디까지 영향을 미치는지 추적을 하기가 어려워지는 것이다.",[14,256,257],{},"(이러한 거대한 Monolith에서 자주 발생한다고 한다.)",[190,259,261],{"start":260},7,[194,262,263],{},"Monolith는 Deployunit이 하나",[14,265,266],{},"Monolith에서 중요한 특징은 Deployment Unit이 하나라는 것",[14,268,269],{},"User\nProduct\nOrder\nPayment\nRecommend",[14,271,272],{},"중 Recommend 코드 한 줄만 수정했다고 하자.",[14,274,275],{},"이러면",[14,277,278],{},"전체 Application Build",[280,281,286],"pre",{"className":282,"code":284,"language":285},[283],"language-text","    ↓\n","text",[287,288,284],"code",{"__ignoreMap":289},"",[14,291,292],{},"shop.jar",[280,294,296],{"className":295,"code":284,"language":285},[283],[287,297,284],{"__ignoreMap":289},[14,299,300],{},"전체 Application Deploy",[14,302,303],{},"이렇게 전체 Deploy를 때려야 하는 문제가 있다.",[14,305,306],{},"Recommend만 바꿨는데 전체 쇼핑몰 Backend를 다시 배포해야 하는 것이다.",[14,308,309],{},"시스템 규모가 작으면 큰 문제가 아니다.",[14,311,312],{},"하지만 애플리케이션이 매우 커지면 Build, Test, Deploy 비용도 같이 증가한다.",[14,314,315],{},"이것도 비용이기에, 결국은 고려해야 한다.",[10,317,319],{"id":318},"_8-scaling에서도-문제가-생길-수-있다","8. Scaling에서도 문제가 생길 수 있다",[14,321,322],{},"예를 들어 쇼핑몰에서 갑자기 상품 조회 요청이 폭증",[14,324,325],{},"실제로 부하가 높은 부분은 Product",[14,327,328],{},"하지만 Monolith가 하나의 Application이라면 보통",[14,330,331,335,337],{},[332,333,334],"span",{},"User + Product + Order + Payment",[332,336,334],{},[332,338,334],{},[14,340,341],{},"처럼 애플리케이션 전체를 복제해서 Scale-Out 해야한다.",[14,343,344],{},"실제로 필요한 것은",[14,346,347],{},"Product\nProduct\nProduct\nProduct",[14,349,350],{},"인데 말이지... 따라서 기능마다 필요한 컴퓨팅 자원이 크게 다르면 비효율이 발생할 수 있다",[10,352,354],{"id":353},"_9-근데-monolith는-왜-씀","9. 근데 Monolith는 왜 씀?",[14,356,357],{},"그렇다면",[40,359,360],{},[14,361,362],{},"Monolith = 나쁜 아키텍처\nMSA = 좋은 아키텍처",[14,364,365],{},"일까? 그것은 당연히 아니다.",[14,367,368],{},"프로젝트의 목적성에 맞게 골라야 한다.",[14,370,371],{},"오히려 규모가 작은 서비스에서 MSA를 사용하면 불필요하게 복잡해질 수 있다.",[14,373,374],{},"그냥 Monolith에서는 간단하게 처리할 수 있는 것을",[14,376,377],{},"하지만 서비스를 분리하면 고민해야 할 것들이 많아진다.",[14,379,380],{},"Monolith",[14,382,383],{},"OrderService → PaymentService",[14,385,386],{},"이런거는 paymentService.pay();와 같이 메서드로 처리하면 된다.",[14,388,389],{},"MSA로 구현하면 아래와 같이 구현해야 하고, 고민해야 할 것들도 많아진다.",[14,391,392],{},"Order Service",[280,394,397],{"className":395,"code":396,"language":285},[283],"  ↓ HTTP \u002F Kafka\n",[287,398,396],{"__ignoreMap":289},[14,400,401],{},"Payment Service",[14,403,404],{},"Network Failure\nTimeout\nRetry\nCircuit Breaker\nService Discovery\nDistributed Logging\nDistributed Transaction\nMessage Queue\nMonitoring\nDeployment",[14,406,407],{},"다시 한 번 정리해보자면",[40,409,410],{},[14,411,412],{},"MSA는 복잡성을 제거하는 것이 아니라 복잡성의 위치를 바꾸는 것",[14,414,415],{},"절대로 만능인 것은 없다.",[14,417,418],{},"프로젝트의 목적성에 맞게, 어려운 지점이 무엇일지 잘 고민해서 선택하면 된다.",[10,420,422],{"id":421},"_10-그래서-좋은-monolith는-어떻게-만드는가","10. 그래서 좋은 Monolith는 어떻게 만드는가?",[14,424,425],{},"여기서 등장하는 생각이 Modular Monolith이다\n이거는 다음 장에서 설명하겠다.",{"title":289,"searchDepth":427,"depth":427,"links":428},2,[],[430,431],"Backend","MSA","2026-08-26 14:08:02 +0900","단어의 유래 Monolith","md",null,"\u002Fbackend\u002Fmsa\u002F2026\u002F08\u002F26\u002FMonolith\u002F",{"layout":438},"post",true,"\u002Fposts\u002Fbackend\u002Fmsa\u002Fmonolith",{"title":5,"description":433},"posts\u002FBackend\u002FMSA\u002FMonolith",[],"lLPhDIV9vrNJ3H49YyaDsSVKVd85eeNvQnwx-xAGbRQ",1788744785442]