Skip to main content

Command Palette

Search for a command to run...

Modern CSS에서 Flexbox를 제대로 이해하기

Published
•4 min read•View as Markdown

― float 해킹부터 flex 실무 패턴까지

프론트엔드 면접이나 실무에서 이런 질문을 자주 듣습니다.

  • “Flexbox 기본 방향은 뭐죠?”

  • “flex: 1은 정확히 무슨 뜻인가요?”

  • “flex-shrink는 0이랑 1만 쓰는 건가요?”

  • “flex-basis: auto랑 100%는 같은가요?”

이 글은 Flexbox를 ‘계산 공식’이 아니라 ‘실무 도구’로 이해하기 위한 정리입니다.
특히 Modern CSS 관점에서 Flex를 어떻게 쓰는지에 초점을 맞췄습니다.


1. Modern CSS란 무엇인가?

먼저 용어부터 정리해야 합니다.

Modern CSS는 새로운 CSS가 아니다.
최신 브라우저 환경을 전제로 한 CSS 사용 패러다임이다.

CSS 문법 자체는 동일하지만,

  • float, clearfix 같은 우회 기법

  • 레이아웃을 JS로 보완하던 방식

대신에

  • Flexbox

  • Grid

  • CSS Variables

  • Container Query

같은 공식 표준 기능을 적극 활용하는 흐름을 보통 Modern CSS라고 부릅니다.


2. 왜 float 해킹이 사라졌는가?

과거에는 레이아웃을 만들 도구가 거의 없었습니다.

float의 원래 목적

img {
  float: left;
}

→ 텍스트가 이미지를 감싸도록 하기 위함

하지만 레이아웃 도구가 없던 시절,
float는 가로 배치를 위한 유일한 선택지였습니다.

그 결과 생긴 것이:

  • clearfix

  • overflow: hidden

  • 가짜 div

  • height 붕괴 문제

이런 것들을 통틀어 float 해킹이라고 부릅니다.

Flexbox와 Grid는
“레이아웃을 위한 공식 도구”로
이런 해킹을 완전히 대체했습니다.


3. Flexbox 레이아웃과 Flex 레이아웃은 같은가?

같습니다.

  • Flexbox

  • Flex 레이아웃

  • CSS Flexible Box Layout

모두 같은 의미이고,
실무에서는 그냥 “flex”라고 부릅니다.

.container {
  display: flex;
}

이 한 줄이 바로 Flexbox의 시작입니다.


4. Flexbox의 기본 방향은?

기본값은 가로(row) 입니다.

.container {
  display: flex;
  /* flex-direction: row; (기본값) */
}

그래서:

  • justify-content → 가로 정렬처럼 보이고

  • align-items → 세로 정렬처럼 보입니다

이걸 헷갈리면 Flexbox는 계속 헷갈립니다.


5. justify-content: space-between은 어떤 정렬인가?

한 문장으로 정리하면 이렇습니다.

첫 요소는 시작점, 마지막 요소는 끝점에 붙고
나머지는 그 사이 간격이 동일하게 배치된다

.container {
  display: flex;
  justify-content: space-between;
}

특징:

  • 양 끝에는 여백 없음

  • 아이템 사이 간격만 분배

  • 아이템이 1개면 효과 없음

실무에서는 헤더, 툴바에 자주 쓰지만
한 요소만 밀 때는 margin-left: auto가 더 안정적입니다.


6. flex: 1 은 무슨 뜻인가?

이건 축약형입니다.

flex: 1;

은 실제로 다음을 의미합니다.

flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;

핵심 포인트는 이것입니다.

“기존 크기는 무시하고
남는 공간을 비율로 나누겠다”

그래서 flex: 1을 쓰면
모든 아이템이 균등한 크기를 갖게 됩니다.


7. flex 속성에서 실제로 중요한 것들

flex-grow

  • 남는 공간을 얼마나 가져갈지

flex-shrink

  • 공간이 부족할 때 얼마나 줄어들지

flex-basis

  • flex 계산의 기준 크기

이 중에서 실무에서 가장 오해가 많은 게 flex-shrink와 flex-basis입니다.


8. flex-shrink는 0 또는 1만 쓰는가?

사실상 그렇습니다.

이론적으로는:

flex-shrink: 0;
flex-shrink: 1;
flex-shrink: 2;
flex-shrink: 10;

모두 가능합니다.

하지만 실무에서는 이렇게 씁니다.

flex-shrink: 0; /* 절대 줄면 안 됨 */
flex-shrink: 1; /* 기본 */

실무에서는 px 단위 계산을 하지 않는다.
“줄어도 되는가 / 안 되는가”만 표현한다.


9. flex-shrink 비율 계산은 실제로 쓰이나?

예를 들어:

  • A: shrink 1

  • B: shrink 2

  • 부족 공간: 30px

이라면,
기준 크기(flex-basis)가 같을 때는

  • A → 10px

  • B → 20px

으로 줄어드는 게 맞습니다.

하지만 실무에서는 이런 계산을 하지 않습니다.

계산은 브라우저가 하고
개발자는 우선순위만 표현합니다.


10. flex-basis: auto 는 무슨 의미인가?

“이 요소의 기준 크기를
width 또는 콘텐츠 크기에서 가져와라”

flex-basis: auto; /* 기본값 */
  • width가 있으면 그 값

  • 없으면 콘텐츠 크기

그래서:

flex: auto;

는

flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;

를 의미합니다.


11. auto와 100%는 같은가?

절대 아닙니다.

