<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>상상가속도</title>
    <link>https://v12engine.tistory.com/</link>
    <description>다 커버린 원숭이가 부르는  노래</description>
    <language>ko</language>
    <pubDate>Wed, 19 Aug 2026 06:11:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>12기통엔진</managingEditor>
    <image>
      <title>상상가속도</title>
      <url>https://tistory1.daumcdn.net/tistory/6529283/attach/bd2ff2c6553a482da28c079e78d0560d</url>
      <link>https://v12engine.tistory.com</link>
    </image>
    <item>
      <title>[Spring Boot] VSCode에서 Newer patch version of Spring Boot available: 경고 제거</title>
      <link>https://v12engine.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle 파일의 노란 경고 표시가 거슬린다.&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;Spring Boot 새 버전이 나왔으니 확인하라고 경고를 띄워주는거랜다.&lt;/p&gt;
&lt;figure id=&quot;og_1721475985628&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;The new Spring Boot version validation and upgrade support in Spring Tools&quot; data-og-description=&quot;New releases of Spring Boot are being released on a quite frequent schedule and updating your projects to newer versions of Spring Boot is something that many teams and organizations around the globe do as part of their daily work. Sometimes those upgrades&quot; data-og-host=&quot;spring.io&quot; data-og-source-url=&quot;https://spring.io/blog/2023/01/17/the-new-spring-boot-version-validation-and-upgrade-support-in-spring-tools&quot; data-og-url=&quot;https://spring.io/blog/2023/01/17/the-new-spring-boot-version-validation-and-upgrade-support-in-spring-tools&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hnW7a/hyWCErRJke/BDp8bbZNNhPcB3KUMkyDi1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bDNEUF/hyWCIHOeo5/XSD97RuUu0DYctQMerw8gk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/rZgyl/hyWCJGIbVz/JPbk51jhj3BPel0ZP0Q8B0/img.png?width=1168&amp;amp;height=934&amp;amp;face=0_0_1168_934&quot;&gt;&lt;a href=&quot;https://spring.io/blog/2023/01/17/the-new-spring-boot-version-validation-and-upgrade-support-in-spring-tools&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spring.io/blog/2023/01/17/the-new-spring-boot-version-validation-and-upgrade-support-in-spring-tools&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hnW7a/hyWCErRJke/BDp8bbZNNhPcB3KUMkyDi1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bDNEUF/hyWCIHOeo5/XSD97RuUu0DYctQMerw8gk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/rZgyl/hyWCJGIbVz/JPbk51jhj3BPel0ZP0Q8B0/img.png?width=1168&amp;amp;height=934&amp;amp;face=0_0_1168_934');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;The new Spring Boot version validation and upgrade support in Spring Tools&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;New releases of Spring Boot are being released on a quite frequent schedule and updating your projects to newer versions of Spring Boot is something that many teams and organizations around the globe do as part of their daily work. Sometimes those upgrades&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;VSCode &amp;gt; Preferences &amp;gt; Settings &amp;gt; 'spring-boot' 검색&amp;nbsp; &amp;gt; 좌측 네비게이터에서 'extentions' - 'spring boot tools' - 'versions and support ranges' 항목 선택 &amp;gt; 스크롤 내리면서 UPDATE_LATEST_PATCH_VERSION 항목 찾기 &amp;gt; 해당 옵션 WARNING에서 IGNORE로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;1444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKlAni/btsIG3mgLvs/ZRm1PDi35ANTUcjtqtl3D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKlAni/btsIG3mgLvs/ZRm1PDi35ANTUcjtqtl3D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKlAni/btsIG3mgLvs/ZRm1PDi35ANTUcjtqtl3D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKlAni%2FbtsIG3mgLvs%2FZRm1PDi35ANTUcjtqtl3D1%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;753&quot; height=&quot;940&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;1444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Development</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/30</guid>
      <comments>https://v12engine.tistory.com/30#entry30comment</comments>
      <pubDate>Sat, 20 Jul 2024 20:46:58 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] 초기 프로젝트 403 error request 처리 실패 해결</title>
      <link>https://v12engine.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot 앱이 정상적으로 로드된 뒤에&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2024-07-20T13:50:13.315+09:00 INFO 93019 --- [demo] [ restartedMain] cohttp://m.example.demo.DemoApplication : Started DemoApplication in 2.822 seconds (process running for 3.144)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포스트맨을 이용해 GET /health request를 보내보면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2024-07-20T13:50:17.072+09:00&amp;nbsp;&amp;nbsp;INFO&amp;nbsp;93019&amp;nbsp;---&amp;nbsp;[demo]&amp;nbsp;[nio-4000-exec-2]&amp;nbsp;o.a.c.c.C.[Tomcat].[localhost].[/]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Initializing&amp;nbsp;Spring&amp;nbsp;DispatcherServlet&amp;nbsp;'dispatcherServlet'&lt;br /&gt;&lt;br /&gt;2024-07-20T13:50:17.072+09:00&amp;nbsp;&amp;nbsp;INFO&amp;nbsp;93019&amp;nbsp;---&amp;nbsp;[demo]&amp;nbsp;[nio-4000-exec-2]&amp;nbsp;o.s.web.servlet.DispatcherServlet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Initializing&amp;nbsp;Servlet&amp;nbsp;'dispatcherServlet'&lt;br /&gt;&lt;br /&gt;2024-07-20T13:50:17.075+09:00&amp;nbsp;&amp;nbsp;INFO&amp;nbsp;93019&amp;nbsp;---&amp;nbsp;[demo]&amp;nbsp;[nio-4000-exec-2]&amp;nbsp;o.s.web.servlet.DispatcherServlet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Completed&amp;nbsp;initialization&amp;nbsp;in&amp;nbsp;3&amp;nbsp;ms&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;response없이, dispatcherServlet을 초기화한다는 로그만 남는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 postman 쪽에서 확인해보면 403 error를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원인&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; Spring Boot Application에 포함된 Security Auto Config 클래스의 실행으로 security filter가 동작해 인가 관련 에러가 발생한 것.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자체적인 인가 로직을 보유하고있다면 Security Auto Config 클래스를 SpringBootApplication에서 제외시켜도 좋고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Security Auto Config를 구상해 반드시 Security filter를 통과하도록 구현해놓고 차차 인가 로직을 구현해도 좋을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;해결&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. security configuration 등록 제외&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{project_name}Application.java 파일의 Application 클래스의 데코레이터에 정의된&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@SpringBootApplication 데코레이터를 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1727355588034&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class {app_name}Application {
...
}&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;exclude=SecurityAutoConfiguration.class 옵션으로 해당 클래스를 제거하자.&lt;br /&gt;&lt;br /&gt;2. SecurityConfig&lt;br /&gt;SecurityConfig 클래스를 정의하고, 반드시 필터를 통과하도록 구상한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;../SecurityConfig.java&lt;/p&gt;
&lt;pre id=&quot;code_1727355494054&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf -&amp;gt; csrf.disable())
                .authorizeHttpRequests(requests -&amp;gt; requests.anyRequest().permitAll());
        return http.build();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Development</category>
      <category>403</category>
      <category>be</category>
      <category>Error</category>
      <category>servelet</category>
      <category>spring boot</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/29</guid>
      <comments>https://v12engine.tistory.com/29#entry29comment</comments>
      <pubDate>Sat, 20 Jul 2024 20:42:25 +0900</pubDate>
    </item>
    <item>
      <title>[Terraform] 리소스 모듈화 - Terraform 가이드 (4)</title>
      <link>https://v12engine.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;지난 게시글에서, 빠르게 결과물을 보려고 main.tf 파일에 다 때려넣었는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;각 리소스의 역할에 맞게 파일을 구분해 유지/보수에 유리하게 구조를 변경하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;variables.tf, provider.tf 분리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;network.tf 분리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;security.tf 분리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;rds.tf 분리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;결과 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;마무리&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이전 글까지 따라했다면 아래의 상태일텐데,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721126790268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/project_root
│
├── terraform
│   ├── main.tf
│   ├── .terraform.lock.hcl
│   ├── terraform.tfstate
│   ├── terraform.tfstate.backup
│   ├── .terraform
│   │   ├── ...&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;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;오늘의 목표는 이렇게 바꾸는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721114912004&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/project_root
│
├── terraform
│   ├── main.tf			// 컨트롤 타워
│   ├── variable.tf 		// 민감한 정보 저장
│   ├── provider.tf 		// region 등 배포에 필요한 제공자 저장
│   ├── common 			// util resource
│   │   ├── network
│   │   │   ├── network.tf	// network resource
│   │   ├── security
│   │   │   ├── security.tf	// security resource
│   ├── rds
│   │   ├── rds.tf		// rds resource
│   ├── .terraform.lock.hcl
│   ├── .terraform
│   │   ├── ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;AWS에서 구분한 기능에 맞게 파일을 전부 나누고, 연결시켜 줄 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;variables.tf, provider.tf 분리&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/variables.tf,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721129793857&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Basic Info
variable &quot;region&quot; {
  description = &quot;The AWS region&quot;
  default     = {your_region}
}

# RDS
variable &quot;db_instance_name&quot; {
  description = &quot;The name of the RDS instance&quot;
  type        = string
  default     = {your_instance_name}
}

