<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Man vs Ai</title>
    <link>https://manvsai.tistory.com/</link>
    <description>백엔드 개발자 김재현입니다. 주로 공부하면서 느낀점을 기록합니다.</description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 10:25:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>MvA</managingEditor>
    <image>
      <title>Man vs Ai</title>
      <url>https://tistory1.daumcdn.net/tistory/7453391/attach/9f5a0742a49740ec96c9df989e06af94</url>
      <link>https://manvsai.tistory.com</link>
    </image>
    <item>
      <title>[Spotify Web API 7편] 배포 방법 구상</title>
      <link>https://manvsai.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;(글 오른쪽 하단 화이트/다크모드 전환 버튼을 통한 &lt;b&gt;화이트모드 사용 권장합니다.&lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BandFeed&lt;/b&gt;&amp;nbsp;서비스에서&amp;nbsp;&lt;b&gt;제공하는 기능 및 &lt;/b&gt;배포 시 사용할&lt;b&gt; 인프라 설계&lt;/b&gt; &lt;b&gt;의사결정 과정을 정리했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;제공하는 기능&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 더보기 토글은 지금까지 구현된 기능입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(변경사항이 있을 때마다 업데이트할 예정)&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(&amp;nbsp;26.06.15&amp;nbsp;기준&amp;nbsp;)&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  인증/공통 (Gateway)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JWT 기반 인증 필터 &amp;mdash; /api/users/signup, /api/users/login 제외 모든 요청 토큰 검증&lt;/li&gt;