항목auto100%
기준문맥 기반부모 기준
flex 친화성⭕❌
반응성높음낮음

특히 Flexbox 안에서는:

  • auto → 안전

  • 100% → 의도 충돌 가능성 큼


12. flex-basis: 100%는 실무에서 쓰나?

거의 안 씁니다.

예외는 딱 하나입니다.

.container {
  display: flex;
  flex-wrap: wrap;
}

.full {
  flex-basis: 100%;
}

“이 아이템은 한 줄을 통째로 차지해라”

이 목적 외에는 거의 등장하지 않습니다.


13. flex-wrap은 무엇인가?

아이템을 한 줄로 유지할지,
공간이 부족하면 줄바꿈할지를 정하는 속성

flex-wrap: nowrap; /* 기본값 */
flex-wrap: wrap;
  • 헤더 / 툴바 → nowrap

  • 카드 / 태그 리스트 → wrap

wrap을 쓰면:

  • justify-content는 각 줄 기준

  • 여러 줄 전체 정렬은 align-content


14. 실무에서 실제로 쓰이는 flex 조합들

⭐ 가장 많이 쓰는 패턴

.container {
  display: flex;
}

.icon {
  flex-shrink: 0;
}

.content {
  flex: 1;
  min-width: 0;
}

이 조합 하나로:

  • 아이콘 고정

  • 텍스트 줄어듦

  • 말줄임 정상


자주 쓰는 flex 축약 패턴

flex: 1;      /* 균등 분배 */
flex: auto;   /* 고유 크기 존중 */
flex: none;   /* 완전 고정 */

이 세 개로 실무 90% 해결됩니다.


15. Flexbox 실무 요약

  • Flex는 계산 도구가 아니다

  • 의도 표현 도구다

  • 0 / 1 / auto / none만 잘 써도 충분

  • min-width: 0은 필수급

  • px 단위 shrink 계산 ❌


마무리 한 문장

Flexbox를 잘 쓴다는 것은
계산 공식을 외우는 게 아니라,
UI 요소의 역할과 우선순위를 정확히 표현하는 것이다.


🧾 작성 참고

이 글은 ChatGPT의 도움을 받아 내용을 정리하였습니다.

More from this blog

LangGraph의 astream_events: 에이전트 실행을 실시간으로 들여다보기

💡 한 줄 요약: astream_events()는 LangGraph 그래프 실행 중 발생하는 모든 이벤트(LLM 토큰, 툴 호출, 노드 시작/종료 등)를 실시간 스트림으로 받을 수 있는 비동기 API입니다. 들어가며 AI 에이전트가 응답을 생성하는 데 25초가 걸린다고 상상해보세요. 사용자는 평균 8초 후에 페이지를 이탈합니다. 하지만 스트리밍을 도입

Jun 20, 20266 min read

LLM은 어떻게 글을 읽고 쓰는가 — 입력부터 출력까지

대화형 AI에게 질문을 던지면, 마치 사람처럼 문장을 이해하고 답을 써 내려가는 것처럼 보인다.하지만 그 안에서 벌어지는 일은 생각보다 단순하고, 또 생각보다 기계적이다.이 글에서는 두 가지 질문에 답해 본다.LLM은 어떻게 글을 만들어내는가,그리고 우리가 입력한 프롬프트는 모델에 어떤 모습으로 들어가는가. 1부. LLM은 어떻게 글을 만들어내는가 핵심은

Jun 10, 20264 min read

useEffect 지옥이란 무엇이며, 어떻게 안전하게 사용하는가

React를 어느 정도 사용하다 보면 한 번쯤은“useEffect 지옥에 빠졌다”는 말을 듣거나 직접 느껴본 적이 있을 것이다. useEffect가 계속 늘어나고 의존성 배열은 점점 길어지고 왜 실행되는지 이해하기 어려워지며 eslint-disable-next-line 이 늘어나는 상태 하지만 많은 사람들이 오해한다.useEffect 지옥은 useEffect가 많아서 생기는 문제가 아니다. 이 글에서는 ‘useEffect 지옥’의 ...

Jan 12, 20263 min read

Zod란 무엇인가: TypeScript에서 런타임 검증과 타입 안정성을 동시에 해결하는 방법

TypeScript 프로젝트를 하다 보면 반드시 마주치는 문제가 있다.바로 “타입은 있는데, 데이터는 믿을 수 없다”는 것이다. TypeScript는 컴파일 타임에는 강력하지만,런타임에 들어오는 데이터에 대해서는 아무런 보장을 해주지 않는다. API 요청 데이터 사용자 입력(Form) 환경 변수 (process.env) 외부 JSON / 설정 파일 이 모든 것은 타입 시스템 바깥에서 들어온다. 이 문제를 해결하기 위해 등장한 라이브러...

Jan 10, 20263 min read

Flatpak을 이해하기 위한 배경 지식

배포판, 라이브러리 충돌, 그리고 OSTree까지 리눅스 데스크톱에서 Flatpak이 표준처럼 자리 잡은 데에는 분명한 이유가 있다.그 이유를 이해하려면 단순히 “Flatpak은 패키징 시스템이다”를 넘어서,리눅스 배포판 구조, 라이브러리 버전 충돌, OSTree라는 기술까지 함께 이해해야 한다. 이 글에서는 다음 질문에 답해본다. 리눅스에서 말하는 배포판이란 무엇인가? 라이브러리 버전 충돌은 왜 발생하는가? Flatpak은 이 문제를 어...

Jan 8, 20265 min read

Dev note

32 posts