<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>파랑새를 냉장고에 넣는 방법</title>
    <link>https://sim-plism.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 23:15:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>파스트잇</managingEditor>
    <image>
      <title>파랑새를 냉장고에 넣는 방법</title>
      <url>https://tistory1.daumcdn.net/tistory/7041988/attach/fa98cb90373d4546ae7a3a4f4da5adee</url>
      <link>https://sim-plism.tistory.com</link>
    </image>
    <item>
      <title>[ Spring] 스프링 없이 의존성 주입하기: 순수 자바로 DI 직접 만들어보기</title>
      <link>https://sim-plism.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스프링을 공부하다 보면 &lt;b&gt;의존성 주입(DI, Dependency Injection)&lt;/b&gt;이라는 개념을 만나게 됩니다. DI는 객체 간의 관계를 외부에서 주입해주는 방식으로 코드의 유연성과 테스트 편의성을 높여주는 중요한 설계 기법입니다. 하지만 DI를 먼저 배우다보면 &quot;왜 굳이 DI가 필요한 거지?&quot;하는 의문이 들기도 합니다. 이번 글에서는 DI의 소중함을 직접 느끼기 위해 순수 자바 코드로 DI를 구현해보려 합니다. 지금 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;192&quot; data-start=&quot;174&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ 객체 직접 생성(&lt;i&gt;new&lt;/i&gt;)의&amp;nbsp; 문제점&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;192&quot; data-start=&quot;174&quot; data-ke-size=&quot;size18&quot;&gt;스프링 없이 객체를 사용할 때 가장 흔히 사용하는 방법은 `new` 키워드를 사용해 직접 인스턴스를 생성하는 것입니다. 예를 들어 서비스 코드 안에 리포지토리(=저장소)를 직접 생성하는 식입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744530618662&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MemberService {
	private final MemberRepository memberRepository = new MemoryMemberRepository();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;192&quot; data-start=&quot;174&quot; data-ke-size=&quot;size18&quot;&gt;물론 이 방법은 매우 일반적이고 보기에는 문제가 없어 보입니다. (별 문제 없이 잘 돌아가니까요) 하지만 상황이 바뀌어 저장소를 다른 구현체로 바꾸어야 하는 상황이 온다면 어떻게 될까요?&lt;/p&gt;