&lt;li&gt;인증된 사용자 ID를 X-User-Id 헤더로 다운스트림 서비스에 전파&lt;/li&gt;
&lt;li&gt;서비스별 라우팅 (user/band/wiki/chat)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;User&amp;nbsp;Service&amp;nbsp;&amp;mdash;&amp;nbsp;회원/팔로우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원가입, 로그인(access/refresh 토큰 발급)&lt;/li&gt;
&lt;li&gt;내 프로필 조회/수정, 비밀번호 변경, 회원 탈퇴&lt;/li&gt;
&lt;li&gt;타 사용자 프로필 조회&lt;/li&gt;
&lt;li&gt;팔로우&amp;nbsp;/&amp;nbsp;언팔로우,&amp;nbsp;팔로워&amp;middot;팔로잉&amp;nbsp;목록&amp;nbsp;조회&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  Band Service &amp;mdash; 밴드 &amp;amp; 타임라인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;밴드 생성/조회(목록&amp;middot;페이지네이션)/수정/삭제 (리더 권한 검증)&lt;/li&gt;
&lt;li&gt;밴드 멤버 초대/조회/추방, 리더 권한 위임&lt;/li&gt;
&lt;li&gt;밴드 타임라인 게시글 CRUD + 페이지네이션&lt;/li&gt;
&lt;li&gt;내가 속한 밴드들의 게시글을 모은 피드(/feed)&lt;/li&gt;
&lt;li&gt;게시글&amp;nbsp;댓글&amp;nbsp;작성/조회/삭제&amp;nbsp;(작성자&amp;nbsp;권한&amp;nbsp;검증)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  Wiki Service &amp;mdash; 곡/악기 위키&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spotify 검색을 통한 곡 검색 및 등록&lt;/li&gt;
&lt;li&gt;곡 상세 조회&lt;/li&gt;
&lt;li&gt;곡별 악기 구성(난이도, 노트) 추가/조회/삭제&lt;/li&gt;
&lt;li&gt;곡에 대한 위키 게시글 CRUD + 페이지네이션(최신/오래된 순)&lt;/li&gt;
&lt;li&gt;Spotify&amp;nbsp;API&amp;nbsp;실패&amp;nbsp;시&amp;nbsp;502&amp;nbsp;예외&amp;nbsp;처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  Chat Service &amp;mdash; 1:1 채팅&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;채팅방 생성(또는 기존 방 재사용)/목록/상세/멤버 조회&lt;/li&gt;
&lt;li&gt;메시지 전송/조회(페이지네이션), 읽음 처리&lt;/li&gt;
&lt;li&gt;WebSocket(STOMP,&amp;nbsp;/ws)을&amp;nbsp;통한&amp;nbsp;실시간&amp;nbsp;메시지&amp;nbsp;송수신&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;⚙️ 공통 인프라&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Eureka(서비스 디스커버리), Config Server(중앙 설정 관리, GitHub 기반)&lt;/li&gt;
&lt;li&gt;공통 에러 처리(BusinessException/ErrorCode 패턴), Soft delete(created/updated/deleted 감사 칼럼)&lt;/li&gt;
&lt;li&gt;Flyway 기반 DB 스키마 마이그레이션 (이번에 추가)&lt;/li&gt;
&lt;li&gt;Kafka, Redis, 모니터링(Prometheus/Grafana/Loki/Zipkin, monitoring profile)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;배포&amp;nbsp;방식&amp;nbsp;의사결정&amp;nbsp;과정&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;초기 인프라 설계도&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWZGmV/dJMcaf7YTbn/AQWhW0LPs6YbhMrErfS7vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWZGmV/dJMcaf7YTbn/AQWhW0LPs6YbhMrErfS7vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWZGmV/dJMcaf7YTbn/AQWhW0LPs6YbhMrErfS7vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWZGmV%2FdJMcaf7YTbn%2FAQWhW0LPs6YbhMrErfS7vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;426&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 더보기 토글은 Claude가 초기 인프라 설계도를 지적한 내용입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원래 다이어그램에서 ECS EC2 launch type임을 알아보기 어려웠던 핵심 이유는 3가지입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &quot;EC2 instance contents&quot; 박스가 ECS와 무관한 독립된 호스트처럼 보임&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;private subnet 안의 EC2 박스가 ECS와 연결되어 있다는 표시 없이 그냥 단독으로 컨테이너들을 담고 있는 박스로 그려져 있었음&lt;/li&gt;
&lt;li&gt;이러면 &quot;이 EC2는 누가 관리하는가? docker-compose로 사람이 직접 띄운 건가, ECS가 관리하는 건가&quot;가 그림만으로는 구분 안 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. ECS&amp;harr;EC2 사이의 양방향 화살표에 라벨이 없음&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화살표만 있고 &quot;이게 무슨 관계냐&quot;(스케줄링 명령? 이미지 전달? 데이터 흐름?)가 안 적혀있어서, 처음에 사용자분이 &quot;ECS가 EC2로 이미지를 push 한다&quot;라고 오해하신 것처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;데이터 흐름으로 잘못 읽힐 여지&lt;/b&gt;가 컸음&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. ECS와 ECR이 나란히, 같은 톤의 박스로 그려져서 &quot;EC2가 의존하는 외부 리소스&quot; 묶음처럼 보임&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RDS/ElastiCache 같은 &quot;EC2가 사용하는 데이터 저장소&quot;와 시각적으로 동급으로 배치되어, ECS도 그런 &quot;리소스&quot;처럼 인식되기 쉬움&lt;/li&gt;
&lt;li&gt;실제로는 ECS는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;EC2를 관리하는 컨트롤 플레인&lt;/b&gt;이라 위계가 다름 (EC2가 ECS에 등록된 &quot;일원&quot;이라는 포함 관계)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떻게 표현했어야 했나&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(제가 v2에서 수정한 방식)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 박스를 **&quot;Private subnet &amp;mdash; EC2 (ECS 컨테이너 인스턴스)&quot;**처럼 라벨링해서, 이 EC2가 ECS 클러스터의 멤버임을 명시&lt;/li&gt;
&lt;li&gt;ECS&amp;harr;EC2 화살표에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&quot;스케줄링&amp;middot;에이전트&quot;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;같은 라벨을 붙여서 컨트롤 플레인 관계임을 명확히&lt;/li&gt;
&lt;li&gt;ECR pull은 &quot;ECS가 직접 pull&quot;이 아니라 **&quot;EC2 위 ECS 에이전트가 pull&quot;**이라는 점이 드러나도록, 가능하면 화살표 출발점을 EC2 박스 쪽에 두는 것이 더 정확함 (지금 v2는 ECS&amp;rarr;ECR로 그려서 약간 단순화되어 있음 - 더 엄밀하게는 EC2 박스에서 ECR로 화살표를 그리는 게 맞음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;요약하면:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&quot;포함 관계(EC2가 ECS 클러스터의 일원)&quot;와 &quot;컨트롤 플레인 vs 데이터 플레인&quot;을 구분해서 표현&lt;/b&gt;했어야 오해가 없었을 것입니다.&lt;/p&gt;
&lt;h4 style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;이때 컨트롤 플레인, 데이터 플레인이란?&lt;/h4&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 네트워크/시스템 설계에서 쓰이는 개념인데, ECS 맥락에 맞춰 설명하면:&lt;/p&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Control plane (제어 영역)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;무엇을 어떻게 할지 결정하고 지시하는&quot; 부분&lt;/li&gt;
&lt;li&gt;실제 트래픽이나 데이터가 흐르는 경로가 아니라,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;설정/명령/상태 관리&lt;/b&gt;가 오가는 경로&lt;/li&gt;
&lt;li&gt;ECS 예시: &quot;이 task definition대로 컨테이너 2개를 이 EC2에 띄워라&quot;, &quot;이 컨테이너가 죽었으니 재시작해라&quot; 같은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;결정과 지시&lt;/b&gt;를 내리는 AWS ECS 서비스 자체&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Data plane (데이터 영역)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;실제로 일이 일어나는&quot; 부분&lt;/li&gt;
&lt;li&gt;사용자 요청, 이미지 파일, DB 쿼리 등&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실질적인 데이터/트래픽이 오가는&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;경로&lt;/li&gt;
&lt;li&gt;ECS 예시: 사용자 HTTP 요청이 ALB&amp;rarr;Gateway&amp;rarr;각 서비스로 흐르는 것, EC2의 ECS 에이전트가 ECR에서 실제 이미지 바이너리를 다운로드하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다이어그램 맥락에서 왜 중요한가&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;ECS &amp;rarr; EC2&quot; 화살표: control plane (ECS가 &quot;이 컨테이너 띄워&quot;라고 명령만 내림, 바이트 자체가 ECS를 거쳐가는 건 아님)&lt;/li&gt;
&lt;li&gt;&quot;EC2 &amp;rarr; ECR&quot; 화살표: data plane (실제 이미지 데이터가 이 경로로 다운로드됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 둘을 같은 종류의 화살표/같은 톤의 박스로 그리면, 보는 사람은 &quot;ECS가 이미지를 받아서 EC2에 전달해 주는 하나의 파이프라인&quot;처럼 오해하기 쉽습니다. 실제로는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ECS는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&quot;누가, 언제, 어디서 실행될지&quot;만 결정&lt;/b&gt;하고&lt;/li&gt;
&lt;li&gt;실제 이미지 다운로드(데이터 이동)는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;EC2의 에이전트가 ECR과 직접&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 둘을 분리해서 그리면(예: control plane은 점선+회색, data plane은 실선+컬러), &quot;ECS가 직접 이미지를 옮긴다&quot;는 오해를 막을 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인프라 설계도 수정 방안&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 1개의 개발계와 3개의 운영계(v1, v2, v3)로 나눠서 구성 및 마이그레이션 예정&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 개발계&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x1gCj/dJMcadPQsse/1V3xKleHspuKGEeuqOE55K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x1gCj/dJMcadPQsse/1V3xKleHspuKGEeuqOE55K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x1gCj/dJMcadPQsse/1V3xKleHspuKGEeuqOE55K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx1gCj%2FdJMcadPQsse%2F1V3xKleHspuKGEeuqOE55K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;473&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 개발 및 테스팅을 위해 도커 컴포즈 네트워크를 사용한다.&lt;br /&gt;로컬환경에서 각 서비스를 띄운다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 운영계 - v1&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTLVEM/dJMcaaljmYs/MfUnfKaLUukg5tBBMOmjbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTLVEM/dJMcaaljmYs/MfUnfKaLUukg5tBBMOmjbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTLVEM/dJMcaaljmYs/MfUnfKaLUukg5tBBMOmjbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTLVEM%2FdJMcaaljmYs%2FMfUnfKaLUukg5tBBMOmjbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;518&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;도커 컴포즈 스택이 EC2에서 그대로 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 단일 EC2 구조로 배포비용이 적고, 테스트가 용이하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- t3.small 기준 월 15$ ~ 20$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배포환경에서 기능 테스트 쉬움.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 향후 서비스 확장 시 구조적 한계로 관리하기 어렵다.&lt;br /&gt;- SPOF, 스케일링 한계, EC2 한 개에 트래픽 집중 -&amp;gt; 부담, 무중단 배포 어려움.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 운영계 - v2&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNEidt/dJMcaf7YTbo/tHwxmK4hKgKzuLRsoy0uJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNEidt/dJMcaf7YTbo/tHwxmK4hKgKzuLRsoy0uJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNEidt/dJMcaf7YTbo/tHwxmK4hKgKzuLRsoy0uJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNEidt%2FdJMcaf7YTbo%2FtHwxmK4hKgKzuLRsoy0uJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;596&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;936&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ECS는 컨테이너를 어디서 실행할지 스케쥴링하는 오 케스트레이터이다.&lt;br /&gt;동작 방식은 2가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;EC2 launch type
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;EC2 인스턴스 위에 ECS 컨테이너 에이전트를 설치&lt;/li&gt;
&lt;li&gt;EC2를 ECS 클러스터 인스턴스로 등록&lt;/li&gt;
&lt;li&gt;ECS가 도커 컨테이너를 이 EC2에 띄우라고 명령&lt;/li&gt;
&lt;li&gt;ECS 에이전트가 ECR(내부적으론 S3)에서 도커 이미지를 다운로드 및 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Fargate : 서버리스 구조, EC2 자체가 없음.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;위 사진은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그중 &lt;b&gt;EC2 launch type 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포 단위는 ECS task definition이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ECS가 새 이미지로 task를 교체하여 배포한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;참고로 ECR은 실제 도커 이미지는 내부적으로 S3에 저장하고 관리한다.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;따라서 EC2에서 ECR로부터 이미지를 다운로드하려고 하면&lt;/i&gt;&lt;br /&gt;&lt;i&gt;사실 S3에서 도커 이미지를 다운로드한다.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot;&gt;ECS는 스케줄링만 함. &lt;b&gt;(&lt;span style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot;&gt;제어 plane)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;실제 이미지 pull은 EC2가 함.&lt;b&gt; (데이터 plane)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ECS Agent &amp;rarr; ECR &amp;rarr; S3(레이어 실제 저장)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 운영계 - v3&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;1084&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baFycf/dJMb997NHoB/Vkz00aq723LbZtKRF1Xnjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baFycf/dJMb997NHoB/Vkz00aq723LbZtKRF1Xnjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baFycf/dJMb997NHoB/Vkz00aq723LbZtKRF1Xnjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaFycf%2FdJMb997NHoB%2FVkz00aq723LbZtKRF1Xnjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;690&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;1084&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ECS Fargate 방식을 적용하는 설계도이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 트레이드오프&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 98.954%; border: 1px solid #dddddd; font-family: sans-serif; height: 144px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;background-color: #f2f2f2; border-bottom: 2px solid #dddddd; height: 19px;&quot;&gt;
&lt;th style=&quot;padding: 12px; text-align: left; border-right: 1px solid #dddddd; font-weight: bold; color: #333333; width: 14.6658%; height: 19px;&quot;&gt;비교 항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; text-align: left; border-right: 1px solid #dddddd; font-weight: bold; color: #333333; width: 42.8018%; height: 19px;&quot;&gt;v2 &amp;mdash; EC2 Launch Type&lt;/th&gt;
&lt;th style=&quot;padding: 12px; text-align: left; font-weight: bold; color: #333333; width: 41.9497%; height: 19px;&quot;&gt;v3 &amp;mdash; ECS Fargate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;border-bottom: 1px solid #dddddd; height: 18px;&quot;&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; font-weight: bold; color: #333333; background-color: #fafafa; width: 14.6658%; height: 18px; text-align: center;&quot;&gt;인프라 관리&lt;/td&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; color: #555555; width: 42.8018%; height: 18px; text-align: center;&quot;&gt;개발자가 OS/Docker 직접 관리 (높은 공수)&lt;/td&gt;
&lt;td style=&quot;padding: 12px; color: #555555; width: 41.9497%; height: 18px; text-align: center;&quot;&gt;AWS가 관리형으로 대행 (공수 제로)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;border-bottom: 1px solid #dddddd; height: 18px;&quot;&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; font-weight: bold; color: #333333; background-color: #fafafa; width: 14.6658%; height: 18px; text-align: center;&quot;&gt;네트워크 모드&lt;/td&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; color: #555555; width: 42.8018%; height: 18px; text-align: center;&quot;&gt;Bridge 또는 호스트 포트 공유 방식 중심&lt;/td&gt;
&lt;td style=&quot;padding: 12px; color: #555555; width: 41.9497%; height: 18px; text-align: center;&quot;&gt;&lt;code style=&quot;background-color: #f1f1f1; padding: 2px 6px; border-radius: 4px; font-family: monospace;&quot;&gt;awsvpc&lt;/code&gt; 모드 강제 (Task별 고유 IP 부여)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;border-bottom: 1px solid #dddddd; height: 18px;&quot;&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; font-weight: bold; color: #333333; background-color: #fafafa; width: 14.6658%; height: 18px; text-align: center;&quot;&gt;보안 그룹 범위&lt;/td&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; color: #555555; width: 42.8018%; height: 18px; text-align: center;&quot;&gt;EC2 인스턴스 단위 (컨테이너간 공유)&lt;/td&gt;
&lt;td style=&quot;padding: 12px; color: #555555; width: 41.9497%; height: 18px; text-align: center;&quot;&gt;개별 컨테이너(Task) 단위 격리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;border-bottom: 1px solid #dddddd; height: 17px;&quot;&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; font-weight: bold; color: #333333; background-color: #fafafa; width: 14.6658%; height: 17px; text-align: center;&quot;&gt;스케일링 구조&lt;/td&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; color: #555555; width: 42.8018%; height: 17px; text-align: center;&quot;&gt;EC2 ASG + ECS Task 이중 설계 필요&lt;/td&gt;
&lt;td style=&quot;padding: 12px; color: #555555; width: 41.9497%; height: 17px; text-align: center;&quot;&gt;ECS Task 단일 오토스케일링으로 단순화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;border-bottom: 1px solid #dddddd; height: 18px;&quot;&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; font-weight: bold; color: #333333; background-color: #fafafa; width: 14.6658%; height: 18px; text-align: center;&quot;&gt;비용 효율성&lt;/td&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; color: #555555; width: 42.8018%; height: 18px; text-align: center;&quot;&gt;자원을 꽉 채워 쓰는 대규모 상시 운영에 유리&lt;/td&gt;
&lt;td style=&quot;padding: 12px; color: #555555; width: 41.9497%; height: 18px; text-align: center;&quot;&gt;트래픽 변동이 크거나 인프라 자동화에 유리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; font-weight: bold; color: #333333; background-color: #fafafa; width: 14.6658%; height: 36px; text-align: center;&quot;&gt;구성 난이도&lt;/td&gt;
&lt;td style=&quot;padding: 12px; border-right: 1px solid #dddddd; color: #555555; width: 42.8018%; height: 36px; text-align: center;&quot;&gt;높음 &lt;br /&gt;(EC2&amp;middot;Task 이중 스케일링 및 초기 에이전트 설정 필요 &lt;br /&gt;/ SSH 트러블슈팅은 용이)&lt;/td&gt;
&lt;td style=&quot;padding: 12px; color: #555555; width: 41.9497%; height: 36px; text-align: center;&quot;&gt;낮음 &lt;br /&gt;(서버 관리 생략 및 Task 단일 스케일링으로 단순함 &lt;br /&gt;/ 모니터링 시스템 구축 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프런트 배포 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백엔드를 운영계 v1&lt;/b&gt;으로&amp;nbsp;배포한다고 가정.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;옵션 1. Nginx 컨테이너 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 EC2의 docker-compose에 Nginx를 추가해 React 빌드 파일을 서빙하는 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점: 관리가 하나로 끝나 단순, 도메인이 같아 CORS 설정 필요 x&lt;/li&gt;
&lt;li&gt;단점: 안 그래도 무거운 v1 EC2 자원(Spring, DB 등)을 공유하므로 부하 커짐.&lt;br /&gt;서버가 터지면 프런트도 같이 죽음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;옵션 2. S3 + CloudFront 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- React 빌드 파일을 S3에 올리고, 글로벌 CDN인 CloudFront를 전면에 세워 배포하는 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점: EC2 자원을 전혀 쓰지 않아 API 연산에 집중 O&lt;br /&gt;백엔드가 다운되어도 프런트 화면은 정상적으로 유지.&lt;br /&gt;프리티어 범위 내에서 비용도 거의 무료.&lt;/li&gt;
&lt;li&gt;단점: 도메인이 찢어져 CORS 설정 필요&lt;br /&gt;배포 파이프라인(CI/CD)을 프런트/백엔드 각각 따로 구축해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&lt;b&gt; 옵션 1로 사용하다가 옵션 2로 마이그레이션 할 예정&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션2로 배포하면, 백엔드를 어떤 식으로 배포해도 상관없다.&lt;br /&gt;프론트와 백엔드 사이의 요청 경로만 그에 맞게 맞춰주면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 배포 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백엔드는 단일 EC2 + dokcer-compose 네트워크 방식 + ECR 구조&lt;/b&gt;로 배포한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프론트는&lt;/b&gt; 위 docker-compose에 Nginx 서비스를 추가한 &lt;b&gt;Nginx 컨테이너 방식&lt;/b&gt;으로 배포한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 위 구조를 채택한 이유&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;저렴한 비용&lt;/li&gt;
&lt;li&gt;쉬운 구성 난이도&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3개의 인프라 서비스와 4개의 비즈니스 서비스를 하나의 EC2에 올려야 한다.&lt;br /&gt;따라서 &lt;b&gt;EC2 인스턴스는&lt;/b&gt; 메모리 용량이 8GB인 &lt;b&gt;t3.large를 선택했다.&lt;br /&gt;&lt;/b&gt;-&amp;gt; 현재 AWS에서 제공하는 &lt;b&gt;EC2 프리티어 모델 중 메모리 8GB 인 것은 &lt;/b&gt;&lt;b&gt;m7i-flex.large&lt;/b&gt; 밖에 없어서 이 모델로 선택했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외 &lt;b&gt;모니터링 스택 배포는&lt;/b&gt; 여유 메모리를 계산하여 진행(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;EC2 추가 구입, 일부만 배포 등&lt;/b&gt;)한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외 설계(ECS Fargate, CloudFront 등)는 &lt;b&gt;로드맵에 개선사항&lt;/b&gt;으로 남겨뒀다.&lt;/p&gt;</description>
      <category>개인 프로젝트</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/131</guid>
      <comments>https://manvsai.tistory.com/131#entry131comment</comments>
      <pubDate>Mon, 15 Jun 2026 06:42:43 +0900</pubDate>
    </item>
    <item>
      <title>[유시민의 글쓰기 특강] 5장 못난 글을 피하는 법</title>
      <link>https://manvsai.tistory.com/130</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;5장 후기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 4장까지는 &lt;b&gt;'글을 잘 쓰는 법'&lt;/b&gt;에 대해 다뤘는데&lt;br /&gt;이번 5장에서는 &lt;b&gt;'잘 쓴 글과 못쓴 글을 구별하는 법'&lt;/b&gt;에 대해 다룰 겁니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;글을 잘 쓰려면&lt;/b&gt; 독해력과 어휘력이 필요하고 &lt;b&gt;많이 읽어야 늘었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만&lt;/b&gt; 세상엔 좋은 글만 있는 게 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;못난 글을 읽으면 글쓰기 실력이 더 떨어질 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;따라서 5장에서는&amp;nbsp;&lt;b&gt;못난 글이 왜 못났는지&lt;/b&gt; 알아보는 감각을 배울 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;못난 글 알아보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글이 못난 글인 지 어떻게 알아볼 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;텍스트를 소리 내어 읽었을 때, &lt;br /&gt;&lt;/b&gt;말하기 불편하고 이해하기 어렵고 듣기에 좋지 않으면 &lt;b&gt;못난 글&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이 책의 3장에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&quot;말이 글보다 먼저다.&quot;라는&lt;/b&gt;&lt;span&gt; 말이 나왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;말은&amp;nbsp;&lt;b&gt;2종류&lt;/b&gt;가&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입말: 생각과 감정을 소리로 표현한 것&lt;/li&gt;
&lt;li&gt;글말: 생각과 감정을 문자로 표현한 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 말과 글 중에는 말이 먼저이므로 &lt;b&gt;말로 해서 좋아야 잘 쓴 글&lt;/b&gt;이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서&amp;nbsp;&lt;b&gt;못난 글의 특징&lt;/b&gt;을 살펴보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 남의 나라 말 오&amp;middot;남용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어려운 한자말&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;육상에서의, 통합적으로, 이원화되어&amp;nbsp;등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;일본말 조사와 수동태
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-에서의, -적, -화, -되어 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한자나 일본말을 무조건 쓰지 말라는 것은 아니다.&lt;br /&gt;하지만 남용하면 문제가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 한자말 남용 예시&lt;br /&gt;[원문]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'경제성장' 즉 자본주의 발전을 위하여 '비효율적인' &lt;u&gt;각종&lt;/u&gt; 민주제도를 &lt;br /&gt;&lt;u&gt;폐지시키려 하는 사상적 경향을 우리는 파시즘이라 부릅니다.&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[고친 글]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'경제성장'&amp;nbsp;즉&amp;nbsp;자본주의&amp;nbsp;발전을&amp;nbsp;위하여&amp;nbsp;'비효율적인'&amp;nbsp;민주제도를&lt;br /&gt;없애버리자는 사상을 우리는 파시즘이라 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;밑줄 친 곳&lt;/b&gt;은 변경될 곳이다. &lt;b&gt;한자말&lt;/b&gt;을 아예 안 쓰는 게 나을 수 있단 걸 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 일본말 오용 예시&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;'나의 살던 고향은 꽃 피는 산골'&lt;/b&gt;이라는 문장은 사실 &lt;b&gt;'내가 살던 고향은 꽃 피는 산골'&lt;/b&gt;이 되어야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;'으로의', '에로의', '에서의', '으로부터의', '에 있어서의'&lt;/b&gt;와 같이 &lt;b&gt;'의'를 겹쳐 쓴 토씨&lt;/b&gt;도 모두 우리 말법에 어긋난다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 &lt;b&gt;'토씨'&lt;/b&gt;는 &lt;b&gt;조사 하나&lt;/b&gt;란 의미이다.&lt;br /&gt;위의 예시는 사실 &lt;b&gt;일본말 'の'&lt;/b&gt;를 &lt;b&gt;우리말 조사 '의'&lt;/b&gt;로 옮긴 것인데, &lt;br /&gt;일본말로 쓰면 자연스럽지만 &lt;b&gt;우리말은 그런 식으로 토씨를 사용하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 &lt;b&gt;우리말에는 피동문이 드물다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 일본말이나 영어를 그대로 우리말로 옮기면서 따라 쓰는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 피동문을 써야 정확하게 의미를 전달할 수 있을 때만 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;'보여지다', '되어지다',&amp;nbsp; '모여지다', '두어지다', '보아지다' &lt;/b&gt;등 은 자동사를 피동형으로 만든 것으로&lt;b&gt; 잘못된 표현이다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보여지다 -&amp;gt; 보이다&lt;/li&gt;
&lt;li&gt;되어지다 -&amp;gt; 되다&lt;/li&gt;
&lt;li&gt;모여지다 -&amp;gt; 모이다&lt;/li&gt;
&lt;li&gt;보아지다 -&amp;gt; 보이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HosRA/dJMcah5SmXr/VVashu9lKLKkb6uJIzV1U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HosRA/dJMcah5SmXr/VVashu9lKLKkb6uJIzV1U0/img.png&quot; data-alt=&quot;티스토리의 맞춤법 검사 기능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HosRA/dJMcah5SmXr/VVashu9lKLKkb6uJIzV1U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHosRA%2FdJMcah5SmXr%2FVVashu9lKLKkb6uJIzV1U0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;228&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;티스토리의 맞춤법 검사 기능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여담이지만 위 사진은 &lt;b&gt;티스토리의 맞춤법 검사 기능&lt;/b&gt;이 동작중인 것인데, &lt;b&gt;'보이다'라는 말이 철자 오류라고 나온다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'키워지다', '다뤄지다', '두어지다'&lt;/b&gt;는 잘 안 쓰는 표현으로, 대부분의 상황에서 &lt;b&gt;능동형으로 쓰는 게 자연스럽다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모님에 의해 키워졌다. -&amp;gt; 부모님이 키우셨다.&lt;/li&gt;
&lt;li&gt;이 문제가 다뤄진다. -&amp;gt; 이 문제를 다뤘다.&lt;/li&gt;
&lt;li&gt;책이 책상 위에 두어졌다. -&amp;gt; 책을 책상 위에 두었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 단어, 문장 오&amp;middot;남용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;독자가 이해하기 어려운 단어 사용&lt;/li&gt;
&lt;li&gt;서양말의 완료시제 사용&lt;/li&gt;
&lt;li&gt;추상명사에 복수형 사용&lt;/li&gt;
&lt;li&gt;분명한 의도가 없는 복문 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우리말은 완료시제가 없다.&lt;/b&gt; 그런 것이 없어도 의사소통엔 아무 문제가 없다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어제 어머니를 만났었다. -&amp;gt; 어제 어머니를 만났다.&lt;/li&gt;
&lt;li&gt;얼마 전 고향을 방문했었다. -&amp;gt; 얼마 전 고향을 방문했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 서양말은 주어가 단수냐 복수냐에 따라 동사 어미가 달라지지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우리말에선 복수를 &lt;/b&gt;분명하게 드러내야 할 때가 아니면 &lt;b&gt;사용하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;방법들을 찾아야 한다. -&amp;gt; 방법을 찾아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'방법'과 같은 추상명사에 복수형을 사용할 필요는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작가는 복문보단 단문 사용을 권한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;복문은&amp;nbsp;한 문장에 주어와 술어가 둘 이상인 문장이다.&lt;br /&gt;단문은 한 문장에 주어와 술어가 하나인 문장이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복문은 무엇인가를 강조하고 싶을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단문은 뜻을 정확하게 표현하고 싶을 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해서 특별한 의도가 없다면 단문 사용이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 복문을 단문으로 바꾼 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[원본]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1894년 9월 어느 날, 프랑스&lt;u&gt;의&lt;/u&gt; 참모본부 정보국은 프랑스 주재 독일대사관&lt;u&gt;의&lt;/u&gt; 우편함에서 훔쳐낸 한 장의 편지를 입수했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[고친&amp;nbsp;글]&lt;/b&gt;&lt;br /&gt;1894년 9월 어느 날, 프랑스 육군 참모본부 정보국 요원이 프랑스 주재 독일대사관의 우편함에서 편지 한 장을 훔쳐냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;원본에는 &lt;b&gt;술어&lt;/b&gt;가 2개이므로 복문이다.&lt;br /&gt;&lt;b&gt;- 훔치다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 입수하다&lt;/b&gt;&lt;br /&gt;또한&amp;nbsp;&lt;b&gt;주어가&amp;nbsp;&lt;/b&gt;누군&amp;nbsp;지&lt;b&gt;&amp;nbsp;명확하지&amp;nbsp;않았다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;고친&amp;nbsp;글에선&amp;nbsp;&lt;b&gt;주어를&lt;/b&gt;&amp;nbsp;'정보국&amp;nbsp;요원'으로&amp;nbsp;명확히&amp;nbsp;하고&lt;br /&gt;&lt;b&gt;술어를&lt;/b&gt; '훔치다' 한 개만 사용해서 전하고자 하는 바를 분명히 했다.&lt;br /&gt;&lt;br /&gt;[고친 글]을 한 번 더 손보면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[개정판&amp;nbsp;글]&lt;/b&gt;&lt;br /&gt;사건은 1894년 9월에 일어났다. 프랑스 육군 참모본부 정보국 요원이 프랑스 주재 독일대사관 우편함에서 편지 봉투를 하나 훔쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;먼저 긴 문장을 두 개의 단문으로 나눴다.&lt;br /&gt;그리고&amp;nbsp;불필요한&amp;nbsp;조사를&amp;nbsp;덜어냈고&lt;br /&gt;글의&amp;nbsp;분위기에&amp;nbsp;맞게&amp;nbsp;자연스러운&amp;nbsp;우리말로&amp;nbsp;바꿨다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. 거시기 화법&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황에&amp;nbsp;꼭&amp;nbsp;맞는&amp;nbsp;단어를&amp;nbsp;선택해야&amp;nbsp;한다.&amp;nbsp;이는&amp;nbsp;어휘가&amp;nbsp;풍부해야&amp;nbsp;가능하다.&lt;br /&gt;&lt;b&gt;'뜻이 불분명해서 아무 곳에나 넣어도 되는 단어'&lt;/b&gt;는&amp;nbsp;쓰지&amp;nbsp;말아야&amp;nbsp;한다.&lt;br /&gt;&lt;br /&gt;다음은&amp;nbsp;책에&amp;nbsp;나온&amp;nbsp;낚시터&amp;nbsp;밥집&amp;nbsp;사장님의&amp;nbsp;대화&amp;nbsp;내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&quot;오늘&amp;nbsp;거시기가&amp;nbsp;좀&amp;nbsp;거석 해서..&amp;nbsp;많이&amp;nbsp;거시기하긴&amp;nbsp;거슥할&amp;nbsp;텐데...&lt;/b&gt;&lt;br /&gt;&lt;b&gt;그래도 잘 거시기해서 거슥하면 거시기하긴 할 거여!&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;낚시를&amp;nbsp;많이&amp;nbsp;다니는&amp;nbsp;손님들은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;b&gt;&quot;오늘&amp;nbsp;날씨가&amp;nbsp;안 좋아서&amp;nbsp;잘&amp;nbsp;잡히진&amp;nbsp;않을 테지만,&amp;nbsp;자리를&amp;nbsp;잘&amp;nbsp;잡으면&amp;nbsp;손맛은&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있을 거야.&quot;&lt;/b&gt;&lt;br /&gt;만약&amp;nbsp;오늘&amp;nbsp;날씨가&amp;nbsp;좋았다면&amp;nbsp;또&amp;nbsp;다르게&amp;nbsp;해석된다.&lt;br /&gt;&lt;b&gt;&quot;오늘&amp;nbsp;바람이&amp;nbsp;많이&amp;nbsp;불어서&amp;nbsp;힘들 테지만,&amp;nbsp;자리를&amp;nbsp;잘&amp;nbsp;잡으면&amp;nbsp;그래도&amp;nbsp;몇 마리&amp;nbsp;잡을&amp;nbsp;수&amp;nbsp;있을 거야.&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;글을&amp;nbsp;쓸&amp;nbsp;때는&amp;nbsp;이런&amp;nbsp;화법을&amp;nbsp;지양해야 한다.&lt;br /&gt;글에서는&amp;nbsp;&lt;b&gt;'거시기'&lt;/b&gt;가&amp;nbsp;&lt;b&gt;'부분'&lt;/b&gt;으로&amp;nbsp;표현될&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;그&amp;nbsp;외에도&amp;nbsp;&lt;b&gt;'뜻이&amp;nbsp;불분명해서&amp;nbsp;아무&amp;nbsp;곳에나&amp;nbsp;넣어도&amp;nbsp;되는&amp;nbsp;단어'&lt;/b&gt;는&amp;nbsp;조심해야&amp;nbsp;한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옷의 마무리 부분이 아쉽다 -&amp;gt; 옷의 마무리가 부실한 점이 아쉽다.&lt;/li&gt;
&lt;li&gt;불빛이 새는 부분이 있다. -&amp;gt; 불빛이 새는 곳이 있다.&lt;/li&gt;
&lt;li&gt;박음질한 부분들인데, 이런 부분 때문에 -&amp;gt; 박음질한 실이 지나간 곳인데, 이것 때문에&lt;/li&gt;
&lt;li&gt;이런저런 부분들이 아쉽지만 -&amp;gt; 이렇게 마무리가 허술해서 아쉬운 점이 있지만&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;오해의 소지가 있는 표현을 적절한 단어로 손 본 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;우리말의 무늬&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜻은 비슷한데 느낌이 다른 말이 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에선 &lt;b&gt;'모양'&lt;/b&gt;을 예로 들었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모습&lt;/li&gt;
&lt;li&gt;자태&lt;/li&gt;
&lt;li&gt;꼴&lt;/li&gt;
&lt;li&gt;꼬락서니&lt;/li&gt;
&lt;li&gt;몰골&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 순서로 배열하면 &lt;b&gt;자태 - 모습 - 모양 - 꼴 - 꼬락서니 -몰골&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시를 한 가지 더 들면,&lt;br /&gt;&lt;b&gt;'죽었다'와 같은 표현&lt;/b&gt;으론&amp;nbsp;&lt;b&gt;'별세했다', '돌아가셨다', '뒈졌다', '밥숟가락 놨다&lt;/b&gt;' 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'천사 같은 몰골'&lt;/b&gt;이나 &lt;b&gt;'어머니가 뒈졌다'&lt;/b&gt; 등은 명백하게 잘못된 표현이다.&lt;br /&gt;하지만 애매한 표현들이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사회적 논의를 시도하는 것이 가능하고 -&amp;gt; 사회적으로 논의하는 행위를 허용하고&lt;/li&gt;
&lt;li&gt;정치적 숙고를 촉발시키고 -&amp;gt; 정치적 숙고를 북돋을 수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시처럼, 상황에 맞는 표현을 사용해야 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5장을 읽으며 내가 못난 글을 쓰고 있었다고 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 일본말 조사나 수동태 사용, 불필요한 완료시제 및 복수형 사용, 복문 남용을 많이 한 것 같다.&lt;/p&gt;</description>
      <category>책 후기</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/130</guid>
      <comments>https://manvsai.tistory.com/130#entry130comment</comments>
      <pubDate>Fri, 12 Jun 2026 22:29:36 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code vs Claude Cowork 차이점</title>
      <link>https://manvsai.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 현업에서는 개발시, AI사용이 당연시 되고 있다고 한다.&lt;br /&gt;또한 채용시 클로드 Code 사용 경험을 필수 조건으로 제시하는 회사들도 봤다.&lt;br /&gt;&lt;br /&gt;여기서 중요한 것은 &lt;b&gt;클로드 Code 사용 경험&lt;/b&gt;이다. &lt;u&gt;클로드 Cowork가 아닌&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;그렇다면 클로드 Code와 Cowork 어떤 차이가 있을까?&lt;br /&gt;지금부터 알아보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클로드(Claude)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로드의 사용 방법은 3가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Chat&lt;/li&gt;
&lt;li&gt;Cowork&lt;/li&gt;
&lt;li&gt;Code&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude Chat&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;1208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drR77n/dJMcaijlEiN/8yXf9fd23tzjhzhcxv8y81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drR77n/dJMcaijlEiN/8yXf9fd23tzjhzhcxv8y81/img.png&quot; data-alt=&quot;Claude Chat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drR77n/dJMcaijlEiN/8yXf9fd23tzjhzhcxv8y81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrR77n%2FdJMcaijlEiN%2F8yXf9fd23tzjhzhcxv8y81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;419&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;1208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Claude Chat&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 상단에서 사용 방식을 고를 수 있다. 기본적으로 &lt;b&gt;Chat&lt;/b&gt;으로 설정된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude Cowork&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;1352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uSR8e/dJMcabYRPxs/Za0ZNUyDxtFwt76hF1Juk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uSR8e/dJMcabYRPxs/Za0ZNUyDxtFwt76hF1Juk1/img.png&quot; data-alt=&quot;Claude Cowork&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uSR8e/dJMcabYRPxs/Za0ZNUyDxtFwt76hF1Juk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuSR8e%2FdJMcabYRPxs%2FZa0ZNUyDxtFwt76hF1Juk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;419&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;1352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Claude Cowork&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클로드 Cowork&lt;/b&gt;는 기본적으로&lt;b&gt; 샌드박스&lt;/b&gt; 위에서 동작한다.&lt;br /&gt;&lt;br /&gt;다시말해, &lt;b&gt;가상환경에서&lt;/b&gt; &lt;b&gt;동작하기 때문에&lt;/b&gt; 클로드의 오동작이나 에러 및 해킹상황에서 비교적 안전하다.&lt;br /&gt;또한 멀티태스킹에 능하고 각종 MVC를 연결한 문서작업에 능하다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;하지만&lt;/b&gt; 가상환경에서 동작하는 만큼 내 코드의 테스트나 빌드를 &lt;b&gt;직접 할 순 없다.&lt;/b&gt;&lt;br /&gt;그리고 내 PC와 직접적으로 맞닿아 있지 않기때문에 &lt;b&gt;Git 명령어를 제어하는 데 한계가 있다.&lt;br /&gt;&lt;/b&gt;또한 매 작업마다 가상환경을 구성하기 때문에 &lt;b&gt;Cluade Code에 비해 실행이&lt;/b&gt; &lt;b&gt;오래걸린다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude Code&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;1422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PJxTJ/dJMcaaySE2z/LHe5xPVQmZnYlvCbg3Y140/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PJxTJ/dJMcaaySE2z/LHe5xPVQmZnYlvCbg3Y140/img.png&quot; data-alt=&quot;Claude Code&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PJxTJ/dJMcaaySE2z/LHe5xPVQmZnYlvCbg3Y140/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPJxTJ%2FdJMcaaySE2z%2FLHe5xPVQmZnYlvCbg3Y140%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;398&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;1422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Claude Code&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클로드 Code&lt;/b&gt;는 기본적으로 &lt;b&gt;내 OS의 권한을 받아 동작&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 직접적으로 내 컴퓨터의 디렉토리위에 있는 파일들에 접근할 수 있다.&lt;br /&gt;또한 명령어를 직접 실행시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다보니 &lt;b&gt;클로드 Cowork의 단점을&lt;/b&gt; 상당부분 &lt;b&gt;커버한다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직접적인 코드 테스트 및 빌드 불가&lt;/li&gt;
&lt;li&gt;Git 명령어 제어불가&lt;/li&gt;
&lt;li&gt;느린 실행시간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 &lt;b&gt;컴파일 에러나 런타임 예외 발생 시,&lt;/b&gt; 로그를 실시간으로 읽어서 &lt;b&gt;원인을 파악&lt;/b&gt;하고 &lt;b&gt;스스로 코드를 수정&lt;/b&gt;할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;하지만&amp;nbsp;&lt;/b&gt;Cowork와 달리 한 번에 하나씩 처리하기떄문에&lt;b&gt; 멀티태스킹의 한계&lt;/b&gt;가 있다.&lt;br /&gt;또한 클로드 Code 오작동 및 에러 발생 시 &lt;b&gt;실제&amp;nbsp;로컬&amp;nbsp;OS&amp;nbsp;환경&amp;nbsp;오염&amp;nbsp;및&amp;nbsp;자료&amp;nbsp;손실&amp;nbsp;위험&lt;/b&gt;이 있다.&lt;br /&gt;그리고 &lt;b&gt;문서작업 면에서&lt;/b&gt;는 내장 도구가 부족해서 Cowork에 비해 &lt;b&gt;성능이 떨어진다는 평가가 있다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;개발시엔&lt;/b&gt; 속도가 빠른 &lt;b&gt;클로드 Code&lt;/b&gt;를&lt;br /&gt;&lt;b&gt;문서작업엔&lt;/b&gt; 다양한 도구를 활용한 대규모 작업을 위한 &lt;b&gt;클로드 Cowork&lt;/b&gt;를 사용하면 좋다.&lt;br /&gt;&lt;br /&gt;또한 파견근무 및 금융권 등 &lt;b&gt;보안 정책&lt;/b&gt;을 고려하면 &lt;b&gt;클로드 Cowork&lt;/b&gt;가 선택지가 될 수 있다.&amp;nbsp;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/128</guid>
      <comments>https://manvsai.tistory.com/128#entry128comment</comments>
      <pubDate>Fri, 12 Jun 2026 00:05:28 +0900</pubDate>
    </item>
    <item>
      <title>[유시민의 글쓰기 특강] 4장 전략적 독서</title>
      <link>https://manvsai.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 &lt;b&gt;책 '유시민의 글쓰기 특강' 4장&lt;/b&gt; 내용입니다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1장~3장 내용 요약&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든&amp;nbsp;표현은&amp;nbsp;결국&amp;nbsp;&lt;b&gt;'생각'&lt;/b&gt;에서&amp;nbsp;나온다.&lt;br /&gt;생각을&amp;nbsp;잘해야&amp;nbsp;'&lt;b&gt;논증'&lt;/b&gt;도&amp;nbsp;잘한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-&amp;nbsp;논증을&amp;nbsp;잘하는&amp;nbsp;규칙&amp;nbsp;3가지&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주장과 취향고백을 구별하라&lt;/li&gt;
&lt;li&gt;주장은 반드시 논증한다.&lt;/li&gt;
&lt;li&gt;처음부터 끝까지 글의 주제에 집중하라&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;글쓰기를&amp;nbsp;잘하기&amp;nbsp;위한&amp;nbsp;철칙&amp;nbsp;2가지&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많이 읽어라&lt;/li&gt;
&lt;li&gt;많이 써라&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때,&amp;nbsp;철칙이란&amp;nbsp;&lt;b&gt;'바꾸거나&amp;nbsp;어길&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;중요한&amp;nbsp;법칙'&lt;/b&gt;이다.&lt;br /&gt;&lt;br /&gt;글쓰기&amp;nbsp;연습은&lt;b&gt;&amp;nbsp;'발췌&amp;nbsp;요약'&lt;/b&gt;부터&amp;nbsp;해봐라.&lt;br /&gt;악플을&amp;nbsp;겁내지&amp;nbsp;말고&lt;b&gt;&amp;nbsp;글을&amp;nbsp;보여주고&amp;nbsp;피드백을&amp;nbsp;수용&lt;/b&gt;해라.&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독해력을 늘리기 위해선 결국 '독서'를 많이 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번역서도 '우리말 글'이다. 따라서 우리말다운 문장으로 써야 한다.&lt;br /&gt;또한 글을 쓸 때는 말하듯이 써라.&lt;br /&gt;&lt;br /&gt;말보다 글이 먼저다.&lt;br /&gt;생각을 담는 것은 언어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;따라서!&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 생각(언어)이 좋은 말하기를 만들고&lt;/li&gt;
&lt;li&gt;좋은 말하기가 좋은 읽기를 만든다.&lt;/li&gt;
&lt;li&gt;좋은 읽기가 좋은 쓰기를 만든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번 챕터(4장)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 4장의 키워드는&amp;nbsp;&lt;b&gt;'어휘력'&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작가는 사람의 어휘력은 지식수준과 비례한다고 한다.&lt;br /&gt;어휘를 많이 알아야 정확한 문장을 구사할 수 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어휘력을 늘리는 방법 역시 &lt;b&gt;많이 읽는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3장에서도&lt;/b&gt; 독해력을 늘리는 방법으로 &lt;b&gt;많이 읽는 것&lt;/b&gt;을 얘기했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 &lt;b&gt;단순히 많이 읽으면 글을 잘 쓰게 될까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 4장에서는 &lt;b&gt;그에 대한 답을 다룬다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;독해란&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저&amp;nbsp;독해란&amp;nbsp;텍스트의&amp;nbsp;한계와&amp;nbsp;오류를&amp;nbsp;찾아내거나&amp;nbsp;텍스트를&amp;nbsp;다른&amp;nbsp;맥락에서&amp;nbsp;해석하는&amp;nbsp;작업을&amp;nbsp;포함한다.&lt;br /&gt;즉,&amp;nbsp;비판적&amp;nbsp;사고를&amp;nbsp;가지고&amp;nbsp;책을&amp;nbsp;읽어야&amp;nbsp;독해력이&amp;nbsp;는다는&amp;nbsp;뜻이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비판적 사고란&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 비판적 사고의 예시이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;원문)&lt;br /&gt;&lt;/b&gt;원자력은&amp;nbsp;탄산가스에&amp;nbsp;의한&amp;nbsp;온실효과를&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;깨끗한&amp;nbsp;&lt;u&gt;에너지이며,&amp;nbsp;또한&amp;nbsp;발전&amp;nbsp;단가도&lt;/u&gt;&amp;nbsp;석유나&lt;br /&gt;액화가스에&amp;nbsp;비하면&amp;nbsp;거의&amp;nbsp;반값에&amp;nbsp;해당하는&amp;nbsp;저렴한&amp;nbsp;에너지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;고친 글)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;원자력은&amp;nbsp;탄산가스에&amp;nbsp;의한&amp;nbsp;온실효과를&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;&lt;u&gt;깨끗한&amp;nbsp;에너지이다.&amp;nbsp;또한&amp;nbsp;발전&amp;nbsp;단가도&lt;/u&gt;&amp;nbsp;석유나&lt;br /&gt;액화가스에&amp;nbsp;비하면&amp;nbsp;거의&amp;nbsp;반값에&amp;nbsp;해당하는&amp;nbsp;저렴한&amp;nbsp;에너지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차이점은 &lt;b&gt;중간에 한번 문장을 끊어준 것뿐이다.&lt;/b&gt;&lt;br /&gt;한 문장에 하나의 개념만 담는 것의 중요성을 보여주려 한 예시다.&lt;br /&gt;&lt;br /&gt;이때 평소 나는 가독성이 좋은 글에 대해 많이 했는데&lt;br /&gt;독자 입장에서 한 문장에 여러 개념이 들어가면 어느 부분에 포인트를 두어 읽어야 할지 어려울 거라 생각했는데,&lt;br /&gt;이 책에서 그 부분을 잘 짚어준 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 작가는 이 글은 아직도 &lt;b&gt;우리말다운 표현이 아닌 부분&lt;/b&gt; 등 고칠 부분이 있다고 했다.&lt;br /&gt;만약 이 글의&lt;b&gt; 앞뒤 문장을 서로 다른 형태로&lt;/b&gt; &lt;b&gt;만든다면,&lt;/b&gt;&amp;nbsp;더욱 분명하고&lt;b&gt; 자연스러운 글이 된다고 한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;개선한&amp;nbsp;글)&lt;br /&gt;&lt;/b&gt;원자력은&amp;nbsp;탄산가스를&amp;nbsp;내뿜지&amp;nbsp;않는&amp;nbsp;깨끗한&amp;nbsp;에너지여서&amp;nbsp;온실효과를&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;발전&amp;nbsp;단가도&amp;nbsp;저렴해서&amp;nbsp;석유나&amp;nbsp;액화가스의&amp;nbsp;반밖에&amp;nbsp;들지&amp;nbsp;않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그리고 이 글을 적은 사람이 전문성이 있는 사람일지라도&lt;br /&gt;&lt;b&gt;이&amp;nbsp;글의&amp;nbsp;정보가&amp;nbsp;사실인지에&amp;nbsp;대한&amp;nbsp;비판적&amp;nbsp;사고&lt;/b&gt;는&amp;nbsp;필요하다고&amp;nbsp;했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원자력이 탄산가스보다 온실효과면에서 깨끗한가?&lt;/li&gt;
&lt;li&gt;발전 단가가 저렴한 것은 사실인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 독해를 하는 방법이라고 한다.&lt;br /&gt;글의 이해를 넘어 &lt;b&gt;문제점과 한계를 탐색&lt;/b&gt;해야 한다.&lt;br /&gt;나아가 그 문제점이나 한계의 &lt;b&gt;출처&lt;/b&gt;는 어디인지까지도&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글쓰기 능력에 도움을 주는 책의 기준&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독서를 함으로써 지식을 배우며 어휘를 익히고&lt;br /&gt;독해를 함으로써 문장을 익힌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q: 단순히 많이 읽으면 독해력이 좋아질까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A: 그렇다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만!&lt;/b&gt; 글쓰기 능력을 기르고 싶다면 그에 맞는 책을 읽는 게 좋다.&lt;br /&gt;어떤 책이냐에 따라 배우고 익히는 어휘와 문장의 양과 질이 다르기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;그럼 책을 고르는 기준은 무엇일까?&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인간, 사회, 문화, 역사, 생명, 자연, 우주를 이해하는데 꼭 필요한 개념과 지식을 담은 책&lt;/li&gt;
&lt;li&gt;정확하고 바른 문장을 구사한 책&lt;/li&gt;
&lt;li&gt;지적 긴장과 흥미를 불러일으키는 책&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;b&gt; 다양하고 양질의 어휘&lt;/b&gt;를 접할 수 있고&lt;b&gt; 정확한 문장&lt;/b&gt;을 배울 수 있고 &lt;br /&gt;&lt;b&gt;즐거운 마음&lt;/b&gt;으로 읽을 수 있는 책이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작가님은 여러 책을 추천하셨는데&lt;br /&gt;그중 관심 가는 것을 아래에 &lt;b&gt;&amp;lt;책제목&amp;gt;, 작가명, (옮긴이명), 출판사 순&lt;/b&gt;으로 적었다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;자유론&amp;gt;, 존 스튜어트, 서병훈 옮김, 책세상&lt;/b&gt;&lt;br /&gt;&lt;b&gt;주제:&lt;/b&gt; 어떤 국가나 사회가 개인의 자유를 제한하는 것이 정당한가?&lt;br /&gt;&lt;b&gt;고른 이유:&lt;/b&gt; 자유라는 어려운 주제를 최대한 쉬운 단어들로 이해하기 쉽게 적었다고 해서 관심이 갔다.&lt;br /&gt;내 글의 방향성 역시 '모든 사람이 이해할 수 있는 글'이다. &lt;br /&gt;글이라고 함은 결국 독자가 이해해야 의미가 있다고 생각하기 때문이다.&lt;br /&gt;그런 의미에서 글 작성 시 도움이 될 것 같다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;만들어진 신&amp;gt;, 리처드 도킨스, 김영사&lt;br /&gt;&lt;/b&gt;&lt;b&gt;주제:&amp;nbsp;&lt;/b&gt;우주는 누가 만들었나? 신이 인간을 만들었나, 인간이 신을 만들었나? 어떻게 증명할 수 있나? &lt;br /&gt;인간은 종교의 도움 없이도 삶에 필요한 도덕을 세울 수 있는가?&lt;br /&gt;신이 있는 세상과 없는 세상 가운데 어느 쪽이 더 희망적인가?&lt;br /&gt;&lt;b&gt;고른 이유: &lt;/b&gt;무신론자지만 신이 인간사회에 미치는 영향력과 종교에 대해 철학적으로 생각해 볼 기회가 될 수 있을 것 같았다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;정의란 무엇인가&amp;gt;, 마이클 샌델, 김영사&lt;br /&gt;&lt;/b&gt;&lt;b&gt;주제:&amp;nbsp;&lt;/b&gt;정의는 무엇이며, 실현하기 위해선 어떤 철학적&amp;middot;도덕적 원리에 의지해야 하는가? 법의 제도가 정의 원칙을 어떻게 얼마나 실현/침해하고 있는가? 이념이 대립하는 상황에서 최대한의 정의를 실현하는 방법은 무엇인가?&lt;br /&gt;&lt;b&gt;고른 이유:&amp;nbsp;&lt;/b&gt;일상생활 속에서, 정의에 관해 생각해 볼 일이 많이 없었는데, 좋은 기회가 될 것 같았다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;불확실성의 시대&amp;gt;, 존 케네스 갤브레이스, 홍신문화사&lt;br /&gt;주제: &lt;/b&gt;고전파 경제학자들의 인류의 물질적 풍요라는 예언은 왜 실현되지 않았는가? &lt;br /&gt;우리의 정치 체제는 거대 법인기업이 지배하는 현대 자본주의 체제를 민주적으로 제어할 수 있는가?&lt;br /&gt;&lt;b&gt;고른 이유:&amp;nbsp;&lt;/b&gt;주식에 관심이 있는데, 빅테크와 같은 거대 기업들이 지배하는 현대사회에 공감이 가서 미래에 대한 견문을 넒힐 수 있을 것 같았다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;유토피아&amp;gt;, 토머스 모어, 서해문집&lt;br /&gt;주제:&amp;nbsp;&lt;/b&gt;공공의 선과 사회적 정의를 실현하기 위해 신분과 계급과 사유재산이 없고 모든 사람이 땀 흘리며 노동하는 사회를 만드는 것은 가능한 일인가? 만약 가능하다면 우리는 어떤 원리 위에서 사회제도를 만들어야 하는가?&lt;br /&gt;&lt;b&gt;고른 이유:&amp;nbsp;&lt;/b&gt;애니메이션 '유토피아'를 재밌게 보기도 했고 유토피아를 주제로 하는 많은 창작물들을 봐왔다.&amp;nbsp;&lt;br /&gt;이 책을 읽으면 나중에 관련 작품들을 볼 때 더 깊은 사고를 할 수 있을 것 같았다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 &lt;b&gt;독해력&lt;/b&gt;과 &lt;b&gt;어휘력&lt;/b&gt;은 &lt;b&gt;많이 읽어야&lt;/b&gt; 기를 수 있다.&lt;br /&gt;&lt;br /&gt;좋은 생각이 좋은 말하기 능력을 만들고&lt;br /&gt;좋은 말하기가 좋은 읽기 능력을 만들고&lt;br /&gt;좋은 읽기가 좋은 쓰기 능력을 기른다고 했었다.&lt;br /&gt;&lt;br /&gt;여기에 더해 &lt;b&gt;이 모든 것을 더욱 향상해 주는 것이 바로 독해력과 어휘력&lt;/b&gt;인 것 같다.&lt;br /&gt;&lt;br /&gt;비판적 사고를 바탕으로 '독해'를 하고, &lt;br /&gt;풍부한 어휘력을 바탕으로 글을 써야 정확하게 문장을 구사할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;나아가서&lt;/b&gt; 독자의 입장에서 글을 바라보아 &lt;b&gt;한 문장에 하나의 개념만을 담는다면&lt;/b&gt;, 글을 &lt;b&gt;더욱 분명하게&lt;/b&gt; 할 수 있다.&lt;/p&gt;</description>
      <category>책 후기</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/127</guid>
      <comments>https://manvsai.tistory.com/127#entry127comment</comments>
      <pubDate>Thu, 11 Jun 2026 22:51:45 +0900</pubDate>
    </item>
    <item>
      <title>[유시민의 글쓰기 특강] 3장 책읽기와 글쓰기 후기</title>
      <link>https://manvsai.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 책 &lt;b&gt;유시민의 글쓰기 특강&lt;/b&gt; 3장 후기입니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1~3장을 읽어보니 책의 흐름이 느껴져서, 이전 내용을 계속 기억하면 좋을 것 같아서!&lt;br /&gt;항상 각 장에서 제일 중요한 내용을 요약하고 시작하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(글의&amp;nbsp;오른쪽&amp;nbsp;하단&amp;nbsp;버튼으로&amp;nbsp;&lt;b&gt;화이트/다크모드&lt;/b&gt;&amp;nbsp;전환이&amp;nbsp;가능합니다.)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내용 복기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 표현은 결국&lt;b&gt; '생각'&lt;/b&gt;에서 나온다.&lt;br /&gt;생각을 잘해야&lt;b&gt; '논증'&lt;/b&gt;도 잘한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- 논증을 잘하는 규칙 3가지&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주장과 취향고백을 구별하라&lt;/li&gt;
