플렉스박스에는 축이 두 개 있습니다. `flex-direction: row`일 때 주축(main axis)은 가로, 교차축(cross axis)은 세로입니다. `justify-content`는 주축을 따라 아이템 사이·둘레의 여백을 나누고, `align-items`는 교차축에서 각 아이템의 위치(또는 늘어나는 정도)를 정합니다. 이 둘을 헷갈리면 "왜 정렬이 안 먹히지"의 8할이 설명됩니다 — `flex-direction: column`으로 바꾸는 순간 두 속성의 역할이 통째로 뒤바뀌기 때문입니다.
`align-items`의 기본값은 `stretch`입니다. 아이템에 높이를 명시하지 않으면 교차축 전체를 채우도록 늘어나고, 높이를 주는 순간 그 값이 우선해서 `center`·`flex-start`처럼 자연스러운 크기로 배치됩니다. 이 데모에서 칩마다 내용물(줄 수)이 달라 높이가 제각각인 이유가 그것입니다 — stretch일 때와 아닐 때의 차이가 실제로 보이게 하려고요.
`justify-content`는 `space-between`(양끝 붙이고 사이 균등)·`space-around`(각 아이템 양옆에 균등한 여백, 바깥쪽은 절반)·`space-evenly`(바깥쪽까지 완전히 균등)로 세분화됩니다. 셋의 차이는 "맨 끝 아이템과 컨테이너 가장자리 사이 여백"에서만 드러나므로, 나란히 비교하지 않으면 눈으로 구분하기 어렵습니다.
언제 쓰나
한 줄(또는 한 열)짜리 정렬이면 무조건 이 둘부터 확인하세요. 여러 줄로 줄바꿈되는 레이아웃의 줄 사이 간격은 `align-content`가 따로 맡습니다.