variable &quot;db_username&quot; {
  description = &quot;Master username for the RDS cluster&quot;
  type        = string
  default     = {your_username}
}

variable &quot;db_password&quot; {
  description = &quot;Master password for the RDS cluster&quot;
  type        = string
  sensitive   = true
  default     = {your_password}
}

variable &quot;db_name&quot; {
    description = &quot;The name of database&quot;
    type = string
    default = {your_db_name}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/provider.tf&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721129862679&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;provider &quot;aws&quot; {
  region = var.region
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;variables.tf, provider.tf 파일을 생성함에 따라, 기존 main.tf 파일을 수정한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/main.tf,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721130107913&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# # Provider
# provider &quot;aws&quot; {
#   region = {your_region}
# }
# Provider 정의 제거

...

# DB Instance
resource &quot;aws_db_instance&quot; &quot;db_instance&quot; {
  identifier              = var.db_instance_name # varialbe.tf에서 불러오도록 변경
...
  username                = var.db_username
  password                = var.db_password
  db_name                 = var.db_name
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;network.tf 분리&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;network 관련 리소스: &lt;b&gt;VPC, &lt;/b&gt;&lt;b&gt;Subnet, &lt;/b&gt;&lt;b&gt;Internet Gateway, &lt;/b&gt;&lt;b&gt;Route Table, &lt;/b&gt;&lt;b&gt;Route Table Association, &lt;/b&gt;&lt;b&gt;Subnet Group&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;새로운 파일을 만들어 옮겨준다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/common/network/network.tf,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721130608125&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DB Network
data &quot;aws_availability_zones&quot; &quot;available&quot; {}

resource &quot;aws_vpc&quot; &quot;db_vpc&quot; {
  cidr_block = &quot;10.0.0.0/16&quot; 
  
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = &quot;db-vpc&quot;
  }
}

resource &quot;aws_subnet&quot; &quot;db_subnet&quot; {
  count             = 2
  vpc_id            = aws_vpc.db_vpc.id
  cidr_block        = element([&quot;10.0.1.0/24&quot;, &quot;10.0.2.0/24&quot;], count.index)
  availability_zone = element(data.aws_availability_zones.available.names, count.index)

  tags = {
    Name = &quot;db-subnet-${count.index}&quot;
  }
}

resource &quot;aws_internet_gateway&quot; &quot;db_igw&quot; {
  vpc_id = aws_vpc.db_vpc.id

  tags = {
    Name = &quot;db-igw&quot;
  }
}

resource &quot;aws_route_table&quot; &quot;db_route_table&quot; {
  vpc_id = aws_vpc.db_vpc.id

  route {
    cidr_block = &quot;0.0.0.0/0&quot;
    gateway_id = aws_internet_gateway.db_igw.id
  }

  tags = {
    Name = &quot;db-route-table&quot;
  }
}

resource &quot;aws_route_table_association&quot; &quot;db_route_table_assoc&quot; {
  count          = 2
  subnet_id      = element(aws_subnet.db_subnet[*].id, count.index)
  route_table_id = aws_route_table.db_route_table.id
}

resource &quot;aws_db_subnet_group&quot; &quot;db_subnet_group&quot; {
  name       = &quot;db-subnet-group&quot;
  subnet_ids = aws_subnet.db_subnet[*].id

  tags = {
    Name = &quot;db-subnet-group&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 중, &lt;b&gt;vpc id, subnet group name&lt;/b&gt;&amp;nbsp;은&amp;nbsp;&lt;b&gt;security, rds에서 필요&lt;/b&gt;로 하니 &lt;b&gt;output으로 따로 지정&lt;/b&gt;해줘야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;in terraform/common/network/network.tf,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721130685499&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
output &quot;db_vpc_id&quot; {
  value = aws_vpc.db_vpc.id
}

output &quot;db_subnet_group_name&quot; {
  value = aws_db_subnet_group.db_subnet_group.name
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;마지막으로 루트 디렉토리의 main.tf 에서 network와 관련된 부분을 변경하고&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;vpc id, subnet group id 받아오는 문법을 교체한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;in terraform/main.tf,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721130766849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DB Network
module &quot;network&quot; { # 기존 코드를 교체
  source = &quot;./common/network&quot;
}

# DB Security
resource &quot;aws_security_group&quot; &quot;db_sg&quot; {
...
  vpc_id = module.network.db_vpc_id # 교체
...
}

# DB Instance
resource &quot;aws_db_instance&quot; &quot;db_instance&quot; {
...
  db_subnet_group_name    = module.network.db_subnet_group_name # 교체
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;security.tf 분리&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이번엔 network 때와 다르게 main.tf에 정의할 module에 db_vpc_id 라는 input이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기존 main.tf의 코드를 옮기고, rds resource에서 사용할 security group id 를 output으로 내놓는 것까진 동일하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/common/security/security.tf,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721131313912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DB Security
resource &quot;aws_security_group&quot; &quot;db_sg&quot; {
  description = &quot;Allow DB instance access&quot;
  vpc_id = module.network.db_vpc_id

  ingress {
    from_port   = 3306
    to_port     = 3306
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = &quot;-1&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  tags = {
    Name = &quot;db-sg&quot;
  }
}

output &quot;db_sg_id&quot; {
  value = aws_security_group.db_sg.id
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이제 network module의 output을 security module의 input으로 받아들일 수 있는 구조로 변경하자.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;terraform/common/security 디렉토리에 variables.tf 파일을 만들자.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/common/security/variables.tf,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721131462567&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;variable &quot;db_vpc_id&quot; {
  description = &quot;The ID of the VPC for DB&quot;
  type        = string
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그리고 security.tf 의 module.network.db_vpc_id 부분을 변경하자.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;in terraform/common/security/security.tf,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721131612117&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DB Security
resource &quot;aws_security_group&quot; &quot;db_sg&quot; {
...
  vpc_id = var.db_vpc_id
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;security 디렉토리의 variables.tf에 &quot;db_vpc_id&quot;가 정의되었으므로,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;해당 디렉토리를 기준으로 생성되는 모듈에서는 &quot;db_vpc_id&quot; 값을 반드시 필요&lt;/b&gt;로 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;마지막으로 main.tf 의 security 부분을 교체한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;in terraform/main.tf&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721131720638&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
# DB Security
module &quot;security&quot; {
  source     = &quot;./common/security&quot;
  db_vpc_id  = module.network.db_vpc_id # Resource Input
}

# DB Instance
resource &quot;aws_db_instance&quot; &quot;db_instance&quot; {
...
  vpc_security_group_ids  = [module.security.db_sg_id]
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;rds.tf 분리&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이제 감을 잡았을 것이다. 해야할 것은 크게 4가지&lt;/span&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;다른 모듈에서 필요한 정보는 output {} 으로 정의해주기&lt;/li&gt;
&lt;li&gt;input에 필요한 정보는 해당 디렉토리에 variables.tf 파일을 만들어 정의&lt;/li&gt;
&lt;li&gt;main.tf 파일에서 module {} 문법으로 교체, 3번에서 정의한 input 집어 넣어 주기&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;한 번에 가보자.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/rds/rds.tf&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721133178303&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DB Instance
resource &quot;aws_db_instance&quot; &quot;db_instance&quot; {
  identifier              = var.db_instance_name
  instance_class          = &quot;db.t3.micro&quot;
  engine                  = &quot;mysql&quot;
  engine_version          = &quot;8.0.34&quot;
  username                = var.db_username
  password                = var.db_password
  db_name                 = var.db_name
  allocated_storage       = 20
  db_subnet_group_name    = var.db_subnet_group_name
  vpc_security_group_ids  = [var.db_sg_id]
  skip_final_snapshot     = true
  publicly_accessible     = true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/rds/variables/tf&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721133209522&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;variable &quot;db_sg_id&quot; {
    description = &quot;Security group id for db instance&quot;
    type = string
}

variable &quot;db_instance_name&quot; {
  description = &quot;The name of the RDS instance&quot;
  type        = string
}

variable &quot;db_username&quot; {
    description = &quot;Root user name&quot;
    type = string
}

variable &quot;db_password&quot; {
    description = &quot;Root user password&quot;
    type = string
}

variable &quot;db_name&quot; {
    description = &quot;The name of database&quot;
    type = string
}

variable &quot;db_subnet_group_name&quot; {
    description = &quot;Subnet group name for db&quot;
    type = string
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;in terraform/main.tf&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721133256140&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
# DB instance
module &quot;rds&quot; {
  source = &quot;./rds&quot;
  db_sg_id             = module.security.db_sg_id
  db_instance_name     = var.db_instance_name
  db_username          = var.db_username
  db_password          = var.db_password
  db_name              = var.db_name
  db_subnet_group_name = module.network.db_subnet_group_name
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;결과 확인&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1721133546750&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform init&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1721133581300&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform validate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HaKV8/btsICfUfr18/SKj16vLtyveGJhd3yzcK2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HaKV8/btsICfUfr18/SKj16vLtyveGJhd3yzcK2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HaKV8/btsICfUfr18/SKj16vLtyveGJhd3yzcK2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHaKV8%2FbtsICfUfr18%2FSKj16vLtyveGJhd3yzcK2K%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;467&quot; height=&quot;288&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1721133621513&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform apply&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8wvK7/btsICUV7TPj/HCXmWSe1xh5V6lm1sNjEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8wvK7/btsICUV7TPj/HCXmWSe1xh5V6lm1sNjEK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8wvK7/btsICUV7TPj/HCXmWSe1xh5V6lm1sNjEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8wvK7%2FbtsICUV7TPj%2FHCXmWSe1xh5V6lm1sNjEK1%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;453&quot; height=&quot;146&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;지난 게시글에서와 동일하게 10개의 리소스를 배포한다고 한다. 구조만 변경한 것이니 당연하다.&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;마무리&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;디렉토리는 아래처럼 바뀌었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721133763981&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/project_root
│
├── terraform
│   ├── main.tf
│   ├── variable.tf
│   ├── provider.tf
│   ├── common
│   │   ├── network
│   │   │   ├── network.tf
│   │   ├── security
│   │   │   ├── security.tf
│   │   │   ├── variables.tf
│   ├── rds
│   │   ├── rds.tf
│   │   ├── variables.tf
│   ├── .terraform.lock.hcl
│   ├── .terraform
│   │   ├── ...&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;/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;마지막으로 .gitignore에 일부 파일을 등록하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;in /.gitignore&lt;/p&gt;
&lt;pre id=&quot;code_1721133862718&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
# Ignore infra
terraform/.terraform/*
terraform/variables.tf
terraform/*.tfstate
terraform/*.tfstate.*
terraform/*.hcl
terraform/variables.tf.bak&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;끝! 다음 게시글에서는 ecr, ecs 리소스를 추가하는 과정을 다루겠다.&lt;/p&gt;</description>
      <category>Development</category>
      <category>AWS</category>
      <category>infra</category>
      <category>RDS</category>
      <category>terraform</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/28</guid>
      <comments>https://v12engine.tistory.com/28#entry28comment</comments>
      <pubDate>Tue, 16 Jul 2024 21:46:06 +0900</pubDate>
    </item>
    <item>
      <title>[Terraform] AWS RDS - Terraform 가이드 (3)</title>
      <link>https://v12engine.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Terraform을 처음 이용해보는 사람의 입장에서 작성하는 시리즈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 글은 AWS와 연결해 &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;b&gt;구조 연결&lt;/b&gt; 등을 진행할 계획이니 차근차근 따라오면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;terraform 디렉토리 생성, main.tf 파일 생성&lt;/li&gt;
&lt;li&gt;RDS 클러스터, 인스턴스 정의&lt;/li&gt;
&lt;li&gt;Network 리소스 정의&lt;/li&gt;
&lt;li&gt;Security 리소스 정의&lt;/li&gt;
&lt;li&gt;AWS credential 연결&lt;/li&gt;
&lt;li&gt;배포&lt;/li&gt;
&lt;li&gt;마무리&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;terraform 디렉토리 생성, main.tf 파일 생성&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;백엔드 프로젝트의 루트 디렉토리에 terraform 디렉토리를 생성하자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721107682595&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir terraform&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 디렉토리에 VSCode의 명령어 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;⌘&lt;/span&gt; + &lt;span style=&quot;background-color: #dddddd;&quot;&gt;N&lt;/span&gt; 로 main.tf 파일을 하나 생성한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;(참고)&lt;br /&gt;이번 글에서는 실행해보는 것을 목표로 하기 때문에 main.tf 파일에 모든 정보를 기재할 예정이다.&lt;br /&gt;다음 글에서부터 variable.tf, provider.tf 파일을 생성해 민감한 정보를 담은 코드를 분리하고&lt;br /&gt;리소스를 역할 별로 디렉토리를 만들어 분류할 예정이다.&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RDS 클러스터, 인스턴스 정의&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;aws region 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;in /terraform/main.tf,&lt;/p&gt;
&lt;pre id=&quot;code_1721112380379&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Provider
provider &quot;aws&quot; {
  region = {your_region}
}&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;&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;db instance 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;in /terraform/main.tf,&lt;/p&gt;
&lt;pre id=&quot;code_1721101329976&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DB Instance
resource &quot;aws_db_instance&quot; &quot;db_instance&quot; {
  identifier              = {your_db_instance_name}
  instance_class          = &quot;db.t3.micro&quot; // free tier
  engine                  = &quot;mysql&quot;
  engine_version          = &quot;8.0.34&quot;
  username                = {db_username}
  password                = {db_password}
  db_name                 = {db_name}
  allocated_storage       = 20
  skip_final_snapshot     = true
  publicly_accessible     = true
}&lt;/code&gt;&lt;/pre&gt;
&lt;figure id=&quot;og_1721102228248&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Terraform Registry&quot; data-og-description=&quot;&quot; data-og-host=&quot;registry.terraform.io&quot; data-og-source-url=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance&quot; data-og-url=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Terraform Registry&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;registry.terraform.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서에서 필요한 프로퍼티를 찾아 기입하자.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 252px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;identifier&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;AWS console에 노출될 이름을 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;instance_class&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;&lt;span&gt;Free tier 에 해당하는 &quot;db.t3.micro&quot; 클래스로 정의한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;engine, engine_version&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;&lt;span&gt;engine, engine_version: 사용할 엔진, 버전을 지정한다. (Docs가 불친절해서 AWS에서 옵션을 보고 기입하자.)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;username, password&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;&lt;span&gt;RDS는 master 계정과 동일한 권한의 계정을 추가 생성해 우리에게 제공해준다. 해당 계정의 이름, 비밀번호를 설정하자.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;db_name&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;사용할 db의 이름을 지정한다. 이 옵션을 넣으면 자동으로 db를 만들어준다. 나중에 진입해서 테이블은 만들어놔야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;allocated_storage&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;Storage 양, GB 단위이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;skip_final_snapshot&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;해당 DB instance를 삭제할 때 final snapshot을 만들지 물어보는 항목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;publicly_accessible&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;AWS 내부 네트워크에서만 통신할건지 물어보는 항목&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Network 리소스 정의&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위에서 정의한 db instance가 배포되었을 때 public network를 통해 접근할 수 있도록 정의해주자.&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;VPC&lt;/b&gt;: AWS 클라우드 내에 격리된 네트워크 환경을 제공&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Subnet&lt;/b&gt;: VPC 내에서 IP 주소 범위를 더 작은 논리적 네트워크로 분할&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Internet Gateway&lt;/b&gt;: VPC와 인터넷 간의 양방향 통신을 가능하게 하는 게이트웨이&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Route Table&lt;/b&gt;: VPC 내 네트워크 트래픽 경로를 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Route Table Association&lt;/b&gt;: 서브넷을 특정 라우팅 테이블에 연결&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Subnet Group&lt;/b&gt;: RDS와 같은 특정 AWS 서비스에서 사용되는 논리적 서브넷 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;in /terraform/main.tf,&lt;/p&gt;
&lt;pre id=&quot;code_1721111564917&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DB Network
data &quot;aws_availability_zones&quot; &quot;available&quot; {}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1721102398150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_vpc&quot; &quot;db_vpc&quot; {
  cidr_block = &quot;10.0.0.0/16&quot; 
  
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = &quot;db-vpc&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1721102432684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_subnet&quot; &quot;db_subnet&quot; {
  count             = 2
  vpc_id            = aws_vpc.db_vpc.id
  cidr_block        = element([&quot;10.0.1.0/24&quot;, &quot;10.0.2.0/24&quot;], count.index)
  availability_zone = element(data.aws_availability_zones.available.names, count.index)

  tags = {
    Name = &quot;db-subnet-${count.index}&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1721102446676&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_internet_gateway&quot; &quot;db_igw&quot; {
  vpc_id = aws_vpc.db_vpc.id

  tags = {
    Name = &quot;db-igw&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1721102457725&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_route_table&quot; &quot;db_route_table&quot; {
  vpc_id = aws_vpc.db_vpc.id

  route {
    cidr_block = &quot;0.0.0.0/0&quot;
    gateway_id = aws_internet_gateway.db_igw.id
  }

  tags = {
    Name = &quot;db-route-table&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1721102465827&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_route_table_association&quot; &quot;db_route_table_assoc&quot; {
  count          = 2
  subnet_id      = element(aws_subnet.db_subnet[*].id, count.index)
  route_table_id = aws_route_table.db_route_table.id
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1721102471459&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_db_subnet_group&quot; &quot;db_subnet_group&quot; {
  name       = &quot;db-subnet-group&quot;
  subnet_ids = aws_subnet.db_subnet[*].id

  tags = {
    Name = &quot;db-subnet-group&quot;
  }
}&lt;/code&gt;&lt;/pre&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;DB instance와 subnet group 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1721108154415&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DB Instance
resource &quot;aws_db_instance&quot; &quot;db_instance&quot; {
...
  db_subnet_group_name    = aws_db_subnet_group.db_subnet_group.name // New!
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Security 리소스 정의&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 접근 가능 ip, port를 제한하는 Security Group을 정의한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;in /terraform/main.tf,&lt;/p&gt;
&lt;pre id=&quot;code_1721108383790&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_security_group&quot; &quot;db_sg&quot; {
  description = &quot;Allow DB instance access&quot;
  vpc_id = aws_vpc.db_vpc.id

  ingress {
    from_port   = 3306
    to_port     = 3306
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = &quot;-1&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  tags = {
    Name = &quot;db-sg&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 security group은,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ingress - 모든 ip로부터 3306 포트의 통신만 받는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;egress - 모든 ip, 모든 포트에 정보를 전달 가능하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;DB instance와 security group 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1721110003302&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_db_instance&quot; &quot;db_instance&quot; {
  ...
  vpc_security_group_ids  = [aws_security_group.db_sg.id] // New!
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AWS credential 연결&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS IAM user 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Access Key 발급&lt;/li&gt;
&lt;li&gt;console 로그인용 user name, password는 선택 사항&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS IAM user 권한 추가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;user group에 권한을 추가한 뒤 해당 group에 user 추가해도 됨.&lt;/li&gt;
&lt;li&gt;Policy - 내 권한에 있는 건데, 최적화된 권한은 아니므로 추가로 알아봐야한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AmazonRDSFullAccess&lt;/li&gt;
&lt;li&gt;AmazonECS_FullAccess&lt;/li&gt;
&lt;li&gt;AmazonECSTaskExecutionRolePolicy&lt;/li&gt;
&lt;li&gt;AmazonElasticContainerRegistryPublicFullAccess&lt;/li&gt;
&lt;li&gt;AmazonEC2ContainerRegistryFullAccess&lt;/li&gt;
&lt;li&gt;AmazonEC2FullAccess&lt;/li&gt;
&lt;li&gt;ElasticLoadBalancingFullAccess&lt;/li&gt;
&lt;li&gt;CloudWatchLogsFullAccess&lt;/li&gt;
&lt;li&gt;IAMFullAccess&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS cli 설치 및 로그인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1721110458471&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws configure&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Access Key ID, Access Key, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;region 입력&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;배포&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 과정에 성공하면 AWS에 인스턴스가 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료 티어의 인스턴스이더라도, &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;&lt;b&gt;네트워크 송수신 비용이 발생&lt;/b&gt;&lt;/span&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;pre id=&quot;code_1721111594246&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ngY5E/btsICnjNx4y/UXGkqMqvsugtZJKyz15p01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ngY5E/btsICnjNx4y/UXGkqMqvsugtZJKyz15p01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ngY5E/btsICnjNx4y/UXGkqMqvsugtZJKyz15p01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FngY5E%2FbtsICnjNx4y%2FUXGkqMqvsugtZJKyz15p01%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;369&quot; height=&quot;171&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1721111605215&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform validate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0q5qC/btsICdIwvze/PdwJFtmY58F1CVK7VnPZX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0q5qC/btsICdIwvze/PdwJFtmY58F1CVK7VnPZX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0q5qC/btsICdIwvze/PdwJFtmY58F1CVK7VnPZX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0q5qC%2FbtsICdIwvze%2FPdwJFtmY58F1CVK7VnPZX0%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;420&quot; height=&quot;52&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1721111670664&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform apply&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lwdHW/btsICuC6l0C/KRlVP6YGow9s1uGzqLZPu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lwdHW/btsICuC6l0C/KRlVP6YGow9s1uGzqLZPu0/img.png&quot; width=&quot;421&quot; height=&quot;459&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;1392&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.8556%; margin-right: 10px;&quot; data-widthpercent=&quot;31.22&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lwdHW/btsICuC6l0C/KRlVP6YGow9s1uGzqLZPu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlwdHW%2FbtsICuC6l0C%2FKRlVP6YGow9s1uGzqLZPu0%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;1278&quot; height=&quot;1392&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xLorR/btsICnRGtbf/HnTiqKgfjpzRhJWmgMRXv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xLorR/btsICnRGtbf/HnTiqKgfjpzRhJWmgMRXv0/img.png&quot; data-origin-width=&quot;1776&quot; data-origin-height=&quot;878&quot; data-is-animation=&quot;false&quot; style=&quot;width: 67.9816%;&quot; data-widthpercent=&quot;68.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xLorR/btsICnRGtbf/HnTiqKgfjpzRhJWmgMRXv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxLorR%2FbtsICnRGtbf%2FHnTiqKgfjpzRhJWmgMRXv0%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;1776&quot; height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;yes를 입력하면 배포를 시도한다. db instance 쪽 오류를 해결하느라 1개만 마지막에 추가됐는데, 문제 없다면 10개의 리소스가 추가된다.&lt;/figcaption&gt;
&lt;/figure&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;배포에 성공했으니, 접속되는지 mysql client로 확인해보자.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필자는 Sequel Ace를 사용하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wKqNi/btsIBXsqKN5/Lb7U3P4aZ57ONinrIK0pUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wKqNi/btsIBXsqKN5/Lb7U3P4aZ57ONinrIK0pUK/img.png&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1644&quot; data-origin-width=&quot;2624&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wKqNi/btsIBXsqKN5/Lb7U3P4aZ57ONinrIK0pUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwKqNi%2FbtsIBXsqKN5%2FLb7U3P4aZ57ONinrIK0pUK%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;2624&quot; height=&quot;1644&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwCbE0/btsIBbdQdbE/HcoIQHtF6iVg9oukCZ7Rh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwCbE0/btsIBbdQdbE/HcoIQHtF6iVg9oukCZ7Rh0/img.png&quot; data-widthpercent=&quot;50&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1644&quot; data-origin-width=&quot;2624&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwCbE0/btsIBbdQdbE/HcoIQHtF6iVg9oukCZ7Rh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwCbE0%2FbtsIBbdQdbE%2FHcoIQHtF6iVg9oukCZ7Rh0%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;2624&quot; height=&quot;1644&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;성공!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 삭제까지 연습해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1721111823416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform destroy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;terraform apply 명령어로 생성된 모든 리소스를 제거한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;1002&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbkozz/btsIBoqk9sb/BdpAbUzZ3duPHUeODl2OMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbkozz/btsIBoqk9sb/BdpAbUzZ3duPHUeODl2OMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbkozz/btsIBoqk9sb/BdpAbUzZ3duPHUeODl2OMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbkozz%2FbtsIBoqk9sb%2FBdpAbUzZ3duPHUeODl2OMK%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;501&quot; height=&quot;267&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;1002&quot;/&gt;&lt;/span&gt;&lt;/figure&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;로그를 꼭 확인하고 AWS 콘솔에서 확실히 삭제해 불필요한 비용 지출을 막자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;마무리&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재까지 디렉토리 구조&lt;/p&gt;
&lt;pre id=&quot;code_1721112050198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/project_root
│
├── terraform
│   ├── main.tf
│   ├── .terraform.lock.hcl
│   ├── terraform.tfstate
│   ├── terraform.tfstate.backup
│   ├── .terraform
│   │   ├── ...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;.terraform.lock.hcl, terraform.tfstate, terraform.tfstate.backup 파일, .terraform 디렉토리는 .gitignore에 추가하자.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 main.tf 파일은 다음과 같을 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1721112222889&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Provider
provider &quot;aws&quot; {
  region = {your_region}
}

# DB Network
data &quot;aws_availability_zones&quot; &quot;available&quot; {}

resource &quot;aws_vpc&quot; &quot;db_vpc&quot; {
  cidr_block = &quot;10.0.0.0/16&quot; 
  
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = &quot;db-vpc&quot;
  }
}

resource &quot;aws_subnet&quot; &quot;db_subnet&quot; {
  count             = 2
  vpc_id            = aws_vpc.db_vpc.id
  cidr_block        = element([&quot;10.0.1.0/24&quot;, &quot;10.0.2.0/24&quot;], count.index)
  availability_zone = element(data.aws_availability_zones.available.names, count.index)

  tags = {
    Name = &quot;db-subnet-${count.index}&quot;
  }
}

resource &quot;aws_internet_gateway&quot; &quot;db_igw&quot; {
  vpc_id = aws_vpc.db_vpc.id

  tags = {
    Name = &quot;db-igw&quot;
  }
}

resource &quot;aws_route_table&quot; &quot;db_route_table&quot; {
  vpc_id = aws_vpc.db_vpc.id

  route {
    cidr_block = &quot;0.0.0.0/0&quot;
    gateway_id = aws_internet_gateway.db_igw.id
  }

  tags = {
    Name = &quot;db-route-table&quot;
  }
}

resource &quot;aws_route_table_association&quot; &quot;db_route_table_assoc&quot; {
  count          = 2
  subnet_id      = element(aws_subnet.db_subnet[*].id, count.index)
  route_table_id = aws_route_table.db_route_table.id
}

resource &quot;aws_db_subnet_group&quot; &quot;db_subnet_group&quot; {
  name       = &quot;db-subnet-group&quot;
  subnet_ids = aws_subnet.db_subnet[*].id

  tags = {
    Name = &quot;db-subnet-group&quot;
  }
}

# DB Security
resource &quot;aws_security_group&quot; &quot;db_sg&quot; {
  description = &quot;Allow DB instance access&quot;
  vpc_id = aws_vpc.db_vpc.id

  ingress {
    from_port   = 3306
    to_port     = 3306
    protocol    = &quot;tcp&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = &quot;-1&quot;
    cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  tags = {
    Name = &quot;db-sg&quot;
  }
}

# DB Instance
resource &quot;aws_db_instance&quot; &quot;db_instance&quot; {
  identifier              = {your_db_instance_name}
  instance_class          = &quot;db.t3.micro&quot; // free tier
  engine                  = &quot;mysql&quot;
  engine_version          = &quot;8.0.34&quot;
  username                = {db_username}
  password                = {db_password}
  db_name                 = {db_name}
  allocated_storage       = 20
  db_subnet_group_name    = aws_db_subnet_group.db_subnet_group.name
  vpc_security_group_ids  = [aws_security_group.db_sg.id]
  skip_final_snapshot     = true
  publicly_accessible     = true
}&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;다음 글에서는 main.tf 하나의 파일을 역할에 맞게 분리, 연결하는 작업을 진행할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 variable.tf 등 보안과 관련된 파일을 .gitignore에 추가해 공개되는 것을 막는 작업 등도 포함되어 있으니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋은 다음 글까지 진행한 다음 찍어주자.&lt;/p&gt;</description>
      <category>Development</category>
      <category>AWS</category>
      <category>infra</category>
      <category>RDS</category>
      <category>terraform</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/27</guid>
      <comments>https://v12engine.tistory.com/27#entry27comment</comments>
      <pubDate>Tue, 16 Jul 2024 15:49:56 +0900</pubDate>
    </item>
    <item>
      <title>[Terraform] Terraform 환경 설정 - Terraform 가이드 (1)</title>
      <link>https://v12engine.tistory.com/26</link>
      <description>&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Terraform?&lt;/li&gt;
&lt;li&gt;Terraform CLI 설치&lt;/li&gt;
&lt;li&gt;VSCode Extension 설치&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Terraform?&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1720968609729&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;What is Terraform | Terraform | HashiCorp Developer&quot; data-og-description=&quot;Terraform is an infrastructure as code tool that lets you build, change, and version cloud and on-prem resources safely and efficiently.&quot; data-og-host=&quot;developer.hashicorp.com&quot; data-og-source-url=&quot;https://developer.hashicorp.com/terraform/intro&quot; data-og-url=&quot;https://developer.hashicorp.com/terraform/intro&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buot3z/hyWzpIV3o8/FBwEKdqTCsmtNkVKb06O70/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/peQWc/hyWzBP6Qvs/4ZKXZnQ3dRsOt2WEyjKj6K/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800&quot;&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/intro&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.hashicorp.com/terraform/intro&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buot3z/hyWzpIV3o8/FBwEKdqTCsmtNkVKb06O70/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/peQWc/hyWzBP6Qvs/4ZKXZnQ3dRsOt2WEyjKj6K/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What is Terraform | Terraform | HashiCorp Developer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Terraform is an infrastructure as code tool that lets you build, change, and version cloud and on-prem resources safely and efficiently.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.hashicorp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;AWS, GCP 등 클라우드 컴퓨팅 기반의 인프라 제공 서비스를 코드 작성으로 이용할 수 있도록 도와줍니다.&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;AWS 콘솔 등에서 웹 GUI를 통해 리소스를 생성하면 되는거 아니냐? 라고 생각하실 수 있지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 깃헙 커밋 등을 통해 리소스가 어떻게 변화해가는지 추적 관찰이 가능하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. (AWS 기능을 잘 꿰고 있다면) 쉽고 빠르게 리소스를 변화시키는 것이 가능하다는 장점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;&lt;b&gt;인프라의 유지 보수&lt;/b&gt;&lt;/span&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;다만 Terraform에서 지원하는 자동화의 부작용으로 의도하지 않았던 동작이 실행될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ex) 인스턴스 일부 기능의 교체를 기대했으나 인스턴스를 삭제/재생성하여 서비스가 일시적으로 중단됨&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;Terraform을 사용해 배포를 시도할때마다 현재 적용 중인 리소스를 기준으로 &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;&lt;b&gt;삭제/변형/생성되는 리소스의 갯수&lt;/b&gt;&lt;/span&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Terraform CLI 설치&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1720969696435&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Install Terraform | Terraform | HashiCorp Developer&quot; data-og-description=&quot;Install Terraform on Mac, Linux, or Windows by downloading the binary or using a package manager (Homebrew or Chocolatey). Then create a Docker container locally by following a quick-start tutorial to check that Terraform installed correctly.&quot; data-og-host=&quot;developer.hashicorp.com&quot; data-og-source-url=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli&quot; data-og-url=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bRpPLm/hyWzCBrWOw/wN8ogINPMnyOqpYCuZpSN0/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/NPBxC/hyWzEMQiwG/6fKn2Vqo3B8kSICKT75EO0/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800&quot;&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bRpPLm/hyWzCBrWOw/wN8ogINPMnyOqpYCuZpSN0/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/NPBxC/hyWzEMQiwG/6fKn2Vqo3B8kSICKT75EO0/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Install Terraform | Terraform | HashiCorp Developer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Install Terraform on Mac, Linux, or Windows by downloading the binary or using a package manager (Homebrew or Chocolatey). Then create a Docker container locally by following a quick-start tutorial to check that Terraform installed correctly.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.hashicorp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제 별로 잘 구분해두었으니 맞는 설정에 따라 설치해주시면 됩니다. 저는 MacOS에 Homebrew 사용 중이라 금방 설치했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;VSCode Extension 설치&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;VSCode 실행 중 ⇧ + ⌘ + X 커맨드 입력해 Extensions 기능 열기&lt;/li&gt;
&lt;li&gt;Terraform 검색&lt;/li&gt;
&lt;li&gt;Hashcorp 사에서 배포한 Terraform Extension 설치&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9wTrU/btsIy0Xqsl8/d2Yzj8q9dzCzYSVmxuqUt1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9wTrU/btsIy0Xqsl8/d2Yzj8q9dzCzYSVmxuqUt1/img.gif&quot; data-alt=&quot;자동완성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9wTrU/btsIy0Xqsl8/d2Yzj8q9dzCzYSVmxuqUt1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/9wTrU/btsIy0Xqsl8/d2Yzj8q9dzCzYSVmxuqUt1/img.gif&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;540&quot; height=&quot;327&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;548&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;구조까지 잡아주는 자동완성이라 불필요한 코드 작성은 줄었다. 하지만,&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;key까진 잡아주는데 value 후보를 보여주지 않았으며,&lt;/li&gt;
&lt;li&gt;Docs에도 어떤 value가 후보인지 한눈에 정리된 문서를 찾지 못해&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 AWS 콘솔 뜯어가면서 값 찾아서 집어넣었다.&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;다음 글은 Terraform에서 사용하는 hcl 문법의 기본적인 사항을 점검할 예정이다.&lt;/p&gt;</description>
      <category>Development</category>
      <category>AWS</category>
      <category>DevOps</category>
      <category>infra</category>
      <category>terraform</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/26</guid>
      <comments>https://v12engine.tistory.com/26#entry26comment</comments>
      <pubDate>Mon, 15 Jul 2024 00:21:34 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker 자주 쓰는 명령어 정리</title>
      <link>https://v12engine.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 대부분이 Docker client(Docker Desktop)가 있으면 안써도 되는 명령어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 cloud computing 환경같이 gui client 설치가 불가능할 때도 있으니 명령어를 정리해두면 좋을 것 같다.&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;util, image 관련, container 관련, network 관련 4개의 항목으로 구분해두었다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Util&lt;/li&gt;
&lt;li&gt;Image 관련&lt;/li&gt;
&lt;li&gt;Container 관련&lt;/li&gt;
&lt;li&gt;Network 관련&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Util&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1720949554893&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker login&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령어 입력 후 Docker Hub의 계정, 비밀번호를 각각 입력해 로그인한다.&lt;/li&gt;
&lt;li&gt;Docker Hub와 연결하려면 필수적인 작업이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Image 관련&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1720948762151&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull {repository_name}:{tag_name}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Docker Hub에서 이미지를 가져온다. 필요한 이미지를 찾아 pull&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;pre id=&quot;code_1720948850467&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker image ls&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬에 보유 중인 Docker Image를 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720949435555&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t {repository_name}:{tag_name} .&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Custom Docker Image를 만드는 명령어이다.&lt;/li&gt;
&lt;li&gt;명령어를 입력하는 디렉토리에 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;Dockerfile&lt;/span&gt; 이라는 빌드 관련 정보를 정리한 파일이 있어야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ex) image의 기반이 되는 운영체제, 아키텍처, docker image 정보, 애플리케이션 코드 디렉토리 위치, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Dockerfile&lt;/span&gt; 관련 문법은 추후에 정리해 여기에 추가하겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720949794398&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker push {repository_name}:{tag_name}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성한 Custom Docker Image를 Hub에 업로드하는 명령어이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720950664878&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker commit -a {user_name} -m &quot;{message}&quot; {container_name} {image_name}:{tag_name}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Dockerfile 없이 현재 실행 중인 container 기반의 image 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Container 관련&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1720948851452&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보유한 이미지를 기반으로 Docker Container 실행&lt;/li&gt;
&lt;li&gt;명령어를 실행할 디렉토리에 Container 설정 파일인 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;docker-compose.yml&lt;/span&gt; 파일이 미리 존재해야함.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;docker-compose.yml&lt;/span&gt; 관련 문법은 추후에 정리해 여기에 추가하겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720948853029&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker-compose down&lt;/code&gt;&lt;/pre&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;명령어를 실행할 디렉토리의&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;docker-compose.yml&lt;/span&gt; 파일 기반의 컨테이너를 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720948854381&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720949075596&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker logs {container_name}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 중인 컨테이너의 터미널에 출력된 문구 확인 (실시간 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720949994703&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker exec -it {container_name} /bin/bash&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720949995944&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker rm {container_id}&lt;/code&gt;&lt;/pre&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;docker ps -a 명령어랑 세트로 사용하자. (container id를 확인)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Network 관련&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1720950122713&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker network list&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720949974122&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker network inspect {docker_network_name}&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720950267596&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker network rm {docker_network_name}&lt;/code&gt;&lt;/pre&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;</description>
      <category>Development</category>
      <category>bash</category>
      <category>cli</category>
      <category>container</category>
      <category>docker</category>
      <category>image</category>
      <category>infra</category>
      <category>Shell</category>
      <category>zsh</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/25</guid>
      <comments>https://v12engine.tistory.com/25#entry25comment</comments>
      <pubDate>Sun, 14 Jul 2024 18:53:51 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker 설치, 개념 정리</title>
      <link>https://v12engine.tistory.com/24</link>
      <description>&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Docker cli 설치&lt;/li&gt;
&lt;li&gt;Docker client 설치&lt;/li&gt;
&lt;li&gt;Docker 란?&lt;/li&gt;
&lt;li&gt;Docker 활용&amp;nbsp;(뭐가&amp;nbsp;달라지는데?)&lt;/li&gt;
&lt;li&gt;Docker 핵심 개념&amp;nbsp;(이것만&amp;nbsp;알면&amp;nbsp;Docker&amp;nbsp;당장&amp;nbsp;써먹을&amp;nbsp;수&amp;nbsp;있음)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Docker cli 설치&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;linux&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1720945255194&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Install Docker Engine on Ubuntu&quot; data-og-description=&quot;Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.&quot; data-og-host=&quot;docs.docker.com&quot; data-og-source-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; data-og-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/m4qxS/hyWztYGrTs/VmDiUaL4UpnD5wgW1ZiF70/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/m4qxS/hyWztYGrTs/VmDiUaL4UpnD5wgW1ZiF70/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Install Docker Engine on Ubuntu&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1720945391815&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;amp;&amp;amp; echo &quot;$VERSION_CODENAME&quot;) stable&quot; | \
  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1720945408377&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mac&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1720945325483&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Docker client 설치 (정식 명칭은 Docker Desktop)&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;figure id=&quot;og_1720945554791&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Docker Desktop: The #1 Containerization Tool for Developers | Docker&quot; data-og-description=&quot;Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.&quot; data-og-host=&quot;www.docker.com&quot; data-og-source-url=&quot;https://www.docker.com/products/docker-desktop/&quot; data-og-url=&quot;https://www.docker.com/products/docker-desktop/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NY1xW/hyWzu4nhtn/0BR0sLf3DwH1csPQKnIkE0/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/pb34i/hyWzwnCieE/aKbKX77WQSCFBa3NxeZsu0/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580&quot;&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NY1xW/hyWzu4nhtn/0BR0sLf3DwH1csPQKnIkE0/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/pb34i/hyWzwnCieE/aKbKX77WQSCFBa3NxeZsu0/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Docker Desktop: The #1 Containerization Tool for Developers | Docker&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Docker 란?&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;비교 가능한 개념 - VM
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 VM의 문제
&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;VM을 실행 중엔 계속해서 부모 리소스 점유&lt;/li&gt;
&lt;li&gt;여러 애플리케이션만 실행하면 되는 환경에서 여러 VM을 사용하는 것은 불필요하다.&lt;/li&gt;
&lt;li&gt;= MSA 환경에 부적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;온디맨드 방식의 리소스 사용 (쓸 때만 부모 리소스 점유)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tg65S/btsIAdg8uKe/9t55uGO0NGQLEI3ApwxXD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tg65S/btsIAdg8uKe/9t55uGO0NGQLEI3ApwxXD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tg65S/btsIAdg8uKe/9t55uGO0NGQLEI3ApwxXD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTg65S%2FbtsIAdg8uKe%2F9t55uGO0NGQLEI3ApwxXD1%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;737&quot; height=&quot;373&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Docker 활용 (뭐가 달라지는데?)&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;cloud computing 환경에서 프로그램 구동에 필요한 패키지를 설치할 필요가 없어진다. (리소스 확보)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬에 mysql cli, engine 설치하지 않고도 mysql db 컨테이너 만들어서 개발 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Docker Hub로 프로젝트의 변경사항을 빠르게 적용 가능하다.&lt;/li&gt;
&lt;li&gt;애플리케이션의 env 파일 관리가 편리하고 유연해진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Docker 핵심 개념 (이것만 알면 Docker 당장 써먹을 수 있음)&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Docker Image
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VM 구동 시 필요한 운영체제 image와 유사한 개념&lt;/li&gt;
&lt;li&gt;사용할 애플리케이션의 상세 코드를 포함한 custom image를 생성 가능 (쉬운 배포)&lt;/li&gt;
&lt;li&gt;Docker Hub에 업로드하는 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Docker Image Build
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션을 image의 형태로 변경하는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Docker Container
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보유한 Docker Image를 실행해 사용 가능한 형태&lt;/li&gt;
&lt;li&gt;Docker 내부 네트워크를 보유, 해당 IP 주소를 통해 통신&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Docker Compose
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Docker Image를 Docker Container로 실행하는 과정&lt;/li&gt;
&lt;li&gt;Container 실행에 필요한 여러 정보를 파일에 저장해 자동화가 가능함 (docker-compose.yml)&lt;/li&gt;
&lt;li&gt;Ex. 애플리케이션과 연결할 포트 번호, DB 이름, host 이름, 비밀번호, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Docker Hub&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Github와 같은 개념, image를 손쉽게 공유할 수 있다.&lt;/li&gt;
&lt;li&gt;로컬에 image가 없더라도 public image의 정보를 기반으로 새로운 custom image를 생성하는 것이 가능하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ex. node 18 이미지 기반의 NestJS 백엔드 애플리케이션 이미지 빌드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서 자주 사용하는 Docker 명령어를 정리해놓겠다.&lt;/p&gt;</description>
      <category>Development</category>
      <category>docker</category>
      <category>infra</category>
      <category>MSA</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/24</guid>
      <comments>https://v12engine.tistory.com/24#entry24comment</comments>
      <pubDate>Sun, 14 Jul 2024 18:15:39 +0900</pubDate>
    </item>
    <item>
      <title>[NestJS] class-validator, class-transformer로 API parameter 제어하기</title>
      <link>https://v12engine.tistory.com/23</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;문제 상황&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;string type message를 body parameter로 받기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713511150981&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export class MessageCreateDto {
  message: string
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;message가 유효한지 검사&lt;/li&gt;
&lt;li&gt;message를 DB에 저장하기 전 암호로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시도 1. (실험) class-validator, class-transformer 데코레이터를 각각 만들어 DTO에 붙여보기&lt;/span&gt;&lt;/h4&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;class-validator, class-transformer package 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713512003742&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i --save class-validator class-transformer&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(main.ts) nest application 객체의 global level 에 validation pipe 삽입&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713512108711&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
async function bootstrap() {
  const app = await NestFactory.create(AppModule)
  app.useGlobalPipes(new ValidationPipe()) // New!
  await app.listen(4000)
}
...&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(controller.ts) 모든 route에서 transform을 허용하면 엄밀함에 문제가 생길 수 있으니 해당 route에만 transform 옵션 true인 validator를 따로 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713512408496&quot; class=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;...
  @Post()
  @UsePipes(new ValidationPipe({transform: true})) // New!
  create(@Body() messageCreateDto: MessageCreateDto) {
    return this.messagesService.createMessage(messageCreateDto)
  }
...&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간단한 validator, transformer를 붙여 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713511625406&quot; class=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;export class MessageCreateDto {
  @IsString() // New!
  @Transform((params: TransformFnParams&amp;lt;string&amp;gt;) =&amp;gt; {
    return textToCode(params.value)
  }) // New!
  message: string
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(참고!) (.../transform-fn-params.interface.d.ts) TransformFnParams 에 type parameter 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713513239248&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
export interface TransformFnParams&amp;lt;T&amp;gt; {
    value: T;
    key: string;
    obj: any;
    type: TransformationType;
    options: ClassTransformOptions;
}&lt;/code&gt;&lt;/pre&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5yGHV/btsGL2ivR7f/s8nJoHj8ZGiPuMnaxrliZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5yGHV/btsGL2ivR7f/s8nJoHj8ZGiPuMnaxrliZ1/img.png&quot; data-alt=&quot;test man 으로 넣으면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5yGHV/btsGL2ivR7f/s8nJoHj8ZGiPuMnaxrliZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5yGHV%2FbtsGL2ivR7f%2Fs8nJoHj8ZGiPuMnaxrliZ1%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;525&quot; height=&quot;146&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;test man 으로 넣으면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dilOh9/btsGLAT9A5K/7hyyjTqi9xtYAKoru0LymK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dilOh9/btsGLAT9A5K/7hyyjTqi9xtYAKoru0LymK/img.png&quot; data-alt=&quot;textToCode 함수의 결괏값으로 변환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dilOh9/btsGLAT9A5K/7hyyjTqi9xtYAKoru0LymK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdilOh9%2FbtsGLAT9A5K%2F7hyyjTqi9xtYAKoru0LymK%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;422&quot; height=&quot;50&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;textToCode 함수의 결괏값으로 변환&lt;/figcaption&gt;
&lt;/figure&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;textToCode 함수의 return '.-.-.- .---.-. ..-...- -.-.'&amp;nbsp; 그대로 변환해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 IsString()을 걷어내고 Custom validator를 붙여보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시도 2. custom validator를 만들어 DTO에 붙이기&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;figure id=&quot;og_1713513561142&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - typestack/class-validator: Decorator-based property validation for classes.&quot; data-og-description=&quot;Decorator-based property validation for classes. Contribute to typestack/class-validator development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/typestack/class-validator?tab=readme-ov-file#custom-validation-decorators&quot; data-og-url=&quot;https://github.com/typestack/class-validator&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bmGqd3/hyVS2tf7GL/PJqUNa6rLrfuqZNhW3jYh0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/typestack/class-validator?tab=readme-ov-file#custom-validation-decorators&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/typestack/class-validator?tab=readme-ov-file#custom-validation-decorators&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bmGqd3/hyVS2tf7GL/PJqUNa6rLrfuqZNhW3jYh0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - typestack/class-validator: Decorator-based property validation for classes.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Decorator-based property validation for classes. Contribute to typestack/class-validator development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ValidatorConstraintInterface를 구상한 class를 붙여야한다. 나는 util 폴더를 따로 만들어 class를 생성했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713513712368&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
// New!
@ValidatorConstraint()
export class CheckValidText implements ValidatorConstraintInterface {
  validate(text: string) {
    return this.isValid(text)
  }
  private isValid(text: string): boolean {
    return ...
  }
}
...&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CreateDto에 붙이기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713513796199&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export class MessageCreateDto {
  @IsString()
  @Validate(CheckValidText, {
    message: 'This message cannot be converted to code.',
  }) // New!
  @Transform((params: TransformFnParams&amp;lt;string&amp;gt;) =&amp;gt; {
    return textToCode(params.value)
  })
  message: string
}&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;nest app의 global 단위에 붙였던 val pipe + route 단위에 붙인 val pipe 두번 동작해서 디버깅용 로그가 2번 출력된다.&lt;/li&gt;
&lt;li&gt;@Transform과 @Validate의 순서를 아무리 변경해도 @Transform 데코레이터가 먼저 실행되어 원하는대로 동작하지 않는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure id=&quot;og_1713513988665&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;ValidationPipe transforms before validating &amp;middot; Issue #2856 &amp;middot; nestjs/nest&quot; data-og-description=&quot;Bug Report Current behavior If a property from a DTO has transformation and validation decorators the transformation decorator will be applied before the validation ones. Since the validators work ...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/nestjs/nest/issues/2856#issuecomment-526654980&quot; data-og-url=&quot;https://github.com/nestjs/nest/issues/2856&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c0iIVx/hyVPT5Mi6b/FkNnk5cSI5dYBpDpUFRXd1/img.png?width=1200&amp;amp;height=600&amp;amp;face=991_131_1051_196&quot;&gt;&lt;a href=&quot;https://github.com/nestjs/nest/issues/2856#issuecomment-526654980&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/nestjs/nest/issues/2856#issuecomment-526654980&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c0iIVx/hyVPT5Mi6b/FkNnk5cSI5dYBpDpUFRXd1/img.png?width=1200&amp;amp;height=600&amp;amp;face=991_131_1051_196');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ValidationPipe transforms before validating &amp;middot; Issue #2856 &amp;middot; nestjs/nest&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Bug Report Current behavior If a property from a DTO has transformation and validation decorators the transformation decorator will be applied before the validation ones. Since the validators work ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nestjs 개발자의 답변: 의도된 동작이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 ValidationPipe 안에서는 @Transform 데코레이터가 반드시 먼저 실행된다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transform을 성공적으로 마친 뒤 Validation하는 것이 자연스러운 흐름이긴 할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 input text의 유효성을 먼저 검사한 뒤 암호화해야하는 내 경우는 어떡하지...?..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시도 3. custom transform pipe를 만들어 route level에 삽입&lt;/span&gt;&lt;/h4&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;transform을 수행하는 pipe를 만들어 route level에 삽입하자. global level에서 validation을 마치고 변환하길 기대한다.&lt;/li&gt;
&lt;li&gt;PipeTransform interface를 구상한 클래스를 만들자. 이 친구도 util 폴더 안에서 만들었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713514475233&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
export class CodeTransformPipe // New!
  implements PipeTransform&amp;lt;MessageCreateDto, MessageCreateDto&amp;gt;
{
  transform(value: MessageCreateDto) {
    return ...
  }
  ...
}
...&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(controller.ts) route level에서 기존의 Validation Pipe는 걷어내고 Custom Transform Pipe를 넣자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713514557172&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  ...
  @Post()
  @UsePipes(new CodeTransformPipe()) // New!
  create(@Body() messageCreateDto: MessageCreateDto) {
    return this.messagesService.createMessage(messageCreateDto)
  }
  ...&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마지막으로 CreateDto의 Transform 데코레이터도 정리해주자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713514627931&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
export class MessageCreateDto {
  @IsString()
  @Validate(CheckValidText, {
    message: 'This message cannot be converted to code.',
  })
  // @Transform() 데코레이터 제거
  message: string
}
...&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;문제 2개가 동시에 해결되었다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;불필요한 ValdiationPipe 의 중복을 제거 (global level, route level)&lt;/li&gt;
&lt;li&gt;global level에서 validate -&amp;gt; route level에서 transform&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFEBp8/btsGMROlG7e/QoycTTzL1C4VZHkloMKuY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFEBp8/btsGMROlG7e/QoycTTzL1C4VZHkloMKuY1/img.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;1014&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.2869%; margin-right: 10px;&quot; data-widthpercent=&quot;48.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFEBp8/btsGMROlG7e/QoycTTzL1C4VZHkloMKuY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFEBp8%2FbtsGMROlG7e%2FQoycTTzL1C4VZHkloMKuY1%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;1468&quot; height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjWO6/btsGMUxwE4k/papHEKTYhgZthjK0qJpsW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjWO6/btsGMUxwE4k/papHEKTYhgZthjK0qJpsW1/img.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;962&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.5503%;&quot; data-widthpercent=&quot;51.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjWO6/btsGMUxwE4k/papHEKTYhgZthjK0qJpsW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmjWO6%2FbtsGMUxwE4k%2FpapHEKTYhgZthjK0qJpsW1%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;1458&quot; height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;(좌) validate 실패 (우) validate 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGPXuT/btsGKT1bVFf/xRgDWkk5Q3CguMdXDhNE8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGPXuT/btsGKT1bVFf/xRgDWkk5Q3CguMdXDhNE8k/img.png&quot; data-alt=&quot;validate에 성공하여 transform까지 동작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGPXuT/btsGKT1bVFf/xRgDWkk5Q3CguMdXDhNE8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGPXuT%2FbtsGKT1bVFf%2FxRgDWkk5Q3CguMdXDhNE8k%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;590&quot; height=&quot;70&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;validate에 성공하여 transform까지 동작&lt;/figcaption&gt;
&lt;/figure&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;남은 궁금증&lt;/span&gt;&lt;/h4&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pipe를 지정할 수 있는 위치가 global, controller, route 등 다양한데? -&amp;gt; pipe 끼리의 순서는 어떻게 되지?&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1st: global pipes&lt;/li&gt;
&lt;li&gt;2nd: controller-level pipes&lt;/li&gt;
&lt;li&gt;3rd: route-level pipes&lt;/li&gt;
&lt;li&gt;위 3개 level 끼리는 순서를 변경할 수 없고, 같은 level 안에서는 작성한 순서에 따라 pipe가 동작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1713511823682&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;[Question] How control global and non-global Pipe order? &amp;middot; Issue #3108 &amp;middot; nestjs/nest&quot; data-og-description=&quot;Question How control global and non-global Pipeline order? At my application I have global ValidationPipe added with useGlobalPipes and custom ParseDatePipe added with Query decorator. I want run P...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/nestjs/nest/issues/3108&quot; data-og-url=&quot;https://github.com/nestjs/nest/issues/3108&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GpRLr/hyVSU23f1I/bVz9bozsFOWV8BB0tjCDfk/img.png?width=1200&amp;amp;height=600&amp;amp;face=988_127_1057_202&quot;&gt;&lt;a href=&quot;https://github.com/nestjs/nest/issues/3108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/nestjs/nest/issues/3108&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GpRLr/hyVSU23f1I/bVz9bozsFOWV8BB0tjCDfk/img.png?width=1200&amp;amp;height=600&amp;amp;face=988_127_1057_202');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Question] How control global and non-global Pipe order? &amp;middot; Issue #3108 &amp;middot; nestjs/nest&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Question How control global and non-global Pipeline order? At my application I have global ValidationPipe added with useGlobalPipes and custom ParseDatePipe added with Query decorator. I want run P...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>Development</category>
      <category>Back-End</category>
      <category>class-transformer</category>
      <category>class-validator</category>
      <category>NestJS</category>
      <category>nodejs</category>
      <category>Pipe</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/23</guid>
      <comments>https://v12engine.tistory.com/23#entry23comment</comments>
      <pubDate>Fri, 19 Apr 2024 17:22:08 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SQL Query 문법과 실제 실행 순서</title>
      <link>https://v12engine.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 내부 변수 사용을 시도하던 중 알게된 정보이다.&lt;/p&gt;
&lt;figure id=&quot;og_1708937984997&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Order of Execution of SQL Queries - GeeksforGeeks&quot; data-og-description=&quot;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&quot; data-og-host=&quot;www.geeksforgeeks.org&quot; data-og-source-url=&quot;https://www.geeksforgeeks.org/order-of-execution-of-sql-queries/&quot; data-og-url=&quot;https://www.geeksforgeeks.org/order-of-execution-of-sql-queries/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eINqs4/hyVqsffUhM/Tc7BShTq8hCNTn9M3Ow0Jk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/HRj82/hyVqiwYwsZ/JNqEJ4HIGQLERP15YTqhd0/img.png?width=728&amp;amp;height=254&amp;amp;face=0_0_728_254,https://scrap.kakaocdn.net/dn/kjnSl/hyVqviJ278/xyCCCZttdkA5WHJZnhTvc1/img.png?width=728&amp;amp;height=254&amp;amp;face=0_0_728_254&quot;&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/order-of-execution-of-sql-queries/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.geeksforgeeks.org/order-of-execution-of-sql-queries/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eINqs4/hyVqsffUhM/Tc7BShTq8hCNTn9M3Ow0Jk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/HRj82/hyVqiwYwsZ/JNqEJ4HIGQLERP15YTqhd0/img.png?width=728&amp;amp;height=254&amp;amp;face=0_0_728_254,https://scrap.kakaocdn.net/dn/kjnSl/hyVqviJ278/xyCCCZttdkA5WHJZnhTvc1/img.png?width=728&amp;amp;height=254&amp;amp;face=0_0_728_254');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Order of Execution of SQL Queries - GeeksforGeeks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.geeksforgeeks.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #273239; text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #273239; text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실행 순서&lt;/span&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;FROM&lt;/span&gt; + &lt;span style=&quot;background-color: #dddddd;&quot;&gt;JOIN&lt;/span&gt;&lt;br /&gt;둘러볼 테이블을 미리 잡아 놓은 뒤,&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;WHERE&lt;/span&gt;&lt;br /&gt;필터링해주고,&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;GROUP BY&lt;/span&gt;&lt;br /&gt;편집,&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;HAVING&lt;/span&gt;&lt;br /&gt;가공한 후&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;SELECT&lt;/span&gt;&lt;br /&gt;한 row 씩 둘러보며 데이터 선택.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;DISTINCT&lt;/span&gt;&lt;br /&gt;중복값 제거는 SELECT 와 동시에 이루어진다고 봐야겠다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;ORDER BY&lt;/span&gt;&lt;br /&gt;마지막으로 지정한 순서에 맞게 sort,&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;LIMIT/OFFSET&lt;/span&gt;&lt;br /&gt;지정한 갯수 만큼만 출력.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하고 보니, 꽤나 상식적이다. 외우지 않아도 금방 연상할 수 있을 듯!&lt;/p&gt;</description>
      <category>Development</category>
      <category>DQL</category>
      <category>Execution Order</category>
      <category>mysql</category>
      <category>SQL</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/22</guid>
      <comments>https://v12engine.tistory.com/22#entry22comment</comments>
      <pubDate>Mon, 26 Feb 2024 20:56:00 +0900</pubDate>
    </item>
    <item>
      <title>[MacOS] 상단 탭 바 규격 줄이기</title>
      <link>https://v12engine.tistory.com/21</link>
      <description>&lt;figure id=&quot;og_1707882001018&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Built-in workaround for applications hiding under the MacBook Pro notch&quot; data-og-description=&quot;Annoyed by the notch on the new MacBook Pro models? There's a built-in workaround! Adjust menu bar spacing with simple Terminal commands, no extra software needed. Say goodbye to hidden menu items behind the notch!&quot; data-og-host=&quot;flaky.build&quot; data-og-source-url=&quot;https://flaky.build/built-in-workaround-for-applications-hiding-under-the-macbook-pro-notch&quot; data-og-url=&quot;https://flaky.build/built-in-workaround-for-applications-hiding-under-the-macbook-pro-notch&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BF9So/hyVjjb0Rtt/iFkDoWYdRiXBq9qcP12oe0/img.png?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500,https://scrap.kakaocdn.net/dn/tybAN/hyVjdJCIt5/ldiq0H4roURtHL6bvOVdh0/img.png?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500,https://scrap.kakaocdn.net/dn/cgoTRY/hyVi8IjdSi/0dj2PXTRtPDRhvCfzyj8y0/img.jpg?width=2000&amp;amp;height=593&amp;amp;face=0_0_2000_593&quot;&gt;&lt;a href=&quot;https://flaky.build/built-in-workaround-for-applications-hiding-under-the-macbook-pro-notch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://flaky.build/built-in-workaround-for-applications-hiding-under-the-macbook-pro-notch&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BF9So/hyVjjb0Rtt/iFkDoWYdRiXBq9qcP12oe0/img.png?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500,https://scrap.kakaocdn.net/dn/tybAN/hyVjdJCIt5/ldiq0H4roURtHL6bvOVdh0/img.png?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500,https://scrap.kakaocdn.net/dn/cgoTRY/hyVi8IjdSi/0dj2PXTRtPDRhvCfzyj8y0/img.jpg?width=2000&amp;amp;height=593&amp;amp;face=0_0_2000_593');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Built-in workaround for applications hiding under the MacBook Pro notch&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Annoyed by the notch on the new MacBook Pro models? There's a built-in workaround! Adjust menu bar spacing with simple Terminal commands, no extra software needed. Say goodbye to hidden menu items behind the notch!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;flaky.build&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 탭 바에 노출되는 앱 아이콘의 간격을 줄여주는 명령어라고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clCNs1/btsEHqmbTJW/qfOgRw4sVKW4dLaPml8k3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clCNs1/btsEHqmbTJW/qfOgRw4sVKW4dLaPml8k3k/img.png&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;1640&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2024-02-14 10.39.14(2).png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clCNs1/btsEHqmbTJW/qfOgRw4sVKW4dLaPml8k3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclCNs1%2FbtsEHqmbTJW%2FqfOgRw4sVKW4dLaPml8k3k%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;2360&quot; height=&quot;1640&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddXZWO/btsESn1Yhki/McvU4YO1eQUsFnwEMnBFk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddXZWO/btsESn1Yhki/McvU4YO1eQUsFnwEMnBFk1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;1640&quot; data-filename=&quot;스크린샷 2024-02-14 10.38.16.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddXZWO/btsESn1Yhki/McvU4YO1eQUsFnwEMnBFk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddXZWO%2FbtsESn1Yhki%2FMcvU4YO1eQUsFnwEMnBFk1%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;2360&quot; height=&quot;1640&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;오른쪽 이미지의 상단 탭바를 보면 날씨 이미지까지만 나오고 그 왼쪽은 다 잘렸다.&lt;/figcaption&gt;
&lt;/figure&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;그래서 Hidden bar를 사용해서 자주 쓰지 않는 앱은 따로 모아뒀었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(유용한 상단 탭 바 앱들은 (&lt;a href=&quot;https://v12engine.tistory.com/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기에&lt;/a&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;pre id=&quot;code_1707882304936&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;defaults -currentHost write -globalDomain NSStatusItemSelectionPadding -int 6
defaults -currentHost write -globalDomain NSStatusItemSpacing -int 6&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;span style=&quot;color: #ef5369;&quot;&gt;재부팅&lt;/span&gt;하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPhtOR/btsEORwf9NZ/qMgpV8I9rCrBK5Xh1VA3EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPhtOR/btsEORwf9NZ/qMgpV8I9rCrBK5Xh1VA3EK/img.png&quot; data-alt=&quot;성공!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPhtOR/btsEORwf9NZ/qMgpV8I9rCrBK5Xh1VA3EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPhtOR%2FbtsEORwf9NZ%2FqMgpV8I9rCrBK5Xh1VA3EK%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;605&quot; height=&quot;327&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;760&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;아까랑 다르게 Hidden bar 앱에 숨겨놓은 아이콘까지 다 보인다.&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;pre id=&quot;code_1707882281335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;defaults -currentHost delete -globalDomain NSStatusItemSelectionPadding
defaults -currentHost delete -globalDomain NSStatusItemSpacing&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;span style=&quot;color: #ef5369;&quot;&gt;재부팅&lt;/span&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;MacOS에서 관리하는 config 값에 변화를 주는 정도라서 큰 위험을 없을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MacOS 14 Sonoma 에서는 잘 동작하는데, 다른 버전에서도 가능한지는 의문이다.&lt;/p&gt;</description>
      <category>MacOS</category>
      <category>MacOS</category>
      <category>Tab Bar</category>
      <category>맥</category>
      <category>생산성</category>
      <category>탭 바</category>
      <category>효율</category>
      <author>12기통엔진</author>
      <guid isPermaLink="true">https://v12engine.tistory.com/21</guid>
      <comments>https://v12engine.tistory.com/21#entry21comment</comments>
      <pubDate>Wed, 14 Feb 2024 12:49:25 +0900</pubDate>
    </item>
  </channel>
</rss>