&lt;li&gt;주장은 반드시 논증한다.&lt;/li&gt;
&lt;li&gt;처음부터 끝까지 글의 주제에 집중하라&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글은 문학적인 글과 논리적인 글로 나뉘는데, &lt;br /&gt;비교적 재능의 영향을 덜 받는 논리적인 글의 경우 충분히 노력하면 잘 쓸 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- 글쓰기를 잘하기 위한 철칙 2가지&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많이 읽어라&lt;/li&gt;
&lt;li&gt;많이 써라&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 철칙이란 '바꾸거나 어길 수 없는 중요한 법칙'이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 글쓰기를 연습할 때는 &lt;b&gt;'발췌 요약'&lt;/b&gt;부터 해라.&lt;br /&gt;글을 많이 안 써본 사람들은 글의 첫 문장을 적는데 어려움을 느낀다.&lt;br /&gt;이는 전체적으로 글을 구성해 봐야 하기 때문&lt;br /&gt;&lt;br /&gt;악플을 겁내지 말고 글을 보여주고 피드백을 수용해라.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번 챕터(3장)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;독해력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;b&gt;2장&lt;/b&gt;에서 글쓰기를 연습할 때는 텍스트 요약부터 하라고 했는데,&lt;br /&gt;요약을 잘하기 위해서는 독해력이 필요하다.&lt;br /&gt;&lt;b&gt;독해력을 늘리려면 &lt;/b&gt;결국&lt;b&gt; '독서'를 많이 해야 한다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이는 곧 2장에서 말한 철칙 중 하나인&lt;b&gt;&amp;nbsp;'많이 읽어라'&lt;/b&gt;에 포함되는 말이기도 하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모국어의 중요성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 언어는 생각을 담는 그릇이다.&lt;/b&gt;&lt;br /&gt;다중언어 능력을 보유하는 것보다 &lt;b&gt;자기 머리로 생각하는 능력&lt;/b&gt;이 중요하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;번역서가 불편한 이유는 무엇일까&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언어를 번역하는 방법은 직역과 의역으로 나뉜다.&lt;br /&gt;하지만 작가는 의역을 강력히 추천했다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;번역서 또한 누군가 읽는 글이다.&lt;/b&gt;&lt;br /&gt;번역서의 문장이 우리말답지 않다면 원서의 분위기와 전하고자 하는 감정이 제대로 전달될 수 없다.&lt;br /&gt;번역서든 아니든&lt;b&gt; 우리말 책은 우리말다운 문장으로 써야 한다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;그래서 모국어를 잘해야 한다고 한다.&lt;br /&gt;&lt;br /&gt;그리고&lt;b&gt; 글을 쓸 때는 말하듯이&lt;/b&gt; &lt;b&gt;쓰는 게 좋다&lt;/b&gt;고 한다.&lt;br /&gt;그 이유는 아래에서 설명하겠다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;말이 글보다 먼저다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1장에서는&amp;nbsp;&lt;b&gt;생각의&amp;nbsp;중요성&lt;/b&gt;에&amp;nbsp;대해서&amp;nbsp;언급했는데 &lt;br /&gt;3장에서는&lt;b&gt;&amp;nbsp;말의&amp;nbsp;중요성&lt;/b&gt;에&amp;nbsp;대해&amp;nbsp;말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아기는 말하는 법을 익히기 전에 말귀를 알아듣고 반응한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 부모들이 아이에게 동화를 읽어주는 게 좋다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말을 못 해도 동화를&lt;b&gt; '들음'&lt;/b&gt;으로써 듣기 능력을 키우고&lt;br /&gt;들을 수 있게 되면&lt;b&gt; '말하는'&lt;/b&gt;법을 배우게 된다고 한다.&lt;br /&gt;말할 수 있으면 문자를&lt;b&gt; '읽는' &lt;/b&gt;방법을 배우게 되고&lt;br /&gt;읽을 수 있다면 글을 &lt;b&gt;'쓰는'&lt;/b&gt; 방법을 배운다.&lt;br /&gt;&lt;br /&gt;따라서 &lt;b&gt;아기의&amp;nbsp;뇌는&lt;/b&gt;&amp;nbsp;시간순으로&amp;nbsp;보면&amp;nbsp;&lt;b&gt;감정(생각)&amp;nbsp;-&amp;nbsp;듣기&amp;nbsp;-&amp;nbsp;말하기&amp;nbsp;-&amp;nbsp;읽기&amp;nbsp;순으로&amp;nbsp;발달한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 읽기를 글로 치환하면&lt;b&gt; '말하기가 글보다 먼저'&lt;/b&gt;란 뜻이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;결과적으로 &lt;br /&gt;생각을 잘해야 바르게 말할 수 있고 &lt;br /&gt;말을 잘해야 글을 올바르게 적을 수 있다.&lt;br /&gt;&lt;br /&gt;글을 쓸 때도 자연스럽게&lt;br /&gt;어떻게 쓸지를 먼저 &lt;b&gt;생각하고&lt;/b&gt; 속으로 &lt;b&gt;말해보고 &lt;/b&gt;글을 &lt;b&gt;적게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;말하듯이 쓰는 게 좋다고 하는 이유가 바로 이 때문이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코딩도 글쓰기다?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 내가 3장을 읽으면서 든 생각이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;개발자들이 코딩을 하는 것도&lt;br /&gt;코드 = 글이니까. &lt;br /&gt;결국 글을 적는 것이라고 생각하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 흐름을 코드로써 구현했을 때,&lt;br /&gt;말로 설명할 수 있어야 좋은 코드이지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러려면 코드 또한 말하듯이 적어야 하지 않나 싶다.&lt;br /&gt;&lt;br /&gt;코드를 적기 전에 먼저 설계(생각)를 하고&lt;br /&gt;코드 구현(글 쓰기)은 말하듯이 적어야 보기 좋은 것 같다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책 &lt;b&gt;'유시민의 글쓰기 특강'&lt;/b&gt;을 3장까지 읽어봤는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;글의 전체적인 흐름&lt;/b&gt;이 느껴져서 좋았다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생각을 잘하려면 많이 읽고 써봐야 한다.&lt;/li&gt;
&lt;li&gt;생각을 잘하게 되면 말을 잘하게 된다.&lt;/li&gt;
&lt;li&gt;말을 잘하게 되면 글을 잘 쓰게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 3장의 핵심&lt;/b&gt;은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;말이 글보다 먼저다.&lt;/li&gt;
&lt;li&gt;생각을 담는 것은 언어다.&lt;/li&gt;
&lt;li&gt;글은 말하듯이 써라.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>책 후기</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/126</guid>
      <comments>https://manvsai.tistory.com/126#entry126comment</comments>
      <pubDate>Thu, 11 Jun 2026 05:29:55 +0900</pubDate>
    </item>
    <item>
      <title>[Spotify Web API 6편] Band 서비스 구현</title>
      <link>https://manvsai.tistory.com/125</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이번 편에서는&lt;/b&gt; 본 프로젝트의 핵심 서비스 중 하나인 &lt;b&gt;Band 서비스를 구현하고, 기능 동작을 Postman으로 확인했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한&amp;nbsp;사용자가&amp;nbsp;사이트에&amp;nbsp;들어오는&amp;nbsp;것부터&amp;nbsp;사이트의&amp;nbsp;기능들을&amp;nbsp;하나씩&amp;nbsp;이용하는&amp;nbsp;&lt;b&gt;사용자&amp;nbsp;요청&amp;nbsp;시나리오&lt;/b&gt;를&amp;nbsp;알아보자.&lt;br /&gt;그&amp;nbsp;과정에서&amp;nbsp;&amp;nbsp;이&amp;nbsp;프로젝트에서&amp;nbsp;&amp;nbsp;&lt;b&gt;Band서비스가&amp;nbsp;하는&amp;nbsp;역할&lt;/b&gt;이&amp;nbsp;무엇인지&amp;nbsp;구현은&amp;nbsp;어떤&amp;nbsp;식으로&amp;nbsp;했는지에&amp;nbsp;대해&amp;nbsp;정리했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 요청 시나리오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 사용자가 우리 사이트에 접속하고 기능들을 이용하려면 회원가입 후 로그인부터 해야 할 것이다.&lt;br /&gt;회원가입을 할 때, 본인이 속한 밴드를 적어야 한다. (혹은 밴드장으로부터 초대를 받으면 자동으로 기입됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소속된 밴드가 없다면, 개인으로 활동하거나 밴드를 새로 생성해야 한다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;회원가입 과정&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;밴드를 새로 생성하는 경우&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 회원가입 전에 밴드생성부터 하게 된다.&lt;br /&gt;밴드 생성 Form에 밴드 정보를 입력하고, 밴드 생성이 완료되면 다시 회원가입 페이지로 가서&lt;br /&gt;밴드 정보와 함께 회원가입을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 생성된 밴드 정보는 Band 서비스에서 관리한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;밴드장으로부터&amp;nbsp;초대를&amp;nbsp;받는&amp;nbsp;경우&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밴드 입력란이 밴드장이 속한 밴드명으로 자동으로 채워져 있다.&lt;br /&gt;이때 밴드명은 중복될 수 없다.&lt;br /&gt;나머지 유저 정보를 입력하여 회원가입을 진행한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;밴드명을&amp;nbsp;알고&amp;nbsp;있는&amp;nbsp;경우&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력란에 밴드명을 입력한 후 인증절차를 가진다.&lt;br /&gt;인증이 완료되면 나머지 유저 정보를 입력하여 회원가입을 진행한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;개인(무소속)으로 회원가입 하는 경우&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밴드 입력란에 '개인'을 체크하고 회원가입을 진행한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로그인 이후&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이후 로그인이 완료되면&lt;/b&gt; 그때부터 &lt;b&gt;Band와 Wiki 서비스&lt;/b&gt;의 기능을 이용할 수 있다.&lt;br /&gt;자신이 속한 밴드와 멤버들의 정보를 확인할 수 있고,&lt;br /&gt;밴드로 새로운 멤버를 초대할 수 있다.&lt;br /&gt;&lt;br /&gt;그리고 멤버들만 열람할 수 있는 글을 작성하고 일정을 관리할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wiki 서비스&lt;/b&gt;의 기능으로는 개인 or 밴드멤버로서 밴드곡을 검색하고, 검색된 곡 아래로 글을 작성할 수 있다.&lt;br /&gt;다른 사람의 글을 조회하고 댓글을 달 수 있다.&lt;br /&gt;&lt;br /&gt;그리고 글에 대한 궁금증이 생긴다면 글 작성자와 1대 1로 채팅을 할 수 있는데&lt;br /&gt;그 기능은 &lt;b&gt;Chat 서비스&lt;/b&gt;에서 담당한다.&lt;br /&gt;&lt;br /&gt;사이트를 이용하는 유저들끼리 Follow를 할 수도 있는데 이 기능은 &lt;b&gt;User 서비스&lt;/b&gt;에서 담당한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;따라서,&lt;/b&gt; 모든 서비스의 시작은 회원가입으로부터 시작된다.&lt;br /&gt;회원가입을 위해 소속된 밴드정보가 필요하기 때문에&lt;br /&gt;&lt;b&gt;밴드 서비스를 제일 먼저 개발하기로 결정!&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Band 서비스&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 역할&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밴드 데이터를 생성 및 관리하며 &lt;b&gt;( Band 도메인 )&lt;/b&gt;&lt;br /&gt;밴드에 멤버를 추가 및 관리할 수 있도록 한다.&amp;nbsp; &lt;b&gt;( BandMember 도메인 )&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;밴드 멤버들끼리 사용할 수 있는 일정표가 있고, 그 일정표에 글을 작성할 수 있다. &lt;b&gt;(TimeLinePost 도메인)&lt;/b&gt;&lt;br /&gt;타임라인글에는 멤버들이 자유롭게 댓글을 달 수 있다. &lt;b&gt;(TimeLinePostComment 도메인)&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 구현 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Band 서비스엔 &lt;b&gt;루트 애그리거트가 2개이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Band &amp;mdash; 밴드와 멤버를 관리하는 애그리거트&lt;/li&gt;