&lt;pre id=&quot;code_1744530696094&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MemberService {
    private final MemberRepository memberRepository = new DbMemberRepository(); 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이처럼 구현체가 바뀔 때마다 서비스 코드까지 직접 수정해야 합니다. 이는 객체 간의 강한 결합을 만들어내고 결과적으로 코드의 유연성을 해치게 됩니다. 좋은 객체 지향 설계 방식이 아닌 것이죠. 새로운 리포지토리 구현체를 추가하거나, 테스트를 위해 가짜 리포지토리(Mock)를 사용해야 할 때마다 서비스 코드를 수정해야 합니다. 이러한 방식은 소프트웨어 설계 원칙 중 하나인&lt;b&gt; OCP(개방-폐쇄 원칙, Open-Closed Principle)&lt;/b&gt;를 위반하는 것입니다. OCP는 &quot;확장에는 열려 있고, 수정에는 닫혀 있어야 한다&quot;는 원칙입니다. 그래서 우리는 객체 생성과 의존성 관리를 별도로 분리할 필요가 있습니다. 이러한 이유에서&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&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;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt; &lt;b&gt;소프트웨어 설계 원칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;유지보수성과 확장성을 높이기 위한 SOLID 원칙&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SRP (단일 책임 원칙, Single Responsibility Principle) ➔ 하나의 클래스는 하나의 책임만 가져야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OCP (개방-폐쇄 원칙, Open-Closed Principle) ➔ 확장에는 열려 있고 수정에는 닫혀 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LSP (리스코프 치환 원칙, Liskov Substitution Principle) ➔ 하위 타입은 언제나 상위 타입을 대체할 수 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ISP (인터페이스 분리 원칙, Interface Segregation Principle) ➔ 하나의 큰 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DIP (의존 역전 원칙, Dependency Inversion Principle) ➔ 고수준 모듈은 저수준 모듈에 의존하면 안 되고 둘 다 추상화에 의존해야 한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ 순수 자바로 DI 직접 구현하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 이제 객체 생성과 의존성 주입을 별도로 분리하는 방법을 적용해보겠습니다. 우리는 서비스 객체가 직접 리포지토리 구현체를 생성하는 대신 외부에서 리포지토리를 생성하고 주입해주는 구조를 만들 것입니다. 이 역할을 담당하는 클래스를 흔히 조립기(Assembler) 또는 `AppConfig`라고 부릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744531556194&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class AppConfig {

    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;`AppConfig` 클래스는 `MemberService` 객체를 생성할 때 `MemberRepository` 객체를 주입해줍니다. 이를 통해 `MemberService`는 저장소 구현체가 무엇인지 알 필요 없이, 오직 `MemberRepository` 인터페이스에만 의존할 수 있습니다. 만약 `MemoryMemberRepository`가 아닌 다른 구현체를 사용하고 싶다면&amp;nbsp; `memberRepository()`의 `return`문만 바꿔주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744531906742&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class AppConfig {

    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    public MemberRepository memberRepository() {
        // return new MemoryMemberRepository();
        return new DbMemberRepository();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 말이죠. 이렇게 하면 다른 구현체로 교체하는 것도 훨씬 쉬워집니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744531736562&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MemberService {
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서비스 코드의 경우 새로운 저장소 구현체를 추가하거나 테스트용 가짜 저장소를 주입하거나 할 때 서비스 코드 자체를 수정할 필요가 없어집니다. 결국 객체 생성과 의존성 관리를 명확히 분리하는 것. 이것이 바로 DI의 핵심입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ 순수 자바 DI 구현의 한계 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;순수 자바 코드만으로 객체 생성과 의존성 주입을 분리해보면서 DI의 개념을 더 명확히 알게 되었으나 몇 가지 한계와 불편함도 함께 느낄 수 있었습니다. 가장 큰 문제는 &lt;u&gt;&lt;b&gt;객체&lt;/b&gt; &lt;b&gt;관리가 불편하다는 것&lt;/b&gt;&lt;/u&gt;입니다. AppConfig와 같은 조립기를 사용한다고 해도 1) 어떤 객체가 생성되었는지 2) 어떤 객체가 어디에 주입되었는지 같은 것들을 사람이 직접 관리하고 조립해줘야 합니다. 객체가 적을 때는 수동 관리가 그리 힘들지 않지만 규모가 커져서 객체가 수십, 수백 개가 된다면 객체 생성과 의존성 주입을 일일이 코드로 관리하는 것은 현실적으로 어렵습니다. 또 다른 문제는 &lt;u&gt;&lt;b&gt;싱글톤 관리&lt;/b&gt;&lt;/u&gt;입니다. 서비스 객체나 저장소 객체는 보통 하나만 생성해서 재사용하고 싶지만 순수 자바만으로는 이러한 싱글톤 보장을 별도로 신경써야 합니다. (매번 new를 하면 새로운 인스턴스가 만들어지기 때문) 결국 객체 생명주기 관리, 싱글톤 보장, 의존성 주입 자동화 등의 문제를 편리하게 해결해줄 무언가가 필요하다고 느끼게 됩니다. 그것이 바로 &lt;b&gt;스프링 프레임워크&lt;/b&gt;입니다. 스프링은 객체를 생성하고 관리하는 컨테이너를 제공하여 개발자가 직접 객체를 관리하는 수고를 덜어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ 우리에게는 스프링이 필요하다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;순수 자바로 의존성 주입을 직접 구현해보며 우리는 객체 관리와 의존성 조립이 생각보다 복잡하고 번거롭다는 사실을 깨달았습니다. 스프링은 객체를 생성하고 의존성을 주입하며 싱글톤처럼 객체를 효율적으로 관리하는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;DI(Dependency Injection) 컨테이너&lt;/b&gt;&lt;/span&gt;를 제공합니다. 이를 활용하면 직접 객체를 관리할 필요 없이 스프링이 대신 객체를 관리해주고 필요한 곳에 주입해주는 구조를 활용할 수 있습니다. 더 깔끔하고 유지보수하기 좋은 구조로 애플리케이션을 개발할 수 있는 것이죠. 다음 글에서는 스프링을 이용해 DI를 어떻게 적용하는지 알아보도록 하겠습니다! ☺️&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>☕ Java/  Spring</category>
      <category>appconfig</category>
      <category>Di</category>
      <category>Spring</category>
      <category>리포지토리</category>
      <category>서비스</category>
      <category>순수 자바</category>
      <category>스프링</category>
      <category>의존성</category>
      <category>의존성 주입</category>
      <category>자바</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/28</guid>
      <comments>https://sim-plism.tistory.com/28#entry28comment</comments>
      <pubDate>Sun, 13 Apr 2025 19:52:53 +0900</pubDate>
    </item>
    <item>
      <title>[ CSS] 반응형 웹 실전 패턴 정리 &amp;mdash; 미디어쿼리 + 레이아웃 대응법</title>
      <link>https://sim-plism.tistory.com/27</link>
      <description>&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;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;p data-ke-size=&quot;size16&quot;&gt;반응형 웹이 뭔지 아직 헷갈린다면?   아래의 글을 먼저 보고 오는 걸 추천합니다&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1743922322152&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;[ CSS] 반응형 웹 시작하기 &amp;mdash; viewport, 미디어쿼리, flex-wrap까지&quot; data-og-description=&quot;요즘 웹사이트는 PC, 태블릿, 모바일처럼 다양한 화면 크기에서 모두 자연스럽게 보이도록 설계해야 합니다. 이때 꼭 필요한 개념이 바로 반응형 웹(Responsive Web) 입니다. 반응형 웹을 제대로 만들&quot; data-og-host=&quot;sim-plism.tistory.com&quot; data-og-source-url=&quot;https://sim-plism.tistory.com/26&quot; data-og-url=&quot;https://sim-plism.tistory.com/26&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CNEix/hyYBhBOzv7/86eov9tkEDpbcnUYzmzZRK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/WFl1N/hyYB7ZBYSA/uFpBfk55rnJGEa1smY9eUK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/D08L2/hyYBfqsJ3C/ncQOcJuBaFvpUzK3OwIcLk/img.png?width=1007&amp;amp;height=678&amp;amp;face=0_0_1007_678&quot;&gt;&lt;a href=&quot;https://sim-plism.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sim-plism.tistory.com/26&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CNEix/hyYBhBOzv7/86eov9tkEDpbcnUYzmzZRK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/WFl1N/hyYB7ZBYSA/uFpBfk55rnJGEa1smY9eUK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/D08L2/hyYBfqsJ3C/ncQOcJuBaFvpUzK3OwIcLk/img.png?width=1007&amp;amp;height=678&amp;amp;face=0_0_1007_678');&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;[ CSS] 반응형 웹 시작하기 &amp;mdash; viewport, 미디어쿼리, flex-wrap까지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;요즘 웹사이트는 PC, 태블릿, 모바일처럼 다양한 화면 크기에서 모두 자연스럽게 보이도록 설계해야 합니다. 이때 꼭 필요한 개념이 바로 반응형 웹(Responsive Web) 입니다. 반응형 웹을 제대로 만들&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sim-plism.tistory.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;h1 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✅ 반응형 실전 패턴 8가지&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ 네비게이션 바 줄이기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 큰 화면: 로고 + 전체 메뉴 다 보이게&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 작은 화면: 햄버거 버튼으로 메뉴 숨기기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  반응형 네비게이션 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743924715352&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;title&amp;gt;반응형 네비게이션 예제&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;

    &amp;lt;style&amp;gt;
      /* 기본 스타일 */
      .navbar {
        display: flex;
        justify-content: space-between;
        align-items: center;
        background-color: lightblue;
        padding: 10px 20px;
      }

      .nav-links {
        display: flex;
        list-style: none;
        gap: 20px;
      }

      .nav-links a {
        text-decoration: none;
        color: #333;
        font-weight: bold;
      }

      /* 햄버거 아이콘은 기본적으로 숨김 */
      .menu-icon {
        display: none;
        font-size: 24px;
        cursor: pointer;
      }

      /* 작은 화면 (768px 이하) */
      @media (max-width: 768px) {
        .nav-links {
          display: none; /* 메뉴 숨김 */
        }
        .menu-icon {
          display: block; /* 햄버거 아이콘 표시 */
        }
      }
    &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;nav class=&quot;navbar&quot;&amp;gt;
      &amp;lt;div class=&quot;logo&quot;&amp;gt;로고&amp;lt;/div&amp;gt;
      &amp;lt;ul class=&quot;nav-links&quot;&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;홈&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;소개&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;서비스&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;문의&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
      &amp;lt;div class=&quot;menu-icon&quot;&amp;gt;☰&amp;lt;/div&amp;gt;
    &amp;lt;/nav&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csfMbN/btsNaCYPv3t/bRfGptkcdyNkDjYPIvjFZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csfMbN/btsNaCYPv3t/bRfGptkcdyNkDjYPIvjFZ1/img.png&quot; data-alt=&quot;기본 스타일 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csfMbN/btsNaCYPv3t/bRfGptkcdyNkDjYPIvjFZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsfMbN%2FbtsNaCYPv3t%2FbRfGptkcdyNkDjYPIvjFZ1%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;1159&quot; height=&quot;126&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;126&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;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0hlW4/btsM91ZoX4a/WvysBurJ5LG1MWrqckPSGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0hlW4/btsM91ZoX4a/WvysBurJ5LG1MWrqckPSGk/img.png&quot; data-alt=&quot;768px 이하 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0hlW4/btsM91ZoX4a/WvysBurJ5LG1MWrqckPSGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0hlW4%2FbtsM91ZoX4a%2FWvysBurJ5LG1MWrqckPSGk%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;1133&quot; height=&quot;186&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;768px 이하 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ 카드형 레이아웃&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 큰 화면: 3~4개씩 가로로 나열&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 작은 화면: 한 줄에 1개씩&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  반응형 카드 레이아웃 만들기 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743925110976&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;반응형 카드 레이아웃 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .card-container {
      display: flex;
      flex-wrap: wrap;
      gap: 20px;
      background-color: #f9f9f9;
      padding: 20px;
    }

    .card {
      flex: 1 1 300px; /* grow: 1, shrink: 1, basis: 300px */
      background-color: white;
      border: 1px solid #ccc;
      border-radius: 8px;
      padding: 20px;
      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
    }

    /* 작은 화면 대응 */
    @media (max-width: 768px) {
      .card {
        flex: 1 1 100%;
      }
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;card-container&quot;&amp;gt;
  &amp;lt;div class=&quot;card&quot;&amp;gt;카드 1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;card&quot;&amp;gt;카드 2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;card&quot;&amp;gt;카드 3&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;card&quot;&amp;gt;카드 4&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZ4w7/btsNaeD7gV5/jcvYuINqh7ULjMUvMEbaAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZ4w7/btsNaeD7gV5/jcvYuINqh7ULjMUvMEbaAK/img.png&quot; data-alt=&quot;화면이 넓을 때 카드 3개가 가로로 배치되고, 공간이 부족한 카드 4번은 아래 줄로 내려감&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZ4w7/btsNaeD7gV5/jcvYuINqh7ULjMUvMEbaAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZ4w7%2FbtsNaeD7gV5%2FjcvYuINqh7ULjMUvMEbaAK%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;1150&quot; height=&quot;173&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면이 넓을 때 카드 3개가 가로로 배치되고, 공간이 부족한 카드 4번은 아래 줄로 내려감&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyQL5H/btsM90e4ZJx/DWvjpEd61LqkNuF4C0v7d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyQL5H/btsM90e4ZJx/DWvjpEd61LqkNuF4C0v7d0/img.png&quot; data-alt=&quot;화면이 더 좁아지면서 카드가 2개씩 두 줄에 정렬된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyQL5H/btsM90e4ZJx/DWvjpEd61LqkNuF4C0v7d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyQL5H%2FbtsM90e4ZJx%2FDWvjpEd61LqkNuF4C0v7d0%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;1159&quot; height=&quot;220&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면이 더 좁아지면서 카드가 2개씩 두 줄에 정렬된 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;909&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JeJhe/btsM9Jq7SVy/X2ONM5nk0KtsbqpIT3n0sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JeJhe/btsM9Jq7SVy/X2ONM5nk0KtsbqpIT3n0sK/img.png&quot; data-alt=&quot;화면 폭이 매우 좁아져 카드가 1개씩 세로로 쌓이는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JeJhe/btsM9Jq7SVy/X2ONM5nk0KtsbqpIT3n0sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJeJhe%2FbtsM9Jq7SVy%2FX2ONM5nk0KtsbqpIT3n0sK%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;1125&quot; height=&quot;909&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;909&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면 폭이 매우 좁아져 카드가 1개씩 세로로 쌓이는 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ 이미지 비율 유지하면서 축소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 브라우저 크기에 맞춰 이미지 자동 축소&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 가로 너비 100%로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  이미지 비율 유지 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743925844498&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;이미지 비율 유지 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .image-container {
      width: 80%;
      max-width: 400px;
      margin: 20px auto;
    }

    .image-container img {
      width: 100%;
      height: auto; /*   핵심: 가로폭에 맞춰 세로비율 자동 유지 */
      display: block;
      border: 2px solid #333;
      border-radius: 8px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;image-container&quot;&amp;gt;
  &amp;lt;img src=&quot;https://picsum.photos/800/500&quot; alt=&quot;비율 유지 이미지&quot;&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRmdNe/btsNbK9e7rV/mk6s2KzUvNHE9Ylm2BxfrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRmdNe/btsNbK9e7rV/mk6s2KzUvNHE9Ylm2BxfrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRmdNe/btsNbK9e7rV/mk6s2KzUvNHE9Ylm2BxfrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRmdNe%2FbtsNbK9e7rV%2Fmk6s2KzUvNHE9Ylm2BxfrK%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;669&quot; height=&quot;439&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ 글자 크기 조정 (반응형 폰트 만들기)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 화면 크기에 따라 글자 크기도 자연스럽게 조정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;199&quot; data-start=&quot;192&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;☑️ 대표 방법&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;381&quot; data-start=&quot;201&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.7675%;&quot;&gt;&lt;b&gt; 방법 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;&lt;b&gt; 특징 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.8837%;&quot;&gt;&lt;b&gt; 설명 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;272&quot; data-start=&quot;235&quot;&gt;
&lt;td style=&quot;width: 14.7675%;&quot;&gt;px&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;고정 크기&lt;/td&gt;
&lt;td style=&quot;width: 54.8837%;&quot;&gt;화면 크기에 상관없이 항상 같은 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;322&quot; data-start=&quot;273&quot;&gt;
&lt;td style=&quot;width: 14.7675%;&quot;&gt;vw&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;화면 너비 기준 비율&lt;/td&gt;
&lt;td style=&quot;width: 54.8837%;&quot;&gt;브라우저 가로 크기에 따라 글자가 커지고 작아짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;381&quot; data-start=&quot;323&quot;&gt;
&lt;td style=&quot;width: 14.7675%;&quot;&gt;clamp()&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;최소~최대 범위 지정&lt;/td&gt;
&lt;td style=&quot;width: 54.8837%;&quot;&gt;모바일, 태블릿, PC 각각 자연스럽게 크기 조정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  반응형 폰트 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743926135355&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;반응형 폰트 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .container {
      padding: 20px;
      background-color: #f5f5f5;
      text-align: center;
    }

    .title-px {
      font-size: 24px; /* 고정 크기 */
      color: #333;
    }

    .title-vw {
      font-size: 5vw; /* 화면 너비 기준 비율 */
      color: #555;
      margin-top: 30px;
    }

    .title-clamp {
      font-size: clamp(16px, 5vw, 32px); /* 최소 16px ~ 최대 32px */
      color: #777;
      margin-top: 30px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;container&quot;&amp;gt;
  &amp;lt;div class=&quot;title-px&quot;&amp;gt;고정(px) 폰트 크기&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;title-vw&quot;&amp;gt;화면 너비(vw) 기반 폰트 크기&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;title-clamp&quot;&amp;gt;clamp()로 자연스럽게 조정된 폰트 크기&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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/b4xMnv/btsNbhfmXYb/SfH68AJ0Mo0EM65oVV1ugk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4xMnv/btsNbhfmXYb/SfH68AJ0Mo0EM65oVV1ugk/img.png&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;437&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.9373%; margin-right: 10px;&quot; data-widthpercent=&quot;64.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4xMnv/btsNbhfmXYb/SfH68AJ0Mo0EM65oVV1ugk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4xMnv%2FbtsNbhfmXYb%2FSfH68AJ0Mo0EM65oVV1ugk%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;1158&quot; height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHwX0F/btsNakjO4Bz/BSvACYyu20MKP0F6tKhpfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHwX0F/btsNakjO4Bz/BSvACYyu20MKP0F6tKhpfk/img.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;784&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.8999%;&quot; data-widthpercent=&quot;35.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHwX0F/btsNakjO4Bz/BSvACYyu20MKP0F6tKhpfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHwX0F%2FbtsNakjO4Bz%2FBSvACYyu20MKP0F6tKhpfk%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;1134&quot; height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;title-px: 항상 24px / title-vw: 화면 너비 따라 변하는 폰트 / title-clamp: 자연스럽게 크기 제한을 걸면서 반응형 지원 (⭐추천)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5️⃣ 그리드 레이아웃 전환&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 큰 화면에서는 카드들을 가로/세로로 배치하고 작은 화면에서는 세로 한 줄로 정렬하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- flex만으로 한계가 있을 때 grid를 써서 좀 더 정확하게 제어&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;   반응형 그리드 전환 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743927310148&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;반응형 그리드 레이아웃 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .grid-container {
      display: grid;
      grid-template-columns: repeat(3, 1fr); /* 3등분 */
      gap: 20px;
      padding: 20px;
      background-color: #f9f9f9;
    }

    .grid-item {
      background-color: lightblue;
      border: 1px solid #ccc;
      padding: 20px;
      text-align: center;
      font-weight: bold;
      font-size: 18px;
    }

    /* 작은 화면에서는 한 줄로 */
    @media (max-width: 768px) {
      .grid-container {
        grid-template-columns: 1fr; /* 1열로 변경 */
      }
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;grid-container&quot;&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot;&amp;gt;아이템 1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot;&amp;gt;아이템 2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot;&amp;gt;아이템 3&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot;&amp;gt;아이템 4&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Y28C/btsNaeD7Pl9/FAXwkKT8DwIoo8Vlc5OwC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Y28C/btsNaeD7Pl9/FAXwkKT8DwIoo8Vlc5OwC1/img.png&quot; data-alt=&quot;3등분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Y28C/btsNaeD7Pl9/FAXwkKT8DwIoo8Vlc5OwC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Y28C%2FbtsNaeD7Pl9%2FFAXwkKT8DwIoo8Vlc5OwC1%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;1145&quot; height=&quot;244&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3등분&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5Z755/btsNakjPtvh/7ZLPLmZKq4H6HYPxpsqDN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5Z755/btsNakjPtvh/7ZLPLmZKq4H6HYPxpsqDN0/img.png&quot; data-alt=&quot;작은 화면에서는 1열로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5Z755/btsNakjPtvh/7ZLPLmZKq4H6HYPxpsqDN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5Z755%2FbtsNakjPtvh%2F7ZLPLmZKq4H6HYPxpsqDN0%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;1143&quot; height=&quot;701&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;작은 화면에서는 1열로 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6️⃣ 요소 순서 변경 (flex order 사용)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 반응형 웹에서는 화면 크기에 따라 요소의 순서를 바꿔야 하는 경우가 존재함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 예를 들어 큰 화면에서 텍스트 먼저, 이미지가 뒤에 나오고 작은 화면에서는 이미지 먼저, 텍스트 나중에 나오는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- HTML 구조를 바꾸지 않고 CSS 만으로 순서를 바꾸는 방법이 `order` 속성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  반응형 순서 변경 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743927738413&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;반응형 순서 변경 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .container {
      display: flex;
      gap: 20px;
      background-color: #eee;
      padding: 20px;
    }
    .item {
      flex: 1 1 200px;
      padding: 20px;
      font-weight: bold;
      text-align: center;
    }
    .image {
      background-color: lightblue;
    }
    .text {
      background-color: rgb(249, 249, 145);
    }
    
    /* 작은 화면에서 순서 변경 */
    @media (max-width: 768px) {
      .image {
        order: -1; /* 이미지를 위로 보냄 */
      }
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;container&quot;&amp;gt;
  &amp;lt;div class=&quot;item text&quot;&amp;gt;텍스트&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;item image&quot;&amp;gt;이미지&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HZ1a3/btsNaA7MvEp/SnMi6XJEIFPKMtsKMdluGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HZ1a3/btsNaA7MvEp/SnMi6XJEIFPKMtsKMdluGk/img.png&quot; data-alt=&quot;PC 화면: 텍스트 -&amp;amp;gt; 이미지 (기본 순서)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HZ1a3/btsNaA7MvEp/SnMi6XJEIFPKMtsKMdluGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHZ1a3%2FbtsNaA7MvEp%2FSnMi6XJEIFPKMtsKMdluGk%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;1153&quot; height=&quot;150&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PC 화면: 텍스트 -&amp;gt; 이미지 (기본 순서)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T1IEy/btsNbKuEI5j/zj0sAEhmX3z9aIRxbPhcAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T1IEy/btsNbKuEI5j/zj0sAEhmX3z9aIRxbPhcAk/img.png&quot; data-alt=&quot;모바일 화면: 이미지 -&amp;amp;gt; 텍스트 (order: -1로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T1IEy/btsNbKuEI5j/zj0sAEhmX3z9aIRxbPhcAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT1IEy%2FbtsNbKuEI5j%2Fzj0sAEhmX3z9aIRxbPhcAk%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;1142&quot; height=&quot;342&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모바일 화면: 이미지 -&amp;gt; 텍스트 (order: -1로 변경)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 7️⃣ 숨기기 / 보이기 (display 속성)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 특정 화면 크기에서만 요소를 숨기거나 보이게 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 예를 들어 큰 화면에서는 큰 메뉴를 보여주고 작은 화면에서는 작은 메뉴나 햄버거 버튼만 보여주기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;276&quot; data-start=&quot;269&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;☑️ 기본 개념&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;393&quot; data-start=&quot;278&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 속성 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt; 설명 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;345&quot; data-start=&quot;302&quot;&gt;
&lt;td&gt;display: none&lt;/td&gt;
&lt;td&gt;화면에서 아예 숨김 (공간도 차지 ❌)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;393&quot; data-start=&quot;346&quot;&gt;
&lt;td&gt;display: block (또는 flex 등)&lt;/td&gt;
&lt;td&gt;요소를 다시 보이게 함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;458&quot; data-start=&quot;395&quot; data-ke-size=&quot;size18&quot;&gt;✔️ display: none 하면 진짜 없는 것처럼 돼서 스크린 리더나 접근성에도 영향 줄 수 있음&lt;/p&gt;
&lt;p data-end=&quot;535&quot; data-start=&quot;460&quot; data-ke-size=&quot;size18&quot;&gt;✔️ 단순히 투명하게 하고 싶으면 opacity: 0 같은 걸 쓰는데 공간까지 없애려면 display: none 써야 함&lt;/p&gt;
&lt;p data-end=&quot;535&quot; data-start=&quot;460&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;535&quot; data-start=&quot;460&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  반응형 웹에서 숨기기/보이기 예제 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743928110569&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;반응형 숨기기/보이기 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .desktop-menu {
      display: block;
      background-color: lightblue;
      padding: 20px;
      text-align: center;
      font-weight: bold;
    }

    .mobile-menu {
      display: none;
      background-color: rgb(252, 252, 146);
      padding: 20px;
      text-align: center;
      font-weight: bold;
    }

    /* 작은 화면 (768px 이하) */
    @media (max-width: 768px) {
      .desktop-menu {
        display: none;
      }
      .mobile-menu {
        display: block;
      }
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;desktop-menu&quot;&amp;gt;데스크탑 메뉴&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;mobile-menu&quot;&amp;gt;모바일 메뉴&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI6KIf/btsNaK98riF/3oNDgf1tuNjYY4OkL3KW7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI6KIf/btsNaK98riF/3oNDgf1tuNjYY4OkL3KW7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI6KIf/btsNaK98riF/3oNDgf1tuNjYY4OkL3KW7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI6KIf%2FbtsNaK98riF%2F3oNDgf1tuNjYY4OkL3KW7k%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;1158&quot; height=&quot;97&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HZYbq/btsM99v9pH8/KKUsZxAicSuSQoR4u9frNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HZYbq/btsM99v9pH8/KKUsZxAicSuSQoR4u9frNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HZYbq/btsM99v9pH8/KKUsZxAicSuSQoR4u9frNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHZYbq%2FbtsM99v9pH8%2FKKUsZxAicSuSQoR4u9frNK%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;1151&quot; height=&quot;174&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;174&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 8️⃣ 버튼&amp;middot;메뉴 크기 조정 (width, padding 반응형 대응)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 화면 크기에 맞춰서 버튼이나 메뉴 크기를 부드럽게 조정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 특히 모바일에서는 버튼이 너무 작으면 터치하기 힘들기 때문에 크기나 여백을 조정해서 UX를 맞춰줘야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 큰 화면: 넉넉한 패딩과 큰 글자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 작은 화면: 패딩과 글자 크기를 줄여서 터치하기 좋게 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;   버튼 크기 조정 예제 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743928338673&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;반응형 버튼 크기 조정&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .btn {
      background-color: royalblue;
      color: white;
      border: none;
      padding: 12px 24px; /* 위아래 12px, 좌우 24px */
      font-size: 18px;
      border-radius: 8px;
      cursor: pointer;
    }

    /* 중간 화면-태블릿- 대응 */
    @media (max-width: 768px) {
      .btn {
        padding: 10px 20px; /* 여백 줄임 */
        font-size: 16px; /* 글자 크기도 조금 작게 */
      }
    }

    /* 작은 화면-모바일- 대응 */
    @media (max-width: 480px) {
      .btn {
        padding: 8px 16px;
        font-size: 14px;
      }
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;button class=&quot;btn&quot;&amp;gt;클릭하세요&amp;lt;/button&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;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;반응형 웹은 단순히 화면 크기에 맞춰 줄이는 것만으로 끝나지 않습니다. 진짜 반응형 웹을 만들기 위해서는 레이아웃을 재배치하고 요소를 숨기거나 순서를 바꾸거나 버튼 크기 같은 세부 사항까지 섬세하게 대응하는 것이 중요합니다. 이 실전 패턴들을 상황에 맞게 자유롭게 조합하며 PC, 태블릿, 모바일 어디서든 자연스럽고 세련된 레이아웃을 구현해 봅시다.&lt;/p&gt;</description>
      <category>  Front-End</category>
      <category>css</category>
      <category>Media Query</category>
      <category>responsive web</category>
      <category>그리드 레이아웃</category>
      <category>네비게이션 바</category>
      <category>레이아웃</category>
      <category>미디어쿼리</category>
      <category>반응형</category>
      <category>반응형 웹</category>
      <category>카드형 레이아웃</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/27</guid>
      <comments>https://sim-plism.tistory.com/27#entry27comment</comments>
      <pubDate>Sun, 6 Apr 2025 17:46:24 +0900</pubDate>
    </item>
    <item>
      <title>[ CSS] 반응형 웹 시작하기 &amp;mdash; viewport, 미디어쿼리, flex-wrap까지</title>
      <link>https://sim-plism.tistory.com/26</link>
      <description>&lt;p data-end=&quot;164&quot; data-start=&quot;56&quot; data-ke-size=&quot;size16&quot;&gt;요즘 웹사이트는 PC, 태블릿, 모바일처럼 다양한 화면 크기에서 모두 자연스럽게 보이도록 설계해야 합니다. 이때 꼭 필요한 개념이 바로 &lt;b&gt;반응형 웹(Responsive Web)&lt;/b&gt; 입니다. 반응형 웹을 제대로 만들기 위해서는 단순히 화면 크기에 맞춰 크기만 조정하는 게 아니라 &lt;b&gt;레이아웃이 유연하게 변하고 요소들이 자연스럽게 재배치&lt;/b&gt;되도록 설계해야 합니다. 이 글에서는 반응형 웹을 구성하는 핵심 요소인 viewport 설정, 미디어쿼리(media query), flex-wrap 같은 기본 기술들을 차근차근 정리해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ 반응형 웹(Responsive Web)이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;반응형 웹이란 하나의 HTML 코드로 다양한 화면 크기(PC, 태블릿, 모바일)에 자동으로 대응하는 웹 디자인 형식을 말합니다. 핵심은 &lt;u&gt;&lt;b&gt;한 번 개발해서 여러 디바이스에 맞게 자연스럽게 변하는 것&lt;/b&gt;&lt;/u&gt;입니다. 유연한 그리드 레이아웃, 유동적인 이미지 크기, 미디어쿼리(Media Query)를 이용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;반응형 웹 = 유연한 레이아웃 + 자동 크기 조정 + 다양한 디바이스 지원&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ Viewport 설정이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;viewport는 사용자가 보는 브라우저 화면의 보이는 영역을 의미합니다. 즉, 화면 창 크기입니다. 일반적으로 PC와 모바일은 화면 크기가 다르기 때문에 모바일에서도 레이아웃이 제대로 보이게 하려면 &lt;u&gt;&lt;b&gt;viewport를 올바르게 설정&lt;/b&gt;&lt;/u&gt;해야 합니다. 반응형 웹은 바로 이 viewport를 설정하는 것에서 시작됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  기본 Viewport 메타 태그 (HTML head 안에 꼭 넣어주기)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743920879966&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(※ width=device-width: 디바이스 화면 크기에 맞춤 / initial-scale=1.0: 기본 줌-배율-설정, 1배)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;3️⃣ 미디어쿼리(Media Query) 기본 구조&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;미디어쿼리는 화면 크기, 해상도, 디바이스 종류 같은 조건에 따라 CSS 스타일을 다르게 적용하는 기능입니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;@media (조건) { /* 적용할 스타일 */ } &lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1743921136841&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 화면 너비가 768px 이하일 때 배경색이 lightblue로 바뀜 */
@media (max-width: 768px) {
  body {
    background-color: lightblue;
  }
}&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;size18&quot;&gt;&lt;b&gt;  자주 쓰는 조건 종류&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;737&quot; data-start=&quot;530&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 조건 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt; 의미 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;591&quot; data-start=&quot;554&quot;&gt;
&lt;td&gt;max-width&lt;/td&gt;
&lt;td&gt;화면 너비가 이 값보다 작거나 같을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;629&quot; data-start=&quot;592&quot;&gt;
&lt;td&gt;min-width&lt;/td&gt;
&lt;td&gt;화면 너비가 이 값보다 크거나 같을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;668&quot; data-start=&quot;630&quot;&gt;
&lt;td&gt;max-height / min-height&lt;/td&gt;
&lt;td&gt;화면 높이 조건&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;702&quot; data-start=&quot;669&quot;&gt;
&lt;td&gt;orientation: portrait&lt;/td&gt;
&lt;td&gt;세로 모드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;737&quot; data-start=&quot;703&quot;&gt;
&lt;td&gt;orientation: landscape&lt;/td&gt;
&lt;td&gt;가로 모드&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ 반응형 웹은 거의 `max-width` 중심으로 짬&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ 큰 화면 -&amp;gt; 작은 화면 순서로 내려가면서 스타일을 덮어씀&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ 주로 768px(태블릿 기준), 480px(모바일 기준) 으로 끊음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ flex-wrap과 shrink를 활용한 반응형 레이아웃 만들기 예제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;`flex-wrap`은 `flex-container` 안에서 아이템들이 공간이 부족할 때 줄바꿈을 허용하는 속성 입니다. 이로 인해 좁은 화면에서도 레이아웃이 깨지지 않고 자연스럽게 정렬됩니다. 한편&amp;nbsp; `flex-shrink`는 flex 아이템이 공간이 모자랄 때 얼마나 줄어들 수 있는지를 결정하는 속성입니다. 예를 들어 `flex-shrink: 0`으로 설정하면, 화면이 작아져도 해당 아이템의 크기를 유지할 수 있습니다. 반응형 레이아웃에서는 이 두 가지 속성을 함께 사용해 화면 크기에 따라 레이아웃은 유연하게 변하지만 중요한 요소는 크기를 고정하는 전략을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  flex-wrap + shrink 반응형 예제 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743921714723&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;flex-wrap 반응형 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .flex-container {
      display: flex;
      flex-wrap: wrap; /* 공간이 부족한 경우 줄바꿈 허용*/
      background-color: #eee;
      padding: 10px;
    }

    .flex-item {
      flex: 0 0 200px; /* flex-grow 0, flex-shrink 0, flex-basis 200px */
      height: 100px;
      margin: 10px;
      background-color: lightcoral;
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: bold;
      font-size: 20px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h3&amp;gt;flex-wrap + shrink 반응형 예제&amp;lt;/h3&amp;gt;

&amp;lt;div class=&quot;flex-container&quot;&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;3&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;4&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OF9Kd/btsNacGfRl5/05MGy5CE7VfHjF6OyGOSSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OF9Kd/btsNacGfRl5/05MGy5CE7VfHjF6OyGOSSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OF9Kd/btsNacGfRl5/05MGy5CE7VfHjF6OyGOSSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOF9Kd%2FbtsNacGfRl5%2F05MGy5CE7VfHjF6OyGOSSK%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;1007&quot; height=&quot;678&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;678&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;2905&quot; data-start=&quot;2806&quot; data-ke-size=&quot;size16&quot;&gt;반응형 웹을 만들 때 가장 기본이 되는 세 가지는 viewport 설정, 미디어쿼리 작성, 그리고 flex-wrap을 통한 자연스러운 줄바꿈 처리입니다. 이번 글에서는 반응형 레이아웃을 시작하기 위한 핵심 요소를 정리했습니다. 다음 글에서는 반응형 웹에서 자주 사용하는 레이아웃 패턴과 구체적인 미디어쿼리 실전 적용법까지 이어서 정리해보겠습니다!  &lt;/p&gt;</description>
      <category>  Front-End</category>
      <category>css</category>
      <category>flex-shrink</category>
      <category>flex-wrap</category>
      <category>html</category>
      <category>Media Query</category>
      <category>responsive web</category>
      <category>viewport</category>
      <category>미디어쿼리</category>
      <category>반응형</category>
      <category>반응형 웹</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/26</guid>
      <comments>https://sim-plism.tistory.com/26#entry26comment</comments>
      <pubDate>Sun, 6 Apr 2025 15:49:14 +0900</pubDate>
    </item>
    <item>
      <title>[ CSS] CSS overflow 속성 총정리</title>
      <link>https://sim-plism.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;레이아웃을 구성하다 보면 콘텐츠가 부모 요소의 크기를 넘어버리는 상황을 자주 만나게 됩니다. 이때 요소가 넘치는 걸 어떻게 처리할지를 결정하는 속성이 overflow입니다. 이 글에서는 overflow 기본 개념부터 visible, hidden, scroll, auto까지 하나씩 정리해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ overflow란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;`overflow`는 요소 안에 콘텐츠가 요소 크기를 초과했을 때 그 초과된 부분을 어떻게 처리할지를 결정하는 CSS 속성입니다. 기본적으로 모든 요소는 콘텐츠를 다 담아야 하지만 부모 요소 크기보다 내용이 커질 경우 `overflow` 설정에 따라 1)초과된 내용을 그냥 보여줄지 2)잘라버릴지 3)스크롤을 만들어줄지 4)상황에 따라 자동 처리할지를 결정할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;467&quot; data-start=&quot;334&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; 속성 이름 &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;b&gt;처리 방식 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;394&quot; data-start=&quot;364&quot;&gt;
&lt;td&gt;visible (기본값)&lt;/td&gt;
&lt;td&gt;넘쳐도 그대로 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;417&quot; data-start=&quot;395&quot;&gt;
&lt;td&gt;hidden&lt;/td&gt;
&lt;td&gt;넘친 부분 잘라냄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;441&quot; data-start=&quot;418&quot;&gt;
&lt;td&gt;scroll&lt;/td&gt;
&lt;td&gt;항상 스크롤바 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;467&quot; data-start=&quot;442&quot;&gt;
&lt;td&gt;auto&lt;/td&gt;
&lt;td&gt;필요할 때만 스크롤바 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ overflow 종류별 특징&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. overflow: visible (기본값)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 콘텐츠가 박스 크기를 넘쳐도 잘리지 않고 그대로 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 별다른 제한 없이 부모 영역을 넘어 확장됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 스크롤이 생성되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 주로 제한이 필요 없는 텍스트나 자연스러운 레이아웃에 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. overflow: hidden&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 박스를 벗어난 콘텐츠는 잘라버림&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 벗어난 부분은 화면에 아예 보이지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 스크롤이 생성되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 주로 레이아웃을 깔끔하게 정리하거나 모션(슬라이드 애니메이션) 구현할 때 많이 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. overflow: scroll&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 콘텐츠의 넘침 여부와 상관없이 항상 스크롤바를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 가로/세로 스크롤 모두 강제로 만들어질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 주로 특정 영역을 고정 크기로 제한하고 그 안에서 스크롤 시키고 싶을 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. overflow: auto&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 콘텐츠가 넘칠 때만 자동으로 스크롤바 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 가장 자연스럽고 자주 쓰이는 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 주로 반응형 웹, 텍스트 영역 등에 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ overflow 예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1743884633182&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;overflow 종류 비교&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .box {
      width: 200px;
      height: 100px;
      margin-bottom: 30px;
      border: 2px solid #333;
      position: relative;
    }
    .content {
      width: 300px;
      height: 150px;
      background-color: rgb(246, 198, 255);
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: bold;
      font-size: 18px;
    }
    .hidden-text {margin-top:60px;}
    .visible { overflow: visible; background-color: lightblue; }
    .hidden { overflow: hidden; background-color: lightgreen; }
    .scroll { overflow: scroll; background-color: lightyellow; }
    .auto { overflow: auto; background-color: lightpink; }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h3&amp;gt;overflow: visible&amp;lt;/h3&amp;gt;
&amp;lt;div class=&quot;box visible&quot;&amp;gt;
  &amp;lt;div class=&quot;content&quot;&amp;gt;넘치는 콘텐츠&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h3 class=&quot;hidden-text&quot;&amp;gt;overflow: hidden&amp;lt;/h3&amp;gt;
&amp;lt;div class=&quot;box hidden&quot;&amp;gt;
  &amp;lt;div class=&quot;content&quot;&amp;gt;넘치는 콘텐츠&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h3&amp;gt;overflow: scroll&amp;lt;/h3&amp;gt;
&amp;lt;div class=&quot;box scroll&quot;&amp;gt;
  &amp;lt;div class=&quot;content&quot;&amp;gt;넘치는 콘텐츠&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h3&amp;gt;overflow: auto&amp;lt;/h3&amp;gt;
&amp;lt;div class=&quot;box auto&quot;&amp;gt;
  &amp;lt;div class=&quot;content&quot;&amp;gt;넘치는 콘텐츠&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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/kzSBx/btsM9VrevNV/cDuy5VOdbRYjWdFB2zckt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzSBx/btsM9VrevNV/cDuy5VOdbRYjWdFB2zckt0/img.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;825&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.4608%; margin-right: 10px;&quot; data-widthpercent=&quot;54.09&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzSBx/btsM9VrevNV/cDuy5VOdbRYjWdFB2zckt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzSBx%2FbtsM9VrevNV%2FcDuy5VOdbRYjWdFB2zckt0%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;716&quot; height=&quot;825&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjNvi/btsNa6Svlra/McF5AikMrVS7h851OhukOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjNvi/btsNa6Svlra/McF5AikMrVS7h851OhukOk/img.png&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;767&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.3764%;&quot; data-widthpercent=&quot;45.91&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjNvi/btsNa6Svlra/McF5AikMrVS7h851OhukOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmjNvi%2FbtsNa6Svlra%2FMcF5AikMrVS7h851OhukOk%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;565&quot; height=&quot;767&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ 자주 틀리는 포인트 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;136&quot; data-start=&quot;103&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;136&quot; data-start=&quot;103&quot; data-ke-size=&quot;size18&quot;&gt;  overflow 기본값은 visible&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;269&quot; data-start=&quot;138&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;183&quot; data-start=&quot;138&quot;&gt;CSS에서 overflow를 따로 설정 안 하면 기본은 visible&lt;/li&gt;
&lt;li data-end=&quot;214&quot; data-start=&quot;184&quot;&gt;&lt;b&gt;콘텐츠가 넘치면 그냥 삐져나와서 다 보임&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;269&quot; data-start=&quot;215&quot;&gt;레이아웃 깨질 때 overflow: hidden 꼭 체크&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;295&quot; data-start=&quot;271&quot; data-ke-size=&quot;size18&quot;&gt;✅ &lt;b&gt;기본은 visible! 잊지 말기&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;346&quot; data-start=&quot;302&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;346&quot; data-start=&quot;302&quot; data-ke-size=&quot;size18&quot;&gt;  overflow: hidden은 자르기만 함 (스크롤 없음)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;439&quot; data-start=&quot;348&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;382&quot; data-start=&quot;348&quot;&gt;hidden은 넘친 부분을 잘라서 보이지 않게 할 뿐&lt;/li&gt;
&lt;li data-end=&quot;403&quot; data-start=&quot;383&quot;&gt;&lt;b&gt;스크롤바가 생기지 않음&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;439&quot; data-start=&quot;404&quot;&gt;스크롤하려면 scroll 또는 auto를 써야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;486&quot; data-start=&quot;441&quot; data-ke-size=&quot;size18&quot;&gt;✅ &quot;잘리고 스크롤도 하고 싶다&quot; ➔ hidden ❌, scroll/auto ⭕️&lt;/p&gt;
&lt;p data-end=&quot;532&quot; data-start=&quot;493&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;532&quot; data-start=&quot;493&quot; data-ke-size=&quot;size18&quot;&gt;  overflow: scroll은 무조건 스크롤바 표시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;607&quot; data-start=&quot;534&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;568&quot; data-start=&quot;534&quot;&gt;콘텐츠가 넘치든 안 넘치든 &lt;b&gt;항상 스크롤바가 생김&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;607&quot; data-start=&quot;569&quot;&gt;넘치지 않으면 스크롤할 내용이 없어도 스크롤바만 덩그러니&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;609&quot; data-ke-size=&quot;size18&quot;&gt;✅ &quot;무조건 스크롤바 필요하다&quot; ➔ scroll&lt;/p&gt;
&lt;p data-end=&quot;677&quot; data-start=&quot;642&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;677&quot; data-start=&quot;642&quot; data-ke-size=&quot;size18&quot;&gt;  overflow: auto는 넘칠 때만 스크롤&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;768&quot; data-start=&quot;679&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;702&quot; data-start=&quot;679&quot;&gt;넘칠 때만 자동으로 스크롤바가 생김&lt;/li&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;703&quot;&gt;넘치지 않으면 깔끔하게 스크롤바 없이 표시&lt;/li&gt;
&lt;li data-end=&quot;768&quot; data-start=&quot;732&quot;&gt;실무에서 가장 많이 쓰는 overflow 값이 auto&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;791&quot; data-start=&quot;770&quot; data-ke-size=&quot;size18&quot;&gt;✅ &quot;필요할 때만 스크롤&quot; ➔ auto&lt;/p&gt;
&lt;p data-end=&quot;835&quot; data-start=&quot;798&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;835&quot; data-start=&quot;798&quot; data-ke-size=&quot;size18&quot;&gt;  overflow는 &lt;b&gt;수평/수직 따로 제어도 가능&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;884&quot; data-start=&quot;837&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;860&quot; data-start=&quot;837&quot;&gt;overflow-x &amp;rarr; 가로 스크롤&lt;/li&gt;
&lt;li data-end=&quot;884&quot; data-start=&quot;861&quot;&gt;overflow-y &amp;rarr; 세로 스크롤&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1743884880613&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;overflow-x: scroll;
overflow-y: hidden;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;975&quot; data-start=&quot;941&quot; data-ke-size=&quot;size18&quot;&gt;✅ 예를 들어 가로로만 긴 테이블 같은 것을 만들 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;194&quot; data-start=&quot;92&quot; data-ke-size=&quot;size16&quot;&gt;CSS에서 overflow 속성은 작지만 레이아웃의 안정성과 사용자 경험(UX)을 좌우하는 핵심 기능입니다. 따라서 기본 개념을 제대로 익히고 상황에 따라 올바르게 선택하는 습관이 중요합니다 ☺️&lt;/p&gt;</description>
      <category>  Front-End</category>
      <category>auto</category>
      <category>css</category>
      <category>hidden</category>
      <category>html</category>
      <category>overflow</category>
      <category>Scroll</category>
      <category>visible</category>
      <category>내용넘칠때</category>
      <category>스크롤</category>
      <category>스크롤바</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/25</guid>
      <comments>https://sim-plism.tistory.com/25#entry25comment</comments>
      <pubDate>Sun, 6 Apr 2025 05:32:21 +0900</pubDate>
    </item>
    <item>
      <title>[ CSS] CSS z-index + stacking context 총정리</title>
      <link>https://sim-plism.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CSS에서 요소를 겹칠 때 어떤 요소가 위로 올라올지를 결정하는 것이 z-index입니다. 하지만 실제 레이아웃에서는 단순히 z-index 숫자만 비교하는 게 아니라 stacking context라는 보이지 않는 독립 그룹 구조까지 함께 이해해야 정확한 결과를 만들 수 있습니다.&lt;br /&gt;이 글에서는 z-index 기본 개념과, 실전에서 반드시 알아야 할 stacking context까지 한 번에 정리해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  position이 아직 헷갈린다면 z-index와 stacking context을 배우기 전에 이 글부터 보고 오는 걸 추천할게요!  &lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743881224869&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;[ CSS] CSS position 속성 총정리&quot; data-og-description=&quot;display 속성으로 레이아웃을 구성하는 방법을 익힌 뒤는 요소를 세밀하게 배치하고 조정할 수 있는 position 속성을 제대로 이해해야 합니다. 이 글에서는 position 속성의 기본 개념부터 static, relative&quot; data-og-host=&quot;sim-plism.tistory.com&quot; data-og-source-url=&quot;https://sim-plism.tistory.com/23&quot; data-og-url=&quot;https://sim-plism.tistory.com/23&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bduk2Y/hyYBd0l9yK/YiuKg8hS4BPSYv9v60spw1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cPPuvg/hyYyHnUGLx/6QfaB6royjuQzpPL4Mb6Z1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/hWUYs/hyYyVl9QfK/qLHFAUHr6AlgEKAK3JEkMk/img.png?width=1165&amp;amp;height=808&amp;amp;face=0_0_1165_808&quot;&gt;&lt;a href=&quot;https://sim-plism.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sim-plism.tistory.com/23&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bduk2Y/hyYBd0l9yK/YiuKg8hS4BPSYv9v60spw1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cPPuvg/hyYyHnUGLx/6QfaB6royjuQzpPL4Mb6Z1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/hWUYs/hyYyVl9QfK/qLHFAUHr6AlgEKAK3JEkMk/img.png?width=1165&amp;amp;height=808&amp;amp;face=0_0_1165_808');&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;[ CSS] CSS position 속성 총정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;display 속성으로 레이아웃을 구성하는 방법을 익힌 뒤는 요소를 세밀하게 배치하고 조정할 수 있는 position 속성을 제대로 이해해야 합니다. 이 글에서는 position 속성의 기본 개념부터 static, relative&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sim-plism.tistory.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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ z-index&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;z-index는 요소가 겹칠 때, 어떤 요소를 더 위로 표시할지를 결정하는 CSS 속성입니다. 숫자가 클 수록 화면에서 더 위에 보이며 기본적으로 position이 relative, absolute, fixed, sticky 중 하나인 요소에 적용됩니다. position이 없으면 z-index를 주어도 적용되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ stacking context&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;stacking context는 요소들이 z-index를 기준으로 겹침 순서를 계산하는 독립된 그룹입니다. 하나의 stacking context 안에서는 z-index 숫자로 요소들의 순서를 비교하지만, 서로 다른 stacking context끼리는 그룹 자체의 순서를 먼저 비교합니다. position과 z-index, opacity, transform 같은 속성에 의해 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;  stacking context가 생성되는 조건 예시&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;807&quot; data-start=&quot;624&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;699&quot; data-start=&quot;624&quot;&gt;position: relative, absolute, fixed, sticky 이면서 z-index 값이 있을 때&lt;/li&gt;
&lt;li data-end=&quot;720&quot; data-start=&quot;700&quot;&gt;opacity: 1 미만일 때&lt;/li&gt;
&lt;li data-end=&quot;768&quot; data-start=&quot;721&quot;&gt;transform, filter, perspective 속성이 있을 때&lt;/li&gt;
&lt;li data-end=&quot;807&quot; data-start=&quot;769&quot;&gt;will-change, mix-blend-mode 사용 시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;853&quot; data-start=&quot;809&quot; data-ke-size=&quot;size18&quot;&gt;✔️ 이 중 가장 많이 만나는 건 &lt;b&gt;position + z-index&lt;/b&gt; 조합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743881600496&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[ 부모 stacking context ]
 ├── z-index: 1 (요소 A)
 ├── z-index: 2 (요소 B)
 │    └── [ 새로운 stacking context 시작 ]
 │        ├── z-index: 5 (자식 요소 B1)
 │        └── z-index: 10 (자식 요소 B2)
 └── z-index: 3 (요소 C)&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: #9d9d9d;&quot;&gt;(※ B2가 z-index 10이어도 부모 B의 그룹 안에서만 비교. 부모끼리 순서가 먼저고 그 다음 자식끼리 순서를 따짐)&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ &lt;b&gt;z-index + stacking context 실전 예제&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1743882372780&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;z-index &amp;amp; stacking context 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .outer {
      position: relative;
      z-index: 1;
      background-color: lightgray;
      padding: 30px;
      width: 300px;
      height: 300px;
    }

    .inner1 {
      position: relative;
      z-index: 2;
      background-color: lightblue;
      width: 150px;
      height: 150px;
    }

    .inner2 {
      position: relative;
      z-index: 3;
      background-color: lightcoral;
      width: 150px;
      height: 150px;
      margin-top: -100px;
      margin-left: 50px;
    }

    .another {
      position: relative;
      z-index: 5;
      background-color: lightgreen;
      width: 200px;
      height: 200px;
      margin-top: -250px;
      margin-left: 200px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;outer&quot;&amp;gt;
  &amp;lt;div class=&quot;inner1&quot;&amp;gt;Inner 1 (z-index:2)&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;inner2&quot;&amp;gt;Inner 2 (z-index:3)&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div class=&quot;another&quot;&amp;gt;Another Box (z-index:5)&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vpdQL/btsNagImrUP/8cLix3pgkQCHERVbCUK7w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vpdQL/btsNagImrUP/8cLix3pgkQCHERVbCUK7w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vpdQL/btsNagImrUP/8cLix3pgkQCHERVbCUK7w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvpdQL%2FbtsNagImrUP%2F8cLix3pgkQCHERVbCUK7w0%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;890&quot; height=&quot;807&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;807&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;size18&quot;&gt;- outer 박스는 z-index 1 &amp;rarr; 제일 아래 그룹&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- outer가 position: relative; z-index:1 이니까 자체 stacking context 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- inner1과 inner2는 outer 안에 있는 요소들 (같은 stacking context), outer 안에서만 z-index 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- another 박스는 outer 바깥에 있는 요소(전체 레벨)이고 z-index가 5 &amp;rarr; 제일 위에 뜸&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5️⃣ 자주 틀리는 포인트 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;126&quot; data-start=&quot;79&quot; data-ke-size=&quot;size18&quot;&gt;✔️ position 없는 static 요소에 z-index 줘도 소용없다. position이 기본값(static)일 때는 z-index가 아예 적용 ❌&lt;/p&gt;
&lt;p data-end=&quot;126&quot; data-start=&quot;79&quot; data-ke-size=&quot;size18&quot;&gt;✅ &quot;z-index 안 먹네?&quot; &amp;rarr; 일단 position 있는지 확인!&lt;/p&gt;
&lt;p data-end=&quot;126&quot; data-start=&quot;79&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;359&quot; data-start=&quot;313&quot; data-ke-size=&quot;size18&quot;&gt;✔️ stacking context가 다르면 z-index 비교가 안 된다. 서로 다른 stacking context끼리는 &lt;b&gt;부모 그룹끼리 z-index를 먼저 비교&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;521&quot; data-start=&quot;443&quot; data-ke-size=&quot;size18&quot;&gt;✅ &quot;z-index 숫자 큰데 왜 밑에 있지?&quot; &amp;rarr; &quot;다른 stacking context 아니야?&quot; 바로 의심!&lt;/p&gt;
&lt;p data-end=&quot;521&quot; data-start=&quot;443&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;579&quot; data-start=&quot;528&quot; data-ke-size=&quot;size18&quot;&gt;✔️ opacity, transform, filter 등도 stacking context를 만든다&lt;b&gt;&lt;/b&gt;&lt;br /&gt;✅ &quot;position: relative 없는데도 stacking context가 있네?&quot; &amp;rarr; &quot;opacity, transform 썼나?&quot; 체크!&lt;/p&gt;
&lt;p data-end=&quot;579&quot; data-start=&quot;528&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;844&quot; data-start=&quot;793&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✔️&lt;span&gt; &lt;/span&gt;&lt;/span&gt;stacking context 안에서는 내부 요소끼리만 z-index 비교한다&lt;/p&gt;
&lt;p data-end=&quot;968&quot; data-start=&quot;919&quot; data-ke-size=&quot;size18&quot;&gt;✅ &quot;부모끼리 먼저, 자식끼리는 나중!&quot; 순서를 생각할 것!&lt;/p&gt;
&lt;p data-end=&quot;968&quot; data-start=&quot;919&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;227&quot; data-start=&quot;63&quot; data-ke-size=&quot;size16&quot;&gt;CSS에서 요소의 겹침 순서를 제어할 때는 단순히 z-index 숫자만 조정하는 것으로 끝나지 않습니다. 요소가 어떤 &lt;b&gt;stacking context&lt;/b&gt; 안에 있는지 그리고 어떤 기준으로 겹침이 계산되는지를 이해해야 의도한 대로 레이아웃을 정확하게 제어할 수 있습니다. 이번 글에서는 z-index와 stacking context 개념을 살펴보았습니다. 다음 글에서는 overflow 속성을 정리하여 콘텐츠가 영역을 넘칠 때 어떻게 처리하는지까지 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Front-End</category>
      <category>context</category>
      <category>css</category>
      <category>Filter</category>
      <category>html</category>
      <category>Opacity</category>
      <category>Position</category>
      <category>stacking</category>
      <category>stacking context</category>
      <category>Transform</category>
      <category>z-index</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/24</guid>
      <comments>https://sim-plism.tistory.com/24#entry24comment</comments>
      <pubDate>Sun, 6 Apr 2025 05:04:04 +0900</pubDate>
    </item>
    <item>
      <title>[ CSS] CSS position 속성 총정리</title>
      <link>https://sim-plism.tistory.com/23</link>
      <description>&lt;p data-end=&quot;276&quot; data-start=&quot;154&quot; data-ke-size=&quot;size16&quot;&gt;display 속성으로 레이아웃을 구성하는 방법을 익힌 뒤는 요소를 세밀하게 배치하고 조정할 수 있는 position 속성을 제대로 이해해야 합니다. 이 글에서는 position 속성의 기본 개념부터 static, relative, absolute, fixed, sticky 각각의 차이와 특징을 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;167&quot; data-start=&quot;145&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  display가 아직 헷갈린다면 position을 배우기 전에 이 글부터 보고 오는 걸 추천할게요!   &lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743880713259&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;[ CSS] CSS display 속성 총정리&quot; data-og-description=&quot;CSS는 기본 개념을 제대로 정리하지 않으면 나중에 flex나 grid 같은 레이아웃을 다룰 때 계속 헷갈리게 됩니다. 다르게 말하면 한 번만 제대로 정리하면 그 이후로는 어떤 레이아웃도 훨씬 쉽게 이&quot; data-og-host=&quot;sim-plism.tistory.com&quot; data-og-source-url=&quot;https://sim-plism.tistory.com/22&quot; data-og-url=&quot;https://sim-plism.tistory.com/22&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EpJeb/hyYyRc0pFX/oQJq6fQ7rY9nVKswOfKHy1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/xYKRE/hyYA8LuCJg/eroSwNoqKFV3LSWQduSfL1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gDs4x/hyYBgbHEAf/K3VurMzzZZ4PAJSw676h50/img.png?width=844&amp;amp;height=918&amp;amp;face=0_0_844_918&quot;&gt;&lt;a href=&quot;https://sim-plism.tistory.com/22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sim-plism.tistory.com/22&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EpJeb/hyYyRc0pFX/oQJq6fQ7rY9nVKswOfKHy1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/xYKRE/hyYA8LuCJg/eroSwNoqKFV3LSWQduSfL1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gDs4x/hyYBgbHEAf/K3VurMzzZZ4PAJSw676h50/img.png?width=844&amp;amp;height=918&amp;amp;face=0_0_844_918');&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;[ CSS] CSS display 속성 총정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CSS는 기본 개념을 제대로 정리하지 않으면 나중에 flex나 grid 같은 레이아웃을 다룰 때 계속 헷갈리게 됩니다. 다르게 말하면 한 번만 제대로 정리하면 그 이후로는 어떤 레이아웃도 훨씬 쉽게 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sim-plism.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-end=&quot;167&quot; data-start=&quot;145&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;167&quot; data-start=&quot;145&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ position이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;`position`&lt;/b&gt; 속성은 HTML 요소가 페이지 안에서 어디에 어떻게 위치할지를 결정하는 CSS 속성입니다. 즉, positon을 설정함으로써 요소를 원하는 위치에 세밀하게 배치하거나 다른 기준을 잡아줄 수 있습니다. 기본적으로 모든 요소는 &lt;b&gt;`position: static`&lt;/b&gt; 상태로 배치됩니다. position 속성은 레이아웃을 제어할 때 top, right, bottom, left 같은 방향 속성과 함께 사용되며 어떤 position 값을 주느냐에 따라 방향 속성의 동작 방식도 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;요소가 어느 기준으로, 어디에 위치할지를 정하는 속성&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;✅ position의 기능&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;704&quot; data-start=&quot;476&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;704&quot; data-start=&quot;500&quot;&gt;
&lt;tr data-end=&quot;551&quot; data-start=&quot;500&quot;&gt;
&lt;td&gt;&lt;b&gt;위치 지정&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;요소를 문서 흐름(static)에서 벗어나 자유롭게 위치시킬 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;608&quot; data-start=&quot;552&quot;&gt;
&lt;td&gt;&lt;b&gt;기준 설정&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;relative나 absolute를 통해 다른 요소의 기준점을 설정할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;658&quot; data-start=&quot;609&quot;&gt;
&lt;td&gt;&lt;b&gt;고정 배치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;fixed를 이용해 스크롤에도 움직이지 않는 요소를 만들 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;704&quot; data-start=&quot;659&quot;&gt;
&lt;td&gt;&lt;b&gt;스크롤 반응&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;sticky를 통해 특정 위치에서 고정되도록 할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-end=&quot;235&quot; data-start=&quot;217&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;235&quot; data-start=&quot;217&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ 주요 position 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. static (기본값)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 모든 요소는 기본적으로 &lt;b&gt;`position: static`&lt;/b&gt; 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- &lt;b&gt;`top`&lt;/b&gt;, &lt;b&gt;`right`&lt;/b&gt;, &lt;b&gt;`bottom`&lt;/b&gt;, &lt;b&gt;`left`&lt;/b&gt; 같은 위치 조정 속성이 적용되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 문서 흐름에 따라 자연스럽게 배치됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 따로 position 설정이 필요 없을 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. relative (상대 위치)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 요소를 자기 자신 기준으로 이동시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 원래 위치를 기준으로 &lt;b&gt;`top`&lt;/b&gt;, &lt;b&gt;`left`&lt;/b&gt; 등을 이용해 살짝 이동할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 이동하더라도 문서 흐름상 원래 자리를 그대로 차지&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 부모 요소로서 &lt;b&gt;`absolute`&lt;/b&gt;요소의 기준이 될 수도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. absolute (절대 위치)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 가장 가까운 &lt;b&gt;`position`&lt;/b&gt;이 &lt;b&gt;`relative`&lt;/b&gt;, &lt;b&gt;`absolute`&lt;/b&gt;, &lt;b&gt;`fixed`&lt;/b&gt;로 설정된 조상 요소를 기준으로 위치가 결정됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 만약 조상 요소 중에 그런 게 없다면 &lt;b&gt;`body`&lt;/b&gt;(문서 전체)를 기준으로 삼음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- &lt;b&gt;`top`&lt;/b&gt;, &lt;b&gt;`left`&lt;/b&gt; 같은 속성으로 자유롭게 배치할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 문서 흐름에서 벗어나기 때문에 원래 자리는 사라짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 레이아웃 안에 독립적인 박스를 만들 때 많이 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. fixed (고정 위치)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 브라우저 화면을 기준으로 위치를 고정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 스크롤을 해도 위치가 변하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 광고 배너, 상단 고정 메뉴 등에 자주 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 항상 화면에 떠 있어야 하는 요소에 적합&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. sticky (스크롤 따라가다 고정)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 기본적으로는 문서 흐름(&lt;b&gt;`static`&lt;/b&gt;)처럼 배치되다가&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 지정한 &lt;b&gt;`top`&lt;/b&gt;, &lt;b&gt;`left`&lt;/b&gt; 위치에 도달하면 그 위치에 고정되는 속성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 스크롤하면서 특정 위치에 딱 붙는 UI를 만들 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 최근 반응형 웹, 모바일 UI에서 많이 쓰임&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  핵심 요약&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1397&quot; data-start=&quot;1136&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.4419%;&quot;&gt;&lt;b&gt; 종류 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.9535%;&quot;&gt;&lt;b&gt; 기준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;&lt;b&gt; 특징&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1208&quot; data-start=&quot;1170&quot;&gt;
&lt;td style=&quot;width: 12.4419%;&quot;&gt;static&lt;/td&gt;
&lt;td style=&quot;width: 43.9535%;&quot;&gt;없음 (문서 흐름)&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;기본 위치, 이동 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1251&quot; data-start=&quot;1209&quot;&gt;
&lt;td style=&quot;width: 12.4419%;&quot;&gt;relative&lt;/td&gt;
&lt;td style=&quot;width: 43.9535%;&quot;&gt;자기 자신&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;원래 자리 유지 + 살짝 이동 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1321&quot; data-start=&quot;1252&quot;&gt;
&lt;td style=&quot;width: 12.4419%;&quot;&gt;absolute&lt;/td&gt;
&lt;td style=&quot;width: 43.9535%;&quot;&gt;가장 가까운 relative/absolute/fixed 조상 요소&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;문서 흐름 벗어나 자유 위치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1359&quot; data-start=&quot;1322&quot;&gt;
&lt;td style=&quot;width: 12.4419%;&quot;&gt;fixed&lt;/td&gt;
&lt;td style=&quot;width: 43.9535%;&quot;&gt;브라우저(viewport)&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;스크롤해도 고정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1397&quot; data-start=&quot;1360&quot;&gt;
&lt;td style=&quot;width: 12.4419%;&quot;&gt;sticky&lt;/td&gt;
&lt;td style=&quot;width: 43.9535%;&quot;&gt;스크롤 + 위치 도달&lt;/td&gt;
&lt;td style=&quot;width: 43.4884%;&quot;&gt;위치 도달 후 고정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;339&quot; data-start=&quot;315&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ position 속성별 예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. static 예제&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1743875132770&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;position: static 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .static-box {
      width: 150px;
      height: 100px;
      background-color: lightblue;
      margin: 10px;
      position: static; /* 기본값 (사실 생략해도 됨) */
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h2&amp;gt;position: static&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;static-box&quot;&amp;gt;Static Box&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;static-box&quot;&amp;gt;Static Box&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U9r5l/btsNbwXtEVr/A5VMmNc7nLe8tD2TpKDbzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U9r5l/btsNbwXtEVr/A5VMmNc7nLe8tD2TpKDbzk/img.png&quot; data-alt=&quot;static 구현 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U9r5l/btsNbwXtEVr/A5VMmNc7nLe8tD2TpKDbzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU9r5l%2FbtsNbwXtEVr%2FA5VMmNc7nLe8tD2TpKDbzk%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;540&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;static 구현 화면&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 아무런 위치 조정 없이 그냥 HTML 문서 흐름(위에서 아래로)에 따라 배치&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- top, left 같은 방향 조정 속성을 써도 아무 효과가 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 생략해도 기본 적용&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. relative (상대 위치)&amp;nbsp; 예제&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1743876571388&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;position: relative 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .relative-box {
      width: 150px;
      height: 100px;
      background-color: lightgreen;
      margin: 10px;
      position: relative;
      top: 20px;
      left: 30px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h2&amp;gt;position: relative&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;relative-box&quot;&amp;gt;Relative Box&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KIvF9/btsM98qiVIJ/H70dp3daCuW4hRtVLQoOKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KIvF9/btsM98qiVIJ/H70dp3daCuW4hRtVLQoOKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KIvF9/btsM98qiVIJ/H70dp3daCuW4hRtVLQoOKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKIvF9%2FbtsM98qiVIJ%2FH70dp3daCuW4hRtVLQoOKk%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;351&quot; height=&quot;327&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 요소가 원래 있어야 할 자리를 기준으로 top, left 값만큼 이동&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 위 코드에서는 아래로 20px(top: 20px), 오른쪽으로 30px(left:30px) 이동&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 문서 흐름에서 차지하는 자리(공간)은 그대로 유지&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 따라서 아래쪽에 다른 요소가 있으면 겹칠 수 있음&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.&lt;span&gt; absolute&lt;/span&gt; (절대 위치)&amp;nbsp; 예제&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1743878399200&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;position: absolute 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .parent-box {
      position: relative; /* 기준이 되는 부모 */
      width: 300px;
      height: 200px;
      background-color: lightgray;
      margin: 20px;
    }

    .absolute-box {
      position: absolute;
      top: 20px;
      left: 30px;
      width: 100px;
      height: 50px;
      background-color: lightcoral;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h2&amp;gt;position: absolute&amp;lt;/h2&amp;gt;

&amp;lt;div class=&quot;parent-box&quot;&amp;gt;
  &amp;lt;div class=&quot;absolute-box&quot;&amp;gt;Absolute Box&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duxZ3O/btsM9WRcqBC/mAeYkQTMbDRDP6x0tP065K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duxZ3O/btsM9WRcqBC/mAeYkQTMbDRDP6x0tP065K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duxZ3O/btsM9WRcqBC/mAeYkQTMbDRDP6x0tP065K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduxZ3O%2FbtsM9WRcqBC%2FmAeYkQTMbDRDP6x0tP065K%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;309&quot; height=&quot;251&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 가장 가까운 position이 relative/absolute/fixed로 설정된 부모 요소를 기준으로 위치가 결정&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- parent-box에&amp;nbsp; postion: relative가 설정되어 있으므로 parent-box의 왼쪽 위(0,0)을 기준으로 오른쪽으로 30px, 아래로 20px 이동한 것&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 만약 parent-box에 position이 없었다면 문서 전체를 기준으로 잡음&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 기준이 되는 부모를 기준으로 완전히 새로운 위치에 배치&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 문서 흐름(자리 차지)에서 완전히 빠지게 됨 (문서 흐름상 다른 요소들이 absolute 박스가 없는 것처럼 배치되므로 다른 요소와 겹치기 쉬움)&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.&lt;span&gt;&lt;span&gt;&amp;nbsp;fixed&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(고정 위치)&amp;nbsp; 예제&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1743878867373&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;position: fixed 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .fixed-box {
      position: fixed;
      top: 20px;
      right: 20px;
      width: 120px;
      height: 60px;
      background-color: lightseagreen;
      color: white;
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: bold;
    }

    .content {
      height: 1500px; /* 스크롤 생기게 만듦 */
      background: linear-gradient(#f0f0f0, #ccc);
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h2&amp;gt;position: fixed&amp;lt;/h2&amp;gt;

&amp;lt;div class=&quot;fixed-box&quot;&amp;gt;Fixed Box&amp;lt;/div&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt;
  스크롤 테스트용 긴 콘텐츠
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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/bMwEGJ/btsNbeCOakK/ofgG50rmfikjYPLGYGE03K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMwEGJ/btsNbeCOakK/ofgG50rmfikjYPLGYGE03K/img.png&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;775&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.123%; margin-right: 10px;&quot; data-widthpercent=&quot;50.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMwEGJ/btsNbeCOakK/ofgG50rmfikjYPLGYGE03K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMwEGJ%2FbtsNbeCOakK%2FofgG50rmfikjYPLGYGE03K%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;1156&quot; height=&quot;775&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k5CVA/btsNaK9Ya8i/1GpDEXqO08egjxkab3IwhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k5CVA/btsNaK9Ya8i/1GpDEXqO08egjxkab3IwhK/img.png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;805&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.7142%;&quot; data-widthpercent=&quot;49.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k5CVA/btsNaK9Ya8i/1GpDEXqO08egjxkab3IwhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk5CVA%2FbtsNaK9Ya8i%2F1GpDEXqO08egjxkab3IwhK%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;1167&quot; height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 브라우저 화면 기준으로 위치가 고정&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 스크롤을 내려도 항상 같은 자리에 표시&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 부모 요소와 관계 없음&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;sticky (스크롤 따라가다 고정)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1743879227628&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;position: sticky 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .sticky-box {
      position: sticky;
      top: 20px;
      background-color: lightsalmon;
      padding: 10px;
      font-weight: bold;
      font-size: 18px;
    }

    .content {
      height: 1500px; /* 스크롤을 만들어줌 */
      background: linear-gradient(white, lightgray);
      padding-top: 100px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h2&amp;gt;position: sticky&amp;lt;/h2&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt;
  &amp;lt;div class=&quot;sticky-box&quot;&amp;gt;Sticky Box&amp;lt;/div&amp;gt;
  긴 스크롤 콘텐츠
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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/nJvoD/btsM9WjoxKA/abhMkO2nJOfvOg78S04oa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJvoD/btsM9WjoxKA/abhMkO2nJOfvOg78S04oa0/img.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;792&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.5926%; margin-right: 10px;&quot; data-widthpercent=&quot;50.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJvoD/btsM9WjoxKA/abhMkO2nJOfvOg78S04oa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJvoD%2FbtsM9WjoxKA%2FabhMkO2nJOfvOg78S04oa0%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;1150&quot; height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c68bqF/btsNaKPEO1i/urivfwp3SKyC3kLJ3xEOPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c68bqF/btsNaKPEO1i/urivfwp3SKyC3kLJ3xEOPK/img.png&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;808&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.2446%;&quot; data-widthpercent=&quot;49.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c68bqF/btsNaKPEO1i/urivfwp3SKyC3kLJ3xEOPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc68bqF%2FbtsNaKPEO1i%2Furivfwp3SKyC3kLJ3xEOPK%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;1165&quot; height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 처음엔 일반 static처럼 문서 흐름에 따라 배치되다가 스크롤을 내리면서 top: 20px 위치에 도달하면 고정됨&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 부모 요소 영역(content)안에서만 sticky가 작동&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 공간 차지함&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;- 상단 고정 헤더, 목차 메뉴 고정 등에 쓰임&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;427&quot; data-start=&quot;408&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ 자주 틀리는 포인트 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;110&quot; data-start=&quot;79&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;110&quot; data-start=&quot;79&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;☑️ static은 &quot;기본값&quot;이라는 점을 잊지 말자&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;224&quot; data-start=&quot;112&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;154&quot; data-start=&quot;112&quot;&gt;position을 따로 설정하지 않으면 기본값은 항상 static&lt;/li&gt;
&lt;li data-end=&quot;224&quot; data-start=&quot;155&quot;&gt;top, left, bottom, right 같은 속성은 &lt;b&gt;static 상태에서는 아무 효과가 없다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;274&quot; data-start=&quot;226&quot; data-ke-size=&quot;size18&quot;&gt;✅ position을 지정하지 않았는데 이동하려 한다? &amp;rarr; position 먼저 확인!&lt;/p&gt;
&lt;p data-end=&quot;274&quot; data-start=&quot;226&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;274&quot; data-start=&quot;226&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;306&quot; data-start=&quot;281&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;☑️ relative는 &quot;공간 유지&quot;한다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;379&quot; data-start=&quot;308&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;308&quot;&gt;relative는 &lt;b&gt;내 자리(공간)는 유지하면서&lt;/b&gt; 눈에 보이는 박스만 이동한다&lt;/li&gt;
&lt;li data-end=&quot;379&quot; data-start=&quot;357&quot;&gt;그래서 아래쪽 요소와 겹칠 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;414&quot; data-start=&quot;381&quot; data-ke-size=&quot;size18&quot;&gt;✅ &quot;문서 흐름은 그대로 + 눈에 보이는 것만 이동&quot; 기억!&lt;/p&gt;
&lt;p data-end=&quot;414&quot; data-start=&quot;381&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;414&quot; data-start=&quot;381&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;447&quot; data-start=&quot;421&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;☑️ absolute는 기준 부모를 찾는다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;558&quot; data-start=&quot;449&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;513&quot; data-start=&quot;449&quot;&gt;absolute는 &lt;b&gt;가장 가까운 relative/absolute/fixed 부모&lt;/b&gt;를 기준으로 위치를 잡는다&lt;/li&gt;
&lt;li data-end=&quot;558&quot; data-start=&quot;514&quot;&gt;만약 기준 부모가 없으면, &lt;b&gt;브라우저 전체(body)&lt;/b&gt; 를 기준 삼는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;608&quot; data-start=&quot;560&quot; data-ke-size=&quot;size18&quot;&gt;✅ absolute 쓸 때는 &lt;b&gt;항상 부모 position 설정 여부를 먼저 확인&lt;/b&gt;!&lt;/p&gt;
&lt;p data-end=&quot;608&quot; data-start=&quot;560&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;608&quot; data-start=&quot;560&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;645&quot; data-start=&quot;615&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;☑️ fixed는 화면(viewport) 기준이다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;718&quot; data-start=&quot;647&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;697&quot; data-start=&quot;647&quot;&gt;fixed는 부모 요소가 뭐든 상관없이 &lt;b&gt;항상 브라우저 화면을 기준&lt;/b&gt;으로 고정된다&lt;/li&gt;
&lt;li data-end=&quot;718&quot; data-start=&quot;698&quot;&gt;스크롤해도 절대 움직이지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;757&quot; data-start=&quot;720&quot; data-ke-size=&quot;size18&quot;&gt;✅ 부모? 그런 거 없고 화면 기준!&lt;/p&gt;
&lt;p data-end=&quot;796&quot; data-start=&quot;764&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;796&quot; data-start=&quot;764&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;796&quot; data-start=&quot;764&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;☑️ sticky는 스크롤하다가 &quot;도착하면 고정&quot;된다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;905&quot; data-start=&quot;798&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;833&quot; data-start=&quot;798&quot;&gt;sticky는 처음엔 static처럼 흐름을 따라 배치된다&lt;/li&gt;
&lt;li data-end=&quot;875&quot; data-start=&quot;834&quot;&gt;스크롤로 지정한 top 위치에 도달하면 &lt;b&gt;거기서 멈춰서 고정&lt;/b&gt;된다&lt;/li&gt;
&lt;li data-end=&quot;905&quot; data-start=&quot;876&quot;&gt;부모 요소 영역 안에서만 sticky가 작동한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;935&quot; data-start=&quot;907&quot; data-ke-size=&quot;size18&quot;&gt;✅ 스크롤&amp;rarr;도착&amp;rarr;고정!&lt;/p&gt;
&lt;p data-end=&quot;540&quot; data-start=&quot;512&quot; 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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;155&quot; data-start=&quot;75&quot; data-ke-size=&quot;size16&quot;&gt;CSS에서 position 속성은 단순히 요소를 어디에 둘까를 넘어 레이아웃 전체의 흐름과 구조를 결정하는 매우 중요한 개념입니다.&lt;/p&gt;
&lt;p data-end=&quot;324&quot; data-start=&quot;157&quot; data-ke-size=&quot;size16&quot;&gt;특히 static, relative, absolute, fixed, sticky 각각의 차이와 동작 방식을 제대로 이해하면 디자인을 세밀하게 컨트롤할 수 있습니다. position을 사용할 때는 기준과 흐름 유지 여부를 항상 의식하면서 설계하는 습관이 중요합니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>  Front-End</category>
      <category>Absolute</category>
      <category>css</category>
      <category>fixed</category>
      <category>html</category>
      <category>Position</category>
      <category>relative</category>
      <category>static</category>
      <category>Sticky</category>
      <category>상대위치</category>
      <category>절대위치</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/23</guid>
      <comments>https://sim-plism.tistory.com/23#entry23comment</comments>
      <pubDate>Sun, 6 Apr 2025 04:14:05 +0900</pubDate>
    </item>
    <item>
      <title>[ CSS] CSS display 속성 총정리</title>
      <link>https://sim-plism.tistory.com/22</link>
      <description>&lt;p data-end=&quot;313&quot; data-start=&quot;293&quot; data-ke-size=&quot;size16&quot;&gt;CSS는 기본 개념을 제대로 정리하지 않으면 flex나 grid 같은 레이아웃을 다룰 때 계속 헷갈리게 됩니다. 다르게 말하면 한 번만 제대로 정리하면 그 이후로는 어떤 레이아웃도 훨씬 쉽게 이해하고 다룰 수 있습니다. 이 글에서는 display 속성의 기본부터 flex와 grid 같은 레이아웃 방식까지 한 번에 깔끔하게 정리해보겠습니다.&lt;/p&gt;
&lt;p data-end=&quot;313&quot; data-start=&quot;293&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;313&quot; data-start=&quot;293&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ display란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;`display`&lt;/b&gt; 속성은 HTML 요소가 페이지에서 어떻게 보일지를 결정하는 CSS 속성입니다. 즉 이 요소를 박스처럼 보이게 할지, 줄 안에 끼워 넣을지 등을 설정하는 것이죠. HTML 태그마다 기본적으로 지정된 display 값이 있지만 우리는 CSS display 속성을 이용하여 기본 동작을 마음대로 바꿀 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;387&quot; data-start=&quot;368&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣&lt;b&gt; 주요(기존) display 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. block&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 한 줄 전체를 차지하는 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 항상 새 줄에서 시작하며 `width`, `height` 를 지정할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 레이아웃을 구성할 때 주로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 대표 태그: &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;lt;div&amp;gt;, &amp;lt;p&amp;gt;, &amp;lt;h1&amp;gt; ~ &amp;lt;h6&amp;gt;, &amp;lt;section&amp;gt;, &amp;lt;article&amp;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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. inline&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 내용만큼만 공간을 차지하는 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 줄 안에 다른 요소들과 함께 배치&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- `width`, `height` 값을 적용할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 텍스트처럼 흐름에 따라 배치&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 대표 태그: &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;lt;span&amp;gt;, &amp;lt;a&amp;gt;, &amp;lt;strong&amp;gt;, &amp;lt;em&amp;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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. inline-block&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- `inline` 처럼 줄 안에 배치되지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- `block`처럼 `width`, `height`를 지정할 수 있는 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 줄 안에 있으면서 크기를 조정할 수 있어 버튼, 작은 카드 요소에 주로 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. none&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 요소를 화면에서 숨김&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 렌더링 자체를 하지 않아 화면에도 안 보이고 &lt;u&gt;&lt;b&gt;공간도 차지하지 않음&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;(※ `inline-block`과 `none`은 기본 태그가 없고, CSS로 설정하여 사용하는 display 속성입니다. )&lt;/i&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  display 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743822299181&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;display 종류 비교&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .block {
      display: block;
      background-color: lightblue;
      margin: 10px 0;
    }
    .inline {
      display: inline;
      background-color: lightgreen;
      margin: 10px;
    }
    .inline-block {
      display: inline-block;
      background-color: lightpink;
      width: 150px;
      height: 50px;
      margin: 10px;
    }
    .none {
      display: none;
      background-color: gray;
      margin: 10px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h2&amp;gt;block&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;block&quot;&amp;gt;block 요소&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;block&quot;&amp;gt;block 요소&amp;lt;/div&amp;gt;

&amp;lt;h2&amp;gt;inline&amp;lt;/h2&amp;gt;
&amp;lt;span class=&quot;inline&quot;&amp;gt;inline 요소&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;inline&quot;&amp;gt;inline 요소&amp;lt;/span&amp;gt;

&amp;lt;h2&amp;gt;inline-block&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;inline-block&quot;&amp;gt;inline-block 요소&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;inline-block&quot;&amp;gt;inline-block 요소&amp;lt;/div&amp;gt;

&amp;lt;h2&amp;gt;none&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;none&quot;&amp;gt;숨겨진 요소(보이지 않음)&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYjw2O/btsNaN6ul02/6Ch3ckBrDalOm4aERPyvZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYjw2O/btsNaN6ul02/6Ch3ckBrDalOm4aERPyvZ1/img.png&quot; data-alt=&quot;display 구현 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYjw2O/btsNaN6ul02/6Ch3ckBrDalOm4aERPyvZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYjw2O%2FbtsNaN6ul02%2F6Ch3ckBrDalOm4aERPyvZ1%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;803&quot; height=&quot;658&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;display 구현 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;  inline-block 사이에 초록색이 보이는 이유&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-end=&quot;445&quot; data-start=&quot;428&quot; data-ke-size=&quot;size16&quot;&gt;inline-block 요소는 글자처럼 취급되기 때문에 코드에 있는 띄어쓰기(공백)가 실제로 빈 텍스트로 렌더링됩니다. 현재 inline 요소에 적용된 background-color: lightgreen 스타일이 이 공백에도 적용되어 초록색으로 보이는 것입니다. 즉, 공백 자체에 스타일이 칠해진 결과입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;445&quot; data-start=&quot;428&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ 신버전 display&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;( ※ '신버전 display'는 공식 용어는 아니며, flex/grid를 구분하기 위해 사용한 표현입니다)&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;size18&quot;&gt;`display: flex`와 `display: grid`는 기존의 `block`, `inline`과 다르게 &lt;b&gt;레이아웃 자체를 제어할 수 있는&lt;/b&gt; display 방식입니다. 둘 다 &lt;b&gt;부모 요소에 적용&lt;/b&gt;해서 자식 요소들의 배치를 쉽게 조정할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. flex&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 부모 요소를 &lt;b&gt;flex container&lt;/b&gt;로 만들어줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 자식 요소들은 자동으로 &lt;b&gt;flex item&lt;/b&gt;이 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 수평/수직 정렬, 공간 나누기, 간격 조정 등이 매우 쉬워짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;✅ 주요 속성&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;606&quot; data-start=&quot;336&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;606&quot; data-start=&quot;360&quot;&gt;
&lt;tr data-end=&quot;405&quot; data-start=&quot;360&quot;&gt;
&lt;td&gt;flex-direction&lt;/td&gt;
&lt;td&gt;주축 방향 설정 (row, column 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;458&quot; data-start=&quot;406&quot;&gt;
&lt;td&gt;justify-content&lt;/td&gt;
&lt;td&gt;주축 정렬 (flex-direction 방향으로 정렬)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;499&quot; data-start=&quot;459&quot;&gt;
&lt;td&gt;align-items&lt;/td&gt;
&lt;td&gt;교차축 정렬 (주축이 가로면 세로 정렬)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;519&quot; data-start=&quot;500&quot;&gt;
&lt;td&gt;gap&lt;/td&gt;
&lt;td&gt;아이템 간격 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;547&quot; data-start=&quot;520&quot;&gt;
&lt;td&gt;flex-grow&lt;/td&gt;
&lt;td&gt;남은 공간 분배 비율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;580&quot; data-start=&quot;548&quot;&gt;
&lt;td&gt;flex-shrink&lt;/td&gt;
&lt;td&gt;공간 줄어들 때 비율 조정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;606&quot; data-start=&quot;581&quot;&gt;
&lt;td&gt;flex-basis&lt;/td&gt;
&lt;td&gt;기본 크기 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 flex 주요 속성 예제를 살펴보겠습니다. 아래 예제에서는 부모 요소인 flex-container에 &lt;b&gt;j&lt;u&gt;ustify-content, align-items, gap, flex-grow, flex-shrink, flex-basis&lt;/u&gt;&lt;/b&gt; 같은 다양한 속성들을 적용하여 3개의 flex-item이 어떻게 배치되고 변하는지를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;b&gt; flex 주요 속성 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743831848591&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;flex 주요 속성 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .flex-container {
      display: flex;
      background-color: #eee;
      height: 100px;
      margin-bottom: 20px;
    }
    .flex-item {
      background-color: lightblue;
      margin: 5px;
      width: 50px;
      height: 50px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: bold;
      font-size: 18px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h2&amp;gt;1. 기본 flex-container&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;flex-container&quot;&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;3&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h2&amp;gt;2. justify-content: center&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;flex-container&quot; style=&quot;justify-content: center;&quot;&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;3&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h2&amp;gt;3. align-items: center&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;flex-container&quot; style=&quot;align-items: center;&quot;&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;height: 90px;&quot;&amp;gt;1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;height: 30px;&quot;&amp;gt;3&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h2&amp;gt;4. gap: 20px&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;flex-container&quot; style=&quot;gap: 20px;&quot;&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot;&amp;gt;3&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h2&amp;gt;5. flex-grow 적용&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;flex-container&quot;&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-grow: 1;&quot;&amp;gt;1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-grow: 2;&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-grow: 1;&quot;&amp;gt;3&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h2&amp;gt;6. flex-shrink 적용&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;flex-container&quot; style=&quot;width: 300px;&quot;&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-shrink: 1; width: 200px;&quot;&amp;gt;1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-shrink: 2; width: 200px;&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-shrink: 1; width: 200px;&quot;&amp;gt;3&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h2&amp;gt;7. flex-basis 적용&amp;lt;/h2&amp;gt;
&amp;lt;div class=&quot;flex-container&quot;&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-basis: 150px;&quot;&amp;gt;1&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-basis: 100px;&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;flex-item&quot; style=&quot;flex-basis: 200px;&quot;&amp;gt;3&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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/I207n/btsNamuQZrf/WevuwKUDE6nofVIGNXyZGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I207n/btsNamuQZrf/WevuwKUDE6nofVIGNXyZGK/img.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;701&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.1856%; margin-right: 10px;&quot; data-widthpercent=&quot;56.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I207n/btsNamuQZrf/WevuwKUDE6nofVIGNXyZGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI207n%2FbtsNamuQZrf%2FWevuwKUDE6nofVIGNXyZGK%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;849&quot; height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDroq6/btsM9wSRrmP/kJpFCwGu9W83zKz6UkkOy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDroq6/btsM9wSRrmP/kJpFCwGu9W83zKz6UkkOy0/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;918&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.6516%;&quot; data-widthpercent=&quot;43.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDroq6/btsM9wSRrmP/kJpFCwGu9W83zKz6UkkOy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDroq6%2FbtsM9wSRrmP%2FkJpFCwGu9W83zKz6UkkOy0%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;844&quot; height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;flex 주요 속성 구현 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. grid&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 부모 요소를 &lt;b&gt;grid container&lt;/b&gt;로 만들어줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 자식 요소들을 행과 열로 나누어 배치할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 복잡한 2차원 레이아웃을 만들 때 특히 강력함&lt;/p&gt;
&lt;p 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;size18&quot;&gt;&lt;b&gt;✅ 주요 속성&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;608&quot; data-start=&quot;397&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;608&quot; data-start=&quot;421&quot;&gt;
&lt;tr data-end=&quot;456&quot; data-start=&quot;421&quot;&gt;
&lt;td style=&quot;width: 31.7441%;&quot;&gt;grid-template-columns&lt;/td&gt;
&lt;td style=&quot;width: 68.1396%;&quot;&gt;열 너비 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;489&quot; data-start=&quot;457&quot;&gt;
&lt;td style=&quot;width: 31.7441%;&quot;&gt;grid-template-rows&lt;/td&gt;
&lt;td style=&quot;width: 68.1396%;&quot;&gt;행 높이 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;509&quot; data-start=&quot;490&quot;&gt;
&lt;td style=&quot;width: 31.7441%;&quot;&gt;gap&lt;/td&gt;
&lt;td style=&quot;width: 68.1396%;&quot;&gt;아이템 간격 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;545&quot; data-start=&quot;510&quot;&gt;
&lt;td style=&quot;width: 31.7441%;&quot;&gt;grid-column&lt;/td&gt;
&lt;td style=&quot;width: 68.1396%;&quot;&gt;아이템이 차지하는 열 영역 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;578&quot; data-start=&quot;546&quot;&gt;
&lt;td style=&quot;width: 31.7441%;&quot;&gt;grid-row&lt;/td&gt;
&lt;td style=&quot;width: 68.1396%;&quot;&gt;아이템이 차지하는 행 영역 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;608&quot; data-start=&quot;579&quot;&gt;
&lt;td style=&quot;width: 31.7441%;&quot;&gt;grid-area&lt;/td&gt;
&lt;td style=&quot;width: 68.1396%;&quot;&gt;영역 이름으로 배치 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 grid 주요 속성 예제를 살펴보겠습니다. 아래 예제에서는 부모 요소인 grid-container에 &lt;u&gt;&lt;b&gt;grid-template-columns, grid-template-rows, gap, grid-column, grid-row, grid-area&lt;/b&gt;&lt;/u&gt; 같은 다양한 속성들을 적용하여 요소들이 어떻게 배치되고 변하는지를 확인할 수 있습니다. grid는 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;칸(cell)이 아니라 선(line) 기준으로 영역을 설정&lt;/span&gt;&lt;/b&gt;한다는 점에 주의해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  grid 주요 속성 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743835609363&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;grid 주요 속성 예제&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    .grid-container {
      display: grid;
      background-color: #eee;
      height: 260px;
      margin-bottom: 20px;
      grid-template-columns: 1fr 2fr 1fr;
      grid-template-rows: 100px 100px;
      gap: 10px;
      grid-template-areas:
        &quot;header header header&quot;
        &quot;sidebar main main&quot;;
    }
    .grid-item {
      background-color: lightcoral;
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: bold;
      font-size: 14px;
    }
    .header {
      grid-area: header;
      background-color: lightseagreen;
    }
    .sidebar {
      grid-area: sidebar;
      background-color: lightpink;
    }
    .main {
      grid-area: main;
      background-color: lightyellow;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h3&amp;gt;1. 기본 grid-container&amp;lt;/h3&amp;gt;
&amp;lt;div class=&quot;grid-container&quot;&amp;gt;
  &amp;lt;div class=&quot;grid-item header&quot;&amp;gt;Header&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item sidebar&quot;&amp;gt;Sidebar&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item main&quot;&amp;gt;Main&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;h3&amp;gt;2. grid-column, grid-row 직접 지정&amp;lt;/h3&amp;gt;
&amp;lt;div class=&quot;grid-container&quot;&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot; style=&quot;grid-column: 1 / 3;&quot;&amp;gt;1 (가로로 2칸 차지)&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot;&amp;gt;2&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot; style=&quot;grid-row: 2 / 3;&quot;&amp;gt;3 (두 번째 줄)&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot;&amp;gt;4&amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;grid-item&quot;&amp;gt;5&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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/QQvAo/btsNa6Ly4Fe/FK4Svd6JXpS7K0NqVGLRq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QQvAo/btsNa6Ly4Fe/FK4Svd6JXpS7K0NqVGLRq0/img.png&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;674&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4122%; margin-right: 10px;&quot; data-widthpercent=&quot;49.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QQvAo/btsNa6Ly4Fe/FK4Svd6JXpS7K0NqVGLRq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQQvAo%2FbtsNa6Ly4Fe%2FFK4Svd6JXpS7K0NqVGLRq0%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;873&quot; height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZtabN/btsNbgNZbVp/MJBqBfVBAUeGa8hy2u2Xo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZtabN/btsNbgNZbVp/MJBqBfVBAUeGa8hy2u2Xo1/img.png&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;680&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.425%;&quot; data-widthpercent=&quot;50.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZtabN/btsNbgNZbVp/MJBqBfVBAUeGa8hy2u2Xo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZtabN%2FbtsNbgNZbVp%2FMJBqBfVBAUeGa8hy2u2Xo1%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;881&quot; height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;grid 주요 속성 구현 화면&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;size18&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;  grid-area와 grid-template-areas의 연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`grid-template-areas`는 부모 요소(`grid-container`) 안의 레이아웃을 &amp;lt;&lt;b&gt;이름&amp;gt;&lt;/b&gt;&amp;nbsp;으로 설계하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. HTML 요소에 클래스 이름 지정: &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 구분을 쉽게 하기 위해 이름을 붙임 (※반드시 필요한 것은 아니나 보통 깔끔하게 맞춰줌)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ex) &amp;lt;div class=&quot;header&quot;&amp;gt;Header&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. CSS에서 `grid-area` 속성 지정:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- `grid-area`의 값은 어떤 영역의 이름에 연결될지를 지정하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ex) .header { grid-area: header; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 부모(grid-container)에서 `grid-template-areas` 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 자식 요소들의 `grid-area` 값이 일치해야 제대로 매칭됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ex) grid-template-areas: &quot;header header header&quot; &quot;sidebar main main&quot;;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;505&quot; data-start=&quot;489&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;505&quot; data-start=&quot;489&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ 자주 틀리는 포인트 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☑️ block vs inline vs inline-block &lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.93%;&quot; border=&quot;1&quot; data-end=&quot;503&quot; data-start=&quot;222&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.8239%;&quot;&gt;&lt;b&gt; 항목 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.303%;&quot;&gt;&lt;b&gt; block &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.9817%;&quot;&gt;&lt;b&gt; inline &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.7053%;&quot;&gt;&lt;b&gt; inline-block &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;374&quot; data-start=&quot;283&quot;&gt;
&lt;td style=&quot;width: 12.8239%;&quot;&gt;기본 배치&lt;/td&gt;
&lt;td style=&quot;width: 27.303%;&quot;&gt;새 줄에서 시작, 한 줄 전체 차지&lt;/td&gt;
&lt;td style=&quot;width: 29.9817%;&quot;&gt;줄 안에 다른 요소와 함께 흐름 유지&lt;/td&gt;
&lt;td style=&quot;width: 30.7053%;&quot;&gt;줄 안에 배치되지만 크기 지정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;411&quot; data-start=&quot;375&quot;&gt;
&lt;td style=&quot;width: 12.8239%;&quot;&gt;width, height&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 27.303%;&quot;&gt;가능&lt;/td&gt;
&lt;td style=&quot;width: 29.9817%;&quot;&gt;불가능&lt;/td&gt;
&lt;td style=&quot;width: 30.7053%;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;503&quot; data-start=&quot;412&quot;&gt;
&lt;td style=&quot;width: 12.8239%;&quot;&gt;대표 예시&lt;/td&gt;
&lt;td style=&quot;width: 27.303%;&quot;&gt;&amp;lt;div&amp;gt;, &amp;lt;p&amp;gt;, &amp;lt;section&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.9817%;&quot;&gt;&amp;lt;span&amp;gt;, &amp;lt;a&amp;gt;, &amp;lt;strong&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.7053%;&quot;&gt;(기본 태그 없음, CSS로 설정)&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☑️ flex vs grid &lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-end=&quot;843&quot; data-start=&quot;630&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 20.2325%; height: 21px;&quot;&gt;&lt;b&gt; 항목 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 32.6745%; height: 21px;&quot;&gt;&lt;b&gt; flex &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.093%; height: 21px;&quot;&gt;&lt;b&gt; grid &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;710&quot; data-start=&quot;668&quot;&gt;
&lt;td style=&quot;width: 20.2325%; height: 21px;&quot;&gt;주 사용 방향&lt;/td&gt;
&lt;td style=&quot;width: 32.6745%; height: 21px;&quot;&gt;한 방향(가로 또는 세로)&lt;/td&gt;
&lt;td style=&quot;width: 47.093%; height: 21px;&quot;&gt;가로 + 세로 동시에&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;742&quot; data-start=&quot;711&quot;&gt;
&lt;td style=&quot;width: 20.2325%; height: 21px;&quot;&gt;정렬 방식&lt;/td&gt;
&lt;td style=&quot;width: 32.6745%; height: 21px;&quot;&gt;주축 방향 정렬&lt;/td&gt;
&lt;td style=&quot;width: 47.093%; height: 21px;&quot;&gt;격자 기반 배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;783&quot; data-start=&quot;743&quot;&gt;
&lt;td style=&quot;width: 20.2325%; height: 21px;&quot;&gt;쓰임새&lt;/td&gt;
&lt;td style=&quot;width: 32.6745%; height: 21px;&quot;&gt;메뉴바, 버튼 묶음&lt;/td&gt;
&lt;td style=&quot;width: 47.093%; height: 21px;&quot;&gt;전체 페이지 레이아웃, 대시보드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;843&quot; data-start=&quot;784&quot;&gt;
&lt;td style=&quot;width: 20.2325%; height: 21px;&quot;&gt;영역 지정&lt;/td&gt;
&lt;td style=&quot;width: 32.6745%; height: 21px;&quot;&gt;흐름(flow) 따라&lt;/td&gt;
&lt;td style=&quot;width: 47.093%; height: 21px;&quot;&gt;명시적으로 (grid-template-areas) 지정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(※ &lt;b&gt;flex&lt;/b&gt;는 &quot;흐름&quot; 기반이라 주축/교차축을,&amp;nbsp; &lt;b&gt;grid&lt;/b&gt;는 &quot;격자&quot; 기반이라 열/행, 선(line)을 신경 써야 한다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☑️ flex-grow, flex-shrink 오해 &lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1129&quot; data-start=&quot;983&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;&lt;b&gt; 항목 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.2325%;&quot;&gt;&lt;b&gt; 설명 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1064&quot; data-start=&quot;1007&quot;&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;flex-grow&lt;/td&gt;
&lt;td style=&quot;width: 75.2325%;&quot;&gt;남은 공간을 비율대로 나눈다 (flex-grow:2를 준다고 해서 요소 크기가 2배가 되는 게 아님)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1129&quot; data-start=&quot;1065&quot;&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;flex-shrink&lt;/td&gt;
&lt;td style=&quot;width: 75.2325%;&quot;&gt;공간이 부족할 때 줄어드는 비율을 설정한다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-end=&quot;615&quot; data-start=&quot;597&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☑️ grid-column, grid-row는 칸이 아니라 선 기준!&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1389&quot; data-start=&quot;1265&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt; 항목 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;&lt;b&gt; 설명 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1341&quot; data-start=&quot;1289&quot;&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;grid-column: 1 / 3&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;1번 선부터 3번 선까지 차지 &amp;rarr; 가로 2칸 차지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1389&quot; data-start=&quot;1342&quot;&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;grid-row: 2 / 3&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;2번 선부터 3번 선까지 차지 &amp;rarr; 두 번째 줄&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;266&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;flex는 한 방향(수평/수직) 정렬&lt;/b&gt;에 강하고, &lt;b&gt;grid는 가로와 세로를 동시에 제어&lt;/b&gt;하는 데 최적화되어 있기 때문에, &lt;b&gt;어떤 레이아웃을 만들고 싶은지&lt;/b&gt;에 따라 적절히 선택하는 것이 중요합니다. 이번 글에서는 display 기본 개념부터 시작해서 flex, grid의 주요 속성과 실전 사용 방법까지 한 번에 정리했습니다. 핵심은 어렵게 외우려고 하지 말고, &lt;b&gt;흐름(flow)을 제어하는 건 flex, 격자(layout)를 설계하는 건 grid&lt;/b&gt;라고 감각을 잡는 것입니다. 한 번 제대로 개념을 정리해두면, 그 이후로는 어떤 레이아웃도 훨씬 쉽게 이해하고 구현할 수 있을 것입니다.&lt;/p&gt;</description>
      <category>  Front-End</category>
      <category>Block</category>
      <category>css</category>
      <category>display</category>
      <category>flex</category>
      <category>Grid</category>
      <category>grid-column</category>
      <category>html</category>
      <category>inline</category>
      <category>inline-block</category>
      <category>justify-content</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/22</guid>
      <comments>https://sim-plism.tistory.com/22#entry22comment</comments>
      <pubDate>Sun, 6 Apr 2025 02:13:51 +0900</pubDate>
    </item>
    <item>
      <title>[ Spring] 10분 안에 끝내는 스프링 vs 스프링 부트 핵심 비교</title>
      <link>https://sim-plism.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;`Spring`과 `Spring Boot`는 둘 다 `Java` 기반의 웹 애플리케이션 개발에 사용되는 프레임워크입니다. 이름도 비슷하고 기능도 유사해서 많은 개발자들이 어떤 것을 선택해야 할지 고민하곤 합니다. 이 글에서는 여러분이 이해하기 쉽도록 두 프레임워크을 비교 분석해 보겠습니다.&lt;/p&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ 스프링(Spring)이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Java는 오랫동안 사랑받아온 대표적인 프로그래밍 언어이지만 개발된 지 오래되어 몇 가지 불편한 점도 있습니다. 예를 들어, 다른 언어에 비해 속도가 느리고, 객체를 생성하고 주입하거나, 웹 요청을 처리하는 컨트롤러, 트랜잭션, 예외 처리, DAO 연결 등 모든 기능을 개발자가 일일이 구현해야 한다는 점이 있죠. 이런 작업을 매번 반복하다 보면, 코드는 점점 복잡해지고 재사용도 어려워집니다. 이 문제를 해결하기 위해 등장한 것이 바로 &lt;span style=&quot;background-color: #f6e199;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ 스프링이 제공하는 대표적인 기능&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&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: 35.5814%; height: 20px;&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DI (의존성 주입)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.4186%; height: 20px;&quot;&gt;객체 생성과 주입을 스프링 컨테이너가 자동으로 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.5814%; height: 20px;&quot;&gt;&lt;b&gt; AOP (관점 지향 프로그래밍) &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.4186%; height: 20px;&quot;&gt;공통 로직(로그, 보안 등)을 깔끔하게 분리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.5814%; height: 20px;&quot;&gt;&lt;b&gt; MVC 아키텍처 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.4186%; height: 20px;&quot;&gt;컨트롤러,&amp;nbsp;서비스,&amp;nbsp;DAO&amp;nbsp;계층&amp;nbsp;구조로&amp;nbsp;역할을&amp;nbsp;분리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.5814%; height: 20px;&quot;&gt;&lt;b&gt; 트랜잭션 처리 / 예외 처리 / 유효성 검증&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.4186%; height: 20px;&quot;&gt;실무에&amp;nbsp;필요한&amp;nbsp;핵심&amp;nbsp;기능&amp;nbsp;제공&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만, 스프링에도 한 가지 큰 단점이 있었습니다.&amp;nbsp;&amp;nbsp;바로 &lt;u&gt;&lt;b&gt;초기 설정이 너무 복잡했다는 것&lt;/b&gt;&lt;/u&gt;이죠. 예를 들어, XML로 의존성을 연결하고, 서블릿을 설정하고, 톰캣 서버를 붙이고, 필요한 라이브러리들을 수동으로 하나하나 추가해야 했습니다. 복잡한 초기 설정은 스프링을 처음 접하는 입문자에게 진입장벽으로 느껴질 수 있는 요소였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ 스프링 부트(Spring Boot)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스프링의 초기 설정이 복잡하다는 단점을 해결하기 위해 등장한 것이 바로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;스프링 부트&lt;/b&gt;&lt;/span&gt;입니다. 스프링 부트는 복잡한 설정 없이도 스프링 애플리케이션을 빠르게 시작할 수 있도록 도와주는 프레임워크입니다. 스프링 부트를 사용하면 이전에 스프링에서 수동으로 추가해야 했던 많은 설정들이 대부분 자동으로 구성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ 스프링 부트의 주요 기능&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 68px;&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: 28.7209%; height: 20px;&quot;&gt;&lt;b&gt; 자동 설정(Auto Configuration) &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%; height: 20px;&quot;&gt;필요한 라이브러리를 추가하면 그에 맞는 설정을 자동으로 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 28.7209%; height: 20px;&quot;&gt;&lt;b&gt; 내장 톰캣 제공 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%; height: 20px;&quot;&gt;따로 톰캣을 설치하거나 설정하지 않아도 바로 실행 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 28.7209%; height: 20px;&quot;&gt;&lt;b&gt; 간편한 프로젝트 생성 도구 지원 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%; height: 20px;&quot;&gt;&lt;a href=&quot;https://start.spring.io&quot; data-end=&quot;569&quot; data-start=&quot;525&quot;&gt;start.spring.io&lt;/a&gt; 를 통해 필요한 기능을 선택해서 바로 프로젝트 생성 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 28.7209%; height: 20px;&quot;&gt;&lt;b&gt; 간결한 의존성 관리 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%; height: 20px;&quot;&gt;spring-boot-starter-web, spring-boot-starter-security 등 스타터 의존성으로 기능 추가가 쉬움&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;p data-ke-size=&quot;size18&quot;&gt;즉, 스프링 부트는 스프링의 복잡한 진입장벽을 낮추고 실제 개발에 집중할 수 있도록 만들어주는 도구입니다. 최신 프로젝트나 학습 자료는 기본적으로 스프링 부트를 기반으로 진행되고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ 스프링 vs 스프링 부트&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 180px;&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: 20.6588%; height: 20px;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.0775%; height: 20px;&quot;&gt;&lt;b&gt;Spring (순수 스프링)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.2636%; height: 20px;&quot;&gt;&lt;b&gt;Spring Boot (스프링 부트)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6588%; height: 20px;&quot;&gt;&lt;b&gt;설정 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.0775%; height: 20px;&quot;&gt;수동 설정 (XML, JavaConfig)&lt;/td&gt;
&lt;td style=&quot;width: 39.2636%; height: 20px;&quot;&gt;자동 설정 (어노테이션 기반)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6588%; height: 20px;&quot;&gt;&lt;b&gt;서버 구동&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.0775%; height: 20px;&quot;&gt;외부 WAS (톰캣 등) 필요&lt;/td&gt;
&lt;td style=&quot;width: 39.2636%; height: 20px;&quot;&gt;내장 톰캣 제공, 바로 실행 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6588%; height: 20px;&quot;&gt;&lt;b&gt;의존성 관리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.0775%; height: 20px;&quot;&gt;직접 버전 지정 및 설정&lt;/td&gt;
&lt;td style=&quot;width: 39.2636%; height: 20px;&quot;&gt;Starter로 간편하게 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6588%; height: 20px;&quot;&gt;&lt;b&gt;프로젝트 생성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.0775%; height: 20px;&quot;&gt;구조 수동 구성&lt;/td&gt;
&lt;td style=&quot;width: 39.2636%; height: 20px;&quot;&gt;`start.spring.io` 등으로 쉽게 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6588%; height: 20px;&quot;&gt;&lt;b&gt;러닝 커브&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.0775%; height: 20px;&quot;&gt;높음 (설정부터 직접 이해해야 함)&lt;/td&gt;
&lt;td style=&quot;width: 39.2636%; height: 20px;&quot;&gt;낮음 (바로 개발에 집중 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 20.6588%; height: 40px;&quot;&gt;&lt;b&gt;사용처&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.0775%; height: 40px;&quot;&gt;전자정부프레임워크, 공공SI, 레거시 시스템&lt;/td&gt;
&lt;td style=&quot;width: 39.2636%; height: 40px;&quot;&gt;스타트업, 신기술 프로젝트, 대부분 실무 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6588%; height: 20px;&quot;&gt;&lt;b&gt;개발 속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.0775%; height: 20px;&quot;&gt;느림 (초기 설정 많음)&lt;/td&gt;
&lt;td style=&quot;width: 39.2636%; height: 20px;&quot;&gt;빠름 (설정 자동화)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣ &lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Spring과 Spring Boot는 같은 기반 위에서 만들어졌지만, 사용하는 목적과 방식에는 분명한 차이가 있습니다. 순수 스프링은 설정과 구성이 자유롭고 유연하다는 장점이 있지만,&amp;nbsp; 초기 설정이 복잡하고 진입장벽이 높은 편입니다.&amp;nbsp;&amp;nbsp;반면 스프링 부트는 복잡한 설정 없이 빠르게 개발을 시작할 수 있어 실무나 개인 프로젝트, 학습용으로 적합한 선택지입니다. 처음 스프링을 배우는 입문자라면 스프링 부트로 시작한 뒤 차근차근 순수 스프링의 구성 방식도 함께 익혀보는 것을 추천합니다!  &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>☕ Java/  Spring</category>
      <category>java</category>
      <category>Spring</category>
      <category>spring boot</category>
      <category>스프링</category>
      <category>스프링부트</category>
      <category>스프링프레임워크</category>
      <category>자바</category>
      <category>프레임워크</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/21</guid>
      <comments>https://sim-plism.tistory.com/21#entry21comment</comments>
      <pubDate>Mon, 24 Mar 2025 18:58:08 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS] EC2 서버 구축 &amp;amp; 초기 보안 설정 (SSH, 보안 그룹) 완벽 가이드</title>
      <link>https://sim-plism.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에서 애플리케이션을 실행하려면 &lt;span&gt;EC2 인스턴스(가상 서버)&lt;/span&gt;를 생성해야 합니다.&amp;nbsp; 글에서는 &lt;span&gt;AWS EC2 서버를 처음부터 설정하고, 보안 그룹(방화벽)까지 설정하는 방법&lt;/span&gt;을 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&lt;b&gt;1. IAM 사용자 생성&lt;/b&gt;&lt;/h1&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;(*AWS 계정이 없다면 [AWS 공식 사이트] &lt;/span&gt;&lt;b&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://aws.amazon.com/&quot;&gt;`https://aws.amazon.com/` &lt;/a&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;에서 회원가입 후 진행하세요.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;AWS EC2 인스턴스를 생성하기 전에, 보안 강화를 위해 &lt;u&gt;&lt;b&gt;IAM 사용자 계정을 먼저 생성&lt;/b&gt;&lt;/u&gt;해야 합니다. 루트 계정은 모든 AWS 서비스에 대한 무제한 권한을 가지고 있기 때문에 직접 사용하지 않는 것이 보안상 안전합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;따라서 IAM 계정을 생성하여, 최소 권한 원칙 기반으로 EC2 작업을 수행하겠습니다.&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;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☑️ IAM&amp;nbsp; 사용자 계정 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;1️⃣ AWS 콘솔에 &lt;b&gt;루트 계정&lt;/b&gt;으로 로그인합니다.&lt;br /&gt;2️⃣ 상단 검색창에서 &lt;b&gt;`IAM`&lt;/b&gt;을 검색 후 이동합니다.&lt;br /&gt;3️⃣ 좌측 메뉴&lt;span style=&quot;color: #333333;&quot;&gt;에서 &quot;&lt;b&gt;사용자&lt;/b&gt;&quot; 를 클릭한 뒤 &lt;b&gt;사용자 생성&lt;/b&gt;을 눌러줍니다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 4️⃣ &lt;b&gt;사용자 세부 정보 단계&lt;/b&gt;에서 사용할 IAM 사용자 이름을 입력합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 박스는 IAM 사용자가 AWS 콘솔에 직접 로그인해야 하는 경우(웹 콘솔에서 EC2 관리, 배포 작업을 수행할 경우)에 체크합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- CLI 또는 API로만 접근할 경우 이 옵션을 체크하지 않아도 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2X1R5/btsMjEi3ncF/aLuk6y9i22j9K7h6VebNoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2X1R5/btsMjEi3ncF/aLuk6y9i22j9K7h6VebNoK/img.png&quot; data-alt=&quot;  IAM 사용자 생성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2X1R5/btsMjEi3ncF/aLuk6y9i22j9K7h6VebNoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2X1R5%2FbtsMjEi3ncF%2FaLuk6y9i22j9K7h6VebNoK%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;1327&quot; height=&quot;758&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;  IAM 사용자 생성 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;5️⃣ 다음을 눌러 &lt;b&gt;권한 설정 단계&lt;/b&gt;로 이동합니다. 직접 정책 연결을 선택하고 &lt;b&gt;AmazonEC2FullAccess&lt;/b&gt;를 검색해 권한을 연결해줍니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 기존 IAM 그룹을 사용하지 않고, 직접 정책을 연결하는 이유 &amp;rarr; 개별 사용자에게 직접 정책을 적용하면 관리가 불편해질 수 있지만, 특정 사용자에게 빠르게 권한을 부여할 때 유용합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- &lt;span&gt;EC2만 관리할 사용자라면 &lt;/span&gt;&lt;span&gt;AmazonEC2FullAccess&lt;/span&gt;&lt;span&gt;를 부여하면 되지만, 기업 환경에서는 최소 권한 원칙을 따르는 것이 좋습니다. 예를 들어, 특정 프로젝트만 접근해야 한다면 &lt;/span&gt;&lt;span&gt;&lt;b&gt;커스텀 정책을 생성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하여 특정 리소스에만 접근 권한을 부여할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AatjE/btsMkyPIkx2/tRT8KJ8cKBDgX5z546v2gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AatjE/btsMkyPIkx2/tRT8KJ8cKBDgX5z546v2gK/img.png&quot; data-alt=&quot;  권한 설정 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AatjE/btsMkyPIkx2/tRT8KJ8cKBDgX5z546v2gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAatjE%2FbtsMkyPIkx2%2FtRT8KJ8cKBDgX5z546v2gK%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;1356&quot; height=&quot;625&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;  권한 설정 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;6️⃣ 다음을 누르고 &lt;b&gt;3단계 검토 및 생성 단계&lt;/b&gt;에서 적절한 권한이 선택된 것을 확인했다면 사용자를 생성합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 생성이 완료되면 &lt;b&gt;IAM 사용자 로그인 정보(암호 파일 .csv)를 다운로드&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 보안이 중요한 정보이므로 &lt;b&gt;클라우드나 공용 PC에 저장하지 말고, 안전한 장소에 보관&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 이후 &lt;b&gt;IAM 사용자로 로그인 후 반드시 암호를 변경&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;387&quot; data-start=&quot;359&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. &lt;/b&gt;&lt;b&gt;EC2 인스턴스 생성&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☑️ IAM 으로 로그인 후 EC2 인스턴스 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1️⃣ &lt;/b&gt;AWS 콘솔 상단 검색창에서 &lt;b&gt;`EC2`&lt;/b&gt;를 검색 후 이동합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drNKFB/btsMj8KFCmW/X4dZfdCHtCKeT47KvwuJa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drNKFB/btsMj8KFCmW/X4dZfdCHtCKeT47KvwuJa1/img.png&quot; data-alt=&quot;  EC2 대시보드 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drNKFB/btsMj8KFCmW/X4dZfdCHtCKeT47KvwuJa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrNKFB%2FbtsMj8KFCmW%2FX4dZfdCHtCKeT47KvwuJa1%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;1356&quot; height=&quot;639&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;  EC2 대시보드 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2️⃣&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;인스턴스 시작&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUFLLh/btsMkdkQWfC/EUtP05jyEVgcpVous3Z15k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUFLLh/btsMkdkQWfC/EUtP05jyEVgcpVous3Z15k/img.png&quot; data-alt=&quot;  인스턴스 시작 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUFLLh/btsMkdkQWfC/EUtP05jyEVgcpVous3Z15k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUFLLh%2FbtsMkdkQWfC%2FEUtP05jyEVgcpVous3Z15k%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;1254&quot; height=&quot;398&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;  인스턴스 시작 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;3️⃣ 이름을 입력한 후 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;운영체제(AMI)&lt;/b&gt;를 선택합니다. &lt;/span&gt;&lt;b&gt;`AMI(Amazon Machine Image)`&lt;/b&gt;는 &lt;u&gt;EC2 인스턴스가 사용할 운영체제(OS) 이미지&lt;/u&gt;를 의미합니다. EC2 인스턴스는 &lt;b&gt;`&lt;span&gt;AMI`&lt;/span&gt;&lt;/b&gt;를 기반으로 운영됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 기본적으로 Amazon Linux가 선택되어 있지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Ubuntu 22.04 LTS&lt;/b&gt;를 선택합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- &lt;b&gt;프리 티어 사용 가능&lt;/b&gt;이 표시된 옵션을 선택하면 추가 비용 없이 사용할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsB7bg/btsMgQW172l/KpMUn06L3XaIHP7jY53viK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsB7bg/btsMgQW172l/KpMUn06L3XaIHP7jY53viK/img.png&quot; data-alt=&quot;  운영체제 선택 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsB7bg/btsMgQW172l/KpMUn06L3XaIHP7jY53viK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsB7bg%2FbtsMgQW172l%2FKpMUn06L3XaIHP7jY53viK%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;1206&quot; height=&quot;714&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;  운영체제 선택 화면&lt;/figcaption&gt;
&lt;/figure&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;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;size18&quot;&gt;4️⃣ 다음으로 &lt;b&gt;인스턴스 유형&lt;/b&gt;을 선택합니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 처음 사용하는 경우 프리티어(free-tier) &lt;b&gt;t2.micro&lt;/b&gt;를 선택합니다. t2.micro는 AWS 프리 티어에서 제공하는 최소 사양의 인스턴스입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 인스턴스 유형에 따라 CPU, 메모리(RAM), 네트워크 속도 등이 결정됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JJRYL/btsMjT1iwzn/kWxRqN0nQKkts6CsSODmWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JJRYL/btsMjT1iwzn/kWxRqN0nQKkts6CsSODmWK/img.png&quot; data-alt=&quot;  인스턴스 유형 선택 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JJRYL/btsMjT1iwzn/kWxRqN0nQKkts6CsSODmWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJJRYL%2FbtsMjT1iwzn%2FkWxRqN0nQKkts6CsSODmWK%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;1077&quot; height=&quot;196&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;  인스턴스 유형 선택 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;5️⃣ 이제 &lt;b&gt;키 페어(SSH 접속)&lt;/b&gt;를 설정합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- AWS에서 생성된 EC2 서버에 SSH로 접속하려면 &lt;b&gt;키 페어(Key Pair)&lt;/b&gt;를 설정해야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 기존 키 페어가 없다면 새 키 페어를 생성하고 다운로드해야 합니다. 저는 새 키 페어를 생성해보겠습니다. 키 페어 이름을 입력하고 RSA, .pem를 선택하고 키 페어 생성 버튼을 누른 후 다운로드합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;키 파일(.pem)&lt;/b&gt;은 안전한 곳에 보관해야 하며, 한 번만 다운로드할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ErYsq/btsMkKoYbmu/GPhV8rmKeBjyuDXKmhewRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ErYsq/btsMkKoYbmu/GPhV8rmKeBjyuDXKmhewRk/img.png&quot; data-alt=&quot;  키 페어 생성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ErYsq/btsMkKoYbmu/GPhV8rmKeBjyuDXKmhewRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FErYsq%2FbtsMkKoYbmu%2FGPhV8rmKeBjyuDXKmhewRk%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;594&quot; height=&quot;544&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;  키 페어 생성 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;   &amp;nbsp;SSH&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;1. SSH란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;Secure Shell(보안 셸)의 약자로, 네트워크를 통해 원격 서버에 안전하게 접속할 수 있도록 해주는 프로토콜. AWS EC2 인스턴스에 직접 접속하려면 SSH를 사용해서 서버에 로그인해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;2. SSH를 사용하는 이유&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;1. 보안 강화 &amp;rarr; 데이터를 암호화하여 안전하게 전송&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;2. 원격 접속 가능 &lt;span style=&quot;background-color: #fafafa; color: #000000; text-align: start;&quot;&gt;&amp;rarr; 로컬 PC에서 AWS 서버를 제어할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000; text-align: start;&quot;&gt;3. 명령어 실행 가능 &lt;span style=&quot;background-color: #fafafa; color: #000000; text-align: start;&quot;&gt;&amp;rarr; 서버에서 직접 명령어를 입력하여 환경을 설정할 수 있음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;486&quot; data-start=&quot;459&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;3. SSH를 사용한 EC2 접속 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;589&quot; data-start=&quot;487&quot; data-ke-size=&quot;size18&quot;&gt;AWS EC2 인스턴스에 SSH로 접속하려면 &lt;u&gt;SSH 키 페어 (.pem 파일)&lt;/u&gt;이 필요합니다. 인스턴스를 생성할 때 &lt;u&gt;키 페어 생성 단계에서 다운로드한 키 파일&lt;/u&gt;을 사용하여 접속합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;498&quot; data-start=&quot;388&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;498&quot; data-start=&quot;388&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6️⃣ &lt;/b&gt;다음으로 &lt;b&gt;보안 그룹&lt;/b&gt;을 설정합니다.&amp;nbsp; 다른 설정은 기본값으로 두고 &lt;b&gt;방화벽(보안 그룹)&lt;/b&gt;과 &lt;b&gt;인바운드 보안 그룹 규칙&lt;/b&gt;만 추가하겠습니다. 먼저 편집을 눌러 보안 그룹을 생성한 뒤 그룹 이름과 설명을 작성해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdC1dd/btsMjLoOZtF/IujozqoafZMGPkiDUxdUIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdC1dd/btsMjLoOZtF/IujozqoafZMGPkiDUxdUIk/img.png&quot; data-alt=&quot;  방화벽(보안 그룹) 생성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdC1dd/btsMjLoOZtF/IujozqoafZMGPkiDUxdUIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdC1dd%2FbtsMjLoOZtF%2FIujozqoafZMGPkiDUxdUIk%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;1038&quot; height=&quot;275&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;275&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;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보안 그룹 규칙으로 HTTP (포트 80), HTTPS (포트 443)은 위치 무관, SSH (포트 22)는 보안을 위해 내 IP만 허용으로 설정해주겠습니다. 웹 애플리케이션을 운영하려면 HTTP와 HTTPS를 모든 사용자에게 열어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/liEuJ/btsMi5nYQ8K/4OTaLhCVeqQR4iEmuSKXIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/liEuJ/btsMi5nYQ8K/4OTaLhCVeqQR4iEmuSKXIK/img.png&quot; data-alt=&quot;  보안 그룹 규칙 설정 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/liEuJ/btsMi5nYQ8K/4OTaLhCVeqQR4iEmuSKXIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FliEuJ%2FbtsMi5nYQ8K%2F4OTaLhCVeqQR4iEmuSKXIK%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;1050&quot; height=&quot;692&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;  보안 그룹 규칙 설정 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;630&quot; data-start=&quot;533&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;7️⃣ 스토리지 구성&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt;은 기본값으로 두고 넘어갑니다. &lt;b&gt;인스턴스 시작&lt;/b&gt;을 클릭해 인스턴스를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;- 향후 더 많은 데이터를 저장해야 한다면, 인스턴스를 생성한 후 추가로 볼륨을 연결할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;359&quot; data-end=&quot;387&quot;&gt;&lt;b&gt;3. EC2 인스턴스 접속 및 초기 보안 설정&amp;nbsp;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☑️ EC2 인스턴스에 SSH 접속하기 (Windows)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;AWS EC2 인스턴스를 생성한 후, SSH를 사용하여 원격 접속을 해야 서버를 직접 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;윈도우에서는 기본적으로 &lt;b&gt;`PuTTY`&lt;/b&gt; 또는 Windows 터미널 (&lt;b&gt;`PowerShell`&lt;/b&gt;, &lt;b&gt;`CMD`&lt;/b&gt;)을 사용할 수 있는데 해당 글에서는 `&lt;b&gt;PowerShell`&lt;/b&gt;을 사용한 접속 방법을 설명하겠습니다.&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;1️⃣&lt;b&gt; SSH 키 파일 (.pem&lt;/b&gt;&lt;b&gt;)&lt;/b&gt; 권한 조정&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;- EC2 인스턴스를 생성할 때 다운로드한 키 파일(.pem)의 저장경로를 확인합니다.&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;632&quot; data-ke-size=&quot;size18&quot;&gt;- 권한 설정 변경: AWS에서는 키 파일이 너무 개방적이면나&amp;nbsp; SSH 접속을 허용하지 않으므로 아래 명령어를 실행하여 보안 설정을 조정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739539916448&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;icacls &quot;C:\Users\사용자이름\Downloads\my-key.pem&quot; /inheritance:r
icacls &quot;C:\Users\사용자이름\Downloads\my-key.pem&quot; /grant:r &quot;%USERNAME%:R&quot;&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;size18&quot;&gt;2️⃣&lt;b&gt; EC2 인스턴스&lt;/b&gt; &lt;b&gt;퍼블릭 IP&lt;/b&gt; 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- AWS 콘솔 &amp;rarr; EC2 &amp;rarr; 인스턴스 목록으로 이동하여 생성한 인스턴스를 선택한 뒤 퍼블릭 IPv4 주소를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3️⃣ PowerShell을 사용하여 &lt;b&gt;SSH 접속&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 아래의 SSH 명령어를 입력하여 접속합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739540713795&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh -i &quot;C:\Users\사용자이름\Downloads\my-key.pem&quot; ubuntu@퍼블릭IPv4주소&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;size18&quot;&gt;- 처음 접속하는 경우 다음과 같은 메시지가 나타납니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739540748916&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;The authenticity of host '퍼블릭IPv4주소 (퍼블릭IPv4주소)' can't be established.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- yes 입력 후 Enter 키를 눌러 접속을 진행합니다&lt;/p&gt;
&lt;pre id=&quot;code_1739540888093&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 6.8.0-1021-aws x86_64)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☑️ EC2 인스턴스에 SSH 접속하기 (Mac &amp;amp; Linux)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Mac과 Linux는 기본적으로 SSH 클라이언트가 내장되어 있으므로, 터미널을 열고 아래 명령어로 접속합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739541277839&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh -i /path/to/keyfile.pem ubuntu@퍼블릭IPv4주소&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(*/path/to/keyfile.pem: .pem 파일 경로)&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 chmod 400 명령어로 키 파일의 권한을 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739541401626&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod 400 /path/to/keyfile.pem&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☑️ 패키지 업데이트 (공통)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size18&quot;&gt;EC2 인스턴스를 최신 상태로 유지하기 위한 패키지 업데이트 방법입니다.&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size18&quot;&gt;1️⃣ EC2 인스턴스에 접속한 뒤 다음 명령어를 입력합니다.&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size18&quot;&gt;- 시스템에 설치된 패키지 목록을 최신으로 업데이트합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739541929822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size18&quot;&gt;2️⃣ 모든 패키지 업그레이드&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;666&quot; data-ke-size=&quot;size18&quot;&gt;- -y 옵션은 업데이트를 자동으로 승인하게 해주며 시스템에 설치된 모든 패키지를 최신 버전으로 업데이트합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739541960606&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt upgrade -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3️⃣ 불필요한 패키지 삭제 (필요한 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 사용하지 않는 패키지를 삭제하여 디스크 공간을 절약합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739542038198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt autoremove&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;141&quot; data-start=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;AWS EC2 설정은 여기까지! 이제 이 서버를 활용해 원하는 애플리케이션을 배포할 차례입니다.&lt;br /&gt;다음 글에서는 웹 서버 구축, 데이터베이스 설치, 그리고 도커(Docker) 환경 설정까지 차근차근 알아보겠습니다.  &lt;/p&gt;
&lt;p data-end=&quot;141&quot; data-start=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;141&quot; data-start=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;141&quot; data-start=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Cloud &amp;amp; DevOps</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>IAM</category>
      <category>SSH</category>
      <category>보안규칙</category>
      <category>보안그룹</category>
      <category>인스턴스</category>
      <category>키 페어</category>
      <category>퍼블릭IP</category>
      <category>프리티어</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/19</guid>
      <comments>https://sim-plism.tistory.com/19#entry19comment</comments>
      <pubDate>Sat, 15 Feb 2025 00:25:54 +0900</pubDate>
    </item>
    <item>
      <title>[⚛️React] Rc-Tree로 메신저 조직도 쉽게 구현하기</title>
      <link>https://sim-plism.tistory.com/18</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;이번 글에서는 Rc-Tree 라이브러리를 사용하여 메신저 내 직원 조직도를 트리 구조로 시각화하는 방법을 단계별로 알아보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;&lt;a style=&quot;background-color: #c0d1e7;&quot; href=&quot;https://www.npmjs.com/package/rc-tree&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.npmjs.com/package/rc-tree&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1729606933206&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;rc-tree&quot; data-og-description=&quot;tree ui component for react. Latest version: 5.10.1, last published: 7 days ago. Start using rc-tree in your project by running &amp;#96;npm i rc-tree&amp;#96;. There are 654 other projects in the npm registry using rc-tree.&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/rc-tree&quot; data-og-url=&quot;https://www.npmjs.com/package/rc-tree&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WwJgJ/hyXlMwlnYD/piiZYgbe25sZc6a62BV6A0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bQSqiv/hyXlThW85W/JyP9svoK6Jg6BgvC0Aeu61/img.png?width=370&amp;amp;height=342&amp;amp;face=0_0_370_342&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/rc-tree&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/rc-tree&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WwJgJ/hyXlMwlnYD/piiZYgbe25sZc6a62BV6A0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bQSqiv/hyXlThW85W/JyP9svoK6Jg6BgvC0Aeu61/img.png?width=370&amp;amp;height=342&amp;amp;face=0_0_370_342');&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;rc-tree&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;tree ui component for react. Latest version: 5.10.1, last published: 7 days ago. Start using rc-tree in your project by running `npm i rc-tree`. There are 654 other projects in the npm registry using rc-tree.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif, color: black;&quot;&gt;&lt;b&gt;&lt;span&gt;1️⃣ Rc-Tree 개념과 사용 방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif, color: black;&quot;&gt;&lt;span&gt;&lt;b&gt;`Rc-Tree`&lt;/b&gt;는 부모와 자식, 즉 폴더와 문서 같은 부모-자식 관계를 가진 데이터 구조를 시각화할 수 있는 React 트리 구성 요소입니다. 해당 라이브러리는 트리 구조를 쉽게 시각화하고 조작할 수 있는 기능을 제공합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9nHp9/btsKfrFVyYo/lHbUlUaC4ndOsHPhxaMZtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9nHp9/btsKfrFVyYo/lHbUlUaC4ndOsHPhxaMZtK/img.png&quot; data-alt=&quot;Rc-Tree의 예시 - 출처: 상단 공식문서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9nHp9/btsKfrFVyYo/lHbUlUaC4ndOsHPhxaMZtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9nHp9%2FbtsKfrFVyYo%2FlHbUlUaC4ndOsHPhxaMZtK%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;370&quot; height=&quot;342&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Rc-Tree의 예시 - 출처: 상단 공식문서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ 기본 사용 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;먼저 `rc-tree` 라이브러리를 설치합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1729607696577&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install rc-tree&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 트리 구조를 만들기 위해 &lt;b&gt;key&lt;/b&gt;, &lt;b&gt;title&lt;/b&gt;, &lt;b&gt;children&lt;/b&gt; 속성을 설정한 트리 데이터를 준비합니다. &lt;b&gt;`key`&lt;/b&gt;는 각 노드의 고유 식별자, &lt;b&gt;`title`&lt;/b&gt;은 노드의 이름, &lt;b&gt;`children`&lt;/b&gt;은 자식 노드를 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1729608543979&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Tree from &quot;rc-tree&quot;; // react-tree 라이브러리
import &quot;rc-tree/assets/index.css&quot;

const treeData = [ // 계층 구조의 트리 데이터
  {
    key: &quot;1&quot;,
    title: &quot;folder 1&quot;,
    children: [
      { key: &quot;1-1&quot;, title: &quot;file 1-1&quot; },
      { key: &quot;1-2&quot;, title: &quot;file 1-2&quot; },
      {
        key: &quot;3&quot;,
        title: &quot;folder 3&quot;,
        children: [
          { key: &quot;3-1&quot;, title: &quot;file 3-1&quot; },
          { key: &quot;3-2&quot;, title: &quot;file 3-2&quot; },
        ],
      },
    ],
  },
  {
    key: &quot;2&quot;,
    title: &quot;folder 2&quot;,
    children: [
      { key: &quot;2-1&quot;, title: &quot;file 2-1&quot; },
      { key: &quot;2-2&quot;, title: &quot;file 2-2&quot; },
    ],
  },
];

&amp;lt;Tree treeData={treeData}&amp;gt;&amp;lt;/Tree&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 예시에서는 &lt;b&gt;폴더와 파일&lt;/b&gt;을 트리 구조로 나타냈습니다. 이 구조에서 Tree 컴포넌트에 `treeData`를 전달하여 트리 구조를 시각화할 수 있습니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif, color: black;&quot;&gt;&lt;b&gt;&lt;span&gt;2️⃣ Rc-Tree의 활용 - 메신저 조직도 구현&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif, color: black;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif, color: black;&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;메신저에서 &lt;b&gt;부서와 직원&lt;/b&gt;을 계층 구조로 시각화하여 조직도를 만들 수 있습니다. 부서는 상위 노드로, 직원은 하위 노드로 나타낼 수 있으며, 자식 노드가 없는 부서는 `&lt;b&gt;isLeaf: false&lt;/b&gt;`로 설정할 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ 부서와 직원 관계 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif, color: black;&quot;&gt;&lt;span&gt; 아래는 &lt;b&gt;부서와 직원&lt;/b&gt;의 관계를 트리 구조로 정의한 예시입니다. . 상위 노드에 부서 이름을 넣어주고 하위 노드에 부서의 직원 이름을 넣어주겠습니다. 트리 구조에서 &lt;b&gt;children&lt;/b&gt; 배열을 사용하여 부서와 직원의 관계를 정의합니다. 그리고 &lt;b&gt;`&amp;lt;Tree&amp;gt;`&lt;/b&gt; 컴포넌트 속성에 &lt;b&gt;`treeData`&lt;/b&gt;를 넣어줍니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729611019883&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const treeData = [ // 트리 데이터
    {
        key: &quot;1&quot;,
        title: &quot;Erpre&quot;,
        children: [
            {
                key: &quot;1-1&quot;,
                title: &quot;영업부&quot;,
                children: [
                    {key: &quot;1-1-1&quot;, title: &quot;안유진&quot;},
                    {key: &quot;1-1-2&quot;, title: &quot;김민주&quot;}
                ]
            },
            {
                key: &quot;1-2&quot;,
                title: &quot;개발부&quot;,
                children: [
                    {key: &quot;1-2-1&quot;, title: &quot;장원영&quot;},
                    {key: &quot;1-2-2&quot;, title: &quot;최예나&quot;},
                    {key: &quot;1-2-3&quot;, title: &quot;조유리&quot;}
                ]
            }
        ]
    }
];

&amp;lt;Tree treeData={treeData}&amp;gt;&amp;lt;/Tree&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxW9yA/btsKfetanRZ/LXz1RP73F5km7unRde6hyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxW9yA/btsKfetanRZ/LXz1RP73F5km7unRde6hyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxW9yA/btsKfetanRZ/LXz1RP73F5km7unRde6hyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxW9yA%2FbtsKfetanRZ%2FLXz1RP73F5km7unRde6hyK%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;184&quot; height=&quot;274&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본적인 트리 모양의 조직도가 만들어진 것을 확인할 수 있습니다. 이렇게 트리 구조로 조직도를 만들면 메신저에서 조직도 조회와 관리가 훨씬 편리해집니다. 만약 부서는 있는데 직원이 없는 경우는 어떻게 될까요?&lt;/p&gt;
&lt;pre id=&quot;code_1729611794950&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    key: &quot;1-3&quot;,
    title: &quot;인사부&quot;,
    isLeaf: false, // 자식 노드가 없는 경우 isLeaf: false 속성을 넣어준다
    children: [] 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;151&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GV95h/btsKfzcLwOX/PKZDH9W0c2Fq1n3Lw7sA7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GV95h/btsKfzcLwOX/PKZDH9W0c2Fq1n3Lw7sA7k/img.png&quot; data-alt=&quot;자식 노드로 인식됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GV95h/btsKfzcLwOX/PKZDH9W0c2Fq1n3Lw7sA7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGV95h%2FbtsKfzcLwOX%2FPKZDH9W0c2Fq1n3Lw7sA7k%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;151&quot; height=&quot;132&quot; data-origin-width=&quot;151&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자식 노드로 인식됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;부서는 있지만 직원이 없는 경우에는 부서가 자식 노드로 인식되는 것을 확인할 수 있습니다. 이 경우 속성에 `&lt;b&gt;isLeaf: false&lt;/b&gt;` 값을 넣어주면 해당 노드가 자식 노드가 아닌 부모 노드로 인식됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KbXBh/btsKgBHsn32/Jtd46bi9XR0pzpbQxcg7y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KbXBh/btsKgBHsn32/Jtd46bi9XR0pzpbQxcg7y1/img.png&quot; data-alt=&quot;부모 노드로 인식됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KbXBh/btsKgBHsn32/Jtd46bi9XR0pzpbQxcg7y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKbXBh%2FbtsKgBHsn32%2FJtd46bi9XR0pzpbQxcg7y1%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;136&quot; height=&quot;134&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;134&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️&lt;/b&gt;&lt;b&gt; 체크 박스 기능 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;메신저에서 여러 사람에게 쪽지나 채팅을 보내기 위해&lt;/b&gt; 체크박스 기능을 추가해 보겠습니다. Rc-Tree에서 지원하는 `&lt;b&gt;checkable&lt;/b&gt;` 속성을 사용하여 체크박스를 활성화할 수 있습니다.&amp;nbsp;저는 메신저에 로그인 했을 때 모든 노드가 기본적으로 확장되기를 원하므로 &lt;b&gt;`defaultExpandAll`&lt;/b&gt; 속성도 넣어 주었습니다. 체크박스가 활성화된 트리 구조를 만들 수 있으며, 체크된 항목은 `&lt;b&gt;onCheck`&lt;/b&gt; 핸들러로 처리할 수 있습니다. 예를 들어, 선택된 직원 목록을 업데이트할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729612734672&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Tree
    treeData={treeData}
    defaultExpandAll={true}  // 모든 노드를 기본적으로 확장
    checkable                // 체크박스 설정
    onCheck={handleCheck}    // 체크 시 이벤트 (체크가 true인 노드의 title을 저장하는 이벤트함수)
/&amp;gt;

const handleCheck = (checkedKeys, { checkedNodes }) =&amp;gt; {
    const recipientNames = checkedNodes
        .filter(node =&amp;gt;  !node.children) 
        .map(node =&amp;gt; node.title); 

    setSelectedRecipients(recipientNames);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPKRp8/btsKeWTP00o/hyzKN0JYFr6lJywRjlfibK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPKRp8/btsKeWTP00o/hyzKN0JYFr6lJywRjlfibK/img.png&quot; data-alt=&quot;체크박스 활성화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPKRp8/btsKeWTP00o/hyzKN0JYFr6lJywRjlfibK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPKRp8%2FbtsKeWTP00o%2FhyzKN0JYFr6lJywRjlfibK%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;182&quot; height=&quot;309&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;309&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️&lt;/b&gt;&lt;b&gt;&lt;span&gt; 아이콘 커스터마이징&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;다음으로는 투박한 폴더와 파일 아이콘을 좀 더 보기좋게 변경해보겠습니다. 아이콘 커스텀도 속성을 통해 해결할 수 있습니다. 트리 노드에 &lt;b&gt;`icon`&lt;/b&gt; 속성을 추가해 원하는 이모티콘을 지정해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729647831873&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    key: &quot;1&quot;,
    title: &quot;Erpre&quot;,
    icon: &amp;lt;span className=&quot;parent-icon&quot;&amp;gt; &amp;lt;/span&amp;gt;,
    children: [
        {
            key: &quot;1-1&quot;,
            title: &quot;영업부&quot;,
            icon: &amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;,
            children: [
                {key: &quot;1-1-1&quot;, title: &quot;안유진&quot;},
                {key: &quot;1-1-2&quot;, title: &quot;김민주&quot;}
            ]
 },
// 생략&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 원하는 아이콘을 지정하면 다음처럼 아이콘이 적용됩니다. 직원에는 추후 각자 지정한 메신저 온라인 상태를 표시할 것이므로 따로 아이콘을 지정하지 않고 그대로 두었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WXiFL/btsKgCl72cB/IW7inmsvw48XRxT2NKA0y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WXiFL/btsKgCl72cB/IW7inmsvw48XRxT2NKA0y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WXiFL/btsKgCl72cB/IW7inmsvw48XRxT2NKA0y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWXiFL%2FbtsKgCl72cB%2FIW7inmsvw48XRxT2NKA0y0%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;173&quot; height=&quot;247&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ 서버에서 직원 데이터 가져오기 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;마지막으로, 서버에서 직원 데이터를 받아와서 트리 구조로 시각화하는 방법을 살펴보겠습니다. 데이터를 `&lt;b&gt;API`&lt;/b&gt;로 받아와서 트리 구조로 변환한 후, `&lt;b&gt;treeData&lt;/b&gt;`에 전달합니다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729666379111&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
  async function fetchData() {
    try {
      const response = await axios.get('/api/messengers/employeeList');
      const employeeList = response.data;
      const treeStructure = buildTreeData(employeeList);
      setTreeData(treeStructure);
    } catch (error) {
      console.error('Failed to fetch employee data:', error);
    }
  }
  fetchData();
}, []);

const buildTreeData = (data) =&amp;gt; {
        const departmentMap = {};
        const tree = [
            {
                key: &quot;0&quot;,
                title: &quot;Erpre&quot;,
                icon: &amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;,
                children: []
            }
        ];

        // 각 직원 데이터를 부서별로 그룹화
        data.forEach(employee =&amp;gt; {
            const departmentName = employee.departmentName;
            const employeeNode = {
                key: employee. employeeId,
                title: employee.employeeName,
                isLeaf: true
            };

            // 해당 부서가 이미 존재하는지 확인
            if(!departmentMap[departmentName]) {
                const departmentNode = {
                    key: employee.departmentId,
                    title: departmentName,
                    children: []
                };
                departmentMap[departmentName] = departmentNode;
                tree[0].children.push(departmentNode);
            }

            departmentMap[departmentName].children.push(employeeNode);
        });

        return tree;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1Nvy/btsKgCAwWbb/WJWc7Kiv6Kk6cW5KWtZgM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1Nvy/btsKgCAwWbb/WJWc7Kiv6Kk6cW5KWtZgM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1Nvy/btsKgCAwWbb/WJWc7Kiv6Kk6cW5KWtZgM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1Nvy%2FbtsKgCAwWbb%2FWJWc7Kiv6Kk6cW5KWtZgM1%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;165&quot; height=&quot;193&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제 데이터가 적용이 된 모습을 보실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif, color: black;&quot;&gt;&lt;b&gt;&lt;span&gt;3️⃣ 마무리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Rc-Tree는 다양한 계층적 데이터를 시각화하는 데 매우 유용합니다. 이 글에서는 &lt;b&gt;메신저 조직도&lt;/b&gt; 구현 방법을 다루었으며, 체크박스 기능, 아이콘 변경, 서버 데이터 연동 등 다양한 커스터마이징 옵션을 사용했습니다. &lt;b&gt;Rc-Tree 공식 문서&lt;/b&gt;를 참고하여 더 많은 기능을 활용해보세요!&lt;/p&gt;</description>
      <category>  Front-End</category>
      <category>rc-tree</category>
      <category>React</category>
      <category>라이브러리</category>
      <category>리액트</category>
      <category>리액트라이브러리</category>
      <category>메신저</category>
      <category>조직도</category>
      <category>트리</category>
      <category>트리구조</category>
      <category>프론트엔드</category>
      <author>파스트잇</author>
      <guid isPermaLink="true">https://sim-plism.tistory.com/18</guid>
      <comments>https://sim-plism.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 23 Oct 2024 16:31:20 +0900</pubDate>
    </item>
  </channel>
</rss>