&lt;li&gt;TimelinePost &amp;mdash; 타임라인 글과 댓글을 관리하는 애그리거트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그에 맞춰 &lt;b&gt;컨트롤러&lt;/b&gt;를 2개로 나눴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BandController&lt;/li&gt;
&lt;li&gt;TimeLinePostController&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서비스 레이어&lt;/b&gt; 또한 2개로 나눴다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BandService&lt;/li&gt;
&lt;li&gt;TimeLinePostService&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 계층을 구현할 때, 2가지를 신경 써서 개발했다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;도메인 객체와 엔티티 객체를 &lt;b&gt;분리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;UUID타입의 PK값을 도메인에서 생성 후 &lt;b&gt;Persistable &amp;lt;UUID&amp;gt;, isNew&lt;/b&gt;&amp;nbsp;&lt;b&gt;패턴&lt;/b&gt;으로 &lt;b&gt;신규/기존 엔티티 구분&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 도메인 계층에 도메인 객체를 두고 인프라 계층에 엔티티 객체를 두었다.&lt;br /&gt;&lt;br /&gt;이때 도메인을 먼저 생성함으로써, 도메인 메서드의 검증 로직들이 엔티티 생성전에 동작할 수 있도록 했다.&lt;br /&gt;&lt;br /&gt;이 과정에서 도메인 객체에서 UUID를 생성하게 되는데&lt;br /&gt;UUID를&amp;nbsp;미리&amp;nbsp;생성하면&amp;nbsp;JPA가&amp;nbsp;신규&amp;nbsp;엔티티인지&amp;nbsp;기존&amp;nbsp;엔티티인지&amp;nbsp;구분하지&amp;nbsp;못하는&amp;nbsp;문제가&amp;nbsp;생긴다.&amp;nbsp;&lt;br /&gt;이를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;&lt;b&gt;Persistable &amp;lt;UUID&amp;gt;&amp;nbsp;&lt;/b&gt;인터페이스를&amp;nbsp;구현하고&amp;nbsp;&lt;b&gt;@Transient&lt;/b&gt;&amp;nbsp;&lt;b&gt;boolean&amp;nbsp;isNew&lt;/b&gt;&amp;nbsp;플래그로&amp;nbsp;신규&amp;nbsp;여부를&amp;nbsp;명시했다.&lt;br /&gt;&lt;br /&gt;이는 &lt;b&gt;PK값 생성을 DB에 위임하지 않음으로써,&lt;/b&gt; 서비스 간 데이터를 합치거나 샤딩시에 ID 충돌이 없어 &lt;b&gt;확장하기 유리하기 때문이다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;아래는 응용계층과 표현계층에 코드 작성 시, 필요한 API 목록이다.&lt;/p&gt;
&lt;pre id=&quot;code_1781029330247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BandController (/api/bands)
| POST 	| /api/bands | 밴드 생성 |
| GET 	| /api/bands/{bandId} | 밴드 단건 조회 |
| GET 	| /api/bands?page=&amp;amp;size= | 밴드 목록 조회 |
| PATCH | /api/bands/{bandId} | 밴드 정보 수정 |
| DELETE | /api/bands/{bandId} | 밴드 삭제 |
| POST 	| /api/bands/{bandId}/members | 멤버 초대 |
| GET 	| /api/bands/{bandId}/members | 멤버 목록 조회 |
| DELETE | /api/bands/{bandId}/members/{userId} | 멤버 강퇴 / 탈퇴 |
| PATCH | /api/bands/{bandId}/leader | 리더 양도 |

TimelinePostController (/api/timeline-posts)
| POST 	| /api/timeline-posts | 포스트 작성 |
| GET 	| /api/timeline-posts/{postId} | 포스트 단건 조회 |
| GET 	| /api/timeline-posts?bandId= | 밴드별 포스트 목록 조회 |
| PATCH | /api/timeline-posts/{postId} | 포스트 수정 |
| DELETE | /api/timeline-posts/{postId} | 포스트 삭제 |
| POST 	| /api/timeline-posts/{postId}/comments | 댓글 작성 |
| DELETE | /api/timeline-posts/{postId}/comments/{commentId} | 댓글 삭제 |&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 프로젝트</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/125</guid>
      <comments>https://manvsai.tistory.com/125#entry125comment</comments>
      <pubDate>Wed, 10 Jun 2026 03:33:38 +0900</pubDate>
    </item>
    <item>
      <title>[유시민의 글쓰기 특강] 2장 글쓰기의 철칙 후기</title>
      <link>https://manvsai.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번엔 책 &lt;b&gt;[유시민의 글쓰기 특강] 2장&lt;/b&gt;에 대한 후기를 적었습니다!&lt;br /&gt;책의 내용을 요약하고, 느낀 점을 적었습니다.&lt;br /&gt;(글의 오른쪽 하단 버튼으로 &lt;b&gt;화이트/다크모드&lt;/b&gt; 전환이 가능합니다.)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1장 내용 짧게 정리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 표현은 결국 생각에서 나오며, 생각을 잘해야 논증도 잘한다.&lt;br /&gt;- 논증을 잘하는 '규칙'으로는 3가지가 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;주장과 취향고백을 구별하라.&lt;br /&gt;&lt;/span&gt;주장은 반드시 논증한다.&lt;br /&gt;처음부터 끝까지 글의 주제에 집중하라.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;책 2장 내용 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 유시민 작가님께서는&amp;nbsp;&lt;b&gt;&quot;글은 문학적인 글과 논리적인 글로 나뉜다&quot;라고&lt;/b&gt; 설명하셨다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문학적인&amp;nbsp;글&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문학적인 글의 예시로는 &lt;b&gt;시, 소설&lt;/b&gt; 등이 있다.&lt;br /&gt;이를&amp;nbsp;예술적인&amp;nbsp;글이라고도&amp;nbsp;표현하셨다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;논리적인 글&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논리적인 글의 예시로는 &lt;b&gt;에세이, 보고서, 논문&lt;/b&gt; 같은 글이다.&lt;br /&gt;&lt;br /&gt;문학적인&amp;nbsp;글은&amp;nbsp;재능의&amp;nbsp;영향을&amp;nbsp;많이&amp;nbsp;받지만,&amp;nbsp;논리적은&amp;nbsp;글은&amp;nbsp;노력으로&amp;nbsp;충분하&amp;nbsp;잘&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;있다고&amp;nbsp;하며&lt;br /&gt;그&amp;nbsp;이유로써&lt;b&gt;&amp;nbsp;글쓰기의&amp;nbsp;'철칙'&amp;nbsp;2가지&lt;/b&gt;를&amp;nbsp;소개하셨다.&lt;br /&gt;&lt;br /&gt;위에서&amp;nbsp;봤듯&lt;b&gt;&amp;nbsp;1장에서는&amp;nbsp;규칙,&lt;/b&gt;&amp;nbsp;&lt;b&gt;2장에서는&amp;nbsp;철칙&lt;/b&gt;에&amp;nbsp;대해서&amp;nbsp;말했는데&amp;nbsp;&lt;u&gt;&lt;b&gt;그&amp;nbsp;이유가&amp;nbsp;있는&amp;nbsp;것&amp;nbsp;같다.&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;먼저&amp;nbsp;규칙과&amp;nbsp;철칙의&amp;nbsp;뜻에&amp;nbsp;대해서&amp;nbsp;알아보면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;규칙 : 여러 사람이 다 같이 지키기로 작정한 법칙. 또는 제정된 질서.&lt;/li&gt;
&lt;li&gt;철칙&amp;nbsp;:&amp;nbsp;바꾸거나&amp;nbsp;어길&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;중요한&amp;nbsp;법칙.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 나는 &lt;b&gt;'논증을 잘하는 3가지 규칙'&lt;/b&gt;을 작가님의 &lt;b&gt;일종의 제안&lt;/b&gt;이라고 이해했다.&lt;br /&gt;또,&amp;nbsp;작가님은&lt;b&gt;&amp;nbsp;'글쓰기&amp;nbsp;근육을&amp;nbsp;만드는&amp;nbsp;유일한&amp;nbsp;방법은&amp;nbsp;쓰는&amp;nbsp;것이다.&amp;nbsp;여기에&amp;nbsp;예외는&amp;nbsp;없다.&amp;nbsp;그래서&amp;nbsp;'철칙'이다.'&lt;/b&gt;라고&amp;nbsp;표현하셨다.&lt;br /&gt;정말&amp;nbsp;모든&amp;nbsp;분야에&amp;nbsp;적용되는&amp;nbsp;말이라고&amp;nbsp;생각한다.&lt;br /&gt;&lt;br /&gt;철칙의&amp;nbsp;내용은&amp;nbsp;바로&amp;nbsp;&lt;b&gt;'글은&amp;nbsp;많이&amp;nbsp;읽어야&amp;nbsp;잘&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;많이&amp;nbsp;쓸수록&amp;nbsp;더&amp;nbsp;잘&amp;nbsp;쓰게&amp;nbsp;된다.'&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[글쓰기의 철칙 1] 많이 읽어야 한다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 글쓰기는 텍스트 발췌 요약부터 시작하는 게 좋다고 했다.&lt;br /&gt;이는 &lt;b&gt;내가 이 책을 읽게 된 계기이다.&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;기술 블로그를 운영하며 글을 작성하며 느낀 점은 &lt;br /&gt;내가 개발을 못한다도 있지만, &lt;b&gt;글을 너무 못쓴다&lt;/b&gt;도 있었다.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;기술 블로그도 '글'이다.&amp;nbsp;&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;그렇다는 것은 '&lt;b&gt;누군가 이 글을 읽는다'&lt;/b&gt;는 것이고,&lt;br /&gt;많은 사람들이 원하는&lt;b&gt; '좋은 글을 위해선 잘 써야 하고 읽기 편하게 써야 한다'라고&lt;/b&gt; 생각한다.&lt;br /&gt;&lt;br /&gt;그런 갈증으로 이 책을 사서 읽게 되었는데, 내가 찾는 지식을 알려주어서 너무 반가웠다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;어떤 글을 잘 썼다고 할까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작가님께서는&amp;nbsp;&lt;b&gt;잘 쓴 글의 특징&lt;/b&gt;을 위의 4가지로 표현하셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;첫째,&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;무슨 이야기를 하는지&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;주제가 분명&lt;/b&gt;해야&lt;span&gt;&amp;nbsp;&lt;/span&gt;한다&lt;b&gt;.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;둘째,&amp;nbsp;&lt;/b&gt;그&amp;nbsp;주제를&amp;nbsp;다루는&amp;nbsp;데&amp;nbsp;&lt;b&gt;꼭&amp;nbsp;필요한&amp;nbsp;사실과&amp;nbsp;중요한&amp;nbsp;정보&lt;/b&gt;를&amp;nbsp;담아야&amp;nbsp;한다.&lt;b&gt;&lt;br /&gt;셋째,&amp;nbsp;&lt;/b&gt;그&amp;nbsp;사실과&amp;nbsp;정보&amp;nbsp;사이에&amp;nbsp;&lt;b&gt;어떤&amp;nbsp;관계&lt;/b&gt;가&amp;nbsp;있는지&amp;nbsp;분명하게&amp;nbsp;나타내야&amp;nbsp;한다.&lt;b&gt;&lt;br /&gt;넷째,&amp;nbsp;&lt;/b&gt;주제와&amp;nbsp;정보와&amp;nbsp;논리를&amp;nbsp;&lt;b&gt;적절한&amp;nbsp;어휘와&amp;nbsp;문장&lt;/b&gt;으로&amp;nbsp;표현해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이렇게 잘 쓰기 위해서 &lt;b&gt;독해, 요약, 사유와 토론&lt;/b&gt;을 추천하셨다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;[글쓰기의 철칙 2] 많이 써봐야 한다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작가님께서는 &lt;b&gt;&quot;학창 시절 배웠던 한문이 시대가 발전하면서 손으로 직접 안 쓰게 되며&lt;/b&gt;&lt;br /&gt;&lt;b&gt;이제는 손으로는 잘 쓰지 못하게 됐다&quot;&lt;/b&gt;는 말을 하시며 &lt;u&gt;&lt;b&gt;'쓰기'의 중요성을 언급하셨다.&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글을 많이 안 써본 사람들은 &lt;b&gt;글의 첫 문장을&lt;/b&gt; 구성하는데 어려움을 느낀다고 했는데&lt;br /&gt;그 이유가&lt;b&gt; '글 전체를 대략적으로라도 구성해야 하기 때문'&lt;/b&gt;이라고 설명했다.&lt;br /&gt;&lt;br /&gt;이것도 정말 맞는 말이라고 생각한다. 1~2년 전만 해도 글의 초고를 작성하는데 되게 오래 걸렸다.&lt;br /&gt;그리고 부트캠프에 들어가게 되며, 내가 쓴 글을 보여줄 일이 생겼는데 그 과정에서 많이 발전한 것 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어제 회의하던 내용 글로 정리해 봤는데, 보시면서 오늘 회의하면 좋을 것 같아요!&lt;/li&gt;
&lt;li&gt;튜터님께 질문드릴 내용 정리해 봤는데, 이걸 보여드리면서 같이 물어봐요!&lt;/li&gt;
&lt;li&gt;저번에 알려주신 내용 글로 정리해 봤는데, 틀린 내용이나 느낀 점 말해주면 좋을 것 같아요!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등 주로 &lt;b&gt;내가 직접 보여주는 형식&lt;/b&gt;이었다. &lt;br /&gt;누군가가 먼저 찾아와서 내 글을 볼 정도의 수준이 되는 것은 더 미래의 일이라고 생각한다.&lt;br /&gt;&lt;br /&gt;안 그래도 할 일이 많은데, 글을 빠르게 작성할 수 있는 것은 현대시대에도 좋은 능력이라고 생각한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;혹평과 악플을 겁내지 말자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2장에서 말하는 마지막 주제이다. 철칙은 아니지만 작가님의 경험이 담겨있는 것 같다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;'글을 쓸 때는 읽는 사람이 누구일지 미리 살펴야 한다.'&lt;/b&gt;라는 내용이 나오는데&lt;br /&gt;유인물(전단지)을 만들며 어떤 유인물이 사람들이 오래 가지고 있는가?를 조사하며 그 사람들의 니즈(Needs)를 파악해야 한다는 뜻이었다. 그러면서 타인의 평가와 비판을 듣고 다음 작업 때 반영해야 한다고 했다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;이력서&lt;/b&gt;의 경우가 바로 위 예시에 해당하며 기업의 채용담당자들이 읽는 글이다.&lt;br /&gt;그래서 &lt;b&gt;정해진 형식이 있다.&lt;/b&gt; &lt;br /&gt;따라서 글을 이쁘게 작성했다고 해서 내용이 &lt;b&gt;독자의 니즈와 맞지 않으면&lt;/b&gt;&amp;nbsp;가치가 떨어지게 된다.&lt;br /&gt;만약 위처럼 이력서를 잘못 작성했다면, 피드백을 받고 형식에 맞게 적으면 될 뿐이다.&lt;/p&gt;</description>
      <category>책 후기</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/124</guid>
      <comments>https://manvsai.tistory.com/124#entry124comment</comments>
      <pubDate>Tue, 9 Jun 2026 23:47:32 +0900</pubDate>
    </item>
    <item>
      <title>[Spotify Web API 5편] Docker 및 공통모듈 세팅</title>
      <link>https://manvsai.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;5편에서는 구현전에 해놔야 하는 것들을 했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 서비스의 Dockerfile&lt;/li&gt;
&lt;li&gt;docker-compose.yml&lt;/li&gt;
&lt;li&gt;공통에러, 응답 처리&lt;/li&gt;
&lt;li&gt;모든 서비스 연동 확인&lt;/li&gt;
&lt;li&gt;컨피그 Repo에 설정 파일 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내일부터는 &lt;b&gt;밴드 서비스 -&amp;gt; 위키 서비스 -&amp;gt; 게이트웨이 및 유저 서비스 -&amp;gt; 챗 서비스 -&amp;gt; CI 구현 -&amp;gt; 배포 -&amp;gt; 모니터링 -&amp;gt; 프런트 개발&lt;/b&gt; 순서로 진행할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 토글(더보기)은 개발 체크리스트이다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BandFeed 개발 체크리스트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0단계 &amp;mdash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사전 준비&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[x] API / 테이블 / 인프라 설계서 작성&lt;/li&gt;
&lt;li&gt;[x] GitHub 레포 생성 (BandFeed, BandFeed-config)&lt;/li&gt;
&lt;li&gt;[x] 모노레포 멀티모듈 구성 (Gradle)&lt;/li&gt;
&lt;li&gt;[x] Config 레포 생성 및 Config Server 연동&lt;/li&gt;
&lt;li&gt;[x] .gitignore / .env 설정&lt;/li&gt;
&lt;li&gt;[x] Docker Compose 구성 (MySQL, Kafka, Redis, 모니터링 profile)&lt;/li&gt;
&lt;li&gt;[x] 각 서비스 Dockerfile 작성 (7개)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1단계 &amp;mdash; MSA 인프라 및 핵심 비즈니스 구축 (Base MVP)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인프라&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[x] Eureka Server 구축 및 동작 확인&lt;/li&gt;
&lt;li&gt;[x] Config Server 구축 및 각 서비스 yml 연동&lt;/li&gt;
&lt;li&gt;[x] Gateway Service 생성 및 유레카 등록&lt;/li&gt;
&lt;li&gt;[x] 공통 모듈 구성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[x] BaseEntity (Auditing)&lt;/li&gt;
&lt;li&gt;[x] ErrorCode 인터페이스&lt;/li&gt;
&lt;li&gt;[x] BusinessException&lt;/li&gt;
&lt;li&gt;[x] CommonErrorCode&lt;/li&gt;
&lt;li&gt;[x] CommonResponse&amp;lt;T&amp;gt;&lt;/li&gt;
&lt;li&gt;[x] GlobalExceptionHandler&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;서비스 생성 및 유레카 등록&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[x] User Service&lt;/li&gt;
&lt;li&gt;[x] Band Service&lt;/li&gt;
&lt;li&gt;[x] Wiki Service (Post/Song)&lt;/li&gt;
&lt;li&gt;[x] Chat Service&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Band Service &amp;mdash; 핵심 기능 구현&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 도메인 설계 (Entity, Repository)&lt;/li&gt;
&lt;li&gt;[ ] Spotify API 연동&lt;/li&gt;
&lt;li&gt;[ ] Band CRUD API&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Wiki Service &amp;mdash; 핵심 기능 구현&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 도메인 설계 (Entity, Repository)&lt;/li&gt;
&lt;li&gt;[ ] Post/Song 위키형 게시판 CRUD API (인증 없이 우선 개발)&lt;/li&gt;
&lt;li&gt;[ ] Resilience4j 서킷 브레이커 적용&lt;/li&gt;
&lt;li&gt;[ ] @Retryable 재시도 로직 적용 및 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계 &amp;mdash; 게이트웨이 라우팅/보안 및 커뮤니티 확장 (Feature MVP)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Gateway 라우팅 및 인증&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 각 서비스로의 라우팅(Routing) 설정&lt;/li&gt;
&lt;li&gt;[ ] User Service 로그인/회원가입 구현&lt;/li&gt;
&lt;li&gt;[ ] Gateway에서 JWT 토큰 발급&amp;middot;검증 흐름 완성&lt;/li&gt;
&lt;li&gt;[ ] X-User-Id 헤더 전달 필터 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인증 기반 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] BandMember 매핑 구현&lt;/li&gt;
&lt;li&gt;[ ] 프라이빗 타임라인 (접근 제어) 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Chat Service&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] WebSocket + STOMP 개념 학습&lt;/li&gt;
&lt;li&gt;[ ] 1:1 DM 기능 구현&lt;/li&gt;
&lt;li&gt;[ ] Kafka 연동 (메시지 이벤트)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기타&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] FeignClient 서비스 간 통신 구현&lt;/li&gt;
&lt;li&gt;[ ] 이벤트 기반 로직 구현 (Kafka)&lt;/li&gt;
&lt;li&gt;[ ] 통합 시나리오 테스트용 .http 파일 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3단계 &amp;mdash; 인프라 고도화 및 아키텍처 검증 (Architecture MVP)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배포&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] GitHub Actions CI 파이프라인 구축&lt;/li&gt;
&lt;li&gt;[ ] Docker 기반 AWS 멀티 컨테이너 CD 구현&lt;/li&gt;
&lt;li&gt;[ ] 배포 환경 동작 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;모니터링&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] Actuator + Prometheus 엔드포인트 설정&lt;/li&gt;
&lt;li&gt;[ ] Loki + Promtail 로그 수집 설정&lt;/li&gt;
&lt;li&gt;[ ] Grafana 대시보드 구성&lt;/li&gt;
&lt;li&gt;[ ] Alertmanager Slack 알림 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;성능 검증&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] JMeter / k6 부하테스트 환경 구성&lt;/li&gt;
&lt;li&gt;[ ] 외부 API 지연 시 서킷 브레이커 Fallback 검증&lt;/li&gt;
&lt;li&gt;[ ] Redis 캐싱 적용 전후 TPS 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프런트엔드&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 프론트 개발&lt;/li&gt;
&lt;li&gt;[ ] 프론트 배포&lt;/li&gt;
&lt;li&gt;[ ] 프론트로 동작 테스트&lt;/li&gt;
&lt;li&gt;[ ] 버그 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[&amp;nbsp;]&amp;nbsp;실사용자&amp;nbsp;배포&lt;/li&gt;
&lt;li&gt;[&amp;nbsp;]&amp;nbsp;피드백&amp;nbsp;수집&amp;nbsp;및&amp;nbsp;반영&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오늘 배운 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 도커 컴포즈 구성시, &lt;b&gt;변수처럼 묶어서 설정을 적용할 수도 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780833940605&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x-java-tz: &amp;amp;java-tz
  TZ: Asia/Seoul
  JAVA_TOOL_OPTIONS: -Duser.timezone=Asia/Seoul

x-common-service: &amp;amp;common-service
  depends_on:
    eureka-server:
      condition: service_healthy
    config-server:
      condition: service_healthy
    mysql:
      condition: service_healthy
  networks:
    - bandfeed-network
    
  band-service:
    build:
      context: .
      dockerfile: apps/band-service/Dockerfile
    container_name: bandfeed-band
    ports:
      - &quot;${BAND_SERVER_PORT}:9020&quot;
    environment:
      &amp;lt;&amp;lt;: *java-tz
      SERVER_PORT: 9020
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/${MYSQL_BAND_DB}?useSSL=false&amp;amp;serverTimezone=Asia/Seoul&amp;amp;allowPublicKeyRetrieval=true
      SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
      SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
      EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka-server:8761/eureka/
      CONFIG_SERVER_URL: ${CONFIG_SERVER_URL}
    &amp;lt;&amp;lt;: *common-service&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 서비스의 공통으로 적용되는 &lt;b&gt;타임존 설정&lt;/b&gt;&lt;br /&gt;- 핵심 비즈니스 로직을 처리하는 마이크로 서비스에 적용하는&lt;b&gt; depends-on 설정&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 도커 컴포즈 구성 시, 프로필 설정으로 원하는 서비스만 실행&lt;/p&gt;
&lt;pre id=&quot;code_1780834239927&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  prometheus:
    image: prom/prometheus:v2.53.0
    container_name: bandfeed-prometheus
    profiles: [&quot;monitoring&quot;]
    environment:
      - TZ=Asia/Seoul
    ports:
      - &quot;${PROMETHEUS_PORT}:9090&quot;
    volumes:
      - ./monitoring/prometheus/prometheus.yaml:/etc/prometheus/prometheus.yaml
      - ./monitoring/prometheus/alert-rules.yaml:/etc/prometheus/alert-rules.yaml
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yaml'
      - '--storage.tsdb.retention.time=14d'
    restart: unless-stopped
    networks:
      - bandfeed-network&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- profiles: [&quot;프로필명&quot;]을 추가했다.&lt;/p&gt;
&lt;pre id=&quot;code_1780834291698&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up -d
docker-compose --profile monitoring up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모니터링 서비스는 내가 설계한 개발 순서상, 나중에 사용하기에&lt;br /&gt;지금 사용할 서비스만 도커 컴포즈로 실행할 수 있도록 했다.&lt;br /&gt;이후 모니터링 관련 이미지도 포함하여 실행하고 싶다면 &lt;b&gt;--profile monitoring&lt;/b&gt;을 추가하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 컨피그 Repo에 있어야 하는 설정과 각 서비스에서 가지고 있어야 할 설정&lt;/p&gt;
&lt;pre id=&quot;code_1780834501629&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각 서비스가 가져야할 설정들
spring:
  application:
    name: band-service        # Config server가 이 이름으로 파일을 찾음
  config:
    import: optional:configserver:http://localhost:8888  # Config server 연결

server:
  port: 9020   # 로컬 실행 시 fallback 포트

# 컨피그 Repo에 넣어야 할 설정들
spring:
  datasource:		# DB 접속 정보
    url: jdbc:mysql://mysql:3306/band_db
    username: bandfeed
    password: secret
  jpa:
    hibernate:
      ddl-auto: update

# 서비스 디스커버리
eureka:
  client:
    service-url:
      defaultZone: http://eureka-server:8761/eureka/

# 외부 서비스 URL, 각종 키, feature flag 등&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 정보같이 각 서비스별로 달라지는 설정들은 컨피그 Repo에서 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 모니터링 개념 및 방식&lt;/p&gt;
&lt;pre id=&quot;code_1780834754217&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;각 서비스(Spring Boot)
    &amp;darr; /actuator/prometheus (메트릭)
Prometheus (수집)
    &amp;darr;
Grafana (시각화)

각 서비스(로그)
    &amp;darr; Docker 컨테이너 로그
Promtail (수집)
    &amp;darr;
Loki (저장)
    &amp;darr;
Grafana (시각화)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 공통 에러 처리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF6vq0/dJMcaaZQY2w/kI5Btp236rtvsnvxMQHkEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF6vq0/dJMcaaZQY2w/kI5Btp236rtvsnvxMQHkEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF6vq0/dJMcaaZQY2w/kI5Btp236rtvsnvxMQHkEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF6vq0%2FdJMcaaZQY2w%2FkI5Btp236rtvsnvxMQHkEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;448&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ErrorCode 객체를 인터페이스로 선언.&lt;/li&gt;
&lt;li&gt;BusinessException에서 ErrorCode를 생성자 주입받음.&lt;/li&gt;
&lt;li&gt;각 서비스에서 enum 객체를 생성 후 ErrorCode를 구현.&lt;/li&gt;
&lt;li&gt;예외 발생 시, GlobalExceptionHandler에서 가로채어 예외 반환.&lt;/li&gt;
&lt;li&gt;예외 반환 시, CommonResponse로 형식이 통일되어 반환됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 공통 모듈 자체의 jar 파일 생성 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 상황&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gradle&amp;gt; bandfeed&amp;gt; Tasks&amp;gt; build&amp;gt; build 중&amp;nbsp;문제 발생!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 에러 로그&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780835504673&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Error while evaluating property 'mainClass' of task ':apps:bootJar'.
&amp;gt; Main class name has not been configured and it could not be resolved&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 apps 모듈의 jar파일을 생성하는데, main 클래스가 없다는 점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;분석&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 루트 폴더의 build.gradle의 일부분&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780835560212&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 루트 모듈을 제외한 하위 프로젝트 공통 설정
subprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(21)
        }
    }

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    }

    tasks.named('test') {
        useJUnitPlatform()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 폴더 하위의 모듈들에게 공통 의존성을 추가하는 부분이다. &lt;br /&gt;근데 &lt;b&gt;setting.gradle&lt;/b&gt; 설정 때문에&lt;b&gt; apps 자체도 모듈이 된다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780835961815&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootProject.name = 'bandfeed'

include 'common'
include 'apps:config-server'
include 'apps:eureka-server'
include 'apps:gateway-service'
include 'apps:band-service'
include 'apps:user-service'
include 'apps:wiki-service'
include 'apps:chat-service'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apps:라고 prefix를 둔 순간 &lt;b&gt;gradle이 apps라는 중간 부모 모듈을 만든다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;조치 및 해결&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- apps 모듈의 자체 jar 파일 생성기능을 비활성화&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780835247325&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id 'java'
    id 'org.springframework.boot' version '3.5.14'
    id 'io.spring.dependency-management' version '1.1.7'
}

// root project 실행 가능 Jar 파일 생성기능 Off
bootJar.enabled = false

// subprojects 설정(루트 프로젝트 하위 모듈 서비스들 공통 설정)


// 모듈의 기본 jar 파일 생성기능 off
project(':common') {
    bootJar.enabled = false
    jar.enabled = true
}

project(':apps') {
    bootJar.enabled = false
    jar.enabled = false
}

// 나머지 서비스들 플러그인 적용(gradle 감지)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subprojects에 대상으로 포함되어도 &lt;b&gt;jar파일을 생성하지 않게 함으로써 에러를 해결했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 프로젝트</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/123</guid>
      <comments>https://manvsai.tistory.com/123#entry123comment</comments>
      <pubDate>Sun, 7 Jun 2026 21:44:37 +0900</pubDate>
    </item>
    <item>
      <title>[유시민의 글쓰기 특강] 1장 논증의 미학 후기</title>
      <link>https://manvsai.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는&lt;b&gt; '유시민의 글쓰기 특강'&lt;/b&gt;이라는 책을 읽고, &lt;b&gt;느낀 점&lt;/b&gt;을 적어보려고 합니다.&lt;br /&gt;(글의 오른쪽 하단 버튼으로 &lt;b&gt;화이트/다크모드&lt;/b&gt; 전환이 가능합니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;유시민의 글쓰기 특강.jpg&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/InpHM/dJMcadWzdKi/rpKbDum1zPF8E2chhAJL6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/InpHM/dJMcadWzdKi/rpKbDum1zPF8E2chhAJL6K/img.jpg&quot; data-alt=&quot;출처: 교보문고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/InpHM/dJMcadWzdKi/rpKbDum1zPF8E2chhAJL6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FInpHM%2FdJMcadWzdKi%2FrpKbDum1zPF8E2chhAJL6K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;619&quot; data-filename=&quot;유시민의 글쓰기 특강.jpg&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: 교보문고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 &lt;b&gt;책의 1장&lt;/b&gt;을 읽고 느낀 점을 적었습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;책을 읽고 느낀 점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1장에서 전하려는 핵심은 모든 표현의 출발은 '생각'에서 시작한다는 것이다.&lt;br /&gt;말로 표현하던, 행동으로 표현하던 말이다.&lt;br /&gt;그래서 생각을 잘해야 논증도 잘할 수 있다고 한다.&lt;br /&gt;&lt;br /&gt;이 책에서는 &lt;b&gt;토론과 글을 잘 쓰기 위한 3가지 규칙&lt;/b&gt;을&amp;nbsp;소개했다.&lt;br /&gt;&lt;b&gt;1. 취향고백과 주장을 구별한다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2. 주장은 반드시 논증한다. &lt;/b&gt;( 주장을 하면 논증해야 하는 책임이 생긴다. )&lt;br /&gt;&lt;b&gt;3. 글의 주제에 끝까지 집중하라.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1번부터 살펴보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생각(취향고백) : A는 B이다.&lt;/li&gt;
&lt;li&gt;주장 : A는 B라고 생각한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책에서는&lt;b&gt; '대한민국 최고 미남은 장동건이다'&lt;/b&gt;라고 예시를 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 주장이 아니며 취향고백에 가깝다고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;만약 주장을 하고 싶었다면, &lt;b&gt;'나는 장동건을 대한민국 최고미남이라고 생각한다'&lt;/b&gt;라고 했어야 했다.&lt;br /&gt;위의 2번에서 말했듯, &lt;b&gt;주장은 반드시 논증해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다시 말해, 장동건이 미남이라고 생각하는 이유나 근거를 들어야 한다.&lt;br /&gt;미남의 기준을 제시하고, 장동건이 그 기준에 들어맞는다는 것을 증명하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이 말을 들은 사람은, 주장에 동의하거나 반박할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미남의 기준을 새로 제시하거나, 다른 인물이 그 기준에 더 잘 들어맞는다고 할 수 있다.&lt;br /&gt;&lt;br /&gt;위에서 &lt;b&gt;'대한민국 최고 미남은 장동건이다'&lt;/b&gt;라는 말이 &lt;b&gt;주장이 아닌 이유는&lt;/b&gt;&lt;br /&gt;&lt;b&gt;논증하지 않았기 때문에 반박도 할 수 없기 때문이다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;따라서, 논증하지 않은 주장은 반박할 수 없고, 그런 주장은 주장으로 받아들여지지 않는다고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기억나는 나의 일화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 주제와 관련한 &lt;b&gt;기억나는 내 일화를 소개&lt;/b&gt;하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 상황&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;친구와 술집에서 '치즈라볶이'를 먹고 나니 점원이 서비스로 떠먹는 아이스크림을 주었다.&lt;br /&gt;그 후 또 다른 친구가 뒤늦게 도착해, 해물파전을 시켜 먹었다.&lt;br /&gt;&lt;br /&gt;근데 파전을 먹을 앞접시가 따로 없어서 나는 아까 아이스크림을 먹은 그릇을 앞접시로 사용했다.&lt;br /&gt;여기서 문제가 발생했다.&lt;br /&gt;&lt;br /&gt;친구 1: &quot;전을 아이스크림 다 묻은 그 앞접시에 먹어?&quot;&lt;br /&gt;나: &quot;라볶이 빨간 국물을 묻히기 싫어서 그랬다.&quot;&lt;br /&gt;친구 1: &quot;진짜 안타깝다..&quot;&lt;br /&gt;나: &quot;(발끈하며) 아니!&quot;&lt;br /&gt;친구 2: &quot;그만그만 얘들아 싸우지 말자.&quot;&lt;br /&gt;친구 2: &quot;원래는 라볶이 먹던 앞접시에 먹는 게 맞긴 하는데.. 싸우지 말자&quot;&lt;br /&gt;&lt;br /&gt;나는 더 반박하고 싶었지만, 그날 술자리의 분위기를 망치고 싶지 않아 그만하기로 했다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 상황을 책의 토론, 논증의 3가지 규칙을 적용해 보자.&lt;br /&gt;먼저, 여기서 제일 좋은 방법은 그냥 점원에게 새로 앞접시를 달라고 하면 됐다.&lt;br /&gt;&lt;br /&gt;하지만 &lt;b&gt;이미 있는 앞접시를 재활용&lt;/b&gt;해야 한다면 &lt;b&gt;2가지 선택지가 있었다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라볶이 국물이 묻은 앞접시&lt;/li&gt;
&lt;li&gt;아이스크림이 묻은 앞접시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 둘 중 그나마 소스가 덜 묻은 아이스크림이 묻은 앞접시를 선택했지만,&lt;b&gt;&lt;br /&gt;&lt;/b&gt;애초에&lt;b&gt; '둘 중 어느 것이 전에 묻는 것이 싫은지'는 취향문제&lt;/b&gt;라고 생각해서 애초에 &lt;b&gt;논쟁할 필요가 없다고 생각한다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;그리고 만약 그냥 라볶이 국물에 먹는 걸 추천한다며, 그 이유에 대해 설명했다면 좋은 주장이 됐을 것이다.&lt;br /&gt;하지만 친구 1은 &lt;b&gt;&quot;전을 아이스크림 앞접시에 먹는 것이 안타깝다&quot;라고 주장했지만, &lt;u&gt;그에 대한 논증을 하지 않았다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 말은 그냥 비난을 한 것이라고 생각한다.&lt;br /&gt;&lt;br /&gt;물론 술자리에서 했던 대화내용이기에 친구 1을 비난하고 싶은 마음은 없다.&lt;br /&gt;술자리에서마저 이런 논증의 규칙을 다 지키는 사람을 얼마 없을 거라 생각하기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;하지만&lt;/b&gt; 이 책을 읽고 갔더라면..&lt;br /&gt;좀 더 대화를 시도해 볼 수 있었을 것 같다.&lt;br /&gt;안타깝다고 했다면 그 이유에 대해 물어본다던지 말이다.&lt;br /&gt;나도 감정적으로 생각해서 내 주장을 다하지 못했던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다시 정리하면,&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;주장과 취향고백은 구별해라.&lt;/li&gt;
&lt;li&gt;주장은 반드시 논증해라.&lt;/li&gt;
&lt;li&gt;처음부터 끝까지 주제에 집중해라.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>책 후기</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/122</guid>
      <comments>https://manvsai.tistory.com/122#entry122comment</comments>
      <pubDate>Sun, 7 Jun 2026 18:21:09 +0900</pubDate>
    </item>
    <item>
      <title>[Spotify Web API 4편] MSA 프로젝트 초기 세팅</title>
      <link>https://manvsai.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 4편부터는 드디어 구현을 시작하는데, 먼저&amp;nbsp;&lt;b&gt;개발 로드맵&lt;/b&gt; 다시 살펴보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발 로드맵&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[1단계]&lt;/b&gt; MSA 인프라 및 핵심 비즈니스 구축 &lt;b&gt;(Base MVP)&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;s&gt;API, 테이블, 인프라 설계서 작성&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;Eureka Server(디스커버리) 및 Config Server(설정 관리) 구축&lt;/li&gt;
&lt;li&gt;User 서비스, Band 서비스, Post 서비스 생성 및 유레카 등록&lt;br /&gt;&lt;b&gt;[핵심 기능]&lt;/b&gt; Spotify API 연동 및 Post/Song 위키형 게시판 CRUD 완성 (인증 없이 우선 개발)&lt;br /&gt;&lt;b&gt;[장애&amp;nbsp;격리]&lt;/b&gt;&amp;nbsp;Post&amp;nbsp;서비스&amp;nbsp;내에&amp;nbsp;Resilience4j&amp;nbsp;서킷&amp;nbsp;브레이커&amp;nbsp;및&amp;nbsp;@Retryable&amp;nbsp;재시도&amp;nbsp;로직&amp;nbsp;적용&amp;nbsp;및&amp;nbsp;검증&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[2단계]&lt;/b&gt; 게이트웨이 라우팅/보안 필터 및 커뮤니티 확장 &lt;b&gt;(Feature MVP)&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Gateway 서비스 구축 및 각 서비스로의 패스 라우팅(Routing) 적용&lt;br /&gt;&lt;b&gt;[인증/인가 빌드업]&lt;/b&gt; User 서비스에서 로그인 검증 후, Gateway에서 JWT 토큰을 발급&amp;middot;검증하는 흐름 완성&lt;br /&gt;&lt;b&gt;[인증 기반 개발&lt;/b&gt;] 게이트웨이가 넘겨준 헤더(X-User-Id)를 활용해 BandMember 매핑 및 프라이빗 타임라인(접근 제어) 구현&lt;/li&gt;
&lt;li&gt;Chat&amp;nbsp;서비스&amp;nbsp;추가&amp;nbsp;분리&amp;nbsp;및&amp;nbsp;WebSocket&amp;nbsp;+&amp;nbsp;STOMP&amp;nbsp;기반&amp;nbsp;1:1&amp;nbsp;DM&amp;nbsp;구축&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[3단계]&amp;nbsp;&lt;/b&gt;인프라&amp;nbsp;고도화&amp;nbsp;및&amp;nbsp;아키텍처&amp;nbsp;검증&amp;nbsp;&lt;b&gt;(Architecture&amp;nbsp;MVP)&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GitHub Actions와 Docker를 이용한 AWS 멀티 컨테이너 배포 파이프라인 구축&lt;/li&gt;
&lt;li&gt;Prometheus + Grafana를 연동하여 서버 메트릭 모니터링 환경 구축&lt;/li&gt;
&lt;li&gt;JMeter / k6 부하테스트를 통해 외부 API 지연 발생 시 서킷 브레이커 동작(Fallback) 검증 및 Redis 캐싱 적용 전후 TPS 비교&lt;/li&gt;
&lt;li&gt;실사용자&amp;nbsp;배포&amp;nbsp;및&amp;nbsp;피드백&amp;nbsp;수집&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;맞다. &lt;b&gt;지금까지 딱 1줄 했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갈 길이 멀다... 얼른 MSA 환경부터 구성해 보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MSA 환경 구성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 유레카 서버 프로젝트 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4mDCx/dJMcahrbqG7/Cl0fCX4rfekXcWAs4w6SF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4mDCx/dJMcahrbqG7/Cl0fCX4rfekXcWAs4w6SF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4mDCx/dJMcahrbqG7/Cl0fCX4rfekXcWAs4w6SF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4mDCx%2FdJMcahrbqG7%2FCl0fCX4rfekXcWAs4w6SF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;352&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;- 프로메테우스와 액츄에이터(모니터링용)&amp;nbsp;&lt;br /&gt;- 컨피그 클라이언트(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;yml 설정을 받아오기 위해)&lt;/span&gt;&lt;br /&gt;- &lt;b&gt;유레카 서버&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 컨피그 서버 프로젝트 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPkFUZ/dJMcaiKi287/ykaUz7wPRHF9Ci1mc5MuRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPkFUZ/dJMcaiKi287/ykaUz7wPRHF9Ci1mc5MuRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPkFUZ/dJMcaiKi287/ykaUz7wPRHF9Ci1mc5MuRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPkFUZ%2FdJMcaiKi287%2FykaUz7wPRHF9Ci1mc5MuRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;299&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로메테우스, 액츄에이터&lt;br /&gt;- &lt;b&gt;컨피그 서버&lt;/b&gt;&lt;br /&gt;- &lt;b&gt;스프링 웹 ( &lt;/b&gt;이후 공통 모듈로부터 주입받을 예정 )&lt;b&gt;&lt;br /&gt;&lt;/b&gt;(다른 서비스에 yml 파일을 전달할 때, &lt;b&gt;HTTP REST API&lt;/b&gt; 방식으로 전달한다. &lt;br /&gt;이때 필요한 &lt;b&gt;내장 TomCat&lt;/b&gt;을 스프링 웹 의존성으로 지원받기 때문이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 게이트웨이 프로젝트 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfvTA/dJMcadPKJco/Q1K1I7FSL8IKNrTzliR3IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfvTA/dJMcadPKJco/Q1K1I7FSL8IKNrTzliR3IK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfvTA/dJMcadPKJco/Q1K1I7FSL8IKNrTzliR3IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtfvTA%2FdJMcadPKJco%2FQ1K1I7FSL8IKNrTzliR3IK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;342&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로메테우스, 액츄에이터&lt;br /&gt;- 유레카 클라이언트&lt;br /&gt;- 컨피그 클라이언트&lt;br /&gt;- 롬복&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;스프링 시큐리티&lt;/b&gt;&lt;br /&gt;- R4j&lt;br /&gt;- &lt;b&gt;스프링 클라우드 게이트웨이&lt;/b&gt;&lt;br /&gt;- Validation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) Jwt 의존성 추가 &lt;br /&gt;(외부 라이브러리라서 수동으로 추가해야 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공통 모듈&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공통 모듈에 어느 의존성까지 주입해야 하는지&lt;/b&gt; 고민해봐야 할 것 같다.&lt;br /&gt;지금은 아래와 같이 설정했다.&lt;/p&gt;
&lt;pre id=&quot;code_1780762972877&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id 'java-library'
    id 'io.spring.dependency-management'
}

dependencyManagement {
    imports {
        mavenBom &quot;org.springframework.boot:spring-boot-dependencies:3.5.14&quot;
    }
}

dependencies {
    // 모니터링 의존성 추가 예정
    // jpa
    api 'org.springframework.boot:spring-boot-starter-data-jpa'

    // querydsl
    implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
    
    // Srping Web
    implementation 'org.springframework.boot:spring-boot-starter-web'
    
    annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta'
    annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api'

    // lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;롬복은&lt;/b&gt; api로 설정해도 annotationProcessor까지는 전파가 안된다고 해서 &lt;br /&gt;어차피 각 서비스에서도 의존성을 추가해줘야 해서 나중에 제거할 수도 있을 것 같다.&lt;br /&gt;&lt;br /&gt;그리고 이후 prometheus나 actuator를 추가할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;또, 루트 폴더 아래에 build.gradle에서도 의존성을 주입할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780763318274&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id 'java'
    id 'org.springframework.boot' version '3.5.14'
    id 'io.spring.dependency-management' version '1.1.7'
}

// root project 실행 가능 Jar 파일 생성기능 Off
bootJar.enabled = false

allprojects {
    group = 'com.bandfeed'
    version = '0.0.1-SNAPSHOT'
    description = 'bandfeed'

    repositories {
        mavenCentral()
    }
}

// 루트 모듈을 제외한 하위 프로젝트 공통 설정
subprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(21)
        }
    }

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    }

    tasks.named('test') {
        useJUnitPlatform()
    }
}

project(':common') {
    bootJar.enabled = false
    jar.enabled = true
}

project(':apps:gateway-server') {
    apply plugin: 'org.springframework.boot'
}

project(':apps:config-server') {
    apply plugin: 'org.springframework.boot'
}

project(':apps:eureka-server') {
    apply plugin: 'org.springframework.boot'
}

// 그 외 마이크로 서비스들 추가 예정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 유레카 서버, 컨피그 서버, 게이트웨이 서버 같은&lt;b&gt; 인프라 서버들과&lt;/b&gt;&lt;br /&gt;비즈니스로직을 처리하는&lt;b&gt; 각 마이크로 서비스들에게&lt;/b&gt; &lt;b&gt;의존성을 다르게 주입하는 전략을 고민 중&lt;/b&gt;이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인프라 서버들은 루트 폴더 아래 build.gradle로부터만 의존성을 주입받는다.&lt;/li&gt;
&lt;li&gt;그 외 서비스들은 루트 폴더 아래 build.gradle 의존성 + 공통모듈 의존성을 모두 주입받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- band-service 프로젝트 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UEfTT/dJMcabqWZxw/xLpoOUU7fzTIhjiJGZFy1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UEfTT/dJMcabqWZxw/xLpoOUU7fzTIhjiJGZFy1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UEfTT/dJMcabqWZxw/xLpoOUU7fzTIhjiJGZFy1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUEfTT%2FdJMcabqWZxw%2FxLpoOUU7fzTIhjiJGZFy1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;896&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오늘 한 것:&lt;/b&gt;&lt;br /&gt;- 프로젝트 Repo 생성 및 모노레포 멀티모듈 구성&lt;br /&gt;- 컨피그 Repo 생성 및 연동&lt;br /&gt;- 유레카-컨피그-게이트웨이서버 동작 확인&lt;br /&gt;- 공통모듈 추가 및 BaseEntity 동작 확인&lt;br /&gt;- 밴드 서비스 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내일 할 것 :&lt;/b&gt;&lt;br /&gt;- 루트 폴더 아래 build.gradle에 band-service 추가&lt;br /&gt;- user-service, wiki-service, chat-service 프로젝트 생성&lt;br /&gt;- band-service, wiki-service MVP 개발&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Todo List : &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- user-service 구현 및 게이트웨이 시큐리티 기능 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- R4j 적용 및 FeignClient, Kafka 연동&lt;br /&gt;- chat-service에서 사용할 ws 개념 알아보기&lt;br /&gt;- chat-service MVP 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이벤트 로직이 필요한 파트 구현&lt;br /&gt;- 통합 시나리오 테스트용 .http 파일 작성&lt;br /&gt;- 모니터링 설정 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CI 코드 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CD 구현&lt;br /&gt;- 배포환경에서 부하테스트&lt;br /&gt;- 프런트 개발&lt;br /&gt;- 프런트 배포&lt;br /&gt;- 프런트로 동작 테스트&lt;br /&gt;- 버그 수정&lt;br /&gt;- 실 사용자 피드백받기 및 반영&lt;/p&gt;</description>
      <category>개인 프로젝트</category>
      <author>MvA</author>
      <guid isPermaLink="true">https://manvsai.tistory.com/121</guid>
      <comments>https://manvsai.tistory.com/121#entry121comment</comments>
      <pubDate>Sun, 7 Jun 2026 01:45:38 +0900</pubDate>
    </item>
  </channel>
</rss>